@hua-labs/ui 1.0.0 → 1.1.0-alpha.0.1
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/README.md +891 -213
- package/dist/ComponentLayout-BxCenSAm.d.mts +73 -0
- package/dist/advanced/dashboard.d.ts +7 -0
- package/dist/advanced/dashboard.d.ts.map +1 -0
- package/dist/advanced/motion.d.ts +2 -0
- package/dist/advanced/motion.d.ts.map +1 -0
- package/dist/advanced-dashboard.d.mts +4 -0
- package/dist/advanced-dashboard.js +2 -0
- package/dist/advanced-dashboard.js.map +1 -0
- package/dist/advanced-dashboard.mjs +2 -0
- package/dist/advanced-dashboard.mjs.map +1 -0
- package/dist/advanced-motion.d.mts +93 -0
- package/dist/advanced-motion.js +2 -0
- package/dist/advanced-motion.js.map +1 -0
- package/dist/advanced-motion.mjs +2 -0
- package/dist/advanced-motion.mjs.map +1 -0
- package/dist/advanced.d.mts +734 -0
- package/dist/advanced.d.ts +17 -0
- package/dist/advanced.d.ts.map +1 -0
- package/dist/advanced.js +2 -0
- package/dist/advanced.js.map +1 -0
- package/dist/advanced.mjs +2 -0
- package/dist/advanced.mjs.map +1 -0
- package/dist/chunk-6NXF6ATP.mjs +2 -0
- package/dist/chunk-6NXF6ATP.mjs.map +1 -0
- package/dist/chunk-ACEKLG37.mjs +2 -0
- package/dist/chunk-ACEKLG37.mjs.map +1 -0
- package/dist/chunk-DMYT7RZ4.mjs +2 -0
- package/dist/chunk-DMYT7RZ4.mjs.map +1 -0
- package/dist/chunk-KHEJZ3U4.mjs +2 -0
- package/dist/chunk-KHEJZ3U4.mjs.map +1 -0
- package/dist/chunk-QXBMXCML.mjs +2 -0
- package/dist/chunk-QXBMXCML.mjs.map +1 -0
- package/dist/chunk-SGCVGEDR.mjs +2 -0
- package/dist/chunk-SGCVGEDR.mjs.map +1 -0
- package/dist/chunk-UUHAXGMO.mjs +2 -0
- package/dist/chunk-UUHAXGMO.mjs.map +1 -0
- package/dist/chunk-VPOFRDYL.mjs +2 -0
- package/dist/chunk-VPOFRDYL.mjs.map +1 -0
- package/dist/chunk-YY6ZBUVJ.mjs +2 -0
- package/dist/chunk-YY6ZBUVJ.mjs.map +1 -0
- package/dist/chunk-ZQAAB3P4.mjs +2 -0
- package/dist/chunk-ZQAAB3P4.mjs.map +1 -0
- package/dist/components/Accordion.d.ts +109 -1
- package/dist/components/Accordion.d.ts.map +1 -1
- package/dist/components/Action.d.ts +68 -0
- package/dist/components/Action.d.ts.map +1 -0
- package/dist/components/ActionToolbar.d.ts +65 -0
- package/dist/components/ActionToolbar.d.ts.map +1 -0
- package/dist/components/Alert.d.ts +49 -0
- package/dist/components/Alert.d.ts.map +1 -1
- package/dist/components/Autocomplete.d.ts +88 -0
- package/dist/components/Autocomplete.d.ts.map +1 -0
- package/dist/components/Avatar.d.ts +71 -1
- package/dist/components/Avatar.d.ts.map +1 -1
- package/dist/components/Badge.d.ts +32 -2
- package/dist/components/Badge.d.ts.map +1 -1
- package/dist/components/Bookmark.d.ts +49 -0
- package/dist/components/Bookmark.d.ts.map +1 -0
- package/dist/components/BottomSheet.d.ts +91 -1
- package/dist/components/BottomSheet.d.ts.map +1 -1
- package/dist/components/Breadcrumb.d.ts +73 -14
- package/dist/components/Breadcrumb.d.ts.map +1 -1
- package/dist/components/Button.d.ts +82 -7
- package/dist/components/Button.d.ts.map +1 -1
- package/dist/components/Card.d.ts +122 -5
- package/dist/components/Card.d.ts.map +1 -1
- package/dist/components/ChatMessage.d.ts +67 -1
- package/dist/components/ChatMessage.d.ts.map +1 -1
- package/dist/components/Checkbox.d.ts +48 -2
- package/dist/components/Checkbox.d.ts.map +1 -1
- package/dist/components/Command.d.ts +82 -1
- package/dist/components/Command.d.ts.map +1 -1
- package/dist/components/ComponentLayout.d.ts +72 -0
- package/dist/components/ComponentLayout.d.ts.map +1 -0
- package/dist/components/ConfirmModal.d.ts +66 -1
- package/dist/components/ConfirmModal.d.ts.map +1 -1
- package/dist/components/Container.d.ts +39 -0
- package/dist/components/Container.d.ts.map +1 -1
- package/dist/components/ContextMenu.d.ts +51 -1
- package/dist/components/ContextMenu.d.ts.map +1 -1
- package/dist/components/DatePicker.d.ts +62 -0
- package/dist/components/DatePicker.d.ts.map +1 -0
- package/dist/components/Divider.d.ts +13 -3
- package/dist/components/Divider.d.ts.map +1 -1
- package/dist/components/Drawer.d.ts +103 -1
- package/dist/components/Drawer.d.ts.map +1 -1
- package/dist/components/Dropdown.d.ts +51 -1
- package/dist/components/Dropdown.d.ts.map +1 -1
- package/dist/components/EmotionAnalysis.d.ts +59 -1
- package/dist/components/EmotionAnalysis.d.ts.map +1 -1
- package/dist/components/EmotionButton.d.ts +35 -1
- package/dist/components/EmotionButton.d.ts.map +1 -1
- package/dist/components/EmotionMeter.d.ts +38 -2
- package/dist/components/EmotionMeter.d.ts.map +1 -1
- package/dist/components/EmotionSelector.d.ts +51 -1
- package/dist/components/EmotionSelector.d.ts.map +1 -1
- package/dist/components/FeatureCard.d.ts +61 -0
- package/dist/components/FeatureCard.d.ts.map +1 -0
- package/dist/components/Form.d.ts +114 -0
- package/dist/components/Form.d.ts.map +1 -0
- package/dist/components/Grid.d.ts +42 -1
- package/dist/components/Grid.d.ts.map +1 -1
- package/dist/components/HeroSection.d.ts +77 -0
- package/dist/components/HeroSection.d.ts.map +1 -0
- package/dist/components/Icon/Icon.d.ts +159 -0
- package/dist/components/Icon/Icon.d.ts.map +1 -0
- package/dist/components/Icon/IconProvider.d.ts +94 -0
- package/dist/components/Icon/IconProvider.d.ts.map +1 -0
- package/dist/components/Icon/icon-store.d.ts +21 -0
- package/dist/components/Icon/icon-store.d.ts.map +1 -0
- package/dist/components/Icon/index.d.ts +10 -0
- package/dist/components/Icon/index.d.ts.map +1 -0
- package/dist/components/InfoCard.d.ts +48 -0
- package/dist/components/InfoCard.d.ts.map +1 -0
- package/dist/components/Input.d.ts +40 -8
- package/dist/components/Input.d.ts.map +1 -1
- package/dist/components/Label.d.ts +50 -0
- package/dist/components/Label.d.ts.map +1 -0
- package/dist/components/LanguageToggle.d.ts +41 -1
- package/dist/components/LanguageToggle.d.ts.map +1 -1
- package/dist/components/Link.d.ts +52 -0
- package/dist/components/Link.d.ts.map +1 -0
- package/dist/components/LoadingSpinner.d.ts +44 -5
- package/dist/components/LoadingSpinner.d.ts.map +1 -1
- package/dist/components/Menu.d.ts +92 -1
- package/dist/components/Menu.d.ts.map +1 -1
- package/dist/components/Modal.d.ts +67 -5
- package/dist/components/Modal.d.ts.map +1 -1
- package/dist/components/Navigation.d.ts +72 -0
- package/dist/components/Navigation.d.ts.map +1 -0
- package/dist/components/PageNavigation.d.ts +48 -0
- package/dist/components/PageNavigation.d.ts.map +1 -0
- package/dist/components/PageTransition.d.ts +44 -1
- package/dist/components/PageTransition.d.ts.map +1 -1
- package/dist/components/Pagination.d.ts +52 -1
- package/dist/components/Pagination.d.ts.map +1 -1
- package/dist/components/Panel.d.ts +99 -0
- package/dist/components/Panel.d.ts.map +1 -0
- package/dist/components/Popover.d.ts +46 -1
- package/dist/components/Popover.d.ts.map +1 -1
- package/dist/components/Progress.d.ts +52 -3
- package/dist/components/Progress.d.ts.map +1 -1
- package/dist/components/Radio.d.ts +44 -2
- package/dist/components/Radio.d.ts.map +1 -1
- package/dist/components/ScrollArea.d.ts +53 -1
- package/dist/components/ScrollArea.d.ts.map +1 -1
- package/dist/components/ScrollIndicator.d.ts +43 -1
- package/dist/components/ScrollIndicator.d.ts.map +1 -1
- package/dist/components/ScrollProgress.d.ts +37 -0
- package/dist/components/ScrollProgress.d.ts.map +1 -1
- package/dist/components/ScrollToTop.d.ts +48 -11
- package/dist/components/ScrollToTop.d.ts.map +1 -1
- package/dist/components/SectionHeader.d.ts +42 -0
- package/dist/components/SectionHeader.d.ts.map +1 -0
- package/dist/components/Select.d.ts +59 -2
- package/dist/components/Select.d.ts.map +1 -1
- package/dist/components/Skeleton.d.ts +44 -1
- package/dist/components/Skeleton.d.ts.map +1 -1
- package/dist/components/Slider.d.ts +75 -0
- package/dist/components/Slider.d.ts.map +1 -0
- package/dist/components/Stack.d.ts +42 -1
- package/dist/components/Stack.d.ts.map +1 -1
- package/dist/components/StatsPanel.d.ts +72 -0
- package/dist/components/StatsPanel.d.ts.map +1 -0
- package/dist/components/Switch.d.ts +48 -2
- package/dist/components/Switch.d.ts.map +1 -1
- package/dist/components/Table.d.ts +206 -0
- package/dist/components/Table.d.ts.map +1 -0
- package/dist/components/Tabs.d.ts +123 -10
- package/dist/components/Tabs.d.ts.map +1 -1
- package/dist/components/Textarea.d.ts +48 -2
- package/dist/components/Textarea.d.ts.map +1 -1
- package/dist/components/ThemeProvider.d.ts +67 -2
- package/dist/components/ThemeProvider.d.ts.map +1 -1
- package/dist/components/ThemeToggle.d.ts +44 -0
- package/dist/components/ThemeToggle.d.ts.map +1 -1
- package/dist/components/Toast.d.ts +75 -1
- package/dist/components/Toast.d.ts.map +1 -1
- package/dist/components/Toggle.d.ts +62 -0
- package/dist/components/Toggle.d.ts.map +1 -0
- package/dist/components/Tooltip.d.ts +48 -1
- package/dist/components/Tooltip.d.ts.map +1 -1
- package/dist/components/Upload.d.ts +87 -0
- package/dist/components/Upload.d.ts.map +1 -0
- package/dist/components/advanced/AdvancedPageTransition.d.ts +25 -0
- package/dist/components/advanced/AdvancedPageTransition.d.ts.map +1 -0
- package/dist/components/advanced/index.d.ts +4 -0
- package/dist/components/advanced/index.d.ts.map +1 -0
- package/dist/components/advanced/usePageTransition.d.ts +33 -0
- package/dist/components/advanced/usePageTransition.d.ts.map +1 -0
- package/dist/components/advanced/usePageTransitionManager.d.ts +44 -0
- package/dist/components/advanced/usePageTransitionManager.d.ts.map +1 -0
- package/dist/components/dashboard/ActivityFeed.d.ts +87 -0
- package/dist/components/dashboard/ActivityFeed.d.ts.map +1 -0
- package/dist/components/dashboard/BarChart.d.ts +82 -0
- package/dist/components/dashboard/BarChart.d.ts.map +1 -0
- package/dist/components/dashboard/DashboardGrid.d.ts +44 -0
- package/dist/components/dashboard/DashboardGrid.d.ts.map +1 -0
- package/dist/components/dashboard/DashboardSidebar.d.ts +105 -0
- package/dist/components/dashboard/DashboardSidebar.d.ts.map +1 -0
- package/dist/components/dashboard/DashboardToolbar.d.ts +120 -0
- package/dist/components/dashboard/DashboardToolbar.d.ts.map +1 -0
- package/dist/components/dashboard/EmptyState.d.ts +61 -0
- package/dist/components/dashboard/EmptyState.d.ts.map +1 -0
- package/dist/components/dashboard/MembershipBadge.d.ts +45 -0
- package/dist/components/dashboard/MembershipBadge.d.ts.map +1 -0
- package/dist/components/dashboard/MerchantList.d.ts +98 -0
- package/dist/components/dashboard/MerchantList.d.ts.map +1 -0
- package/dist/components/dashboard/MetricCard.d.ts +75 -0
- package/dist/components/dashboard/MetricCard.d.ts.map +1 -0
- package/dist/components/dashboard/MiniBarChart.d.ts +60 -0
- package/dist/components/dashboard/MiniBarChart.d.ts.map +1 -0
- package/dist/components/dashboard/NotificationCard.d.ts +89 -0
- package/dist/components/dashboard/NotificationCard.d.ts.map +1 -0
- package/dist/components/dashboard/ProfileCard.d.ts +82 -0
- package/dist/components/dashboard/ProfileCard.d.ts.map +1 -0
- package/dist/components/dashboard/ProgressCard.d.ts +71 -0
- package/dist/components/dashboard/ProgressCard.d.ts.map +1 -0
- package/dist/components/dashboard/QuickActionCard.d.ts +63 -0
- package/dist/components/dashboard/QuickActionCard.d.ts.map +1 -0
- package/dist/components/dashboard/RoutingBreakdownCard.d.ts +88 -0
- package/dist/components/dashboard/RoutingBreakdownCard.d.ts.map +1 -0
- package/dist/components/dashboard/SettlementTimeline.d.ts +90 -0
- package/dist/components/dashboard/SettlementTimeline.d.ts.map +1 -0
- package/dist/components/dashboard/StatCard.d.ts +70 -0
- package/dist/components/dashboard/StatCard.d.ts.map +1 -0
- package/dist/components/dashboard/SummaryCard.d.ts +73 -0
- package/dist/components/dashboard/SummaryCard.d.ts.map +1 -0
- package/dist/components/dashboard/TransactionDetailDrawer.d.ts +183 -0
- package/dist/components/dashboard/TransactionDetailDrawer.d.ts.map +1 -0
- package/dist/components/dashboard/TransactionsTable.d.ts +137 -0
- package/dist/components/dashboard/TransactionsTable.d.ts.map +1 -0
- package/dist/components/dashboard/TrendChart.d.ts +75 -0
- package/dist/components/dashboard/TrendChart.d.ts.map +1 -0
- package/dist/components/dashboard/index.d.ts +41 -0
- package/dist/components/dashboard/index.d.ts.map +1 -0
- package/dist/components/scrollbar/scrollbar.d.ts +12 -0
- package/dist/components/scrollbar/scrollbar.d.ts.map +1 -0
- package/dist/dashboard-QMssHf5j.d.mts +1801 -0
- package/dist/feedback.d.mts +103 -0
- package/dist/feedback.d.ts +21 -0
- package/dist/feedback.d.ts.map +1 -0
- package/dist/feedback.js +2 -0
- package/dist/feedback.js.map +1 -0
- package/dist/feedback.mjs +2 -0
- package/dist/feedback.mjs.map +1 -0
- package/dist/form.d.mts +803 -0
- package/dist/form.d.ts +42 -0
- package/dist/form.d.ts.map +1 -0
- package/dist/form.js +2 -0
- package/dist/form.js.map +1 -0
- package/dist/form.mjs +2 -0
- package/dist/form.mjs.map +1 -0
- package/dist/hooks/useScrollToggle.d.ts +12 -0
- package/dist/hooks/useScrollToggle.d.ts.map +1 -0
- package/dist/icons-DoSGIez_.d.mts +135 -0
- package/dist/index.d.mts +3770 -0
- package/dist/index.d.ts +76 -38
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -49
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +37 -0
- package/dist/index.mjs.map +1 -0
- package/dist/lib/icon-aliases.d.ts +24 -0
- package/dist/lib/icon-aliases.d.ts.map +1 -0
- package/dist/lib/icon-names.d.ts +47 -0
- package/dist/lib/icon-names.d.ts.map +1 -0
- package/dist/lib/icon-providers.d.ts +560 -0
- package/dist/lib/icon-providers.d.ts.map +1 -0
- package/dist/lib/icons.d.ts +113 -24
- package/dist/lib/icons.d.ts.map +1 -1
- package/dist/lib/phosphor-icons.d.ts +6 -0
- package/dist/lib/phosphor-icons.d.ts.map +1 -0
- package/dist/lib/styles/colors.d.ts +131 -0
- package/dist/lib/styles/colors.d.ts.map +1 -0
- package/dist/lib/styles/index.d.ts +8 -0
- package/dist/lib/styles/index.d.ts.map +1 -0
- package/dist/lib/styles/utils.d.ts +87 -0
- package/dist/lib/styles/utils.d.ts.map +1 -0
- package/dist/lib/styles/variants.d.ts +79 -0
- package/dist/lib/styles/variants.d.ts.map +1 -0
- package/dist/lib/types/common.d.ts +80 -0
- package/dist/lib/types/common.d.ts.map +1 -0
- package/dist/lib/types/index.d.ts +6 -0
- package/dist/lib/types/index.d.ts.map +1 -0
- package/dist/lib/utils.d.ts +73 -1
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/navigation.d.mts +105 -0
- package/dist/navigation.d.ts +22 -0
- package/dist/navigation.d.ts.map +1 -0
- package/dist/navigation.js +2 -0
- package/dist/navigation.js.map +1 -0
- package/dist/navigation.mjs +2 -0
- package/dist/navigation.mjs.map +1 -0
- package/package.json +85 -19
- package/src/styles/toast.css +23 -0
- package/dist/components/Accordion.js +0 -84
- package/dist/components/Alert.js +0 -61
- package/dist/components/Avatar.js +0 -18
- package/dist/components/Badge.js +0 -15
- package/dist/components/BottomSheet.js +0 -96
- package/dist/components/Breadcrumb.js +0 -47
- package/dist/components/Button.js +0 -23
- package/dist/components/Card.js +0 -18
- package/dist/components/ChatMessage.js +0 -59
- package/dist/components/Checkbox.js +0 -30
- package/dist/components/Command.js +0 -119
- package/dist/components/ConfirmModal.js +0 -53
- package/dist/components/Container.js +0 -23
- package/dist/components/ContextMenu.js +0 -110
- package/dist/components/Divider.js +0 -39
- package/dist/components/Drawer.js +0 -79
- package/dist/components/Dropdown.js +0 -174
- package/dist/components/EmotionAnalysis.js +0 -40
- package/dist/components/EmotionButton.js +0 -16
- package/dist/components/EmotionMeter.js +0 -21
- package/dist/components/EmotionSelector.js +0 -46
- package/dist/components/Grid.js +0 -44
- package/dist/components/Icon.d.ts +0 -26
- package/dist/components/Icon.d.ts.map +0 -1
- package/dist/components/Icon.js +0 -48
- package/dist/components/Input.js +0 -25
- package/dist/components/LanguageToggle.js +0 -61
- package/dist/components/LoadingSpinner.js +0 -37
- package/dist/components/Menu.js +0 -122
- package/dist/components/Modal.js +0 -62
- package/dist/components/PageTransition.js +0 -39
- package/dist/components/Pagination.js +0 -87
- package/dist/components/Popover.js +0 -159
- package/dist/components/Progress.js +0 -51
- package/dist/components/Radio.js +0 -29
- package/dist/components/ScrollArea.js +0 -42
- package/dist/components/ScrollIndicator.js +0 -60
- package/dist/components/ScrollProgress.js +0 -39
- package/dist/components/ScrollToTop.js +0 -46
- package/dist/components/Select.js +0 -29
- package/dist/components/Skeleton.js +0 -71
- package/dist/components/Stack.js +0 -34
- package/dist/components/Switch.js +0 -29
- package/dist/components/Tabs.js +0 -117
- package/dist/components/Textarea.js +0 -31
- package/dist/components/ThemeProvider.js +0 -76
- package/dist/components/ThemeToggle.js +0 -49
- package/dist/components/Toast.js +0 -138
- package/dist/components/Tooltip.js +0 -102
- package/dist/lib/icons.js +0 -321
- package/dist/lib/utils.js +0 -5
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {a as a$1,b,c,d,h,e,f,g}from'./chunk-VPOFRDYL.mjs';export{l as ComponentLayout}from'./chunk-VPOFRDYL.mjs';export{d as ActivityFeed,l as DashboardEmptyState,c as DashboardGrid,m as DashboardSidebar,o as DashboardToolbar,f as MembershipBadge,t as MerchantList,j as MetricCard,g as MiniBarChart,i as NotificationCard,e as ProfileCard,k as ProgressCard,b as QuickActionCard,s as RoutingBreakdownCard,v as SectionHeader,r as SettlementTimeline,a as StatCard,u as StatsPanel,h as SummaryCard,q as TransactionDetailDrawer,n as TransactionsTable,p as TrendChart}from'./chunk-YY6ZBUVJ.mjs';import {i}from'./chunk-SGCVGEDR.mjs';export{a as AdvancedPageTransition,g as CubePageTransition,b as FadePageTransition,e as FlipPageTransition,f as MorphPageTransition,d as ScalePageTransition,c as SlidePageTransition,h as ZoomPageTransition,i as usePageTransition,j as usePageTransitionManager}from'./chunk-KHEJZ3U4.mjs';import {a as a$2}from'./chunk-ACEKLG37.mjs';import {l}from'./chunk-DMYT7RZ4.mjs';import {a}from'./chunk-UUHAXGMO.mjs';import V,{useState,useEffect}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var Q=V.forwardRef(({className:p,id:e,storageKey:o="bookmarks",defaultBookmarked:i=false,onBookmarkChange:s,size:l$1="md",variant:u="default",...b},v)=>{let[m,x]=useState(i);useEffect(()=>{let y=localStorage.getItem(o);if(y){let n=JSON.parse(y);x(n.includes(e));}},[e,o]);let d=()=>{let y=!m;x(y);let n=localStorage.getItem(o),h=n?JSON.parse(n):[];if(y)h.includes(e)||h.push(e);else {let r=h.indexOf(e);r>-1&&h.splice(r,1);}localStorage.setItem(o,JSON.stringify(h)),s==null||s(y);},g={sm:"w-6 h-6",md:"w-8 h-8",lg:"w-10 h-10"},N={default:"text-slate-400 hover:text-yellow-500 transition-colors",filled:"text-yellow-500 hover:text-yellow-600 transition-colors",outline:"border border-slate-300 dark:border-slate-600 text-slate-400 hover:text-yellow-500 hover:border-yellow-500 transition-colors rounded"};return jsx("button",{ref:v,onClick:d,className:a("flex items-center justify-center focus:outline-none focus:ring-2 focus:ring-yellow-500 focus:ring-offset-2",g[l$1],N[u],p),...b,children:jsx(l,{name:"star",className:a("transition-all duration-200",m&&"fill-current")})})});Q.displayName="Bookmark";var X=V.forwardRef(({className:p,message:e,user:o={name:"\uC0AC\uC6A9\uC790",color:"#3b82f6"},assistant:i$1={name:"AI",color:"#10b981"},showAvatar:s=true,showTimestamp:l=true,showEmotion:u=true,variant:b$1="default",theme:v={userBubbleBg:"#3b82f6",userBubbleText:"#ffffff",aiBubbleBg:"#f3f4f6",aiBubbleText:"#1f2937"},...m},x)=>{var h$1,r,B;let d$1=e.role==="user";e.role==="assistant";e.role==="system";let y=k=>k?{joy:"bg-yellow-100 text-yellow-800",sadness:"bg-blue-100 text-blue-800",anger:"bg-red-100 text-red-800",calm:"bg-green-100 text-green-800",excitement:"bg-pink-100 text-pink-800",worry:"bg-gray-100 text-gray-800",gratitude:"bg-purple-100 text-purple-800",loneliness:"bg-indigo-100 text-indigo-800"}[k]||"bg-gray-100 text-gray-800":"bg-gray-100",n=k=>k.toLocaleTimeString("ko-KR",{hour:"2-digit",minute:"2-digit"});return b$1==="bubble"?jsx("div",{ref:x,className:a("flex w-full",d$1?"justify-end":"justify-start",p),...m,children:jsxs("div",{className:a("flex max-w-[80%] space-x-2",d$1?"flex-row-reverse space-x-reverse":"flex-row"),children:[s&&jsxs(a$1,{className:"w-8 h-8 flex-shrink-0",children:[jsx(b,{src:d$1?o.avatar:i$1.avatar,alt:d$1?o.name:i$1.name}),jsx(c,{style:{backgroundColor:d$1?o.color:i$1.color},children:(h$1=d$1?o.name:i$1.name)==null?void 0:h$1.charAt(0)})]}),jsxs("div",{className:"space-y-1",children:[jsx("div",{className:a("px-4 py-2 rounded-2xl max-w-full break-words",d$1?"rounded-br-md":"rounded-bl-md"),style:{backgroundColor:d$1?v.userBubbleBg:v.aiBubbleBg,color:d$1?v.userBubbleText:v.aiBubbleText},children:e.isTyping?jsxs("div",{className:"flex space-x-1",children:[jsx("div",{className:"w-2 h-2 bg-current rounded-full animate-bounce"}),jsx("div",{className:"w-2 h-2 bg-current rounded-full animate-bounce delay-100"}),jsx("div",{className:"w-2 h-2 bg-current rounded-full animate-bounce delay-200"})]}):jsx("div",{className:"whitespace-pre-wrap",children:e.content})}),jsxs("div",{className:a("flex items-center space-x-2 text-xs text-muted-foreground",d$1?"justify-end":"justify-start"),children:[l&&jsx("span",{children:n(e.timestamp)}),u&&e.emotion&&jsx(i,{variant:"secondary",className:a("text-xs",y(e.emotion)),children:e.emotion})]})]})]})}):b$1==="compact"?jsxs("div",{ref:x,className:a("flex items-start space-x-3 py-2",p),...m,children:[s&&jsxs(a$1,{className:"w-6 h-6 flex-shrink-0",children:[jsx(b,{src:d$1?o.avatar:i$1.avatar,alt:d$1?o.name:i$1.name}),jsx(c,{style:{backgroundColor:d$1?o.color:i$1.color},children:(r=d$1?o.name:i$1.name)==null?void 0:r.charAt(0)})]}),jsxs("div",{className:"flex-1 min-w-0",children:[jsxs("div",{className:"flex items-center space-x-2 mb-1",children:[jsx("span",{className:"text-sm font-medium",children:d$1?o.name:i$1.name}),l&&jsx("span",{className:"text-xs text-muted-foreground",children:n(e.timestamp)}),u&&e.emotion&&jsx(i,{variant:"secondary",className:a("text-xs",y(e.emotion)),children:e.emotion})]}),jsx("div",{className:"text-sm",children:e.isTyping?jsxs("div",{className:"flex space-x-1",children:[jsx("div",{className:"w-1.5 h-1.5 bg-muted-foreground rounded-full animate-bounce"}),jsx("div",{className:"w-1.5 h-1.5 bg-muted-foreground rounded-full animate-bounce delay-100"}),jsx("div",{className:"w-1.5 h-1.5 bg-muted-foreground rounded-full animate-bounce delay-200"})]}):jsx("div",{className:"whitespace-pre-wrap",children:e.content})})]})]}):jsxs("div",{ref:x,className:a("flex items-start space-x-3 py-4",p),...m,children:[s&&jsxs(a$1,{className:"w-10 h-10 flex-shrink-0",children:[jsx(b,{src:d$1?o.avatar:i$1.avatar,alt:d$1?o.name:i$1.name}),jsx(c,{style:{backgroundColor:d$1?o.color:i$1.color},children:(B=d$1?o.name:i$1.name)==null?void 0:B.charAt(0)})]}),jsxs("div",{className:"flex-1 min-w-0",children:[jsxs("div",{className:"flex items-center space-x-2 mb-2",children:[jsx("span",{className:"font-medium",children:d$1?o.name:i$1.name}),l&&jsx("span",{className:"text-sm text-muted-foreground",children:n(e.timestamp)}),u&&e.emotion&&jsx(i,{variant:"secondary",className:a("text-xs",y(e.emotion)),children:e.emotion})]}),jsx(d,{className:a("inline-block",d$1?"bg-primary text-primary-foreground":"bg-muted"),children:jsx(h,{className:"p-3",children:e.isTyping?jsxs("div",{className:"flex space-x-1",children:[jsx("div",{className:"w-2 h-2 bg-current rounded-full animate-bounce"}),jsx("div",{className:"w-2 h-2 bg-current rounded-full animate-bounce delay-100"}),jsx("div",{className:"w-2 h-2 bg-current rounded-full animate-bounce delay-200"})]}):jsx("div",{className:"whitespace-pre-wrap",children:e.content})})})]})]})});X.displayName="ChatMessage";var L=V.forwardRef(({className:p,value:e,max:o=100,size:i="md",color:s="blue",...l},u)=>{let b={sm:"h-2",md:"h-3",lg:"h-4"},v={blue:"bg-blue-500",green:"bg-green-500",yellow:"bg-yellow-500",red:"bg-red-500",purple:"bg-purple-500",orange:"bg-orange-500",indigo:"bg-indigo-500",pink:"bg-pink-500",gray:"bg-gray-500"},m=Math.min(Math.max(e/o*100,0),100);return jsx("div",{ref:u,className:a("w-full bg-gray-200 rounded-full dark:bg-gray-700",b[i],p),...l,children:jsx("div",{className:a("h-full rounded-full transition-all duration-300",v[s]||v.blue),style:{width:`${m}%`}})})});L.displayName="EmotionMeter";var ee=V.forwardRef(({className:p,primaryEmotion:e$1,emotionDistribution:o=[],keywords:i$1=[],intensity:s=50,positivity:l=70,energy:u=60,showMeter:b=true,showDistribution:v=true,showKeywords:m=true,showMetrics:x=true,layout:d$1="detailed",...g$1},N)=>{let y=r=>r<30?"\uC57D\uD568":r<70?"\uBCF4\uD1B5":"\uAC15\uD568",n=r=>r<30?"\uBD80\uC815\uC801":r<70?"\uC911\uB9BD\uC801":"\uAE0D\uC815\uC801",h$1=r=>r<30?"\uB0AE\uC74C":r<70?"\uBCF4\uD1B5":"\uB192\uC74C";return d$1==="compact"?jsxs("div",{ref:N,className:a("space-y-3",p),...g$1,children:[e$1&&jsxs("div",{className:"flex items-center justify-between",children:[jsx("span",{className:"text-sm font-medium",children:"\uC8FC\uC694 \uAC10\uC815:"}),jsxs("div",{className:"flex items-center space-x-2",children:[jsxs("span",{className:"text-sm text-muted-foreground",children:[e$1.name," (",e$1.intensity,"%)"]}),b&&jsx(L,{value:e$1.intensity,size:"sm",color:"blue"})]})]}),x&&jsxs(Fragment,{children:[jsxs("div",{className:"flex items-center justify-between",children:[jsx("span",{className:"text-sm font-medium",children:"\uAC10\uC815 \uAC15\uB3C4:"}),jsx("span",{className:"text-sm text-muted-foreground",children:y(s)})]}),jsxs("div",{className:"flex items-center justify-between",children:[jsx("span",{className:"text-sm font-medium",children:"\uAE0D\uC815\uC131:"}),jsx("span",{className:"text-sm text-muted-foreground",children:n(l)})]}),jsxs("div",{className:"flex items-center justify-between",children:[jsx("span",{className:"text-sm font-medium",children:"\uC5D0\uB108\uC9C0:"}),jsx("span",{className:"text-sm text-muted-foreground",children:h$1(u)})]})]}),m&&i$1.length>0&&jsxs("div",{children:[jsx("span",{className:"text-sm font-medium",children:"\uD0A4\uC6CC\uB4DC:"}),jsx("div",{className:"flex flex-wrap gap-1 mt-1",children:i$1.map(r=>jsx(i,{variant:"secondary",className:"text-xs",children:r},r))})]})]}):d$1==="card"?jsxs(d,{ref:N,className:a("",p),...g$1,children:[jsxs(e,{children:[jsxs(f,{className:"flex items-center",children:[jsx("span",{className:"text-2xl mr-2",children:"\u2728"}),"AI \uBD84\uC11D"]}),jsx(g,{children:"\uAC10\uC815 \uBD84\uC11D \uACB0\uACFC"})]}),jsxs(h,{className:"space-y-4",children:[e$1&&jsxs("div",{className:"space-y-3",children:[jsxs("div",{className:"text-sm",children:[jsx("span",{className:"font-medium",children:"\uC8FC\uC694 \uAC10\uC815:"}),jsxs("span",{className:"ml-2 text-muted-foreground",children:[e$1.name," (",e$1.intensity,"%)"]})]}),b&&jsx("div",{className:"flex justify-center",children:jsx(L,{value:e$1.intensity,size:"md",color:"blue"})})]}),x&&jsxs(Fragment,{children:[jsxs("div",{className:"text-sm",children:[jsx("span",{className:"font-medium",children:"\uAC10\uC815 \uAC15\uB3C4:"}),jsx("span",{className:"ml-2 text-muted-foreground",children:y(s)})]}),jsxs("div",{className:"text-sm",children:[jsx("span",{className:"font-medium",children:"\uAE0D\uC815\uC131:"}),jsx("span",{className:"ml-2 text-muted-foreground",children:n(l)})]}),jsxs("div",{className:"text-sm",children:[jsx("span",{className:"font-medium",children:"\uC5D0\uB108\uC9C0:"}),jsx("span",{className:"ml-2 text-muted-foreground",children:h$1(u)})]})]}),m&&i$1.length>0&&jsxs("div",{className:"text-sm",children:[jsx("span",{className:"font-medium",children:"\uD0A4\uC6CC\uB4DC:"}),jsx("div",{className:"flex flex-wrap gap-1 mt-1",children:i$1.map(r=>jsx(i,{variant:"secondary",className:"text-xs",children:r},r))})]})]})]}):jsxs("div",{ref:N,className:a("space-y-6",p),...g$1,children:[e$1&&jsxs("div",{className:"space-y-4",children:[jsx("h3",{className:"text-lg font-semibold",children:"\uC8FC\uC694 \uAC10\uC815"}),jsxs("div",{className:"flex items-center space-x-4",children:[jsxs("div",{className:"text-center",children:[jsx("div",{className:"text-2xl font-bold text-primary",children:e$1.name}),jsxs("div",{className:"text-sm text-muted-foreground",children:[e$1.intensity,"% \uAC15\uB3C4"]})]}),b&&jsx(L,{value:e$1.intensity,size:"lg",color:"blue"})]})]}),v&&o.length>0&&jsxs("div",{className:"space-y-4",children:[jsx("h3",{className:"text-lg font-semibold",children:"\uAC10\uC815 \uBD84\uD3EC"}),jsx("div",{className:"space-y-3",children:o.map((r,B)=>jsxs("div",{className:"space-y-2",children:[jsxs("div",{className:"flex items-center justify-between",children:[jsx("span",{className:"text-sm font-medium",children:r.emotion}),jsxs("span",{className:"text-sm text-muted-foreground",children:[r.percentage,"%"]})]}),jsx("div",{className:"w-full bg-muted rounded-full h-2",children:jsx("div",{className:`${r.color} h-2 rounded-full transition-all duration-300`,style:{width:`${r.percentage}%`}})})]},B))})]}),x&&jsxs("div",{className:"space-y-4",children:[jsx("h3",{className:"text-lg font-semibold",children:"\uBD84\uC11D \uC9C0\uD45C"}),jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:[jsxs("div",{className:"space-y-2",children:[jsx("div",{className:"text-sm font-medium",children:"\uAC10\uC815 \uAC15\uB3C4"}),jsx("div",{className:"text-2xl font-bold text-primary",children:y(s)}),jsx("div",{className:"w-full bg-muted rounded-full h-2",children:jsx("div",{className:"bg-primary h-2 rounded-full transition-all duration-300",style:{width:`${s}%`}})})]}),jsxs("div",{className:"space-y-2",children:[jsx("div",{className:"text-sm font-medium",children:"\uAE0D\uC815\uC131"}),jsx("div",{className:"text-2xl font-bold text-green-600",children:n(l)}),jsx("div",{className:"w-full bg-muted rounded-full h-2",children:jsx("div",{className:"bg-green-500 h-2 rounded-full transition-all duration-300",style:{width:`${l}%`}})})]}),jsxs("div",{className:"space-y-2",children:[jsx("div",{className:"text-sm font-medium",children:"\uC5D0\uB108\uC9C0"}),jsx("div",{className:"text-2xl font-bold text-orange-600",children:h$1(u)}),jsx("div",{className:"w-full bg-muted rounded-full h-2",children:jsx("div",{className:"bg-orange-500 h-2 rounded-full transition-all duration-300",style:{width:`${u}%`}})})]})]})]}),m&&i$1.length>0&&jsxs("div",{className:"space-y-4",children:[jsx("h3",{className:"text-lg font-semibold",children:"\uAC10\uC815 \uD0A4\uC6CC\uB4DC"}),jsx("div",{className:"flex flex-wrap gap-2",children:i$1.map(r=>jsx(i,{variant:"outline",className:"text-sm",children:r},r))})]})]})});ee.displayName="EmotionAnalysis";var F=V.forwardRef(({className:p,emotion:e,isSelected:o=false,size:i="md",...s},l)=>jsx("button",{ref:l,className:a("rounded-full border-2 transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-2 focus:ring-blue-500",{sm:"w-8 h-8 text-sm",md:"w-12 h-12 text-lg",lg:"w-16 h-16 text-xl"}[i],o?"border-blue-500 bg-blue-50 dark:bg-blue-900/20":"border-gray-200 bg-white dark:border-gray-700 dark:bg-gray-800",p),...s,children:e}));F.displayName="EmotionButton";var ke=[{key:"joy",label:"\uAE30\uC068",icon:"smile",color:"yellow"},{key:"sadness",label:"\uC2AC\uD514",icon:"frown",color:"blue"},{key:"anger",label:"\uD654\uB0A8",icon:"angry",color:"red"},{key:"calm",label:"\uD3C9\uC628",icon:"heart",color:"green"},{key:"excitement",label:"\uC124\uB818",icon:"star",color:"pink"},{key:"worry",label:"\uAC71\uC815",icon:"meh",color:"gray"},{key:"gratitude",label:"\uAC10\uC0AC",icon:"heart",color:"purple"},{key:"loneliness",label:"\uC678\uB85C\uC6C0",icon:"user",color:"indigo"}],te=V.forwardRef(({className:p,selectedEmotion:e,onEmotionSelect:o,layout:i="grid",showIntensity:s=false,intensity:l=50,onIntensityChange:u,emotions:b=ke,size:v="md",variant:m="button",...x},d)=>{let g=n=>{o==null||o(n);},N=n=>{let h=e===n.key;return m==="button"?jsx(F,{emotion:n.key,isSelected:h,size:v,onClick:()=>g(n.key),className:a("transition-all duration-200",h&&"ring-2 ring-offset-2 ring-primary"),children:n.label},n.key):m==="card"?jsx("div",{className:a("p-4 rounded-lg border-2 cursor-pointer transition-all duration-200 hover:shadow-md",h?"border-primary bg-primary/5":"border-border hover:border-primary/50"),onClick:()=>g(n.key),children:jsxs("div",{className:"flex items-center space-x-3",children:[jsx("div",{className:a("w-8 h-8 rounded-full flex items-center justify-center",h?"bg-primary text-primary-foreground":"bg-muted"),children:n.icon&&jsxs("span",{className:"text-lg",children:[n.icon==="smile"&&"\u{1F60A}",n.icon==="frown"&&"\u{1F622}",n.icon==="angry"&&"\u{1F620}",n.icon==="heart"&&"\u2764\uFE0F",n.icon==="star"&&"\u2B50",n.icon==="meh"&&"\u{1F610}",n.icon==="user"&&"\u{1F464}"]})}),jsx("span",{className:"font-medium truncate max-w-[120px]",children:n.label})]})},n.key):m==="chip"?jsx("div",{className:a("px-3 py-1 rounded-full cursor-pointer transition-all duration-200 text-sm font-medium",h?"bg-primary text-primary-foreground":"bg-muted hover:bg-muted/80"),onClick:()=>g(n.key),children:jsx("span",{className:"truncate max-w-[100px]",children:n.label})},n.key):null},y={grid:"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-2 md:gap-3",list:"space-y-2",compact:"flex flex-wrap gap-1"};return jsxs("div",{ref:d,className:a("space-y-4",p),...x,children:[jsx("div",{className:y[i],children:b.map(N)}),s&&e&&jsxs("div",{className:"space-y-3",children:[jsxs("div",{className:"flex items-center justify-between",children:[jsx("span",{className:"text-sm font-medium",children:"\uAC10\uC815 \uAC15\uB3C4"}),jsxs("span",{className:"text-sm text-muted-foreground",children:[l,"%"]})]}),jsx("input",{type:"range",min:"0",max:"100",value:l,onChange:n=>u==null?void 0:u(Number(n.target.value)),className:"w-full h-2 bg-muted rounded-lg appearance-none cursor-pointer slider"}),jsxs("div",{className:"flex justify-between text-xs text-muted-foreground",children:[jsx("span",{children:"\uC57D\uD568"}),jsx("span",{children:"\uBCF4\uD1B5"}),jsx("span",{children:"\uAC15\uD568"})]})]}),e&&s&&jsx("div",{className:"flex justify-center",children:jsx(L,{value:l,size:"md",color:"blue"})})]})});te.displayName="EmotionSelector";var re=V.forwardRef(({className:p,size:e="md",variant:o="button",showLabel:i=false,languages:s=[{code:"ko",name:"\uD55C\uAD6D\uC5B4",flag:"\u{1F1F0}\u{1F1F7}"},{code:"en",name:"English",flag:"\u{1F1FA}\u{1F1F8}"},{code:"ja",name:"\u65E5\u672C\u8A9E",flag:"\u{1F1EF}\u{1F1F5}"},{code:"zh",name:"\u4E2D\u6587",flag:"\u{1F1E8}\u{1F1F3}"}],currentLanguage:l="ko",onLanguageChange:u,...b},v)=>{let [m,x]=V.useState(false),d=V.useRef(null),g=s.find(r=>r.code===l)||s[0],N={sm:"h-10 w-10",md:"h-12 w-12",lg:"h-14 w-14"};V.useEffect(()=>{let r=B=>{d.current&&!d.current.contains(B.target)&&x(false);};return m&&document.addEventListener("mousedown",r),()=>{document.removeEventListener("mousedown",r);}},[m]);let n=r=>{u==null||u(r),x(false);},h=()=>jsx("div",{className:"flex items-center justify-center",children:jsx("span",{className:"text-lg",children:g.flag})});return o==="icon"?jsxs("div",{ref:d,className:"relative",children:[jsx("button",{onClick:()=>x(!m),className:a("inline-flex items-center justify-center rounded-lg transition-all duration-300 hover:bg-gray-100 dark:hover:bg-gray-800 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/50 focus-visible:ring-offset-2",N[e],p),...b,children:h()}),m&&jsx("div",{className:"absolute top-full right-0 mt-2 w-48 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 py-2 z-50",children:s.map(r=>jsxs("button",{onClick:()=>n(r.code),className:a("w-full px-4 py-3 text-left hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors duration-200 flex items-center gap-3",l===r.code&&"bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400"),children:[jsx("span",{className:"text-lg",children:r.flag}),jsx("span",{className:"text-sm font-medium",children:r.name})]},r.code))})]}):o==="dropdown"?jsxs("div",{ref:d,className:"relative",children:[jsxs("button",{onClick:()=>x(!m),className:a("inline-flex items-center gap-3 rounded-lg px-4 py-3 text-sm font-medium transition-all duration-300 hover:bg-gray-100 dark:hover:bg-gray-800 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/50 focus-visible:ring-offset-2",p),...b,children:[jsx("span",{className:"text-lg",children:g.flag}),i&&jsx("span",{children:g.name}),jsx("svg",{className:a("w-4 h-4 transition-transform duration-200",m&&"rotate-180"),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})]}),m&&jsx("div",{className:"absolute top-full right-0 mt-2 w-48 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 py-2 z-50",children:s.map(r=>jsxs("button",{onClick:()=>n(r.code),className:a("w-full px-4 py-3 text-left hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors duration-200 flex items-center gap-3",l===r.code&&"bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400"),children:[jsx("span",{className:"text-lg",children:r.flag}),jsx("span",{className:"text-sm font-medium",children:r.name})]},r.code))})]}):jsxs("button",{onClick:()=>{let B=(s.findIndex(k=>k.code===l)+1)%s.length;u==null||u(s[B].code);},className:a("inline-flex items-center gap-3 rounded-lg px-4 py-3 text-sm font-medium transition-all duration-300 hover:bg-gray-100 dark:hover:bg-gray-800 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/50 focus-visible:ring-offset-2",p),...b,children:[jsx("span",{className:"text-lg",children:g.flag}),i&&jsx("span",{children:g.name})]})});re.displayName="LanguageToggle";var ae=V.forwardRef(({className:p,targetId:e,text:o="Scroll down",iconName:i="arrowDown",iconSize:s=20,position:l$1="bottom-center",variant:u="default",size:b="md",animated:v=true,autoHide:m=true,hideThreshold:x=100,...d},g)=>{let[N,y]=useState(true);useEffect(()=>{if(!m)return;let k=()=>{let z=window.scrollY;y(z<x);};return k(),window.addEventListener("scroll",k,{passive:true}),()=>window.removeEventListener("scroll",k)},[m,x]);let n=()=>{if(e){let k=document.getElementById(e);k&&k.scrollIntoView({behavior:"smooth"});}else {let k=g;if(k.current){let z=k.current.nextElementSibling;z&&z.scrollIntoView({behavior:"smooth"});}}},h={"bottom-center":"bottom-8 left-1/2 transform -translate-x-1/2","bottom-left":"bottom-8 left-8","bottom-right":"bottom-8 right-8"},r={sm:"text-sm",md:"text-base",lg:"text-lg"},B={default:"text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white",primary:"text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-200",secondary:"text-purple-600 dark:text-purple-400 hover:text-purple-800 dark:hover:text-purple-200",outline:"text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white"};return N?jsx("div",{ref:g,className:a("absolute z-10",h[l$1],p),...d,children:jsxs(a$2,{onClick:n,variant:"ghost",size:"sm",className:a("flex flex-col items-center space-y-2 transition-all duration-300",r[b],B[u],v&&"animate-in fade-in-0 slide-in-from-bottom-2 duration-500"),"aria-label":o,children:[jsx("span",{className:"text-xs opacity-80",children:o}),jsx(l,{name:i,size:s,className:a(v&&"animate-bounce")})]})}):null});ae.displayName="ScrollIndicator";var le=V.forwardRef(({className:p,height:e=2,color:o="gradient",position:i="top",animated:s=true,showPercentage:l=false,...u},b)=>{let[v,m]=useState(0);useEffect(()=>{let g=()=>{let N=window.scrollY,y=document.documentElement.scrollHeight-window.innerHeight,n=y>0?N/y*100:0;m(n);};return g(),window.addEventListener("scroll",g,{passive:true}),window.addEventListener("resize",g,{passive:true}),()=>{window.removeEventListener("scroll",g),window.removeEventListener("resize",g);}},[]);let x={default:"bg-blue-600",primary:"bg-purple-600",secondary:"bg-gray-600",gradient:"bg-gradient-to-r from-purple-600 via-blue-600 to-purple-600"};return jsxs("div",{ref:b,className:a("fixed z-50",{top:"top-0 left-0 right-0",bottom:"bottom-0 left-0 right-0"}[i],p),style:{height:`${e}px`},...u,children:[jsx("div",{className:"w-full h-full bg-gray-200 dark:bg-gray-700"}),jsx("div",{className:a("h-full origin-left transition-all duration-100 ease-out",x[o]||x.gradient),style:{width:`${v}%`,transformOrigin:"left"}}),l&&jsxs("div",{className:"absolute top-2 right-2 text-xs text-gray-600 dark:text-gray-400 bg-white dark:bg-gray-800 px-2 py-1 rounded",children:[Math.round(v),"%"]})]})});le.displayName="ScrollProgress";var ne=V.forwardRef(({className:p,variant:e="default",size:o="md",orientation:i="both",autoHide:s=true,smooth:l=true,children:u,...b},v)=>{let m=()=>{switch(e){case "glass":return "scrollbar-thumb-white/20 hover:scrollbar-thumb-white/30 backdrop-blur-sm";case "colorful":return "scrollbar-thumb-gradient-to-b scrollbar-thumb-from-blue-500 scrollbar-thumb-to-purple-500 hover:scrollbar-thumb-from-blue-600 hover:scrollbar-thumb-to-purple-600";case "minimal":return "scrollbar-thumb-slate-200/50 hover:scrollbar-thumb-slate-300/70 dark:scrollbar-thumb-slate-700/50 dark:hover:scrollbar-thumb-slate-600/70";case "neon":return "scrollbar-thumb-cyan-400/60 hover:scrollbar-thumb-cyan-300/80 scrollbar-thumb-shadow-lg scrollbar-thumb-shadow-cyan-500/25";default:return "scrollbar-thumb-slate-300 hover:scrollbar-thumb-slate-400 dark:scrollbar-thumb-slate-600 dark:hover:scrollbar-thumb-slate-500"}},x=()=>{switch(o){case "sm":return "scrollbar-w-1";case "lg":return "scrollbar-w-3";case "xl":return "scrollbar-w-4";default:return "scrollbar-w-2"}},d=()=>{switch(i){case "vertical":return "overflow-y-auto overflow-x-hidden";case "horizontal":return "overflow-x-auto overflow-y-hidden";default:return "overflow-auto"}},g=a("scrollbar-thin scrollbar-track-transparent scrollbar-thumb-rounded-full transition-all duration-200",m(),x(),d(),s&&"scrollbar-hide",l&&"scroll-smooth",p);return jsx("div",{className:g,ref:v,...b,children:u})});ne.displayName="Scrollbar";var ie=V.forwardRef(({className:p,icon:e,title:o,description:i,variant:s="default",size:l$1="md",hover:u="scale",gradient:b="blue",customGradient:v,...m},x)=>{let d={sm:"p-4",md:"p-6",lg:"p-8"},g={default:"bg-white/90 dark:bg-gray-800/80 backdrop-blur-sm border border-gray-200/50 dark:border-gray-700/50",gradient:`bg-gradient-to-br ${v||Ie(b)}`,glass:"bg-white/10 dark:bg-gray-800/10 backdrop-blur-md border border-white/20 dark:border-gray-700/20",neon:"bg-gray-900/90 dark:bg-gray-900/90 border border-cyan-400/30 dark:border-cyan-400/30 shadow-lg shadow-cyan-400/20"},N={scale:"hover:scale-105 transition-transform duration-300",glow:"hover:shadow-2xl hover:shadow-blue-500/25 dark:hover:shadow-cyan-400/25 transition-shadow duration-300",slide:"hover:-translate-y-2 transition-transform duration-300",none:""},y=l$1==="lg"?"text-5xl":l$1==="md"?"text-4xl":"text-3xl";return jsxs("div",{ref:x,className:a("rounded-2xl shadow-lg transition-all duration-300 flex flex-col items-center text-center",d[l$1],g[s],N[u],p),...m,children:[e&&jsx("div",{className:`mb-4 ${y} ${s==="neon"?"text-cyan-400":""}`,children:typeof e=="string"&&e.startsWith("http")?jsx("img",{src:e,alt:o,className:"w-full h-full object-contain"}):typeof e=="string"?jsx("span",{children:e}):jsx(l,{name:e,className:"w-full h-full"})}),jsx("h3",{className:a("font-bold mb-2",l$1==="lg"?"text-2xl":l$1==="md"?"text-xl":"text-lg",s==="gradient"?"text-white":"text-gray-900 dark:text-white"),children:o}),jsx("p",{className:a(l$1==="lg"?"text-base":"text-sm",s==="gradient"?"text-white/90":"text-gray-600 dark:text-gray-300"),children:i})]})});ie.displayName="FeatureCard";function Ie(p){let e={blue:"from-blue-500 via-cyan-500 to-blue-600",purple:"from-purple-500 via-pink-500 to-purple-600",green:"from-green-500 via-emerald-500 to-green-600",orange:"from-orange-500 via-red-500 to-orange-600",pink:"from-pink-500 via-rose-500 to-pink-600"};return e[p]||e.blue}var de=V.forwardRef(({className:p,title:e,subtitle:o,description:i,primaryAction:s,secondaryAction:l,variant:u="default",background:b="gradient",customBackground:v,size:m="lg",...x},d)=>{let g={sm:"py-16",md:"py-20",lg:"py-24",xl:"py-32"},N={sm:"text-3xl md:text-4xl",md:"text-4xl md:text-5xl",lg:"text-5xl md:text-6xl",xl:"text-6xl md:text-7xl"},y={sm:"text-lg md:text-xl",md:"text-xl md:text-2xl",lg:"text-2xl md:text-3xl",xl:"text-3xl md:text-4xl"},n={sm:"text-base md:text-lg",md:"text-lg md:text-xl",lg:"text-lg md:text-2xl",xl:"text-xl md:text-3xl"},h={none:"",gradient:"relative overflow-hidden",particles:"relative overflow-hidden",video:"relative overflow-hidden"},r={none:null,gradient:jsxs("div",{className:"absolute inset-0 z-0 pointer-events-none",children:[jsx("div",{className:"absolute -top-32 -left-32 w-[600px] h-[600px] bg-gradient-to-br from-cyan-400 via-blue-500 to-purple-600 opacity-60 rounded-full blur-3xl animate-pulse"}),jsx("div",{className:"absolute bottom-0 right-0 w-[400px] h-[400px] bg-gradient-to-tr from-orange-400 via-pink-500 to-red-600 opacity-40 rounded-full blur-2xl animate-pulse"})]}),particles:jsxs("div",{className:"absolute inset-0 z-0 pointer-events-none",children:[jsx("div",{className:"absolute inset-0 bg-gradient-to-br from-blue-50 via-indigo-50 to-purple-50 dark:from-gray-900 dark:via-blue-900 dark:to-purple-900"}),jsx("div",{className:"absolute inset-0 opacity-30",children:[...Array(20)].map((B,k)=>jsx("div",{className:"absolute w-2 h-2 bg-blue-500 rounded-full animate-pulse",style:{left:`${Math.random()*100}%`,top:`${Math.random()*100}%`,animationDelay:`${Math.random()*2}s`,animationDuration:`${2+Math.random()*2}s`}},k))})]}),video:jsx("div",{className:"absolute inset-0 z-0 pointer-events-none",children:jsx("video",{autoPlay:true,loop:true,muted:true,playsInline:true,className:"absolute inset-0 w-full h-full object-cover opacity-20",children:jsx("source",{src:v,type:"video/mp4"})})})};return jsxs("section",{ref:d,className:a("flex-1 flex flex-col justify-center items-center text-center px-4 sm:px-6 lg:px-8",g[m],h[b],p),...x,children:[r[b],jsxs("div",{className:"relative z-10 max-w-4xl mx-auto",children:[jsxs("h1",{className:a("font-extrabold mb-6 text-gray-900 dark:text-white drop-shadow-[0_4px_24px_rgba(0,0,0,0.1)] dark:drop-shadow-[0_4px_24px_rgba(0,0,0,0.25)]",N[m]),children:[jsx("span",{className:"block text-transparent bg-clip-text bg-gradient-to-r from-blue-600 via-purple-600 to-cyan-600 dark:from-cyan-300 dark:via-blue-400 dark:to-purple-400 drop-shadow-[0_2px_8px_rgba(39,94,254,0.3)]",children:e}),o&&jsx("span",{className:a("block font-semibold mt-4 text-gray-700 dark:text-white/90",y[m]),children:o})]}),jsx("p",{className:a("text-gray-600 dark:text-white/80 mb-10 max-w-2xl mx-auto drop-shadow-[0_2px_8px_rgba(0,0,0,0.05)] dark:drop-shadow-[0_2px_8px_rgba(0,0,0,0.15)]",n[m]),children:i}),(s||l)&&jsxs("div",{className:"flex flex-col sm:flex-row gap-4 justify-center mb-8",children:[s&&jsxs(a$2,{href:s.href,variant:"gradient",size:m==="xl"?"lg":"md",className:"inline-flex items-center",children:[s.icon&&jsx("span",{className:"mr-2",children:s.icon}),s.label]}),l&&jsxs(a$2,{href:l.href,variant:"outline",size:m==="xl"?"lg":"md",className:"inline-flex items-center",children:[l.icon&&jsx("span",{className:"mr-2",children:l.icon}),l.label]})]})]})]})});de.displayName="HeroSection";var Ae={blue:{container:"bg-gradient-to-r from-blue-50 to-indigo-50 dark:from-blue-900/20 dark:to-indigo-900/20 rounded-lg p-4 border border-blue-200 dark:border-blue-700",icon:"h-5 w-5 text-blue-600 dark:text-blue-400 mr-3 mt-0.5 flex-shrink-0",title:"text-sm font-medium text-blue-900 dark:text-blue-100 mb-2 block",body:"text-gray-800 dark:text-gray-200 text-sm leading-relaxed"},purple:{container:"bg-gradient-to-r from-purple-50 to-pink-50 dark:from-purple-900/20 dark:to-pink-900/20 rounded-lg p-4 border border-purple-200 dark:border-purple-700",icon:"h-5 w-5 text-purple-600 dark:text-purple-400 mr-3 mt-0.5 flex-shrink-0",title:"text-sm font-medium text-purple-900 dark:text-purple-100 mb-2 block",body:"text-gray-800 dark:text-gray-200 text-sm leading-relaxed"},green:{container:"bg-gradient-to-r from-green-50 to-emerald-50 dark:from-green-900/20 dark:to-emerald-900/20 rounded-lg p-4 border border-green-200 dark:border-green-700",icon:"h-5 w-5 text-green-600 dark:text-green-400 mr-3 mt-0.5 flex-shrink-0",title:"text-sm font-medium text-green-900 dark:text-green-100 mb-2 block",body:"text-gray-800 dark:text-gray-200 text-sm leading-relaxed"},orange:{container:"bg-gradient-to-r from-orange-50 to-rose-50 dark:from-orange-900/20 dark:to-rose-900/20 rounded-lg p-4 border border-orange-200 dark:border-orange-700",icon:"h-5 w-5 text-orange-600 dark:text-orange-400 mr-3 mt-0.5 flex-shrink-0",title:"text-sm font-medium text-orange-900 dark:text-orange-100 mb-2 block",body:"text-gray-800 dark:text-gray-200 text-sm leading-relaxed"}},ce=V.forwardRef(({className:p,title:e,icon:o,tone:i="blue",children:s,...l$1},u)=>{let b=Ae[i];return jsx("div",{ref:u,className:a(b.container,p),...l$1,children:jsxs("div",{className:"flex items-start mb-2",children:[jsx(l,{name:o,className:b.icon}),jsxs("div",{className:"flex-1",children:[jsx("span",{className:b.title,children:e}),jsx("div",{className:b.body,children:s})]})]})})});ce.displayName="InfoCard";export{Q as Bookmark,X as ChatMessage,ee as EmotionAnalysis,F as EmotionButton,L as EmotionMeter,te as EmotionSelector,ie as FeatureCard,de as HeroSection,ce as InfoCard,re as LanguageToggle,ae as ScrollIndicator,le as ScrollProgress,ne as Scrollbar};//# sourceMappingURL=advanced.mjs.map
|
|
2
|
+
//# sourceMappingURL=advanced.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Bookmark.tsx","../src/components/ChatMessage.tsx","../src/components/EmotionMeter.tsx","../src/components/EmotionAnalysis.tsx","../src/components/EmotionButton.tsx","../src/components/EmotionSelector.tsx","../src/components/LanguageToggle.tsx","../src/components/ScrollIndicator.tsx","../src/components/ScrollProgress.tsx","../src/components/scrollbar/scrollbar.tsx","../src/components/FeatureCard.tsx","../src/components/HeroSection.tsx","../src/components/InfoCard.tsx"],"names":["Bookmark","React","className","id","storageKey","defaultBookmarked","onBookmarkChange","size","variant","props","ref","isBookmarked","setIsBookmarked","useState","useEffect","savedBookmarks","bookmarks","toggleBookmark","newBookmarked","index","sizeClasses","variantClasses","jsx","merge","Icon","ChatMessage","message","user","assistant","showAvatar","showTimestamp","showEmotion","theme","_a","_b","_c","isUser","getEmotionColor","emotion","formatTime","date","jsxs","Avatar","AvatarImage","AvatarFallback","Badge","Card","CardContent","EmotionMeter","value","max","color","emotionColors","percentage","EmotionAnalysis","primaryEmotion","emotionDistribution","keywords","intensity","positivity","energy","showMeter","showDistribution","showKeywords","showMetrics","layout","getIntensityLabel","getPositivityLabel","getEnergyLabel","Fragment","keyword","CardHeader","CardTitle","CardDescription","item","EmotionButton","isSelected","defaultEmotions","EmotionSelector","selectedEmotion","onEmotionSelect","showIntensity","onIntensityChange","emotions","handleEmotionClick","emotionKey","renderEmotionItem","layoutClasses","e","LanguageToggle","showLabel","languages","currentLanguage","onLanguageChange","isOpen","setIsOpen","dropdownRef","currentLang","lang","handleClickOutside","event","handleLanguageChange","languageCode","renderIcon","language","nextIndex","ScrollIndicator","targetId","text","iconName","iconSize","position","animated","autoHide","hideThreshold","isVisible","setIsVisible","handleScroll","scrollTop","scrollToTarget","targetElement","currentSection","nextSection","positionClasses","Button","ScrollProgress","height","showPercentage","progress","setProgress","updateProgress","docHeight","currentProgress","progressColors","Scrollbar","orientation","smooth","children","getVariantClasses","getSizeClasses","getOrientationClasses","baseClasses","FeatureCard","icon","title","description","hover","gradient","customGradient","getGradientClass","hoverClasses","gradients","HeroSection","subtitle","primaryAction","secondaryAction","background","customBackground","titleSizeClasses","subtitleSizeClasses","descriptionSizeClasses","backgroundClasses","backgroundContent","_","i","toneClasses","InfoCard","tone","t"],"mappings":"gmCAoDA,IAAMA,CAAAA,CAAWC,CAAAA,CAAM,UAAA,CACrB,CAAC,CACC,SAAA,CAAAC,CAAAA,CACA,EAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CAAa,WAAA,CACb,iBAAA,CAAAC,CAAAA,CAAoB,KAAA,CACpB,gBAAA,CAAAC,CAAAA,CACA,IAAA,CAAAC,IAAO,IAAA,CACP,OAAA,CAAAC,CAAAA,CAAU,SAAA,CACV,GAAGC,CACL,CAAA,CAAGC,CAAAA,GAAQ,CACT,GAAM,CAACC,CAAAA,CAAcC,CAAe,CAAA,CAAIC,QAAAA,CAASR,CAAiB,CAAA,CAGlES,SAAAA,CAAU,IAAM,CACd,IAAMC,CAAAA,CAAiB,YAAA,CAAa,OAAA,CAAQX,CAAU,CAAA,CACtD,GAAIW,CAAAA,CAAgB,CAClB,IAAMC,EAAY,IAAA,CAAK,KAAA,CAAMD,CAAc,CAAA,CAC3CH,CAAAA,CAAgBI,CAAAA,CAAU,QAAA,CAASb,CAAE,CAAC,EACxC,CACF,CAAA,CAAG,CAACA,CAAAA,CAAIC,CAAU,CAAC,CAAA,CAGnB,IAAMa,CAAAA,CAAiB,IAAM,CAC3B,IAAMC,CAAAA,CAAgB,CAACP,CAAAA,CACvBC,CAAAA,CAAgBM,CAAa,CAAA,CAG7B,IAAMH,EAAiB,YAAA,CAAa,OAAA,CAAQX,CAAU,CAAA,CAChDY,CAAAA,CAAYD,CAAAA,CAAiB,IAAA,CAAK,KAAA,CAAMA,CAAc,CAAA,CAAI,EAAC,CAEjE,GAAIG,CAAAA,CACGF,CAAAA,CAAU,QAAA,CAASb,CAAE,CAAA,EACxBa,CAAAA,CAAU,IAAA,CAAKb,CAAE,CAAA,CAAA,KAEd,CACL,IAAMgB,CAAAA,CAAQH,CAAAA,CAAU,OAAA,CAAQb,CAAE,CAAA,CAC9BgB,CAAAA,CAAQ,IACVH,CAAAA,CAAU,MAAA,CAAOG,CAAAA,CAAO,CAAC,EAE7B,CAEA,YAAA,CAAa,OAAA,CAAQf,CAAAA,CAAY,IAAA,CAAK,SAAA,CAAUY,CAAS,CAAC,CAAA,CAC1DV,GAAA,IAAA,EAAAA,CAAAA,CAAmBY,CAAAA,EACrB,CAAA,CAEME,CAAAA,CAAc,CAClB,EAAA,CAAI,SAAA,CACJ,EAAA,CAAI,SAAA,CACJ,EAAA,CAAI,WACN,CAAA,CAEMC,CAAAA,CAAiB,CACrB,OAAA,CAAS,wDAAA,CACT,MAAA,CAAQ,yDAAA,CACR,OAAA,CAAS,sIACX,CAAA,CAEA,OACEC,GAAAA,CAAC,QAAA,CAAA,CACC,GAAA,CAAKZ,CAAAA,CACL,OAAA,CAASO,CAAAA,CACT,SAAA,CAAWM,CAAAA,CACT,4GAAA,CACAH,CAAAA,CAAYb,GAAI,CAAA,CAChBc,CAAAA,CAAeb,CAAO,CAAA,CACtBN,CACF,CAAA,CACC,GAAGO,CAAAA,CAEJ,QAAA,CAAAa,GAAAA,CAACE,CAAAA,CAAA,CACC,IAAA,CAAK,MAAA,CACL,SAAA,CAAWD,CAAAA,CACT,6BAAA,CACAZ,CAAAA,EAAgB,cAClB,CAAA,CACF,CAAA,CACF,CAEJ,CACF,EAEAX,CAAAA,CAAS,WAAA,CAAc,UAAA,CC5BvB,IAAMyB,CAAAA,CAAcxB,CAAAA,CAAM,UAAA,CACxB,CAAC,CACC,UAAAC,CAAAA,CACA,OAAA,CAAAwB,CAAAA,CACA,IAAA,CAAAC,CAAAA,CAAO,CAAE,IAAA,CAAM,oBAAA,CAAO,KAAA,CAAO,SAAU,CAAA,CACvC,SAAA,CAAAC,GAAAA,CAAY,CAAE,IAAA,CAAM,IAAA,CAAM,KAAA,CAAO,SAAU,CAAA,CAC3C,UAAA,CAAAC,CAAAA,CAAa,IAAA,CACb,aAAA,CAAAC,CAAAA,CAAgB,IAAA,CAChB,WAAA,CAAAC,CAAAA,CAAc,IAAA,CACd,OAAA,CAAAvB,GAAAA,CAAU,UACV,KAAA,CAAAwB,CAAAA,CAAQ,CACN,YAAA,CAAc,SAAA,CACd,cAAA,CAAgB,SAAA,CAChB,UAAA,CAAY,SAAA,CACZ,YAAA,CAAc,SAChB,CAAA,CACA,GAAGvB,CACL,EAAGC,CAAAA,GAAQ,CA3Hb,IAAAuB,GAAAA,CAAAC,CAAAA,CAAAC,CAAAA,CA4HI,IAAMC,GAAAA,CAASV,CAAAA,CAAQ,IAAA,GAAS,MAAA,CACZA,CAAAA,CAAQ,IAAA,GAAS,YACpBA,CAAAA,CAAQ,IAAA,GAAS,QAAA,KAE5BW,CAAAA,CAAmBC,CAAAA,EAClBA,CAAAA,CAEiB,CACpB,GAAA,CAAK,+BAAA,CACL,OAAA,CAAS,2BAAA,CACT,KAAA,CAAO,yBAAA,CACP,IAAA,CAAM,6BAAA,CACN,UAAA,CAAY,2BAAA,CACZ,KAAA,CAAO,2BAAA,CACP,SAAA,CAAW,+BAAA,CACX,UAAA,CAAY,+BACd,CAAA,CAEqBA,CAAqC,CAAA,EAAK,2BAAA,CAb1C,aAAA,CAgBjBC,CAAAA,CAAcC,GACXA,CAAAA,CAAK,kBAAA,CAAmB,OAAA,CAAS,CACtC,IAAA,CAAM,SAAA,CACN,MAAA,CAAQ,SACV,CAAC,EAGH,OAAIhC,GAAAA,GAAY,QAAA,CAEZc,GAAAA,CAAC,OACC,GAAA,CAAKZ,CAAAA,CACL,SAAA,CAAWa,CAAAA,CACT,aAAA,CACAa,GAAAA,CAAS,aAAA,CAAgB,eAAA,CACzBlC,CACF,CAAA,CACC,GAAGO,CAAAA,CAEJ,QAAA,CAAAgC,IAAAA,CAAC,OAAI,SAAA,CAAWlB,CAAAA,CACd,4BAAA,CACAa,GAAAA,CAAS,kCAAA,CAAqC,UAChD,CAAA,CACG,QAAA,CAAA,CAAAP,CAAAA,EACCY,IAAAA,CAACC,GAAAA,CAAA,CAAO,SAAA,CAAU,uBAAA,CAChB,QAAA,CAAA,CAAApB,GAAAA,CAACqB,CAAAA,CAAA,CACC,GAAA,CAAKP,GAAAA,CAAST,CAAAA,CAAK,MAAA,CAASC,GAAAA,CAAU,MAAA,CACtC,GAAA,CAAKQ,GAAAA,CAAST,CAAAA,CAAK,IAAA,CAAOC,GAAAA,CAAU,IAAA,CACtC,EACAN,GAAAA,CAACsB,CAAAA,CAAA,CACC,KAAA,CAAO,CACL,eAAA,CAAiBR,GAAAA,CAAST,CAAAA,CAAK,KAAA,CAAQC,GAAAA,CAAU,KACnD,CAAA,CAEE,QAAA,CAAA,CAAAK,GAAAA,CAAAG,IAAST,CAAAA,CAAK,IAAA,CAAOC,GAAAA,CAAU,IAAA,GAA/B,IAAA,CAAA,MAAA,CAAAK,GAAAA,CAAsC,MAAA,CAAO,CAAA,CAAA,CACjD,CAAA,CAAA,CACF,CAAA,CAGFQ,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,UAAAnB,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWC,CAAAA,CACT,8CAAA,CACAa,GAAAA,CACI,eAAA,CACA,eACN,CAAA,CACA,KAAA,CAAO,CACL,eAAA,CAAiBA,GAAAA,CAASJ,CAAAA,CAAM,YAAA,CAAeA,CAAAA,CAAM,UAAA,CACrD,KAAA,CAAOI,GAAAA,CAASJ,CAAAA,CAAM,cAAA,CAAiBA,CAAAA,CAAM,YAC/C,CAAA,CAEC,QAAA,CAAAN,CAAAA,CAAQ,QAAA,CACPe,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iBACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gDAAA,CAAiD,CAAA,CAChEA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0DAAA,CAA2D,CAAA,CAC1EA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0DAAA,CAA2D,CAAA,CAAA,CAC5E,CAAA,CAEAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CAAuB,QAAA,CAAAI,CAAAA,CAAQ,OAAA,CAAQ,CAAA,CAE1D,CAAA,CAEAe,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWlB,CAAAA,CACd,4DACAa,GAAAA,CAAS,aAAA,CAAgB,eAC3B,CAAA,CACG,QAAA,CAAA,CAAAN,CAAAA,EACCR,GAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAiB,CAAAA,CAAWb,CAAAA,CAAQ,SAAS,CAAA,CAAE,CAAA,CAEtCK,CAAAA,EAAeL,CAAAA,CAAQ,OAAA,EACtBJ,GAAAA,CAACuB,CAAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,SAAA,CAAWtB,CAAAA,CAAM,SAAA,CAAWc,CAAAA,CAAgBX,CAAAA,CAAQ,OAAO,CAAC,CAAA,CAE3D,SAAAA,CAAAA,CAAQ,OAAA,CACX,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAIAlB,GAAAA,GAAY,SAAA,CAEZiC,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAK/B,CAAAA,CACL,SAAA,CAAWa,EACT,iCAAA,CACArB,CACF,CAAA,CACC,GAAGO,CAAAA,CAEH,QAAA,CAAA,CAAAoB,CAAAA,EACCY,IAAAA,CAACC,GAAAA,CAAA,CAAO,SAAA,CAAU,uBAAA,CAChB,QAAA,CAAA,CAAApB,GAAAA,CAACqB,EAAA,CACC,GAAA,CAAKP,GAAAA,CAAST,CAAAA,CAAK,MAAA,CAASC,GAAAA,CAAU,MAAA,CACtC,GAAA,CAAKQ,GAAAA,CAAST,CAAAA,CAAK,IAAA,CAAOC,GAAAA,CAAU,IAAA,CACtC,CAAA,CACAN,GAAAA,CAACsB,CAAAA,CAAA,CACC,KAAA,CAAO,CACL,eAAA,CAAiBR,GAAAA,CAAST,CAAAA,CAAK,KAAA,CAAQC,GAAAA,CAAU,KACnD,CAAA,CAEE,QAAA,CAAA,CAAAM,CAAAA,CAAAE,GAAAA,CAAST,CAAAA,CAAK,KAAOC,GAAAA,CAAU,IAAA,GAA/B,IAAA,CAAA,MAAA,CAAAM,CAAAA,CAAsC,MAAA,CAAO,CAAA,CAAA,CACjD,CAAA,CAAA,CACF,CAAA,CAGFO,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,OAAI,SAAA,CAAU,kCAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CACb,QAAA,CAAAc,GAAAA,CAAST,CAAAA,CAAK,IAAA,CAAOC,GAAAA,CAAU,IAAA,CAClC,CAAA,CACCE,GACCR,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAAiB,CAAAA,CAAWb,CAAAA,CAAQ,SAAS,CAAA,CAC/B,CAAA,CAEDK,CAAAA,EAAeL,CAAAA,CAAQ,OAAA,EACtBJ,GAAAA,CAACuB,CAAAA,CAAA,CACC,OAAA,CAAQ,WAAA,CACR,SAAA,CAAWtB,CAAAA,CAAM,SAAA,CAAWc,CAAAA,CAAgBX,CAAAA,CAAQ,OAAO,CAAC,CAAA,CAE3D,QAAA,CAAAA,CAAAA,CAAQ,OAAA,CACX,CAAA,CAAA,CAEJ,EAEAJ,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CACZ,QAAA,CAAAI,CAAAA,CAAQ,QAAA,CACPe,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,6DAAA,CAA8D,CAAA,CAC7EA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uEAAA,CAAwE,CAAA,CACvFA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uEAAA,CAAwE,CAAA,CAAA,CACzF,CAAA,CAEAA,GAAAA,CAAC,OAAI,SAAA,CAAU,qBAAA,CAAuB,QAAA,CAAAI,CAAAA,CAAQ,OAAA,CAAQ,CAAA,CAE1D,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAMFe,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAK/B,CAAAA,CACL,SAAA,CAAWa,CAAAA,CACT,iCAAA,CACArB,CACF,CAAA,CACC,GAAGO,CAAAA,CAEH,QAAA,CAAA,CAAAoB,CAAAA,EACCY,IAAAA,CAACC,GAAAA,CAAA,CAAO,SAAA,CAAU,yBAAA,CAChB,QAAA,CAAA,CAAApB,GAAAA,CAACqB,CAAAA,CAAA,CACC,GAAA,CAAKP,GAAAA,CAAST,CAAAA,CAAK,MAAA,CAASC,GAAAA,CAAU,MAAA,CACtC,GAAA,CAAKQ,GAAAA,CAAST,CAAAA,CAAK,IAAA,CAAOC,GAAAA,CAAU,IAAA,CACtC,CAAA,CACAN,GAAAA,CAACsB,CAAAA,CAAA,CACC,KAAA,CAAO,CACL,eAAA,CAAiBR,GAAAA,CAAST,CAAAA,CAAK,KAAA,CAAQC,GAAAA,CAAU,KACnD,CAAA,CAEE,QAAA,CAAA,CAAAO,CAAAA,CAAAC,GAAAA,CAAST,CAAAA,CAAK,IAAA,CAAOC,IAAU,IAAA,GAA/B,IAAA,CAAA,MAAA,CAAAO,CAAAA,CAAsC,MAAA,CAAO,CAAA,CAAA,CACjD,CAAA,CAAA,CACF,CAAA,CAGFM,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CACb,QAAA,CAAAc,GAAAA,CAAST,CAAAA,CAAK,IAAA,CAAOC,GAAAA,CAAU,IAAA,CAClC,CAAA,CACCE,CAAAA,EACCR,GAAAA,CAAC,QAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAAiB,CAAAA,CAAWb,CAAAA,CAAQ,SAAS,CAAA,CAC/B,CAAA,CAEDK,CAAAA,EAAeL,CAAAA,CAAQ,OAAA,EACtBJ,GAAAA,CAACuB,CAAAA,CAAA,CACC,QAAQ,WAAA,CACR,SAAA,CAAWtB,CAAAA,CAAM,SAAA,CAAWc,CAAAA,CAAgBX,CAAAA,CAAQ,OAAO,CAAC,CAAA,CAE3D,QAAA,CAAAA,CAAAA,CAAQ,OAAA,CACX,CAAA,CAAA,CAEJ,CAAA,CAEAJ,IAACwB,CAAAA,CAAA,CAAK,SAAA,CAAWvB,CAAAA,CACf,cAAA,CACAa,GAAAA,CAAS,oCAAA,CAAuC,UAClD,CAAA,CACE,QAAA,CAAAd,GAAAA,CAACyB,CAAAA,CAAA,CAAY,SAAA,CAAU,KAAA,CACpB,QAAA,CAAArB,CAAAA,CAAQ,QAAA,CACPe,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gDAAA,CAAiD,CAAA,CAChEA,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,0DAAA,CAA2D,CAAA,CAC1EA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0DAAA,CAA2D,CAAA,CAAA,CAC5E,CAAA,CAEAA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CAAuB,QAAA,CAAAI,CAAAA,CAAQ,OAAA,CAAQ,CAAA,CAE1D,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CACF,EAEAD,CAAAA,CAAY,WAAA,CAAc,aAAA,CCvT1B,IAAMuB,CAAAA,CAAe/C,CAAAA,CAAM,UAAA,CACzB,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,KAAA,CAAA+C,CAAAA,CAAO,GAAA,CAAAC,CAAAA,CAAM,GAAA,CAAK,IAAA,CAAA3C,CAAAA,CAAO,IAAA,CAAM,KAAA,CAAA4C,CAAAA,CAAQ,MAAA,CAAQ,GAAG1C,CAAM,CAAA,CAAGC,CAAAA,GAAQ,CAC/E,IAAMU,CAAAA,CAAc,CAClB,GAAI,KAAA,CACJ,EAAA,CAAI,KAAA,CACJ,EAAA,CAAI,KACN,CAAA,CAGMgC,CAAAA,CAAwC,CAC5C,IAAA,CAAM,aAAA,CACN,KAAA,CAAO,cAAA,CACP,MAAA,CAAQ,eAAA,CACR,IAAK,YAAA,CAEL,MAAA,CAAQ,eAAA,CACR,MAAA,CAAQ,eAAA,CACR,MAAA,CAAQ,eAAA,CACR,IAAA,CAAM,aAAA,CACN,IAAA,CAAM,aACR,CAAA,CAEMC,CAAAA,CAAa,IAAA,CAAK,IAAI,IAAA,CAAK,GAAA,CAAKJ,CAAAA,CAAQC,CAAAA,CAAO,GAAA,CAAK,CAAC,CAAA,CAAG,GAAG,CAAA,CAEjE,OACE5B,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKZ,CAAAA,CACL,SAAA,CAAWa,CAAAA,CACT,kDAAA,CACAH,CAAAA,CAAYb,CAAI,CAAA,CAChBL,CACF,CAAA,CACC,GAAGO,CAAAA,CAEJ,QAAA,CAAAa,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWC,CAAAA,CACT,iDAAA,CACA6B,EAAcD,CAAK,CAAA,EAAKC,CAAAA,CAAc,IACxC,CAAA,CACA,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,EAAGC,CAAU,CAAA,CAAA,CAAI,CAAA,CACnC,CAAA,CACF,CAEJ,CACF,EACAL,CAAAA,CAAa,WAAA,CAAc,cAAA,CCL3B,IAAMM,EAAAA,CAAkBrD,CAAAA,CAAM,WAC5B,CAAC,CACC,SAAA,CAAAC,CAAAA,CACA,cAAA,CAAAqD,GAAAA,CACA,mBAAA,CAAAC,CAAAA,CAAsB,EAAC,CACvB,QAAA,CAAAC,GAAAA,CAAW,EAAC,CACZ,SAAA,CAAAC,CAAAA,CAAY,EAAA,CACZ,UAAA,CAAAC,CAAAA,CAAa,EAAA,CACb,MAAA,CAAAC,CAAAA,CAAS,EAAA,CACT,SAAA,CAAAC,CAAAA,CAAY,IAAA,CACZ,gBAAA,CAAAC,CAAAA,CAAmB,IAAA,CACnB,YAAA,CAAAC,EAAe,IAAA,CACf,WAAA,CAAAC,CAAAA,CAAc,IAAA,CACd,MAAA,CAAAC,GAAAA,CAAS,UAAA,CACT,GAAGxD,GACL,CAAA,CAAGC,CAAAA,GAAQ,CACT,IAAMwD,CAAAA,CAAqBjB,GACrBA,CAAAA,CAAQ,EAAA,CAAW,cAAA,CACnBA,CAAAA,CAAQ,EAAA,CAAW,cAAA,CAChB,cAAA,CAGHkB,CAAAA,CAAsBlB,CAAAA,EACtBA,CAAAA,CAAQ,EAAA,CAAW,oBAAA,CACnBA,CAAAA,CAAQ,EAAA,CAAW,qBAChB,oBAAA,CAGHmB,GAAAA,CAAkBnB,CAAAA,EAClBA,CAAAA,CAAQ,EAAA,CAAW,cAAA,CACnBA,CAAAA,CAAQ,EAAA,CAAW,cAAA,CAChB,cAAA,CAGT,OAAIgB,GAAAA,GAAW,SAAA,CAEXxB,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAK/B,CAAAA,CACL,SAAA,CAAWa,CAAAA,CAAM,WAAA,CAAarB,CAAS,CAAA,CACtC,GAAGO,GAAAA,CAEH,QAAA,CAAA,CAAA8C,GAAAA,EACCd,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,UAAAnB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,4BAAA,CAAM,CAAA,CAC5CmB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gCACb,QAAA,CAAA,CAAAc,GAAAA,CAAe,IAAA,CAAK,IAAA,CAAGA,GAAAA,CAAe,SAAA,CAAU,IAAA,CAAA,CACnD,CAAA,CACCM,CAAAA,EACCvC,GAAAA,CAAC0B,CAAAA,CAAA,CACC,KAAA,CAAOO,GAAAA,CAAe,UACtB,IAAA,CAAK,IAAA,CACL,KAAA,CAAM,MAAA,CACR,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAGDS,CAAAA,EACCvB,IAAAA,CAAA4B,QAAAA,CAAA,CACE,QAAA,CAAA,CAAA5B,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,4BAAA,CAAM,CAAA,CAC5CA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAA4C,CAAAA,CAAkBR,CAAS,EAC9B,CAAA,CAAA,CACF,CAAA,CACAjB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,qBAAA,CAAI,CAAA,CAC1CA,GAAAA,CAAC,QAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAA6C,CAAAA,CAAmBR,CAAU,CAAA,CAChC,CAAA,CAAA,CACF,CAAA,CACAlB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,QAAK,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,qBAAA,CAAI,CAAA,CAC1CA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAA8C,GAAAA,CAAeR,CAAM,CAAA,CACxB,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGDG,CAAAA,EAAgBN,GAAAA,CAAS,MAAA,CAAS,CAAA,EACjChB,IAAAA,CAAC,KAAA,CAAA,CACC,QAAA,CAAA,CAAAnB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,qBAAA,CAAI,CAAA,CAC1CA,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,2BAAA,CACZ,QAAA,CAAAmC,GAAAA,CAAS,GAAA,CAAKa,CAAAA,EACbhD,GAAAA,CAACuB,CAAAA,CAAA,CAAoB,OAAA,CAAQ,WAAA,CAAY,SAAA,CAAU,SAAA,CAChD,QAAA,CAAAyB,CAAAA,CAAAA,CADSA,CAEZ,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAIAL,GAAAA,GAAW,MAAA,CAEXxB,IAAAA,CAACK,CAAAA,CAAA,CACC,GAAA,CAAKpC,CAAAA,CACL,SAAA,CAAWa,CAAAA,CAAM,EAAA,CAAIrB,CAAS,CAAA,CAC7B,GAAGO,GAAAA,CAEJ,QAAA,CAAA,CAAAgC,IAAAA,CAAC8B,CAAAA,CAAA,CACC,QAAA,CAAA,CAAA9B,IAAAA,CAAC+B,CAAAA,CAAA,CAAU,SAAA,CAAU,mBAAA,CACnB,QAAA,CAAA,CAAAlD,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,eAAA,CAAgB,QAAA,CAAA,QAAA,CAAC,CAAA,CAAO,iBAAA,CAAA,CAE1C,CAAA,CACAA,GAAAA,CAACmD,CAAAA,CAAA,CAAgB,QAAA,CAAA,wCAAA,CAEjB,CAAA,CAAA,CACF,CAAA,CACAhC,IAAAA,CAACM,CAAAA,CAAA,CAAY,SAAA,CAAU,WAAA,CACpB,QAAA,CAAA,CAAAQ,GAAAA,EACCd,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CACb,QAAA,CAAA,CAAAnB,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CAAc,QAAA,CAAA,4BAAA,CAAM,CAAA,CACpCmB,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,4BAAA,CACb,QAAA,CAAA,CAAAc,GAAAA,CAAe,IAAA,CAAK,IAAA,CAAGA,GAAAA,CAAe,UAAU,IAAA,CAAA,CACnD,CAAA,CAAA,CACF,CAAA,CACCM,CAAAA,EACCvC,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CACb,QAAA,CAAAA,GAAAA,CAAC0B,CAAAA,CAAA,CACC,KAAA,CAAOO,GAAAA,CAAe,SAAA,CACtB,IAAA,CAAK,IAAA,CACL,KAAA,CAAM,MAAA,CACR,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAGDS,CAAAA,EACCvB,IAAAA,CAAA4B,QAAAA,CAAA,CACE,QAAA,CAAA,CAAA5B,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,UACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CAAc,QAAA,CAAA,4BAAA,CAAM,CAAA,CACpCA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,4BAAA,CACb,QAAA,CAAA4C,CAAAA,CAAkBR,CAAS,EAC9B,CAAA,CAAA,CACF,CAAA,CACAjB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CAAc,QAAA,CAAA,qBAAA,CAAI,CAAA,CAClCA,GAAAA,CAAC,QAAK,SAAA,CAAU,4BAAA,CACb,QAAA,CAAA6C,CAAAA,CAAmBR,CAAU,CAAA,CAChC,CAAA,CAAA,CACF,CAAA,CACAlB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CAAc,QAAA,CAAA,qBAAA,CAAI,CAAA,CAClCA,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,4BAAA,CACb,QAAA,CAAA8C,GAAAA,CAAeR,CAAM,CAAA,CACxB,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGDG,GAAgBN,GAAAA,CAAS,MAAA,CAAS,CAAA,EACjChB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CAAc,QAAA,CAAA,qBAAA,CAAI,CAAA,CAClCA,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,2BAAA,CACZ,QAAA,CAAAmC,GAAAA,CAAS,GAAA,CAAKa,CAAAA,EACbhD,GAAAA,CAACuB,CAAAA,CAAA,CAAoB,OAAA,CAAQ,WAAA,CAAY,SAAA,CAAU,SAAA,CAChD,SAAAyB,CAAAA,CAAAA,CADSA,CAEZ,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAMF7B,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAK/B,CAAAA,CACL,SAAA,CAAWa,CAAAA,CAAM,WAAA,CAAarB,CAAS,CAAA,CACtC,GAAGO,GAAAA,CAEH,QAAA,CAAA,CAAA8C,GAAAA,EACCd,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,uBAAA,CAAwB,qCAAK,CAAA,CAC3CmB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,aAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iCAAA,CACZ,QAAA,CAAAiC,GAAAA,CAAe,IAAA,CAClB,CAAA,CACAd,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+BAAA,CACZ,QAAA,CAAA,CAAAc,GAAAA,CAAe,SAAA,CAAU,gBAAA,CAAA,CAC5B,CAAA,CAAA,CACF,CAAA,CACCM,CAAAA,EACmBvC,IAAC0B,CAAAA,CAAA,CACf,KAAA,CAAOO,GAAAA,CAAe,SAAA,CACtB,IAAA,CAAK,IAAA,CACL,KAAA,CAAM,MAAA,CACR,CAAA,CAAA,CAEN,CAAA,CAAA,CACF,CAAA,CAGDO,CAAAA,EAAoBN,CAAAA,CAAoB,MAAA,CAAS,CAAA,EAChDf,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,uBAAA,CAAwB,QAAA,CAAA,2BAAA,CAAK,CAAA,CAC3CA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,YACZ,QAAA,CAAAkC,CAAAA,CAAoB,GAAA,CAAI,CAACkB,CAAAA,CAAMvD,CAAAA,GAC9BsB,IAAAA,CAAC,KAAA,CAAA,CAAgB,SAAA,CAAU,WAAA,CACzB,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oCACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAuB,QAAA,CAAAoD,CAAAA,CAAK,OAAA,CAAQ,CAAA,CACpDjC,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CACb,QAAA,CAAA,CAAAiC,EAAK,UAAA,CAAW,GAAA,CAAA,CACnB,CAAA,CAAA,CACF,CAAA,CACApD,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,EAAGoD,CAAAA,CAAK,KAAK,CAAA,6CAAA,CAAA,CACxB,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,EAAGA,CAAAA,CAAK,UAAU,CAAA,CAAA,CAAI,CAAA,CACxC,CAAA,CACF,CAAA,CAAA,CAAA,CAZQvD,CAaV,CACD,CAAA,CACH,CAAA,CAAA,CACF,EAGD6C,CAAAA,EACCvB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,uBAAA,CAAwB,QAAA,CAAA,2BAAA,CAAK,CAAA,CAC3CmB,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,uCAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,2BAAA,CAAK,CAAA,CAC1CA,GAAAA,CAAC,OAAI,SAAA,CAAU,iCAAA,CACZ,QAAA,CAAA4C,CAAAA,CAAkBR,CAAS,CAAA,CAC9B,CAAA,CACApC,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,yDAAA,CACV,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,EAAGoC,CAAS,CAAA,CAAA,CAAI,CAAA,CAClC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACAjB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,UAAAnB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,oBAAA,CAAG,CAAA,CACxCA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACZ,QAAA,CAAA6C,CAAAA,CAAmBR,CAAU,CAAA,CAChC,EACArC,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,2DAAA,CACV,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,EAAGqC,CAAU,GAAI,CAAA,CACnC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACAlB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,oBAAA,CAAG,CAAA,CACxCA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oCAAA,CACZ,QAAA,CAAA8C,GAAAA,CAAeR,CAAM,CAAA,CACxB,CAAA,CACAtC,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CACb,QAAA,CAAAA,GAAAA,CAAC,OACC,SAAA,CAAU,4DAAA,CACV,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,EAAGsC,CAAM,CAAA,CAAA,CAAI,CAAA,CAC/B,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAGDG,CAAAA,EAAgBN,GAAAA,CAAS,MAAA,CAAS,CAAA,EACjChB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,uBAAA,CAAwB,QAAA,CAAA,iCAAA,CAAM,CAAA,CAC5CA,GAAAA,CAAC,OAAI,SAAA,CAAU,sBAAA,CACZ,QAAA,CAAAmC,GAAAA,CAAS,GAAA,CAAKa,CAAAA,EACbhD,GAAAA,CAACuB,CAAAA,CAAA,CAAoB,OAAA,CAAQ,SAAA,CAAU,SAAA,CAAU,SAAA,CAC9C,QAAA,CAAAyB,CAAAA,CAAAA,CADSA,CAEZ,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAEJ,CACF,EAEAhB,EAAAA,CAAgB,WAAA,CAAc,iBAAA,CC7U9B,IAAMqB,CAAAA,CAAgB1E,CAAAA,CAAM,UAAA,CAC1B,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,OAAA,CAAAoC,CAAAA,CAAS,UAAA,CAAAsC,CAAAA,CAAa,KAAA,CAAO,KAAArE,CAAAA,CAAO,IAAA,CAAM,GAAGE,CAAM,CAAA,CAAGC,CAAAA,GAQhEY,GAAAA,CAAC,QAAA,CAAA,CACC,GAAA,CAAKZ,CAAAA,CACL,SAAA,CAAWa,CAAAA,CACT,uHAAA,CAVc,CAClB,GAAI,iBAAA,CACJ,EAAA,CAAI,mBAAA,CACJ,EAAA,CAAI,mBACN,CAAA,CAOkBhB,CAAI,CAAA,CAChBqE,CAAAA,CACI,gDAAA,CACA,gEAAA,CACJ1E,CACF,CAAA,CACC,GAAGO,CAAAA,CAEH,QAAA,CAAA6B,CAAAA,CACH,CAGN,EACAqC,CAAAA,CAAc,WAAA,CAAc,eAAA,KC7BtBE,EAAAA,CAAkB,CACtB,CAAE,GAAA,CAAK,KAAA,CAAO,KAAA,CAAO,cAAA,CAAM,IAAA,CAAM,OAAA,CAAS,KAAA,CAAO,QAAS,CAAA,CAC1D,CAAE,GAAA,CAAK,SAAA,CAAW,KAAA,CAAO,cAAA,CAAM,IAAA,CAAM,OAAA,CAAS,KAAA,CAAO,MAAO,CAAA,CAC5D,CAAE,GAAA,CAAK,OAAA,CAAS,KAAA,CAAO,cAAA,CAAM,IAAA,CAAM,OAAA,CAAS,KAAA,CAAO,KAAM,CAAA,CACzD,CAAE,GAAA,CAAK,MAAA,CAAQ,KAAA,CAAO,cAAA,CAAM,IAAA,CAAM,OAAA,CAAS,KAAA,CAAO,OAAQ,CAAA,CAC1D,CAAE,GAAA,CAAK,YAAA,CAAc,KAAA,CAAO,cAAA,CAAM,IAAA,CAAM,MAAA,CAAQ,KAAA,CAAO,MAAO,CAAA,CAC9D,CAAE,GAAA,CAAK,OAAA,CAAS,KAAA,CAAO,cAAA,CAAM,IAAA,CAAM,KAAA,CAAO,KAAA,CAAO,MAAO,EACxD,CAAE,GAAA,CAAK,WAAA,CAAa,KAAA,CAAO,cAAA,CAAM,IAAA,CAAM,OAAA,CAAS,KAAA,CAAO,QAAS,CAAA,CAChE,CAAE,GAAA,CAAK,YAAA,CAAc,KAAA,CAAO,qBAAO,IAAA,CAAM,MAAA,CAAQ,KAAA,CAAO,QAAS,CACnE,CAAA,CAkCMC,EAAAA,CAAkB7E,CAAAA,CAAM,UAAA,CAC5B,CAAC,CACC,SAAA,CAAAC,CAAAA,CACA,eAAA,CAAA6E,EACA,eAAA,CAAAC,CAAAA,CACA,MAAA,CAAAf,CAAAA,CAAS,MAAA,CACT,aAAA,CAAAgB,CAAAA,CAAgB,KAAA,CAChB,SAAA,CAAAvB,CAAAA,CAAY,EAAA,CACZ,iBAAA,CAAAwB,CAAAA,CACA,QAAA,CAAAC,CAAAA,CAAWN,EAAAA,CACX,IAAA,CAAAtE,CAAAA,CAAO,IAAA,CACP,OAAA,CAAAC,CAAAA,CAAU,QAAA,CACV,GAAGC,CACL,CAAA,CAAGC,CAAAA,GAAQ,CACT,IAAM0E,CAAAA,CAAsBC,CAAAA,EAAuB,CACjDL,CAAAA,EAAA,IAAA,EAAAA,CAAAA,CAAkBK,CAAAA,EACpB,CAAA,CAEMC,CAAAA,CAAqBhD,CAAAA,EAAgC,CACzD,IAAMsC,CAAAA,CAAaG,CAAAA,GAAoBzC,CAAAA,CAAQ,GAAA,CAE/C,OAAI9B,CAAAA,GAAY,QAAA,CAEZc,GAAAA,CAACqD,CAAAA,CAAA,CAEC,OAAA,CAASrC,CAAAA,CAAQ,GAAA,CACjB,UAAA,CAAYsC,CAAAA,CACZ,IAAA,CAAMrE,CAAAA,CACN,OAAA,CAAS,IAAM6E,CAAAA,CAAmB9C,CAAAA,CAAQ,GAAG,CAAA,CAC7C,SAAA,CAAWf,CAAAA,CACT,6BAAA,CACAqD,CAAAA,EAAc,mCAChB,CAAA,CAEC,QAAA,CAAAtC,CAAAA,CAAQ,KAAA,CAAA,CAVJA,CAAAA,CAAQ,GAWf,CAAA,CAIA9B,CAAAA,GAAY,MAAA,CAEZc,GAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAWC,CAAAA,CACT,oFAAA,CACAqD,CAAAA,CACI,6BAAA,CACA,uCACN,CAAA,CACA,OAAA,CAAS,IAAMQ,CAAAA,CAAmB9C,CAAAA,CAAQ,GAAG,CAAA,CAE7C,SAAAG,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,CAAAA,CACd,uDAAA,CACAqD,CAAAA,CAAa,oCAAA,CAAuC,UACtD,CAAA,CACG,SAAAtC,CAAAA,CAAQ,IAAA,EACPG,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CACb,QAAA,CAAA,CAAAH,CAAAA,CAAQ,IAAA,GAAS,OAAA,EAAW,WAAA,CAC5BA,CAAAA,CAAQ,IAAA,GAAS,OAAA,EAAW,YAC5BA,CAAAA,CAAQ,IAAA,GAAS,OAAA,EAAW,WAAA,CAC5BA,CAAAA,CAAQ,IAAA,GAAS,OAAA,EAAW,cAAA,CAC5BA,CAAAA,CAAQ,IAAA,GAAS,MAAA,EAAU,QAAA,CAC3BA,CAAAA,CAAQ,IAAA,GAAS,KAAA,EAAS,WAAA,CAC1BA,CAAAA,CAAQ,IAAA,GAAS,MAAA,EAAU,WAAA,CAAA,CAC9B,CAAA,CAEJ,CAAA,CACAhB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oCAAA,CAAsC,QAAA,CAAAgB,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAA,CACtE,GA3BKA,CAAAA,CAAQ,GA4Bf,CAAA,CAIA9B,CAAAA,GAAY,MAAA,CAEZc,GAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CAAWC,CAAAA,CACT,uFAAA,CACAqD,CAAAA,CACI,oCAAA,CACA,4BACN,CAAA,CACA,QAAS,IAAMQ,CAAAA,CAAmB9C,CAAAA,CAAQ,GAAG,CAAA,CAE7C,QAAA,CAAAhB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,wBAAA,CAA0B,QAAA,CAAAgB,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAA,CATnDA,EAAQ,GAUf,CAAA,CAIG,IACT,CAAA,CAEMiD,CAAAA,CAAgB,CACpB,IAAA,CAAM,+DAAA,CACN,IAAA,CAAM,WAAA,CACN,OAAA,CAAS,sBACX,CAAA,CAEA,OACE9C,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAK/B,CAAAA,CACL,SAAA,CAAWa,CAAAA,CAAM,WAAA,CAAarB,CAAS,CAAA,CACtC,GAAGO,CAAAA,CAEJ,QAAA,CAAA,CAAAa,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWiE,CAAAA,CAActB,CAAM,CAAA,CACjC,QAAA,CAAAkB,CAAAA,CAAS,GAAA,CAAIG,CAAiB,CAAA,CACjC,CAAA,CAECL,CAAAA,EAAiBF,CAAAA,EAChBtC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,WAAA,CACb,QAAA,CAAA,CAAAA,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mCAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAsB,QAAA,CAAA,2BAAA,CAAK,CAAA,CAC3CmB,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CAAiC,UAAAiB,CAAAA,CAAU,GAAA,CAAA,CAAC,CAAA,CAAA,CAC9D,CAAA,CACApC,GAAAA,CAAC,OAAA,CAAA,CACC,IAAA,CAAK,OAAA,CACL,GAAA,CAAI,GAAA,CACJ,GAAA,CAAI,KAAA,CACJ,KAAA,CAAOoC,CAAAA,CACP,QAAA,CAAW8B,CAAAA,EAAMN,CAAAA,EAAA,IAAA,CAAA,MAAA,CAAAA,CAAAA,CAAoB,MAAA,CAAOM,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAA,CAC1D,SAAA,CAAU,sEAAA,CACZ,CAAA,CACA/C,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qDACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,cAAA,CAAE,CAAA,CACRA,GAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,cAAA,CAAE,CAAA,CACRA,GAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,cAAA,CAAE,CAAA,CAAA,CACV,CAAA,CAAA,CACF,CAAA,CAGDyD,CAAAA,EAAmBE,CAAAA,EAClB3D,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CACb,QAAA,CAAAA,GAAAA,CAAC0B,CAAAA,CAAA,CACC,KAAA,CAAOU,CAAAA,CACP,IAAA,CAAK,IAAA,CACL,KAAA,CAAM,OACR,CAAA,CACF,CAAA,CAAA,CAEJ,CAEJ,CACF,EAEAoB,EAAAA,CAAgB,WAAA,CAAc,iBAAA,CC5K9B,IAAMW,EAAAA,CAAiBxF,CAAAA,CAAM,UAAA,CAC3B,CAAC,CACC,SAAA,CAAAC,CAAAA,CACA,IAAA,CAAAK,CAAAA,CAAO,IAAA,CACP,OAAA,CAAAC,CAAAA,CAAU,QAAA,CACV,UAAAkF,CAAAA,CAAY,KAAA,CACZ,SAAA,CAAAC,CAAAA,CAAY,CACV,CAAE,IAAA,CAAM,IAAA,CAAM,IAAA,CAAM,oBAAA,CAAO,IAAA,CAAM,oBAAO,CAAA,CACxC,CAAE,KAAM,IAAA,CAAM,IAAA,CAAM,SAAA,CAAW,IAAA,CAAM,oBAAO,CAAA,CAC5C,CAAE,IAAA,CAAM,IAAA,CAAM,IAAA,CAAM,oBAAA,CAAO,IAAA,CAAM,oBAAO,CAAA,CACxC,CAAE,IAAA,CAAM,IAAA,CAAM,IAAA,CAAM,cAAA,CAAM,IAAA,CAAM,oBAAO,CACzC,CAAA,CACA,eAAA,CAAAC,CAAAA,CAAkB,IAAA,CAClB,gBAAA,CAAAC,CAAAA,CACA,GAAGpF,CACL,CAAA,CAAGC,CAAAA,GAAQ,CACT,IAAM,CAACoF,CAAAA,CAAQC,CAAS,CAAA,CAAI9F,CAAAA,CAAM,QAAA,CAAS,KAAK,CAAA,CAC1C+F,CAAAA,CAAc/F,CAAAA,CAAM,MAAA,CAAuB,IAAI,CAAA,CAE/CgG,CAAAA,CAAcN,CAAAA,CAAU,IAAA,CAAKO,CAAAA,EAAQA,CAAAA,CAAK,IAAA,GAASN,CAAe,CAAA,EAAKD,CAAAA,CAAU,CAAC,CAAA,CAElFvE,CAAAA,CAAc,CAClB,GAAI,WAAA,CACJ,EAAA,CAAI,WAAA,CACJ,EAAA,CAAI,WACN,CAAA,CASAnB,CAAAA,CAAM,SAAA,CAAU,IAAM,CACpB,IAAMkG,CAAAA,CAAsBC,CAAAA,EAAsB,CAC5CJ,CAAAA,CAAY,OAAA,EAAW,CAACA,CAAAA,CAAY,OAAA,CAAQ,QAAA,CAASI,CAAAA,CAAM,MAAc,CAAA,EAC3EL,CAAAA,CAAU,KAAK,EAEnB,CAAA,CAEA,OAAID,CAAAA,EACF,QAAA,CAAS,gBAAA,CAAiB,WAAA,CAAaK,CAAkB,CAAA,CAGpD,IAAM,CACX,SAAS,mBAAA,CAAoB,WAAA,CAAaA,CAAkB,EAC9D,CACF,CAAA,CAAG,CAACL,CAAM,CAAC,CAAA,CAEX,IAAMO,CAAAA,CAAwBC,CAAAA,EAAyB,CACrDT,GAAA,IAAA,EAAAA,CAAAA,CAAmBS,CAAAA,CAAAA,CACnBP,CAAAA,CAAU,KAAK,EACjB,CAAA,CAEMQ,CAAAA,CAAa,IACjBjF,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CACb,QAAA,CAAAA,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CAAW,QAAA,CAAA2E,CAAAA,CAAY,IAAA,CAAK,CAAA,CAC9C,CAAA,CAGF,OAAIzF,CAAAA,GAAY,MAAA,CAEZiC,IAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAKuD,CAAAA,CAAa,SAAA,CAAU,UAAA,CAC/B,QAAA,CAAA,CAAA1E,GAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAMyE,CAAAA,CAAU,CAACD,CAAM,CAAA,CAChC,SAAA,CAAWvE,CAAAA,CACT,oOAAA,CACAH,CAAAA,CAAYb,CAAI,CAAA,CAChBL,CACF,CAAA,CACC,GAAGO,CAAAA,CAEH,QAAA,CAAA8F,CAAAA,EAAW,CACd,CAAA,CAECT,CAAAA,EACCxE,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0IAAA,CACZ,QAAA,CAAAqE,CAAAA,CAAU,GAAA,CAAKa,CAAAA,EACd/D,IAAAA,CAAC,QAAA,CAAA,CAEC,OAAA,CAAS,IAAM4D,CAAAA,CAAqBG,CAAAA,CAAS,IAAI,CAAA,CACjD,SAAA,CAAWjF,CAAAA,CACT,2HAAA,CACAqE,CAAAA,GAAoBY,EAAS,IAAA,EAAQ,iEACvC,CAAA,CAEA,QAAA,CAAA,CAAAlF,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CAAW,QAAA,CAAAkF,CAAAA,CAAS,IAAA,CAAK,CAAA,CACzClF,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAuB,QAAA,CAAAkF,CAAAA,CAAS,IAAA,CAAK,CAAA,CAAA,CAAA,CARhDA,CAAAA,CAAS,IAShB,CACD,CAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CAIAhG,CAAAA,GAAY,UAAA,CAEZiC,IAAAA,CAAC,KAAA,CAAA,CAAI,IAAKuD,CAAAA,CAAa,SAAA,CAAU,UAAA,CAC/B,QAAA,CAAA,CAAAvD,IAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAMsD,CAAAA,CAAU,CAACD,CAAM,CAAA,CAChC,SAAA,CAAWvE,CAAAA,CACT,0PACArB,CACF,CAAA,CACC,GAAGO,CAAAA,CAEJ,QAAA,CAAA,CAAAa,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CAAW,QAAA,CAAA2E,CAAAA,CAAY,IAAA,CAAK,CAAA,CAC3CP,CAAAA,EAAapE,IAAC,MAAA,CAAA,CAAM,QAAA,CAAA2E,CAAAA,CAAY,IAAA,CAAK,CAAA,CACtC3E,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWC,CAAAA,CACT,2CAAA,CACAuE,CAAAA,EAAU,YACZ,CAAA,CACA,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,cAAA,CACP,OAAA,CAAQ,WAAA,CAER,QAAA,CAAAxE,GAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAa,CAAA,CAAG,CAAA,CAAE,gBAAA,CAAiB,EACxF,CAAA,CAAA,CACF,CAAA,CAECwE,CAAAA,EACCxE,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0IAAA,CACZ,QAAA,CAAAqE,CAAAA,CAAU,GAAA,CAAKa,CAAAA,EACd/D,IAAAA,CAAC,QAAA,CAAA,CAEC,OAAA,CAAS,IAAM4D,CAAAA,CAAqBG,CAAAA,CAAS,IAAI,CAAA,CACjD,SAAA,CAAWjF,CAAAA,CACT,2HAAA,CACAqE,CAAAA,GAAoBY,CAAAA,CAAS,IAAA,EAAQ,iEACvC,CAAA,CAEA,QAAA,CAAA,CAAAlF,GAAAA,CAAC,QAAK,SAAA,CAAU,SAAA,CAAW,QAAA,CAAAkF,CAAAA,CAAS,IAAA,CAAK,CAAA,CACzClF,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,qBAAA,CAAuB,QAAA,CAAAkF,CAAAA,CAAS,IAAA,CAAK,CAAA,CAAA,CAAA,CARhDA,CAAAA,CAAS,IAShB,CACD,CAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CAMF/D,IAAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAM,CAEb,IAAMgE,CAAAA,CAAAA,CADed,CAAAA,CAAU,SAAA,CAAUO,CAAAA,EAAQA,EAAK,IAAA,GAASN,CAAe,CAAA,CAC5C,CAAA,EAAKD,CAAAA,CAAU,MAAA,CACjDE,CAAAA,EAAA,IAAA,EAAAA,CAAAA,CAAmBF,CAAAA,CAAUc,CAAS,CAAA,CAAE,IAAA,EAC1C,CAAA,CACA,UAAWlF,CAAAA,CACT,yPAAA,CACArB,CACF,CAAA,CACC,GAAGO,CAAAA,CAEJ,QAAA,CAAA,CAAAa,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CAAW,QAAA,CAAA2E,CAAAA,CAAY,IAAA,CAAK,EAC3CP,CAAAA,EAAapE,GAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAA2E,CAAAA,CAAY,IAAA,CAAK,CAAA,CAAA,CACxC,CAEJ,CACF,EACAR,EAAAA,CAAe,WAAA,CAAc,gBAAA,CChK7B,IAAMiB,EAAAA,CAAkBzG,CAAAA,CAAM,UAAA,CAAiD,CAAC,CAC9E,SAAA,CAAAC,CAAAA,CACA,QAAA,CAAAyG,CAAAA,CACA,IAAA,CAAAC,CAAAA,CAAO,aAAA,CACP,QAAA,CAAAC,CAAAA,CAAW,WAAA,CACX,QAAA,CAAAC,CAAAA,CAAW,EAAA,CACX,QAAA,CAAAC,GAAAA,CAAW,eAAA,CACX,OAAA,CAAAvG,CAAAA,CAAU,SAAA,CACV,IAAA,CAAAD,CAAAA,CAAO,IAAA,CACP,QAAA,CAAAyG,CAAAA,CAAW,IAAA,CACX,QAAA,CAAAC,CAAAA,CAAW,IAAA,CACX,aAAA,CAAAC,EAAgB,GAAA,CAChB,GAAGzG,CACL,CAAA,CAAGC,CAAAA,GAAQ,CACT,GAAM,CAACyG,CAAAA,CAAWC,CAAY,CAAA,CAAIvG,QAAAA,CAAS,IAAI,CAAA,CAE/CC,SAAAA,CAAU,IAAM,CACd,GAAI,CAACmG,CAAAA,CAAU,OAEf,IAAMI,CAAAA,CAAe,IAAM,CACzB,IAAMC,CAAAA,CAAY,MAAA,CAAO,OAAA,CACzBF,CAAAA,CAAaE,EAAYJ,CAAa,EACxC,CAAA,CAGA,OAAAG,CAAAA,EAAa,CAEb,MAAA,CAAO,gBAAA,CAAiB,QAAA,CAAUA,CAAAA,CAAc,CAAE,OAAA,CAAS,IAAK,CAAC,EAC1D,IAAM,MAAA,CAAO,mBAAA,CAAoB,QAAA,CAAUA,CAAY,CAChE,CAAA,CAAG,CAACJ,CAAAA,CAAUC,CAAa,CAAC,CAAA,CAE5B,IAAMK,CAAAA,CAAiB,IAAM,CAC3B,GAAIZ,CAAAA,CAAU,CACZ,IAAMa,CAAAA,CAAgB,QAAA,CAAS,cAAA,CAAeb,CAAQ,CAAA,CAClDa,CAAAA,EACFA,CAAAA,CAAc,cAAA,CAAe,CAAE,QAAA,CAAU,QAAS,CAAC,EAEvD,CAAA,KAAO,CAEL,IAAMC,CAAAA,CAAiB/G,CAAAA,CACvB,GAAI+G,CAAAA,CAAe,OAAA,CAAS,CAC1B,IAAMC,CAAAA,CAAcD,CAAAA,CAAe,QAAQ,kBAAA,CACvCC,CAAAA,EACFA,CAAAA,CAAY,cAAA,CAAe,CAAE,QAAA,CAAU,QAAS,CAAC,EAErD,CACF,CACF,CAAA,CAEMC,CAAAA,CAAkB,CACtB,eAAA,CAAiB,8CAAA,CACjB,aAAA,CAAe,iBAAA,CACf,cAAA,CAAgB,kBAClB,CAAA,CAEMvG,CAAAA,CAAc,CAClB,EAAA,CAAI,SAAA,CACJ,EAAA,CAAI,WAAA,CACJ,EAAA,CAAI,SACN,CAAA,CAEMC,EAAiB,CACrB,OAAA,CAAS,4EAAA,CACT,OAAA,CAAS,+EAAA,CACT,SAAA,CAAW,uFAAA,CACX,OAAA,CAAS,4EACX,CAAA,CAEA,OAAK8F,CAAAA,CAGH7F,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKZ,CAAAA,CACL,SAAA,CAAWa,CAAAA,CACT,eAAA,CACAoG,CAAAA,CAAgBZ,GAAQ,CAAA,CACxB7G,CACF,CAAA,CACC,GAAGO,CAAAA,CAEJ,QAAA,CAAAgC,IAAAA,CAACmF,GAAAA,CAAA,CACC,QAASL,CAAAA,CACT,OAAA,CAAQ,OAAA,CACR,IAAA,CAAK,IAAA,CACL,SAAA,CAAWhG,CAAAA,CACT,kEAAA,CACAH,CAAAA,CAAYb,CAAI,CAAA,CAChBc,CAAAA,CAAeb,CAAO,CAAA,CACtBwG,GAAY,0DACd,CAAA,CACA,YAAA,CAAYJ,CAAAA,CAEZ,QAAA,CAAA,CAAAtF,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oBAAA,CAAsB,QAAA,CAAAsF,CAAAA,CAAK,CAAA,CAC3CtF,GAAAA,CAACE,CAAAA,CAAA,CACC,IAAA,CAAMqF,CAAAA,CACN,IAAA,CAAMC,CAAAA,CACN,SAAA,CAAWvF,CAAAA,CACTyF,CAAAA,EAAY,gBACd,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAjCqB,IAmCzB,CAAC,EAEDN,EAAAA,CAAgB,WAAA,CAAc,iBAAA,KCrHxBmB,EAAAA,CAAiB5H,CAAAA,CAAM,UAAA,CAAgD,CAAC,CAC5E,SAAA,CAAAC,CAAAA,CACA,MAAA,CAAA4H,CAAAA,CAAS,CAAA,CACT,KAAA,CAAA3E,CAAAA,CAAQ,UAAA,CACR,QAAA,CAAA4D,CAAAA,CAAW,KAAA,CACX,QAAA,CAAAC,CAAAA,CAAW,IAAA,CACX,cAAA,CAAAe,CAAAA,CAAiB,KAAA,CACjB,GAAGtH,CACL,CAAA,CAAGC,CAAAA,GAAQ,CACT,GAAM,CAACsH,CAAAA,CAAUC,CAAW,CAAA,CAAIpH,QAAAA,CAAS,CAAC,CAAA,CAE1CC,SAAAA,CAAU,IAAM,CACd,IAAMoH,CAAAA,CAAiB,IAAM,CAC3B,IAAMZ,CAAAA,CAAY,MAAA,CAAO,OAAA,CACnBa,CAAAA,CAAY,QAAA,CAAS,eAAA,CAAgB,YAAA,CAAe,MAAA,CAAO,WAAA,CAC3DC,CAAAA,CAAkBD,CAAAA,CAAY,CAAA,CAAKb,CAAAA,CAAYa,CAAAA,CAAa,GAAA,CAAM,CAAA,CACxEF,CAAAA,CAAYG,CAAe,EAC7B,CAAA,CAGA,OAAAF,CAAAA,EAAe,CAEf,MAAA,CAAO,gBAAA,CAAiB,QAAA,CAAUA,CAAAA,CAAgB,CAAE,OAAA,CAAS,IAAK,CAAC,CAAA,CACnE,MAAA,CAAO,iBAAiB,QAAA,CAAUA,CAAAA,CAAgB,CAAE,OAAA,CAAS,IAAK,CAAC,CAAA,CAE5D,IAAM,CACX,MAAA,CAAO,mBAAA,CAAoB,QAAA,CAAUA,CAAc,CAAA,CACnD,OAAO,mBAAA,CAAoB,QAAA,CAAUA,CAAc,EACrD,CACF,CAAA,CAAG,EAAE,CAAA,CAGL,IAAMG,CAAAA,CAAyC,CAC7C,OAAA,CAAS,aAAA,CACT,OAAA,CAAS,eAAA,CACT,SAAA,CAAW,aAAA,CACX,QAAA,CAAU,6DACZ,CAAA,CAOA,OACE5F,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAK/B,CAAAA,CACL,SAAA,CAAWa,CAAAA,CACT,YAAA,CATkB,CACtB,IAAK,sBAAA,CACL,MAAA,CAAQ,yBACV,CAAA,CAOsBwF,CAAQ,CAAA,CACxB7G,CACF,CAAA,CACA,KAAA,CAAO,CAAE,MAAA,CAAQ,CAAA,EAAG4H,CAAM,CAAA,EAAA,CAAK,EAC9B,GAAGrH,CAAAA,CAGJ,QAAA,CAAA,CAAAa,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,4CAAA,CAA6C,CAAA,CAG5DA,GAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWC,CAAAA,CACT,yDAAA,CACA8G,CAAAA,CAAelF,CAAK,CAAA,EAAKkF,CAAAA,CAAe,QAC1C,CAAA,CACA,KAAA,CAAO,CACL,KAAA,CAAO,CAAA,EAAGL,CAAQ,CAAA,CAAA,CAAA,CAClB,eAAA,CAAiB,MACnB,CAAA,CACF,CAAA,CAGCD,CAAAA,EACCtF,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6GAAA,CACZ,QAAA,CAAA,CAAA,IAAA,CAAK,KAAA,CAAMuF,CAAQ,CAAA,CAAE,GAAA,CAAA,CACxB,CAAA,CAAA,CAEJ,CAEJ,CAAC,EAEDH,EAAAA,CAAe,WAAA,CAAc,iBCvH7B,IAAMS,EAAAA,CAAYrI,CAAAA,CAAM,UAAA,CACtB,CAAC,CACC,SAAA,CAAAC,CAAAA,CACA,QAAAM,CAAAA,CAAU,SAAA,CACV,IAAA,CAAAD,CAAAA,CAAO,IAAA,CACP,WAAA,CAAAgI,CAAAA,CAAc,MAAA,CACd,QAAA,CAAAtB,CAAAA,CAAW,IAAA,CACX,MAAA,CAAAuB,CAAAA,CAAS,IAAA,CACT,SAAAC,CAAAA,CACA,GAAGhI,CACL,CAAA,CAAGC,CAAAA,GAAQ,CAET,IAAMgI,CAAAA,CAAoB,IAAM,CAC9B,OAAQlI,CAAAA,EACN,KAAK,OAAA,CACH,OAAO,0EAAA,CACT,KAAK,UAAA,CACH,OAAO,mKAAA,CACT,KAAK,SAAA,CACH,OAAO,2IAAA,CACT,KAAK,MAAA,CACH,OAAO,4HAAA,CACT,QACE,OAAO,+HACX,CACF,CAAA,CAEMmI,CAAAA,CAAiB,IAAM,CAC3B,OAAQpI,CAAAA,EACN,KAAK,IAAA,CACH,OAAO,eAAA,CACT,KAAK,IAAA,CACH,OAAO,eAAA,CACT,KAAK,IAAA,CACH,OAAO,eAAA,CACT,QACE,OAAO,eACX,CACF,CAAA,CAEMqI,CAAAA,CAAwB,IAAM,CAClC,OAAQL,GACN,KAAK,UAAA,CACH,OAAO,mCAAA,CACT,KAAK,YAAA,CACH,OAAO,mCAAA,CACT,QACE,OAAO,eACX,CACF,CAAA,CAEMM,CAAAA,CAActH,CAAAA,CAClB,qGAAA,CACAmH,CAAAA,EAAkB,CAClBC,CAAAA,EAAe,CACfC,CAAAA,EAAsB,CACtB3B,CAAAA,EAAY,gBAAA,CACZuB,CAAAA,EAAU,eAAA,CACVtI,CACF,CAAA,CAEA,OACEoB,IAAC,KAAA,CAAA,CACC,SAAA,CAAWuH,CAAAA,CACX,GAAA,CAAKnI,CAAAA,CACJ,GAAGD,CAAAA,CAEH,QAAA,CAAAgI,CAAAA,CACH,CAEJ,CACF,EACAH,EAAAA,CAAU,WAAA,CAAc,YCpBxB,IAAMQ,EAAAA,CAAc7I,CAAAA,CAAM,UAAA,CACxB,CAAC,CACC,SAAA,CAAAC,CAAAA,CACA,IAAA,CAAA6I,CAAAA,CACA,KAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,OAAA,CAAAzI,CAAAA,CAAU,SAAA,CACV,IAAA,CAAAD,GAAAA,CAAO,IAAA,CACP,KAAA,CAAA2I,CAAAA,CAAQ,OAAA,CACR,QAAA,CAAAC,CAAAA,CAAW,MAAA,CACX,cAAA,CAAAC,CAAAA,CACA,GAAG3I,CACL,CAAA,CAAGC,CAAAA,GAAQ,CACT,IAAMU,CAAAA,CAAc,CAClB,GAAI,KAAA,CACJ,EAAA,CAAI,KAAA,CACJ,EAAA,CAAI,KACN,CAAA,CAEMC,CAAAA,CAAiB,CACrB,OAAA,CAAS,oGAAA,CACT,QAAA,CAAU,CAAA,kBAAA,EAAqB+H,CAAAA,EAAkBC,EAAAA,CAAiBF,CAAQ,CAAC,CAAA,CAAA,CAC3E,KAAA,CAAO,iGAAA,CACP,IAAA,CAAM,mHACR,CAAA,CAEMG,CAAAA,CAAe,CACnB,KAAA,CAAO,mDAAA,CACP,IAAA,CAAM,wGAAA,CACN,KAAA,CAAO,yDACP,IAAA,CAAM,EACR,CAAA,CAEMxC,CAAAA,CAAWvG,GAAAA,GAAS,IAAA,CAAO,UAAA,CAAaA,GAAAA,GAAS,IAAA,CAAO,UAAA,CAAa,UAAA,CAE3E,OACEkC,IAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAK/B,CAAAA,CACL,SAAA,CAAWa,CAAAA,CACT,0FAAA,CACAH,CAAAA,CAAYb,GAAI,CAAA,CAChBc,CAAAA,CAAeb,CAAO,CAAA,CACtB8I,CAAAA,CAAaJ,CAAK,CAAA,CAClBhJ,CACF,CAAA,CACC,GAAGO,CAAAA,CAEH,QAAA,CAAA,CAAAsI,CAAAA,EACCzH,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW,CAAA,KAAA,EAAQwF,CAAQ,CAAA,CAAA,EAAItG,CAAAA,GAAY,MAAA,CAAS,eAAA,CAAkB,EAAE,CAAA,CAAA,CAC1E,gBAAOuI,CAAAA,EAAS,QAAA,EAAYA,CAAAA,CAAK,UAAA,CAAW,MAAM,CAAA,CACjDzH,GAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAKyH,CAAAA,CAAM,GAAA,CAAKC,CAAAA,CAAO,SAAA,CAAU,8BAAA,CAA+B,EACnE,OAAOD,CAAAA,EAAS,QAAA,CAClBzH,GAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAyH,CAAAA,CAAK,CAAA,CAEZzH,GAAAA,CAACE,CAAAA,CAAA,CAAK,IAAA,CAAMuH,CAAAA,CAAM,SAAA,CAAU,eAAA,CAAgB,CAAA,CAEhD,CAAA,CAGFzH,GAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAWC,CAAAA,CACb,gBAAA,CACAhB,GAAAA,GAAS,IAAA,CAAO,UAAA,CAAaA,GAAAA,GAAS,IAAA,CAAO,SAAA,CAAY,SAAA,CACzDC,CAAAA,GAAY,WAAa,YAAA,CAAe,+BAC1C,CAAA,CACG,QAAA,CAAAwI,CAAAA,CACH,CAAA,CAEA1H,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAWC,CAAAA,CACZhB,GAAAA,GAAS,IAAA,CAAO,WAAA,CAAc,SAAA,CAC9BC,CAAAA,GAAY,UAAA,CAAa,eAAA,CAAkB,kCAC7C,CAAA,CACG,QAAA,CAAAyI,CAAAA,CACH,CAAA,CAAA,CACF,CAEJ,CACF,EAEAH,EAAAA,CAAY,WAAA,CAAc,aAAA,CAE1B,SAASO,EAAAA,CAAiBF,EAA0B,CAClD,IAAMI,CAAAA,CAAY,CAChB,IAAA,CAAM,wCAAA,CACN,MAAA,CAAQ,4CAAA,CACR,KAAA,CAAO,6CAAA,CACP,MAAA,CAAQ,2CAAA,CACR,IAAA,CAAM,wCACR,CAAA,CACA,OAAOA,CAAAA,CAAUJ,CAAkC,CAAA,EAAKI,CAAAA,CAAU,IACpE,CCzEA,IAAMC,EAAAA,CAAcvJ,CAAAA,CAAM,UAAA,CACxB,CAAC,CACC,SAAA,CAAAC,CAAAA,CACA,KAAA,CAAA8I,CAAAA,CACA,QAAA,CAAAS,CAAAA,CACA,WAAA,CAAAR,CAAAA,CACA,cAAAS,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,OAAA,CAAAnJ,CAAAA,CAAU,SAAA,CACV,UAAA,CAAAoJ,CAAAA,CAAa,UAAA,CACb,gBAAA,CAAAC,CAAAA,CACA,IAAA,CAAAtJ,CAAAA,CAAO,IAAA,CACP,GAAGE,CACL,CAAA,CAAGC,CAAAA,GAAQ,CACT,IAAMU,CAAAA,CAAc,CAClB,EAAA,CAAI,OAAA,CACJ,EAAA,CAAI,OAAA,CACJ,EAAA,CAAI,OAAA,CACJ,EAAA,CAAI,OACN,CAAA,CAEM0I,CAAAA,CAAmB,CACvB,EAAA,CAAI,sBAAA,CACJ,EAAA,CAAI,sBAAA,CACJ,EAAA,CAAI,sBAAA,CACJ,EAAA,CAAI,sBACN,CAAA,CAEMC,CAAAA,CAAsB,CAC1B,EAAA,CAAI,qBACJ,EAAA,CAAI,qBAAA,CACJ,EAAA,CAAI,sBAAA,CACJ,EAAA,CAAI,sBACN,CAAA,CAEMC,CAAAA,CAAyB,CAC7B,EAAA,CAAI,sBAAA,CACJ,EAAA,CAAI,oBAAA,CACJ,EAAA,CAAI,sBACJ,EAAA,CAAI,qBACN,CAAA,CAEMC,CAAAA,CAAoB,CACxB,IAAA,CAAM,EAAA,CACN,QAAA,CAAU,0BAAA,CACV,SAAA,CAAW,0BAAA,CACX,KAAA,CAAO,0BACT,CAAA,CAEMC,EAAoB,CACxB,IAAA,CAAM,IAAA,CACN,QAAA,CACEzH,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0CAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yJAAA,CAA0J,CAAA,CACzKA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wJAAA,CAAyJ,CAAA,CAAA,CAC1K,CAAA,CAEF,SAAA,CACEmB,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0CAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oIAAA,CAAqI,EACpJA,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6BAAA,CACZ,QAAA,CAAA,CAAC,GAAG,KAAA,CAAM,EAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC6I,CAAAA,CAAGC,CAAAA,GACtB9I,IAAC,KAAA,CAAA,CAEC,SAAA,CAAU,yDAAA,CACV,KAAA,CAAO,CACL,IAAA,CAAM,CAAA,EAAG,IAAA,CAAK,MAAA,EAAO,CAAI,GAAG,CAAA,CAAA,CAAA,CAC5B,GAAA,CAAK,CAAA,EAAG,KAAK,MAAA,EAAO,CAAI,GAAG,CAAA,CAAA,CAAA,CAC3B,cAAA,CAAgB,CAAA,EAAG,IAAA,CAAK,MAAA,EAAO,CAAI,CAAC,CAAA,CAAA,CAAA,CACpC,iBAAA,CAAmB,CAAA,EAAG,CAAA,CAAI,IAAA,CAAK,MAAA,EAAO,CAAI,CAAC,CAAA,CAAA,CAC7C,CAAA,CAAA,CAPK8I,CAQP,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAEF,KAAA,CACE9I,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0CAAA,CACb,SAAAA,GAAAA,CAAC,OAAA,CAAA,CACC,QAAA,CAAQ,IAAA,CACR,IAAA,CAAI,IAAA,CACJ,KAAA,CAAK,IAAA,CACL,WAAA,CAAW,IAAA,CACX,SAAA,CAAU,wDAAA,CAEV,QAAA,CAAAA,GAAAA,CAAC,QAAA,CAAA,CAAO,GAAA,CAAKuI,CAAAA,CAAkB,IAAA,CAAK,WAAA,CAAY,CAAA,CAClD,CAAA,CACF,CAEJ,CAAA,CAEA,OACEpH,IAAAA,CAAC,SAAA,CAAA,CACC,GAAA,CAAK/B,CAAAA,CACL,SAAA,CAAWa,CAAAA,CACT,oFACAH,CAAAA,CAAYb,CAAI,CAAA,CAChB0J,CAAAA,CAAkBL,CAAU,CAAA,CAC5B1J,CACF,CAAA,CACC,GAAGO,CAAAA,CAEH,QAAA,CAAA,CAAAyJ,CAAAA,CAAkBN,CAAU,CAAA,CAE7BnH,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iCAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAWlB,CAAAA,CACb,2IAAA,CACAuI,CAAAA,CAAiBvJ,CAAI,CACvB,CAAA,CACE,QAAA,CAAA,CAAAe,GAAAA,CAAC,QAAK,SAAA,CAAU,mMAAA,CACb,QAAA,CAAA0H,CAAAA,CACH,CAAA,CACCS,CAAAA,EACCnI,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAWC,CAAAA,CACf,2DAAA,CACAwI,CAAAA,CAAoBxJ,CAAI,CAC1B,EACG,QAAA,CAAAkJ,CAAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CAEAnI,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAWC,CAAAA,CACZ,iJAAA,CACAyI,CAAAA,CAAuBzJ,CAAI,CAC7B,CAAA,CACG,QAAA,CAAA0I,EACH,CAAA,CAAA,CAEES,CAAAA,EAAiBC,CAAAA,GACjBlH,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qDAAA,CACZ,QAAA,CAAA,CAAAiH,CAAAA,EACCjH,IAAAA,CAACmF,GAAAA,CAAA,CACC,IAAA,CAAM8B,CAAAA,CAAc,IAAA,CACpB,OAAA,CAAQ,UAAA,CACR,IAAA,CAAMnJ,CAAAA,GAAS,IAAA,CAAO,IAAA,CAAO,IAAA,CAC7B,SAAA,CAAU,0BAAA,CAET,QAAA,CAAA,CAAAmJ,CAAAA,CAAc,IAAA,EAAQpI,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,OAAQ,QAAA,CAAAoI,CAAAA,CAAc,IAAA,CAAK,CAAA,CACjEA,CAAAA,CAAc,KAAA,CAAA,CACjB,CAAA,CAGDC,CAAAA,EACClH,IAAAA,CAACmF,GAAAA,CAAA,CACC,IAAA,CAAM+B,CAAAA,CAAgB,IAAA,CACtB,OAAA,CAAQ,SAAA,CACR,IAAA,CAAMpJ,CAAAA,GAAS,IAAA,CAAO,IAAA,CAAO,IAAA,CAC7B,SAAA,CAAU,0BAAA,CAET,QAAA,CAAA,CAAAoJ,CAAAA,CAAgB,IAAA,EAAQrI,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,MAAA,CAAQ,SAAAqI,CAAAA,CAAgB,IAAA,CAAK,CAAA,CACrEA,CAAAA,CAAgB,KAAA,CAAA,CACnB,CAAA,CAAA,CAEJ,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAEJ,CACF,EAEAH,EAAAA,CAAY,WAAA,CAAc,aAAA,CC7N1B,IAAMa,EAAAA,CAA4H,CAChI,IAAA,CAAM,CACJ,SAAA,CAAW,mJAAA,CACX,IAAA,CAAM,qEACN,KAAA,CAAO,iEAAA,CACP,IAAA,CAAM,0DACR,CAAA,CACA,MAAA,CAAQ,CACN,SAAA,CAAW,uJAAA,CACX,IAAA,CAAM,wEAAA,CACN,KAAA,CAAO,qEAAA,CACP,IAAA,CAAM,0DACR,CAAA,CACA,KAAA,CAAO,CACL,SAAA,CAAW,yJAAA,CACX,IAAA,CAAM,sEAAA,CACN,KAAA,CAAO,mEAAA,CACP,IAAA,CAAM,0DACR,CAAA,CACA,MAAA,CAAQ,CACN,UAAW,uJAAA,CACX,IAAA,CAAM,wEAAA,CACN,KAAA,CAAO,qEAAA,CACP,IAAA,CAAM,0DACR,CACF,CAAA,CAgCaC,EAAAA,CAAWrK,CAAAA,CAAM,UAAA,CAA0C,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,KAAA,CAAA8I,CAAAA,CAAO,IAAA,CAAAD,CAAAA,CAAM,IAAA,CAAAwB,CAAAA,CAAO,MAAA,CAAQ,QAAA,CAAA9B,CAAAA,CAAU,GAAGhI,GAAM,CAAA,CAAGC,CAAAA,GAAQ,CAC9I,IAAM8J,CAAAA,CAAIH,EAAAA,CAAYE,CAAI,CAAA,CAC1B,OACEjJ,GAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAKZ,CAAAA,CAAK,SAAA,CAAWa,CAAAA,CAAMiJ,CAAAA,CAAE,SAAA,CAAWtK,CAAS,CAAA,CAAI,GAAGO,GAAAA,CAC3D,QAAA,CAAAgC,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAACE,CAAAA,CAAA,CAAK,IAAA,CAAMuH,CAAAA,CAAM,SAAA,CAAWyB,CAAAA,CAAE,KAAM,CAAA,CACrC/H,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,QAAA,CACb,QAAA,CAAA,CAAAnB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAWkJ,CAAAA,CAAE,KAAA,CAAQ,QAAA,CAAAxB,CAAAA,CAAM,CAAA,CACjC1H,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWkJ,CAAAA,CAAE,IAAA,CAAO,QAAA,CAAA/B,CAAAA,CAAS,CAAA,CAAA,CACpC,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CAAC,EAED6B,EAAAA,CAAS,WAAA,CAAc,UAAA","file":"advanced.mjs","sourcesContent":["\"use client\"\n\nimport React, { useState, useEffect } from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * Bookmark 컴포넌트의 props / Bookmark component props\n * @typedef {Object} BookmarkProps\n * @property {string} id - 북마크 고유 ID / Bookmark unique ID\n * @property {string} [storageKey='bookmarks'] - localStorage 키 / localStorage key\n * @property {boolean} [defaultBookmarked=false] - 기본 북마크 상태 / Default bookmarked state\n * @property {(bookmarked: boolean) => void} [onBookmarkChange] - 북마크 상태 변경 콜백 / Bookmark state change callback\n * @property {'sm' | 'md' | 'lg'} [size='md'] - Bookmark 크기 / Bookmark size\n * @property {'default' | 'filled' | 'outline'} [variant='default'] - Bookmark 스타일 변형 / Bookmark style variant\n * @extends {React.HTMLAttributes<HTMLButtonElement>}\n */\nexport interface BookmarkProps extends React.HTMLAttributes<HTMLButtonElement> {\n id: string\n storageKey?: string\n defaultBookmarked?: boolean\n onBookmarkChange?: (bookmarked: boolean) => void\n size?: 'sm' | 'md' | 'lg'\n variant?: 'default' | 'filled' | 'outline'\n}\n\n/**\n * Bookmark 컴포넌트 / Bookmark component\n * \n * 북마크 기능을 제공하는 버튼 컴포넌트입니다.\n * localStorage에 북마크 상태를 저장하며, 여러 항목의 북마크를 관리할 수 있습니다.\n * \n * Button component that provides bookmark functionality.\n * Saves bookmark state to localStorage and can manage bookmarks for multiple items.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Bookmark id=\"article-1\" />\n * \n * @example\n * // 상태 변경 감지 / State change detection\n * <Bookmark \n * id=\"article-1\"\n * onBookmarkChange={(bookmarked) => console.log(bookmarked)}\n * variant=\"filled\"\n * />\n * \n * @param {BookmarkProps} props - Bookmark 컴포넌트의 props / Bookmark component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} Bookmark 컴포넌트 / Bookmark component\n */\nconst Bookmark = React.forwardRef<HTMLButtonElement, BookmarkProps>(\n ({ \n className, \n id, \n storageKey = 'bookmarks',\n defaultBookmarked = false,\n onBookmarkChange,\n size = 'md',\n variant = 'default',\n ...props \n }, ref) => {\n const [isBookmarked, setIsBookmarked] = useState(defaultBookmarked)\n\n // 로컬 스토리지에서 북마크 상태 불러오기\n useEffect(() => {\n const savedBookmarks = localStorage.getItem(storageKey)\n if (savedBookmarks) {\n const bookmarks = JSON.parse(savedBookmarks)\n setIsBookmarked(bookmarks.includes(id))\n }\n }, [id, storageKey])\n\n // 북마크 토글\n const toggleBookmark = () => {\n const newBookmarked = !isBookmarked\n setIsBookmarked(newBookmarked)\n \n // 로컬 스토리지 업데이트\n const savedBookmarks = localStorage.getItem(storageKey)\n const bookmarks = savedBookmarks ? JSON.parse(savedBookmarks) : []\n \n if (newBookmarked) {\n if (!bookmarks.includes(id)) {\n bookmarks.push(id)\n }\n } else {\n const index = bookmarks.indexOf(id)\n if (index > -1) {\n bookmarks.splice(index, 1)\n }\n }\n \n localStorage.setItem(storageKey, JSON.stringify(bookmarks))\n onBookmarkChange?.(newBookmarked)\n }\n\n const sizeClasses = {\n sm: \"w-6 h-6\",\n md: \"w-8 h-8\", \n lg: \"w-10 h-10\"\n }\n\n const variantClasses = {\n default: \"text-slate-400 hover:text-yellow-500 transition-colors\",\n filled: \"text-yellow-500 hover:text-yellow-600 transition-colors\",\n outline: \"border border-slate-300 dark:border-slate-600 text-slate-400 hover:text-yellow-500 hover:border-yellow-500 transition-colors rounded\"\n }\n\n return (\n <button\n ref={ref}\n onClick={toggleBookmark}\n className={merge(\n \"flex items-center justify-center focus:outline-none focus:ring-2 focus:ring-yellow-500 focus:ring-offset-2\",\n sizeClasses[size],\n variantClasses[variant],\n className\n )}\n {...props}\n >\n <Icon \n name=\"star\" \n className={merge(\n \"transition-all duration-200\",\n isBookmarked && \"fill-current\"\n )}\n />\n </button>\n )\n }\n)\n\nBookmark.displayName = \"Bookmark\"\n\nexport { Bookmark } ","'use client'\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Avatar, AvatarImage, AvatarFallback } from \"./Avatar\"\nimport { Badge } from \"./Badge\"\nimport { Card, CardContent } from \"./Card\"\n\n/**\n * ChatMessage 컴포넌트의 props / ChatMessage component props\n * @typedef {Object} ChatMessageProps\n * @property {Object} message - 메시지 데이터 / Message data\n * @property {string} message.id - 메시지 ID / Message ID\n * @property {string} message.content - 메시지 내용 / Message content\n * @property {\"user\" | \"assistant\" | \"system\"} message.role - 메시지 역할 / Message role\n * @property {Date} message.timestamp - 메시지 타임스탬프 / Message timestamp\n * @property {string} [message.emotion] - 감정 정보 / Emotion information\n * @property {number} [message.intensity] - 감정 강도 / Emotion intensity\n * @property {boolean} [message.isTyping] - 타이핑 중 여부 / Typing state\n * @property {Object} [user] - 사용자 정보 / User information\n * @property {string} [user.name=\"사용자\"] - 사용자 이름 / User name\n * @property {string} [user.avatar] - 사용자 아바타 URL / User avatar URL\n * @property {string} [user.color=\"#3b82f6\"] - 사용자 색상 / User color\n * @property {Object} [assistant] - AI 어시스턴트 정보 / AI assistant information\n * @property {string} [assistant.name=\"AI\"] - AI 이름 / AI name\n * @property {string} [assistant.avatar] - AI 아바타 URL / AI avatar URL\n * @property {string} [assistant.color=\"#10b981\"] - AI 색상 / AI color\n * @property {boolean} [showAvatar=true] - 아바타 표시 여부 / Show avatar\n * @property {boolean} [showTimestamp=true] - 타임스탬프 표시 여부 / Show timestamp\n * @property {boolean} [showEmotion=true] - 감정 표시 여부 / Show emotion\n * @property {\"default\" | \"compact\" | \"bubble\"} [variant=\"default\"] - ChatMessage 스타일 변형 / ChatMessage style variant\n * @property {Object} [theme] - 커스텀 테마 / Custom theme\n * @property {string} [theme.userBubbleBg] - 사용자 버블 배경색 / User bubble background color\n * @property {string} [theme.userBubbleText] - 사용자 버블 텍스트 색상 / User bubble text color\n * @property {string} [theme.aiBubbleBg] - AI 버블 배경색 / AI bubble background color\n * @property {string} [theme.aiBubbleText] - AI 버블 텍스트 색상 / AI bubble text color\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\ninterface ChatMessageProps extends React.HTMLAttributes<HTMLDivElement> {\n message: {\n id: string\n content: string\n role: \"user\" | \"assistant\" | \"system\"\n timestamp: Date\n emotion?: string\n intensity?: number\n isTyping?: boolean\n }\n user?: {\n name?: string\n avatar?: string\n color?: string\n }\n assistant?: {\n name?: string\n avatar?: string\n color?: string\n }\n showAvatar?: boolean\n showTimestamp?: boolean\n showEmotion?: boolean\n variant?: \"default\" | \"compact\" | \"bubble\"\n theme?: {\n userBubbleBg?: string\n userBubbleText?: string\n aiBubbleBg?: string\n aiBubbleText?: string\n }\n}\n\n/**\n * ChatMessage 컴포넌트\n * \n * 채팅 메시지를 표시하는 컴포넌트입니다.\n * 사용자, AI 어시스턴트, 시스템 메시지를 지원하며, 감정 정보를 표시할 수 있습니다.\n * \n * @component\n * @example\n * // 기본 사용\n * <ChatMessage\n * message={{\n * id: \"1\",\n * content: \"안녕하세요!\",\n * role: \"user\",\n * timestamp: new Date()\n * }}\n * />\n * \n * @example\n * // AI 메시지, 감정 정보 포함\n * <ChatMessage\n * message={{\n * id: \"2\",\n * content: \"안녕하세요! 도와드릴까요?\",\n * role: \"assistant\",\n * timestamp: new Date(),\n * emotion: \"joy\",\n * intensity: 0.8\n * }}\n * variant=\"bubble\"\n * />\n * \n * @param {ChatMessageProps} props - ChatMessage 컴포넌트의 props / ChatMessage component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ChatMessage 컴포넌트 / ChatMessage component\n */\nconst ChatMessage = React.forwardRef<HTMLDivElement, ChatMessageProps>(\n ({ \n className, \n message,\n user = { name: \"사용자\", color: \"#3b82f6\" },\n assistant = { name: \"AI\", color: \"#10b981\" },\n showAvatar = true,\n showTimestamp = true,\n showEmotion = true,\n variant = \"default\",\n theme = {\n userBubbleBg: \"#3b82f6\",\n userBubbleText: \"#ffffff\",\n aiBubbleBg: \"#f3f4f6\",\n aiBubbleText: \"#1f2937\"\n },\n ...props \n }, ref) => {\n const isUser = message.role === \"user\"\n const isAssistant = message.role === \"assistant\"\n const isSystem = message.role === \"system\"\n\n const getEmotionColor = (emotion?: string) => {\n if (!emotion) return \"bg-gray-100\"\n \n const emotionColors = {\n joy: \"bg-yellow-100 text-yellow-800\",\n sadness: \"bg-blue-100 text-blue-800\",\n anger: \"bg-red-100 text-red-800\",\n calm: \"bg-green-100 text-green-800\",\n excitement: \"bg-pink-100 text-pink-800\",\n worry: \"bg-gray-100 text-gray-800\",\n gratitude: \"bg-purple-100 text-purple-800\",\n loneliness: \"bg-indigo-100 text-indigo-800\"\n }\n \n return emotionColors[emotion as keyof typeof emotionColors] || \"bg-gray-100 text-gray-800\"\n }\n\n const formatTime = (date: Date) => {\n return date.toLocaleTimeString('ko-KR', { \n hour: '2-digit', \n minute: '2-digit' \n })\n }\n\n if (variant === \"bubble\") {\n return (\n <div\n ref={ref}\n className={merge(\n \"flex w-full\",\n isUser ? \"justify-end\" : \"justify-start\",\n className\n )}\n {...props}\n >\n <div className={merge(\n \"flex max-w-[80%] space-x-2\",\n isUser ? \"flex-row-reverse space-x-reverse\" : \"flex-row\"\n )}>\n {showAvatar && (\n <Avatar className=\"w-8 h-8 flex-shrink-0\">\n <AvatarImage\n src={isUser ? user.avatar : assistant.avatar}\n alt={isUser ? user.name : assistant.name}\n />\n <AvatarFallback\n style={{\n backgroundColor: isUser ? user.color : assistant.color\n }}\n >\n {(isUser ? user.name : assistant.name)?.charAt(0)}\n </AvatarFallback>\n </Avatar>\n )}\n \n <div className=\"space-y-1\">\n <div\n className={merge(\n \"px-4 py-2 rounded-2xl max-w-full break-words\",\n isUser \n ? \"rounded-br-md\" \n : \"rounded-bl-md\"\n )}\n style={{\n backgroundColor: isUser ? theme.userBubbleBg : theme.aiBubbleBg,\n color: isUser ? theme.userBubbleText : theme.aiBubbleText\n }}\n >\n {message.isTyping ? (\n <div className=\"flex space-x-1\">\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-100\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-200\" />\n </div>\n ) : (\n <div className=\"whitespace-pre-wrap\">{message.content}</div>\n )}\n </div>\n \n <div className={merge(\n \"flex items-center space-x-2 text-xs text-muted-foreground\",\n isUser ? \"justify-end\" : \"justify-start\"\n )}>\n {showTimestamp && (\n <span>{formatTime(message.timestamp)}</span>\n )}\n {showEmotion && message.emotion && (\n <Badge \n variant=\"secondary\" \n className={merge(\"text-xs\", getEmotionColor(message.emotion))}\n >\n {message.emotion}\n </Badge>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n }\n\n if (variant === \"compact\") {\n return (\n <div\n ref={ref}\n className={merge(\n \"flex items-start space-x-3 py-2\",\n className\n )}\n {...props}\n >\n {showAvatar && (\n <Avatar className=\"w-6 h-6 flex-shrink-0\">\n <AvatarImage\n src={isUser ? user.avatar : assistant.avatar}\n alt={isUser ? user.name : assistant.name}\n />\n <AvatarFallback\n style={{\n backgroundColor: isUser ? user.color : assistant.color\n }}\n >\n {(isUser ? user.name : assistant.name)?.charAt(0)}\n </AvatarFallback>\n </Avatar>\n )}\n \n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center space-x-2 mb-1\">\n <span className=\"text-sm font-medium\">\n {isUser ? user.name : assistant.name}\n </span>\n {showTimestamp && (\n <span className=\"text-xs text-muted-foreground\">\n {formatTime(message.timestamp)}\n </span>\n )}\n {showEmotion && message.emotion && (\n <Badge \n variant=\"secondary\" \n className={merge(\"text-xs\", getEmotionColor(message.emotion))}\n >\n {message.emotion}\n </Badge>\n )}\n </div>\n \n <div className=\"text-sm\">\n {message.isTyping ? (\n <div className=\"flex space-x-1\">\n <div className=\"w-1.5 h-1.5 bg-muted-foreground rounded-full animate-bounce\" />\n <div className=\"w-1.5 h-1.5 bg-muted-foreground rounded-full animate-bounce delay-100\" />\n <div className=\"w-1.5 h-1.5 bg-muted-foreground rounded-full animate-bounce delay-200\" />\n </div>\n ) : (\n <div className=\"whitespace-pre-wrap\">{message.content}</div>\n )}\n </div>\n </div>\n </div>\n )\n }\n\n // default variant\n return (\n <div\n ref={ref}\n className={merge(\n \"flex items-start space-x-3 py-4\",\n className\n )}\n {...props}\n >\n {showAvatar && (\n <Avatar className=\"w-10 h-10 flex-shrink-0\">\n <AvatarImage\n src={isUser ? user.avatar : assistant.avatar}\n alt={isUser ? user.name : assistant.name}\n />\n <AvatarFallback\n style={{\n backgroundColor: isUser ? user.color : assistant.color\n }}\n >\n {(isUser ? user.name : assistant.name)?.charAt(0)}\n </AvatarFallback>\n </Avatar>\n )}\n \n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center space-x-2 mb-2\">\n <span className=\"font-medium\">\n {isUser ? user.name : assistant.name}\n </span>\n {showTimestamp && (\n <span className=\"text-sm text-muted-foreground\">\n {formatTime(message.timestamp)}\n </span>\n )}\n {showEmotion && message.emotion && (\n <Badge \n variant=\"secondary\" \n className={merge(\"text-xs\", getEmotionColor(message.emotion))}\n >\n {message.emotion}\n </Badge>\n )}\n </div>\n \n <Card className={merge(\n \"inline-block\",\n isUser ? \"bg-primary text-primary-foreground\" : \"bg-muted\"\n )}>\n <CardContent className=\"p-3\">\n {message.isTyping ? (\n <div className=\"flex space-x-1\">\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-100\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-200\" />\n </div>\n ) : (\n <div className=\"whitespace-pre-wrap\">{message.content}</div>\n )}\n </CardContent>\n </Card>\n </div>\n </div>\n )\n }\n)\n\nChatMessage.displayName = \"ChatMessage\"\n\nexport { ChatMessage } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport type { Color } from \"../lib/types/common\"\n\n/**\n * EmotionMeter 컴포넌트의 props / EmotionMeter component props\n * @typedef {Object} EmotionMeterProps\n * @property {number} value - 감정 강도 값 (0-max) / Emotion intensity value (0-max)\n * @property {number} [max=100] - 최대값 / Maximum value\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 미터 크기 / Meter size\n * @property {\"blue\" | \"green\" | \"yellow\" | \"red\"} [color=\"blue\"] - 미터 색상 / Meter color\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface EmotionMeterProps extends React.HTMLAttributes<HTMLDivElement> {\n value: number\n max?: number\n size?: \"sm\" | \"md\" | \"lg\"\n color?: \"blue\" | \"green\" | \"yellow\" | \"red\" | Color\n}\n\n/**\n * EmotionMeter 컴포넌트 / EmotionMeter component\n * \n * 감정 강도를 표시하는 미터 컴포넌트입니다.\n * Progress 컴포넌트와 유사하지만 감정 분석에 특화되어 있습니다.\n * \n * Meter component that displays emotion intensity.\n * Similar to Progress component but specialized for emotion analysis.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionMeter value={75} />\n * \n * @example\n * // 다양한 색상 / Various colors\n * <EmotionMeter \n * value={80}\n * color=\"green\"\n * size=\"lg\"\n * />\n * \n * @param {EmotionMeterProps} props - EmotionMeter 컴포넌트의 props / EmotionMeter component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} EmotionMeter 컴포넌트 / EmotionMeter component\n */\nconst EmotionMeter = React.forwardRef<HTMLDivElement, EmotionMeterProps>(\n ({ className, value, max = 100, size = \"md\", color = \"blue\", ...props }, ref) => {\n const sizeClasses = {\n sm: \"h-2\",\n md: \"h-3\", \n lg: \"h-4\"\n }\n\n // EmotionMeter는 특정 색상만 사용 (감정 분석 특화)\n const emotionColors: Record<string, string> = {\n blue: \"bg-blue-500\",\n green: \"bg-green-500\",\n yellow: \"bg-yellow-500\",\n red: \"bg-red-500\",\n // 추가 색상 지원\n purple: \"bg-purple-500\",\n orange: \"bg-orange-500\",\n indigo: \"bg-indigo-500\",\n pink: \"bg-pink-500\",\n gray: \"bg-gray-500\",\n }\n\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100)\n\n return (\n <div\n ref={ref}\n className={merge(\n \"w-full bg-gray-200 rounded-full dark:bg-gray-700\",\n sizeClasses[size],\n className\n )}\n {...props}\n >\n <div\n className={merge(\n \"h-full rounded-full transition-all duration-300\",\n emotionColors[color] || emotionColors.blue\n )}\n style={{ width: `${percentage}%` }}\n />\n </div>\n )\n }\n)\nEmotionMeter.displayName = \"EmotionMeter\"\n\nexport { EmotionMeter } ","'use client'\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"./Card\"\nimport { Badge } from \"./Badge\"\nimport { EmotionMeter } from \"./EmotionMeter\"\n\n/**\n * EmotionAnalysis 컴포넌트의 props / EmotionAnalysis component props\n * @typedef {Object} EmotionAnalysisProps\n * @property {Object} [primaryEmotion] - 주요 감정 정보 / Primary emotion information\n * @property {string} primaryEmotion.name - 감정 이름 / Emotion name\n * @property {number} primaryEmotion.intensity - 감정 강도 (0-100) / Emotion intensity (0-100)\n * @property {string} [primaryEmotion.color] - 감정 색상 / Emotion color\n * @property {Array<Object>} [emotionDistribution] - 감정 분포 배열 / Emotion distribution array\n * @property {string} emotionDistribution[].emotion - 감정 이름 / Emotion name\n * @property {number} emotionDistribution[].percentage - 감정 비율 (0-100) / Emotion percentage (0-100)\n * @property {string} emotionDistribution[].color - 감정 색상 / Emotion color\n * @property {string[]} [keywords] - 키워드 배열 / Keywords array\n * @property {number} [intensity=50] - 전체 강도 (0-100) / Overall intensity (0-100)\n * @property {number} [positivity=70] - 긍정성 (0-100) / Positivity (0-100)\n * @property {number} [energy=60] - 에너지 (0-100) / Energy (0-100)\n * @property {boolean} [showMeter=true] - 강도 미터 표시 여부 / Show intensity meter\n * @property {boolean} [showDistribution=true] - 분포 표시 여부 / Show distribution\n * @property {boolean} [showKeywords=true] - 키워드 표시 여부 / Show keywords\n * @property {boolean} [showMetrics=true] - 메트릭 표시 여부 / Show metrics\n * @property {\"compact\" | \"detailed\" | \"card\"} [layout=\"detailed\"] - 레이아웃 타입 / Layout type\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\ninterface EmotionAnalysisProps extends React.HTMLAttributes<HTMLDivElement> {\n primaryEmotion?: {\n name: string\n intensity: number\n color?: string\n }\n emotionDistribution?: Array<{\n emotion: string\n percentage: number\n color: string\n }>\n keywords?: string[]\n intensity?: number\n positivity?: number\n energy?: number\n showMeter?: boolean\n showDistribution?: boolean\n showKeywords?: boolean\n showMetrics?: boolean\n layout?: \"compact\" | \"detailed\" | \"card\"\n}\n\n/**\n * EmotionAnalysis 컴포넌트 / EmotionAnalysis component\n * \n * 감정 분석 결과를 표시하는 컴포넌트입니다.\n * 주요 감정, 감정 분포, 키워드, 메트릭(강도, 긍정성, 에너지)을 표시할 수 있습니다.\n * \n * Component that displays emotion analysis results.\n * Can display primary emotion, emotion distribution, keywords, and metrics (intensity, positivity, energy).\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionAnalysis\n * primaryEmotion={{ name: \"기쁨\", intensity: 80 }}\n * keywords={[\"행복\", \"만족\"]}\n * />\n * \n * @example\n * // 상세 레이아웃 / Detailed layout\n * <EmotionAnalysis\n * primaryEmotion={{ name: \"평온\", intensity: 65, color: \"green\" }}\n * emotionDistribution={[\n * { emotion: \"기쁨\", percentage: 40, color: \"yellow\" },\n * { emotion: \"평온\", percentage: 60, color: \"green\" }\n * ]}\n * keywords={[\"안정\", \"편안\"]}\n * intensity={65}\n * positivity={75}\n * energy={50}\n * layout=\"detailed\"\n * />\n * \n * @param {EmotionAnalysisProps} props - EmotionAnalysis 컴포넌트의 props / EmotionAnalysis component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} EmotionAnalysis 컴포넌트 / EmotionAnalysis component\n */\nconst EmotionAnalysis = React.forwardRef<HTMLDivElement, EmotionAnalysisProps>(\n ({ \n className, \n primaryEmotion,\n emotionDistribution = [],\n keywords = [],\n intensity = 50,\n positivity = 70,\n energy = 60,\n showMeter = true,\n showDistribution = true,\n showKeywords = true,\n showMetrics = true,\n layout = \"detailed\",\n ...props \n }, ref) => {\n const getIntensityLabel = (value: number) => {\n if (value < 30) return \"약함\"\n if (value < 70) return \"보통\"\n return \"강함\"\n }\n\n const getPositivityLabel = (value: number) => {\n if (value < 30) return \"부정적\"\n if (value < 70) return \"중립적\"\n return \"긍정적\"\n }\n\n const getEnergyLabel = (value: number) => {\n if (value < 30) return \"낮음\"\n if (value < 70) return \"보통\"\n return \"높음\"\n }\n\n if (layout === \"compact\") {\n return (\n <div\n ref={ref}\n className={merge(\"space-y-3\", className)}\n {...props}\n >\n {primaryEmotion && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">주요 감정:</span>\n <div className=\"flex items-center space-x-2\">\n <span className=\"text-sm text-muted-foreground\">\n {primaryEmotion.name} ({primaryEmotion.intensity}%)\n </span>\n {showMeter && (\n <EmotionMeter\n value={primaryEmotion.intensity}\n size=\"sm\"\n color=\"blue\"\n />\n )}\n </div>\n </div>\n )}\n\n {showMetrics && (\n <>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">감정 강도:</span>\n <span className=\"text-sm text-muted-foreground\">\n {getIntensityLabel(intensity)}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">긍정성:</span>\n <span className=\"text-sm text-muted-foreground\">\n {getPositivityLabel(positivity)}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">에너지:</span>\n <span className=\"text-sm text-muted-foreground\">\n {getEnergyLabel(energy)}\n </span>\n </div>\n </>\n )}\n\n {showKeywords && keywords.length > 0 && (\n <div>\n <span className=\"text-sm font-medium\">키워드:</span>\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {keywords.map((keyword) => (\n <Badge key={keyword} variant=\"secondary\" className=\"text-xs\">\n {keyword}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n }\n\n if (layout === \"card\") {\n return (\n <Card\n ref={ref}\n className={merge(\"\", className)}\n {...props}\n >\n <CardHeader>\n <CardTitle className=\"flex items-center\">\n <span className=\"text-2xl mr-2\">✨</span>\n AI 분석\n </CardTitle>\n <CardDescription>\n 감정 분석 결과\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {primaryEmotion && (\n <div className=\"space-y-3\">\n <div className=\"text-sm\">\n <span className=\"font-medium\">주요 감정:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {primaryEmotion.name} ({primaryEmotion.intensity}%)\n </span>\n </div>\n {showMeter && (\n <div className=\"flex justify-center\">\n <EmotionMeter\n value={primaryEmotion.intensity}\n size=\"md\"\n color=\"blue\"\n />\n </div>\n )}\n </div>\n )}\n\n {showMetrics && (\n <>\n <div className=\"text-sm\">\n <span className=\"font-medium\">감정 강도:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {getIntensityLabel(intensity)}\n </span>\n </div>\n <div className=\"text-sm\">\n <span className=\"font-medium\">긍정성:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {getPositivityLabel(positivity)}\n </span>\n </div>\n <div className=\"text-sm\">\n <span className=\"font-medium\">에너지:</span>\n <span className=\"ml-2 text-muted-foreground\">\n {getEnergyLabel(energy)}\n </span>\n </div>\n </>\n )}\n\n {showKeywords && keywords.length > 0 && (\n <div className=\"text-sm\">\n <span className=\"font-medium\">키워드:</span>\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {keywords.map((keyword) => (\n <Badge key={keyword} variant=\"secondary\" className=\"text-xs\">\n {keyword}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n )\n }\n\n // detailed layout (default)\n return (\n <div\n ref={ref}\n className={merge(\"space-y-6\", className)}\n {...props}\n >\n {primaryEmotion && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">주요 감정</h3>\n <div className=\"flex items-center space-x-4\">\n <div className=\"text-center\">\n <div className=\"text-2xl font-bold text-primary\">\n {primaryEmotion.name}\n </div>\n <div className=\"text-sm text-muted-foreground\">\n {primaryEmotion.intensity}% 강도\n </div>\n </div>\n {showMeter && (\n <EmotionMeter\n value={primaryEmotion.intensity}\n size=\"lg\"\n color=\"blue\"\n />\n )}\n </div>\n </div>\n )}\n\n {showDistribution && emotionDistribution.length > 0 && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">감정 분포</h3>\n <div className=\"space-y-3\">\n {emotionDistribution.map((item, index) => (\n <div key={index} className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">{item.emotion}</span>\n <span className=\"text-sm text-muted-foreground\">\n {item.percentage}%\n </span>\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div \n className={`${item.color} h-2 rounded-full transition-all duration-300`} \n style={{ width: `${item.percentage}%` }}\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {showMetrics && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">분석 지표</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div className=\"space-y-2\">\n <div className=\"text-sm font-medium\">감정 강도</div>\n <div className=\"text-2xl font-bold text-primary\">\n {getIntensityLabel(intensity)}\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div \n className=\"bg-primary h-2 rounded-full transition-all duration-300\" \n style={{ width: `${intensity}%` }}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <div className=\"text-sm font-medium\">긍정성</div>\n <div className=\"text-2xl font-bold text-green-600\">\n {getPositivityLabel(positivity)}\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div \n className=\"bg-green-500 h-2 rounded-full transition-all duration-300\" \n style={{ width: `${positivity}%` }}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <div className=\"text-sm font-medium\">에너지</div>\n <div className=\"text-2xl font-bold text-orange-600\">\n {getEnergyLabel(energy)}\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div \n className=\"bg-orange-500 h-2 rounded-full transition-all duration-300\" \n style={{ width: `${energy}%` }}\n />\n </div>\n </div>\n </div>\n </div>\n )}\n\n {showKeywords && keywords.length > 0 && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold\">감정 키워드</h3>\n <div className=\"flex flex-wrap gap-2\">\n {keywords.map((keyword) => (\n <Badge key={keyword} variant=\"outline\" className=\"text-sm\">\n {keyword}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n }\n)\n\nEmotionAnalysis.displayName = \"EmotionAnalysis\"\n\nexport { EmotionAnalysis } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * EmotionButton 컴포넌트의 props / EmotionButton component props\n * @typedef {Object} EmotionButtonProps\n * @property {string} emotion - 감정 이모지 또는 텍스트 / Emotion emoji or text\n * @property {boolean} [isSelected=false] - 선택 상태 / Selected state\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 버튼 크기 / Button size\n * @extends {React.ButtonHTMLAttributes<HTMLButtonElement>}\n */\nexport interface EmotionButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n emotion: string\n isSelected?: boolean\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * EmotionButton 컴포넌트 / EmotionButton component\n * \n * 감정을 선택하는 버튼 컴포넌트입니다.\n * 이모지나 텍스트로 감정을 표시하며, 선택 상태를 지원합니다.\n * \n * Button component for selecting emotions.\n * Displays emotion as emoji or text and supports selected state.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionButton emotion=\"😊\" />\n * \n * @example\n * // 선택 상태 / Selected state\n * <EmotionButton \n * emotion=\"😊\"\n * isSelected\n * size=\"lg\"\n * />\n * \n * @param {EmotionButtonProps} props - EmotionButton 컴포넌트의 props / EmotionButton component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} EmotionButton 컴포넌트 / EmotionButton component\n */\nconst EmotionButton = React.forwardRef<HTMLButtonElement, EmotionButtonProps>(\n ({ className, emotion, isSelected = false, size = \"md\", ...props }, ref) => {\n const sizeClasses = {\n sm: \"w-8 h-8 text-sm\",\n md: \"w-12 h-12 text-lg\",\n lg: \"w-16 h-16 text-xl\"\n }\n\n return (\n <button\n ref={ref}\n className={merge(\n \"rounded-full border-2 transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-2 focus:ring-blue-500\",\n sizeClasses[size],\n isSelected \n ? \"border-blue-500 bg-blue-50 dark:bg-blue-900/20\" \n : \"border-gray-200 bg-white dark:border-gray-700 dark:bg-gray-800\",\n className\n )}\n {...props}\n >\n {emotion}\n </button>\n )\n }\n)\nEmotionButton.displayName = \"EmotionButton\"\n\nexport { EmotionButton } ","'use client'\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { EmotionButton } from \"./EmotionButton\"\nimport { EmotionMeter } from \"./EmotionMeter\"\n\n/**\n * EmotionSelector 컴포넌트의 props / EmotionSelector component props\n * @typedef {Object} EmotionSelectorProps\n * @property {string} [selectedEmotion] - 선택된 감정 키 / Selected emotion key\n * @property {(emotion: string) => void} [onEmotionSelect] - 감정 선택 콜백 / Emotion selection callback\n * @property {\"grid\" | \"list\" | \"compact\"} [layout=\"grid\"] - 레이아웃 타입 / Layout type\n * @property {boolean} [showIntensity=false] - 강도 조절 표시 여부 / Show intensity control\n * @property {number} [intensity=50] - 감정 강도 (0-100) / Emotion intensity (0-100)\n * @property {(intensity: number) => void} [onIntensityChange] - 강도 변경 콜백 / Intensity change callback\n * @property {Array<Object>} [emotions] - 감정 목록 / Emotions list\n * @property {string} emotions[].key - 감정 키 / Emotion key\n * @property {string} emotions[].label - 감정 라벨 / Emotion label\n * @property {string} [emotions[].icon] - 감정 아이콘 / Emotion icon\n * @property {string} [emotions[].color] - 감정 색상 / Emotion color\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 감정 버튼 크기 / Emotion button size\n * @property {\"button\" | \"card\" | \"chip\"} [variant=\"button\"] - 감정 표시 스타일 / Emotion display style\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\ninterface EmotionSelectorProps extends React.HTMLAttributes<HTMLDivElement> {\n selectedEmotion?: string\n onEmotionSelect?: (emotion: string) => void\n layout?: \"grid\" | \"list\" | \"compact\"\n showIntensity?: boolean\n intensity?: number\n onIntensityChange?: (intensity: number) => void\n emotions?: Array<{\n key: string\n label: string\n icon?: string\n color?: string\n }>\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"button\" | \"card\" | \"chip\"\n}\n\nconst defaultEmotions = [\n { key: \"joy\", label: \"기쁨\", icon: \"smile\", color: \"yellow\" },\n { key: \"sadness\", label: \"슬픔\", icon: \"frown\", color: \"blue\" },\n { key: \"anger\", label: \"화남\", icon: \"angry\", color: \"red\" },\n { key: \"calm\", label: \"평온\", icon: \"heart\", color: \"green\" },\n { key: \"excitement\", label: \"설렘\", icon: \"star\", color: \"pink\" },\n { key: \"worry\", label: \"걱정\", icon: \"meh\", color: \"gray\" },\n { key: \"gratitude\", label: \"감사\", icon: \"heart\", color: \"purple\" },\n { key: \"loneliness\", label: \"외로움\", icon: \"user\", color: \"indigo\" }\n]\n\n/**\n * EmotionSelector 컴포넌트 / EmotionSelector component\n * \n * 감정을 선택하는 컴포넌트입니다.\n * 여러 감정 옵션을 제공하며, 강도 조절 기능을 포함할 수 있습니다.\n * \n * Component for selecting emotions.\n * Provides multiple emotion options and can include intensity control.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <EmotionSelector\n * selectedEmotion=\"joy\"\n * onEmotionSelect={(emotion) => console.log(emotion)}\n * />\n * \n * @example\n * // 강도 조절 포함 / With intensity control\n * <EmotionSelector\n * selectedEmotion=\"calm\"\n * onEmotionSelect={handleEmotionSelect}\n * showIntensity\n * intensity={intensity}\n * onIntensityChange={setIntensity}\n * variant=\"card\"\n * />\n * \n * @param {EmotionSelectorProps} props - EmotionSelector 컴포넌트의 props / EmotionSelector component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} EmotionSelector 컴포넌트 / EmotionSelector component\n */\nconst EmotionSelector = React.forwardRef<HTMLDivElement, EmotionSelectorProps>(\n ({ \n className, \n selectedEmotion,\n onEmotionSelect,\n layout = \"grid\",\n showIntensity = false,\n intensity = 50,\n onIntensityChange,\n emotions = defaultEmotions,\n size = \"md\",\n variant = \"button\",\n ...props \n }, ref) => {\n const handleEmotionClick = (emotionKey: string) => {\n onEmotionSelect?.(emotionKey)\n }\n\n const renderEmotionItem = (emotion: typeof emotions[0]) => {\n const isSelected = selectedEmotion === emotion.key\n \n if (variant === \"button\") {\n return (\n <EmotionButton\n key={emotion.key}\n emotion={emotion.key}\n isSelected={isSelected}\n size={size}\n onClick={() => handleEmotionClick(emotion.key)}\n className={merge(\n \"transition-all duration-200\",\n isSelected && \"ring-2 ring-offset-2 ring-primary\"\n )}\n >\n {emotion.label}\n </EmotionButton>\n )\n }\n\n if (variant === \"card\") {\n return (\n <div\n key={emotion.key}\n className={merge(\n \"p-4 rounded-lg border-2 cursor-pointer transition-all duration-200 hover:shadow-md\",\n isSelected \n ? \"border-primary bg-primary/5\" \n : \"border-border hover:border-primary/50\"\n )}\n onClick={() => handleEmotionClick(emotion.key)}\n >\n <div className=\"flex items-center space-x-3\">\n <div className={merge(\n \"w-8 h-8 rounded-full flex items-center justify-center\",\n isSelected ? \"bg-primary text-primary-foreground\" : \"bg-muted\"\n )}>\n {emotion.icon && (\n <span className=\"text-lg\">\n {emotion.icon === \"smile\" && \"😊\"}\n {emotion.icon === \"frown\" && \"😢\"}\n {emotion.icon === \"angry\" && \"😠\"}\n {emotion.icon === \"heart\" && \"❤️\"}\n {emotion.icon === \"star\" && \"⭐\"}\n {emotion.icon === \"meh\" && \"😐\"}\n {emotion.icon === \"user\" && \"👤\"}\n </span>\n )}\n </div>\n <span className=\"font-medium truncate max-w-[120px]\">{emotion.label}</span>\n </div>\n </div>\n )\n }\n\n if (variant === \"chip\") {\n return (\n <div\n key={emotion.key}\n className={merge(\n \"px-3 py-1 rounded-full cursor-pointer transition-all duration-200 text-sm font-medium\",\n isSelected \n ? \"bg-primary text-primary-foreground\" \n : \"bg-muted hover:bg-muted/80\"\n )}\n onClick={() => handleEmotionClick(emotion.key)}\n >\n <span className=\"truncate max-w-[100px]\">{emotion.label}</span>\n </div>\n )\n }\n\n return null\n }\n\n const layoutClasses = {\n grid: \"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-2 md:gap-3\",\n list: \"space-y-2\",\n compact: \"flex flex-wrap gap-1\"\n }\n\n return (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)}\n {...props}\n >\n <div className={layoutClasses[layout]}>\n {emotions.map(renderEmotionItem)}\n </div>\n\n {showIntensity && selectedEmotion && (\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">감정 강도</span>\n <span className=\"text-sm text-muted-foreground\">{intensity}%</span>\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={intensity}\n onChange={(e) => onIntensityChange?.(Number(e.target.value))}\n className=\"w-full h-2 bg-muted rounded-lg appearance-none cursor-pointer slider\"\n />\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>약함</span>\n <span>보통</span>\n <span>강함</span>\n </div>\n </div>\n )}\n\n {selectedEmotion && showIntensity && (\n <div className=\"flex justify-center\">\n <EmotionMeter\n value={intensity}\n size=\"md\"\n color=\"blue\"\n />\n </div>\n )}\n </div>\n )\n }\n)\n\nEmotionSelector.displayName = \"EmotionSelector\"\n\nexport { EmotionSelector } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * LanguageToggle 컴포넌트의 props / LanguageToggle component props\n * @typedef {Object} LanguageToggleProps\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Toggle 크기 / Toggle size\n * @property {\"button\" | \"icon\" | \"dropdown\"} [variant=\"button\"] - Toggle 스타일 변형 / Toggle style variant\n * @property {boolean} [showLabel=false] - 라벨 표시 여부 / Show label\n * @property {Array<Object>} [languages] - 언어 목록 / Language list\n * @property {string} languages[].code - 언어 코드 / Language code\n * @property {string} languages[].name - 언어 이름 / Language name\n * @property {string} [languages[].flag] - 언어 플래그 이모지 / Language flag emoji\n * @property {string} [currentLanguage=\"ko\"] - 현재 선택된 언어 코드 / Currently selected language code\n * @property {(language: string) => void} [onLanguageChange] - 언어 변경 콜백 / Language change callback\n */\nexport interface LanguageToggleProps {\n className?: string\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"button\" | \"icon\" | \"dropdown\"\n showLabel?: boolean\n languages?: Array<{\n code: string\n name: string\n flag?: string\n }>\n currentLanguage?: string\n onLanguageChange?: (language: string) => void\n}\n\n/**\n * LanguageToggle 컴포넌트 / LanguageToggle component\n * \n * 언어를 전환하는 토글 컴포넌트입니다.\n * 여러 언어를 지원하며, 버튼, 아이콘, 드롭다운 형태로 표시할 수 있습니다.\n * \n * Toggle component for switching languages.\n * Supports multiple languages and can be displayed as button, icon, or dropdown.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <LanguageToggle />\n * \n * @example\n * // 드롭다운 형태 / Dropdown variant\n * <LanguageToggle \n * variant=\"dropdown\"\n * currentLanguage=\"en\"\n * onLanguageChange={(lang) => console.log(lang)}\n * />\n * \n * @param {LanguageToggleProps} props - LanguageToggle 컴포넌트의 props / LanguageToggle component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} LanguageToggle 컴포넌트 / LanguageToggle component\n */\nconst LanguageToggle = React.forwardRef<HTMLDivElement, LanguageToggleProps>(\n ({ \n className,\n size = \"md\",\n variant = \"button\",\n showLabel = false,\n languages = [\n { code: \"ko\", name: \"한국어\", flag: \"🇰🇷\" },\n { code: \"en\", name: \"English\", flag: \"🇺🇸\" },\n { code: \"ja\", name: \"日本語\", flag: \"🇯🇵\" },\n { code: \"zh\", name: \"中文\", flag: \"🇨🇳\" }\n ],\n currentLanguage = \"ko\",\n onLanguageChange,\n ...props \n }, ref) => {\n const [isOpen, setIsOpen] = React.useState(false)\n const dropdownRef = React.useRef<HTMLDivElement>(null)\n\n const currentLang = languages.find(lang => lang.code === currentLanguage) || languages[0]\n\n const sizeClasses = {\n sm: \"h-10 w-10\", // 40px - 더 넉넉한 크기\n md: \"h-12 w-12\", // 48px - 더 넉넉한 크기\n lg: \"h-14 w-14\" // 56px - 더 넉넉한 크기\n }\n\n const iconSizes = {\n sm: 16,\n md: 20,\n lg: 24\n }\n\n // 외부 클릭 시 드롭다운 닫기\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside)\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside)\n }\n }, [isOpen])\n\n const handleLanguageChange = (languageCode: string) => {\n onLanguageChange?.(languageCode)\n setIsOpen(false)\n }\n\n const renderIcon = () => (\n <div className=\"flex items-center justify-center\">\n <span className=\"text-lg\">{currentLang.flag}</span>\n </div>\n )\n\n if (variant === \"icon\") {\n return (\n <div ref={dropdownRef} className=\"relative\">\n <button\n onClick={() => setIsOpen(!isOpen)}\n className={merge(\n \"inline-flex items-center justify-center rounded-lg transition-all duration-300 hover:bg-gray-100 dark:hover:bg-gray-800 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/50 focus-visible:ring-offset-2\",\n sizeClasses[size],\n className\n )}\n {...props}\n >\n {renderIcon()}\n </button>\n\n {isOpen && (\n <div className=\"absolute top-full right-0 mt-2 w-48 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 py-2 z-50\">\n {languages.map((language) => (\n <button\n key={language.code}\n onClick={() => handleLanguageChange(language.code)}\n className={merge(\n \"w-full px-4 py-3 text-left hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors duration-200 flex items-center gap-3\", // 16px, 12px 패딩, 12px 간격\n currentLanguage === language.code && \"bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400\"\n )}\n >\n <span className=\"text-lg\">{language.flag}</span>\n <span className=\"text-sm font-medium\">{language.name}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )\n }\n\n if (variant === \"dropdown\") {\n return (\n <div ref={dropdownRef} className=\"relative\">\n <button\n onClick={() => setIsOpen(!isOpen)}\n className={merge(\n \"inline-flex items-center gap-3 rounded-lg px-4 py-3 text-sm font-medium transition-all duration-300 hover:bg-gray-100 dark:hover:bg-gray-800 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/50 focus-visible:ring-offset-2\", // 12px 간격, 16px, 12px 패딩\n className\n )}\n {...props}\n >\n <span className=\"text-lg\">{currentLang.flag}</span>\n {showLabel && <span>{currentLang.name}</span>}\n <svg\n className={merge(\n \"w-4 h-4 transition-transform duration-200\",\n isOpen && \"rotate-180\"\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n {isOpen && (\n <div className=\"absolute top-full right-0 mt-2 w-48 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 py-2 z-50\">\n {languages.map((language) => (\n <button\n key={language.code}\n onClick={() => handleLanguageChange(language.code)}\n className={merge(\n \"w-full px-4 py-3 text-left hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors duration-200 flex items-center gap-3\", // 16px, 12px 패딩, 12px 간격\n currentLanguage === language.code && \"bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400\"\n )}\n >\n <span className=\"text-lg\">{language.flag}</span>\n <span className=\"text-sm font-medium\">{language.name}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )\n }\n\n // 기본 버튼 형태\n return (\n <button\n onClick={() => {\n const currentIndex = languages.findIndex(lang => lang.code === currentLanguage)\n const nextIndex = (currentIndex + 1) % languages.length\n onLanguageChange?.(languages[nextIndex].code)\n }}\n className={merge(\n \"inline-flex items-center gap-3 rounded-lg px-4 py-3 text-sm font-medium transition-all duration-300 hover:bg-gray-100 dark:hover:bg-gray-800 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/50 focus-visible:ring-offset-2\", // 12px 간격, 16px, 12px 패딩\n className\n )}\n {...props}\n >\n <span className=\"text-lg\">{currentLang.flag}</span>\n {showLabel && <span>{currentLang.name}</span>}\n </button>\n )\n }\n)\nLanguageToggle.displayName = \"LanguageToggle\"\n\nexport { LanguageToggle } ","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport { Button } from './Button'\nimport { Icon } from './Icon'\nimport { merge } from '../lib/utils'\nimport type { IconName } from '../lib/icons'\n\n/**\n * ScrollIndicator 컴포넌트의 props / ScrollIndicator component props\n * @typedef {Object} ScrollIndicatorProps\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {string} [targetId] - 스크롤 대상 요소 ID / Target element ID to scroll to\n * @property {string} [text='Scroll down'] - 표시 텍스트 / Display text\n * @property {IconName} [iconName='arrowDown'] - 아이콘 이름 / Icon name\n * @property {number} [iconSize=20] - 아이콘 크기 / Icon size\n * @property {'bottom-center' | 'bottom-left' | 'bottom-right'} [position='bottom-center'] - 표시 위치 / Display position\n * @property {'default' | 'primary' | 'secondary' | 'outline'} [variant='default'] - ScrollIndicator 스타일 변형 / ScrollIndicator style variant\n * @property {'sm' | 'md' | 'lg'} [size='md'] - ScrollIndicator 크기 / ScrollIndicator size\n * @property {boolean} [animated=true] - 애니메이션 활성화 여부 / Enable animation\n * @property {boolean} [autoHide=true] - 자동 숨김 여부 / Auto hide\n * @property {number} [hideThreshold=100] - 숨김 임계값 (px) / Hide threshold (px)\n */\nexport interface ScrollIndicatorProps {\n className?: string\n targetId?: string\n text?: string\n iconName?: IconName\n iconSize?: number\n position?: 'bottom-center' | 'bottom-left' | 'bottom-right'\n variant?: 'default' | 'primary' | 'secondary' | 'outline'\n size?: 'sm' | 'md' | 'lg'\n animated?: boolean\n autoHide?: boolean\n hideThreshold?: number\n}\n\n/**\n * ScrollIndicator 컴포넌트 / ScrollIndicator component\n * \n * 스크롤 가능함을 나타내는 인디케이터 컴포넌트입니다.\n * 클릭 시 지정된 요소로 스크롤하거나 다음 섹션으로 스크롤합니다.\n * \n * Indicator component that shows scrollability.\n * Scrolls to specified element or next section on click.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ScrollIndicator />\n * \n * @example\n * // 특정 요소로 스크롤 / Scroll to specific element\n * <ScrollIndicator \n * targetId=\"section-2\"\n * text=\"다음 섹션으로\"\n * position=\"bottom-right\"\n * />\n * \n * @param {ScrollIndicatorProps} props - ScrollIndicator 컴포넌트의 props / ScrollIndicator component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ScrollIndicator 컴포넌트 / ScrollIndicator component\n */\nconst ScrollIndicator = React.forwardRef<HTMLDivElement, ScrollIndicatorProps>(({\n className,\n targetId,\n text = 'Scroll down',\n iconName = 'arrowDown',\n iconSize = 20,\n position = 'bottom-center',\n variant = 'default',\n size = 'md',\n animated = true,\n autoHide = true,\n hideThreshold = 100,\n ...props\n}, ref) => {\n const [isVisible, setIsVisible] = useState(true)\n\n useEffect(() => {\n if (!autoHide) return\n\n const handleScroll = () => {\n const scrollTop = window.scrollY\n setIsVisible(scrollTop < hideThreshold)\n }\n\n // 초기 실행\n handleScroll()\n\n window.addEventListener('scroll', handleScroll, { passive: true })\n return () => window.removeEventListener('scroll', handleScroll)\n }, [autoHide, hideThreshold])\n\n const scrollToTarget = () => {\n if (targetId) {\n const targetElement = document.getElementById(targetId)\n if (targetElement) {\n targetElement.scrollIntoView({ behavior: 'smooth' })\n }\n } else {\n // 기본적으로 다음 섹션으로 스크롤\n const currentSection = ref as React.RefObject<HTMLDivElement>\n if (currentSection.current) {\n const nextSection = currentSection.current.nextElementSibling\n if (nextSection) {\n nextSection.scrollIntoView({ behavior: 'smooth' })\n }\n }\n }\n }\n\n const positionClasses = {\n 'bottom-center': 'bottom-8 left-1/2 transform -translate-x-1/2',\n 'bottom-left': 'bottom-8 left-8',\n 'bottom-right': 'bottom-8 right-8'\n }\n\n const sizeClasses = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg'\n }\n\n const variantClasses = {\n default: 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white',\n primary: 'text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-200',\n secondary: 'text-purple-600 dark:text-purple-400 hover:text-purple-800 dark:hover:text-purple-200',\n outline: 'text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white'\n }\n\n if (!isVisible) return null\n\n return (\n <div\n ref={ref}\n className={merge(\n 'absolute z-10',\n positionClasses[position],\n className\n )}\n {...props}\n >\n <Button\n onClick={scrollToTarget}\n variant=\"ghost\"\n size=\"sm\"\n className={merge(\n 'flex flex-col items-center space-y-2 transition-all duration-300',\n sizeClasses[size],\n variantClasses[variant],\n animated && 'animate-in fade-in-0 slide-in-from-bottom-2 duration-500'\n )}\n aria-label={text}\n >\n <span className=\"text-xs opacity-80\">{text}</span>\n <Icon\n name={iconName}\n size={iconSize}\n className={merge(\n animated && 'animate-bounce'\n )}\n />\n </Button>\n </div>\n )\n})\n\nScrollIndicator.displayName = 'ScrollIndicator'\n\nexport { ScrollIndicator } ","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport { merge } from '../lib/utils'\n\n/**\n * ScrollProgress 컴포넌트의 props / ScrollProgress component props\n * @typedef {Object} ScrollProgressProps\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {number} [height=2] - 진행률 바 높이 (px) / Progress bar height (px)\n * @property {'default' | 'primary' | 'secondary' | 'gradient'} [color='gradient'] - 진행률 바 색상 / Progress bar color\n * @property {'top' | 'bottom'} [position='top'] - 표시 위치 / Display position\n * @property {boolean} [animated=true] - 애니메이션 활성화 여부 / Enable animation\n * @property {boolean} [showPercentage=false] - 퍼센트 표시 여부 / Show percentage\n */\nexport interface ScrollProgressProps {\n className?: string\n height?: number\n color?: 'default' | 'primary' | 'secondary' | 'gradient'\n position?: 'top' | 'bottom'\n animated?: boolean\n showPercentage?: boolean\n}\n\n/**\n * ScrollProgress 컴포넌트 / ScrollProgress component\n * \n * 페이지 스크롤 진행률을 표시하는 컴포넌트입니다.\n * 페이지 상단 또는 하단에 고정되어 표시됩니다.\n * \n * Component that displays page scroll progress.\n * Fixed at top or bottom of the page.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ScrollProgress />\n * \n * @example\n * // 하단에 표시, 퍼센트 포함 / Display at bottom with percentage\n * <ScrollProgress \n * position=\"bottom\"\n * color=\"primary\"\n * showPercentage\n * height={4}\n * />\n * \n * @param {ScrollProgressProps} props - ScrollProgress 컴포넌트의 props / ScrollProgress component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ScrollProgress 컴포넌트 / ScrollProgress component\n */\nconst ScrollProgress = React.forwardRef<HTMLDivElement, ScrollProgressProps>(({\n className,\n height = 2,\n color = 'gradient',\n position = 'top',\n animated = true,\n showPercentage = false,\n ...props\n}, ref) => {\n const [progress, setProgress] = useState(0)\n\n useEffect(() => {\n const updateProgress = () => {\n const scrollTop = window.scrollY\n const docHeight = document.documentElement.scrollHeight - window.innerHeight\n const currentProgress = docHeight > 0 ? (scrollTop / docHeight) * 100 : 0\n setProgress(currentProgress)\n }\n\n // 초기 실행\n updateProgress()\n\n window.addEventListener('scroll', updateProgress, { passive: true })\n window.addEventListener('resize', updateProgress, { passive: true })\n \n return () => {\n window.removeEventListener('scroll', updateProgress)\n window.removeEventListener('resize', updateProgress)\n }\n }, [])\n\n // ScrollProgress는 특정 색상만 사용 (스크롤 진행률 표시 특화)\n const progressColors: Record<string, string> = {\n default: 'bg-blue-600',\n primary: 'bg-purple-600',\n secondary: 'bg-gray-600',\n gradient: 'bg-gradient-to-r from-purple-600 via-blue-600 to-purple-600'\n }\n\n const positionClasses = {\n top: 'top-0 left-0 right-0',\n bottom: 'bottom-0 left-0 right-0'\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n 'fixed z-50',\n positionClasses[position],\n className\n )}\n style={{ height: `${height}px` }}\n {...props}\n >\n {/* 배경 바 */}\n <div className=\"w-full h-full bg-gray-200 dark:bg-gray-700\" />\n \n {/* 진행률 바 */}\n <div\n className={merge(\n 'h-full origin-left transition-all duration-100 ease-out',\n progressColors[color] || progressColors.gradient\n )}\n style={{\n width: `${progress}%`,\n transformOrigin: 'left'\n }}\n />\n \n {/* 퍼센트 표시 (선택사항) */}\n {showPercentage && (\n <div className=\"absolute top-2 right-2 text-xs text-gray-600 dark:text-gray-400 bg-white dark:bg-gray-800 px-2 py-1 rounded\">\n {Math.round(progress)}%\n </div>\n )}\n </div>\n )\n})\n\nScrollProgress.displayName = 'ScrollProgress'\n\nexport { ScrollProgress } ","import React from \"react\"\nimport { merge } from \"../../lib/utils\"\n\nexport interface ScrollbarProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n variant?: \"default\" | \"glass\" | \"colorful\" | \"minimal\" | \"neon\"\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n orientation?: \"vertical\" | \"horizontal\" | \"both\"\n autoHide?: boolean\n smooth?: boolean\n}\n\nconst Scrollbar = React.forwardRef<HTMLDivElement, ScrollbarProps>(\n ({ \n className, \n variant = \"default\", \n size = \"md\", \n orientation = \"both\", \n autoHide = true, \n smooth = true, \n children, \n ...props \n }, ref) => {\n \n const getVariantClasses = () => {\n switch (variant) {\n case \"glass\":\n return \"scrollbar-thumb-white/20 hover:scrollbar-thumb-white/30 backdrop-blur-sm\"\n case \"colorful\":\n return \"scrollbar-thumb-gradient-to-b scrollbar-thumb-from-blue-500 scrollbar-thumb-to-purple-500 hover:scrollbar-thumb-from-blue-600 hover:scrollbar-thumb-to-purple-600\"\n case \"minimal\":\n return \"scrollbar-thumb-slate-200/50 hover:scrollbar-thumb-slate-300/70 dark:scrollbar-thumb-slate-700/50 dark:hover:scrollbar-thumb-slate-600/70\"\n case \"neon\":\n return \"scrollbar-thumb-cyan-400/60 hover:scrollbar-thumb-cyan-300/80 scrollbar-thumb-shadow-lg scrollbar-thumb-shadow-cyan-500/25\"\n default:\n return \"scrollbar-thumb-slate-300 hover:scrollbar-thumb-slate-400 dark:scrollbar-thumb-slate-600 dark:hover:scrollbar-thumb-slate-500\"\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"scrollbar-w-1\"\n case \"lg\":\n return \"scrollbar-w-3\"\n case \"xl\":\n return \"scrollbar-w-4\"\n default:\n return \"scrollbar-w-2\"\n }\n }\n\n const getOrientationClasses = () => {\n switch (orientation) {\n case \"vertical\":\n return \"overflow-y-auto overflow-x-hidden\"\n case \"horizontal\":\n return \"overflow-x-auto overflow-y-hidden\"\n default:\n return \"overflow-auto\"\n }\n }\n\n const baseClasses = merge(\n \"scrollbar-thin scrollbar-track-transparent scrollbar-thumb-rounded-full transition-all duration-200\",\n getVariantClasses(),\n getSizeClasses(),\n getOrientationClasses(),\n autoHide && \"scrollbar-hide\",\n smooth && \"scroll-smooth\",\n className\n )\n\n return (\n <div\n className={baseClasses}\n ref={ref}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nScrollbar.displayName = \"Scrollbar\"\n\nexport { Scrollbar } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport type { IconName } from \"../lib/icons\"\n\n/**\n * FeatureCard 컴포넌트의 props / FeatureCard component props\n * @typedef {Object} FeatureCardProps\n * @property {IconName | string} [icon] - 아이콘 (IconName 또는 이미지 URL) / Icon (IconName or image URL)\n * @property {string} title - 카드 제목 / Card title\n * @property {string} description - 카드 설명 / Card description\n * @property {\"default\" | \"gradient\" | \"glass\" | \"neon\"} [variant=\"default\"] - FeatureCard 스타일 변형 / FeatureCard style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - FeatureCard 크기 / FeatureCard size\n * @property {\"scale\" | \"glow\" | \"slide\" | \"none\"} [hover=\"scale\"] - 호버 효과 / Hover effect\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\"} [gradient=\"blue\"] - 그라디언트 색상 / Gradient color\n * @property {string} [customGradient] - 커스텀 그라디언트 클래스 / Custom gradient class\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface FeatureCardProps extends React.HTMLAttributes<HTMLDivElement> {\n icon?: IconName | string\n title: string\n description: 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 customGradient?: string\n}\n\n/**\n * FeatureCard 컴포넌트 / FeatureCard component\n * \n * 기능을 소개하는 카드 컴포넌트입니다.\n * 아이콘, 제목, 설명을 포함하며, 다양한 스타일과 호버 효과를 지원합니다.\n * \n * Card component that introduces features.\n * Includes icon, title, and description, supports various styles and hover effects.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <FeatureCard\n * icon=\"star\"\n * title=\"고급 기능\"\n * description=\"강력한 기능을 제공합니다\"\n * />\n * \n * @example\n * // Gradient 스타일 / Gradient style\n * <FeatureCard\n * icon=\"zap\"\n * title=\"빠른 성능\"\n * description=\"최적화된 성능\"\n * variant=\"gradient\"\n * gradient=\"purple\"\n * hover=\"glow\"\n * />\n * \n * @param {FeatureCardProps} props - FeatureCard 컴포넌트의 props / FeatureCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} FeatureCard 컴포넌트 / FeatureCard component\n */\nconst FeatureCard = React.forwardRef<HTMLDivElement, FeatureCardProps>(\n ({ \n className, \n icon, \n title, \n description, \n variant = \"default\", \n size = \"md\",\n hover = \"scale\",\n gradient = \"blue\",\n customGradient,\n ...props \n }, ref) => {\n const sizeClasses = {\n sm: \"p-4\",\n md: \"p-6\",\n lg: \"p-8\"\n }\n\n const variantClasses = {\n default: \"bg-white/90 dark:bg-gray-800/80 backdrop-blur-sm border border-gray-200/50 dark:border-gray-700/50\",\n gradient: `bg-gradient-to-br ${customGradient || getGradientClass(gradient)}`,\n glass: \"bg-white/10 dark:bg-gray-800/10 backdrop-blur-md border border-white/20 dark:border-gray-700/20\",\n neon: \"bg-gray-900/90 dark:bg-gray-900/90 border border-cyan-400/30 dark:border-cyan-400/30 shadow-lg shadow-cyan-400/20\"\n }\n\n const hoverClasses = {\n scale: \"hover:scale-105 transition-transform duration-300\",\n glow: \"hover:shadow-2xl hover:shadow-blue-500/25 dark:hover:shadow-cyan-400/25 transition-shadow duration-300\",\n slide: \"hover:-translate-y-2 transition-transform duration-300\",\n none: \"\"\n }\n\n const iconSize = size === \"lg\" ? \"text-5xl\" : size === \"md\" ? \"text-4xl\" : \"text-3xl\"\n\n return (\n <div\n ref={ref}\n className={merge(\n \"rounded-2xl shadow-lg transition-all duration-300 flex flex-col items-center text-center\",\n sizeClasses[size],\n variantClasses[variant],\n hoverClasses[hover],\n className\n )}\n {...props}\n >\n {icon && (\n <div className={`mb-4 ${iconSize} ${variant === \"neon\" ? \"text-cyan-400\" : \"\"}`}>\n {typeof icon === \"string\" && icon.startsWith(\"http\") ? (\n <img src={icon} alt={title} className=\"w-full h-full object-contain\" />\n ) : typeof icon === \"string\" ? (\n <span>{icon}</span>\n ) : (\n <Icon name={icon} className=\"w-full h-full\" />\n )}\n </div>\n )}\n \n <h3 className={merge(\n \"font-bold mb-2\",\n size === \"lg\" ? \"text-2xl\" : size === \"md\" ? \"text-xl\" : \"text-lg\",\n variant === \"gradient\" ? \"text-white\" : \"text-gray-900 dark:text-white\"\n )}>\n {title}\n </h3>\n \n <p className={merge(\n size === \"lg\" ? \"text-base\" : \"text-sm\",\n variant === \"gradient\" ? \"text-white/90\" : \"text-gray-600 dark:text-gray-300\"\n )}>\n {description}\n </p>\n </div>\n )\n }\n)\n\nFeatureCard.displayName = \"FeatureCard\"\n\nfunction getGradientClass(gradient: string): string {\n const gradients = {\n blue: \"from-blue-500 via-cyan-500 to-blue-600\",\n purple: \"from-purple-500 via-pink-500 to-purple-600\",\n green: \"from-green-500 via-emerald-500 to-green-600\",\n orange: \"from-orange-500 via-red-500 to-orange-600\",\n pink: \"from-pink-500 via-rose-500 to-pink-600\"\n }\n return gradients[gradient as keyof typeof gradients] || gradients.blue\n}\n\nexport { FeatureCard } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Button } from \"./Button\"\n\n/**\n * HeroSection 컴포넌트의 props / HeroSection component props\n * @typedef {Object} HeroSectionProps\n * @property {string} title - 히어로 섹션 제목 / Hero section title\n * @property {string} [subtitle] - 히어로 섹션 부제목 / Hero section subtitle\n * @property {string} description - 히어로 섹션 설명 / Hero section description\n * @property {Object} [primaryAction] - 주요 액션 버튼 / Primary action button\n * @property {string} primaryAction.label - 버튼 라벨 / Button label\n * @property {string} primaryAction.href - 버튼 링크 / Button link\n * @property {string} [primaryAction.icon] - 버튼 아이콘 / Button icon\n * @property {Object} [secondaryAction] - 보조 액션 버튼 / Secondary action button\n * @property {string} secondaryAction.label - 버튼 라벨 / Button label\n * @property {string} secondaryAction.href - 버튼 링크 / Button link\n * @property {string} [secondaryAction.icon] - 버튼 아이콘 / Button icon\n * @property {\"default\" | \"gradient\" | \"glass\" | \"neon\"} [variant=\"default\"] - HeroSection 스타일 변형 / HeroSection style variant\n * @property {\"none\" | \"gradient\" | \"particles\" | \"video\"} [background=\"gradient\"] - 배경 타입 / Background type\n * @property {string} [customBackground] - 커스텀 배경 / Custom background\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\"} [size=\"lg\"] - HeroSection 크기 / HeroSection size\n * @extends {React.HTMLAttributes<HTMLElement>}\n */\nexport interface HeroSectionProps extends React.HTMLAttributes<HTMLElement> {\n title: string\n subtitle?: string\n description: string\n primaryAction?: {\n label: string\n href: string\n icon?: string\n }\n secondaryAction?: {\n label: string\n href: string\n icon?: string\n }\n variant?: \"default\" | \"gradient\" | \"glass\" | \"neon\"\n background?: \"none\" | \"gradient\" | \"particles\" | \"video\"\n customBackground?: string\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n}\n\n/**\n * HeroSection 컴포넌트 / HeroSection component\n * \n * 랜딩 페이지의 히어로 섹션을 제공하는 컴포넌트입니다.\n * 제목, 설명, 액션 버튼을 포함하며, 다양한 배경 효과를 지원합니다.\n * \n * Component that provides hero section for landing pages.\n * Includes title, description, and action buttons, supports various background effects.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <HeroSection\n * title=\"환영합니다\"\n * description=\"우리 서비스를 소개합니다\"\n * primaryAction={{ label: \"시작하기\", href: \"/start\" }}\n * />\n * \n * @example\n * // Gradient 배경, 두 개의 액션 버튼 / Gradient background, two action buttons\n * <HeroSection\n * title=\"혁신적인 솔루션\"\n * subtitle=\"차세대 플랫폼\"\n * description=\"최신 기술로 만든 플랫폼\"\n * variant=\"gradient\"\n * background=\"gradient\"\n * primaryAction={{ label: \"시작하기\", href: \"/start\", icon: \"arrowRight\" }}\n * secondaryAction={{ label: \"더 알아보기\", href: \"/about\" }}\n * />\n * \n * @param {HeroSectionProps} props - HeroSection 컴포넌트의 props / HeroSection component props\n * @param {React.Ref<HTMLElement>} ref - section 요소 ref / section element ref\n * @returns {JSX.Element} HeroSection 컴포넌트 / HeroSection component\n */\nconst HeroSection = React.forwardRef<HTMLElement, HeroSectionProps>(\n ({ \n className, \n title, \n subtitle, \n description, \n primaryAction, \n secondaryAction,\n variant = \"default\",\n background = \"gradient\",\n customBackground,\n size = \"lg\",\n ...props \n }, ref) => {\n const sizeClasses = {\n sm: \"py-16\",\n md: \"py-20\", \n lg: \"py-24\",\n xl: \"py-32\"\n }\n\n const titleSizeClasses = {\n sm: \"text-3xl md:text-4xl\",\n md: \"text-4xl md:text-5xl\",\n lg: \"text-5xl md:text-6xl\",\n xl: \"text-6xl md:text-7xl\"\n }\n\n const subtitleSizeClasses = {\n sm: \"text-lg md:text-xl\",\n md: \"text-xl md:text-2xl\", \n lg: \"text-2xl md:text-3xl\",\n xl: \"text-3xl md:text-4xl\"\n }\n\n const descriptionSizeClasses = {\n sm: \"text-base md:text-lg\",\n md: \"text-lg md:text-xl\",\n lg: \"text-lg md:text-2xl\",\n xl: \"text-xl md:text-3xl\"\n }\n\n const backgroundClasses = {\n none: \"\",\n gradient: \"relative overflow-hidden\",\n particles: \"relative overflow-hidden\",\n video: \"relative overflow-hidden\"\n }\n\n const backgroundContent = {\n none: null,\n gradient: (\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\n <div className=\"absolute -top-32 -left-32 w-[600px] h-[600px] bg-gradient-to-br from-cyan-400 via-blue-500 to-purple-600 opacity-60 rounded-full blur-3xl animate-pulse\" />\n <div className=\"absolute bottom-0 right-0 w-[400px] h-[400px] bg-gradient-to-tr from-orange-400 via-pink-500 to-red-600 opacity-40 rounded-full blur-2xl animate-pulse\" />\n </div>\n ),\n particles: (\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\n <div className=\"absolute inset-0 bg-gradient-to-br from-blue-50 via-indigo-50 to-purple-50 dark:from-gray-900 dark:via-blue-900 dark:to-purple-900\" />\n <div className=\"absolute inset-0 opacity-30\">\n {[...Array(20)].map((_, i) => (\n <div\n key={i}\n className=\"absolute w-2 h-2 bg-blue-500 rounded-full animate-pulse\"\n style={{\n left: `${Math.random() * 100}%`,\n top: `${Math.random() * 100}%`,\n animationDelay: `${Math.random() * 2}s`,\n animationDuration: `${2 + Math.random() * 2}s`\n }}\n />\n ))}\n </div>\n </div>\n ),\n video: (\n <div className=\"absolute inset-0 z-0 pointer-events-none\">\n <video\n autoPlay\n loop\n muted\n playsInline\n className=\"absolute inset-0 w-full h-full object-cover opacity-20\"\n >\n <source src={customBackground} type=\"video/mp4\" />\n </video>\n </div>\n )\n }\n\n return (\n <section\n ref={ref}\n className={merge(\n \"flex-1 flex flex-col justify-center items-center text-center px-4 sm:px-6 lg:px-8\",\n sizeClasses[size],\n backgroundClasses[background],\n className\n )}\n {...props}\n >\n {backgroundContent[background]}\n \n <div className=\"relative z-10 max-w-4xl mx-auto\">\n <h1 className={merge(\n \"font-extrabold mb-6 text-gray-900 dark:text-white drop-shadow-[0_4px_24px_rgba(0,0,0,0.1)] dark:drop-shadow-[0_4px_24px_rgba(0,0,0,0.25)]\",\n titleSizeClasses[size]\n )}>\n <span className=\"block text-transparent bg-clip-text bg-gradient-to-r from-blue-600 via-purple-600 to-cyan-600 dark:from-cyan-300 dark:via-blue-400 dark:to-purple-400 drop-shadow-[0_2px_8px_rgba(39,94,254,0.3)]\">\n {title}\n </span>\n {subtitle && (\n <span className={merge(\n \"block font-semibold mt-4 text-gray-700 dark:text-white/90\",\n subtitleSizeClasses[size]\n )}>\n {subtitle}\n </span>\n )}\n </h1>\n \n <p className={merge(\n \"text-gray-600 dark:text-white/80 mb-10 max-w-2xl mx-auto drop-shadow-[0_2px_8px_rgba(0,0,0,0.05)] dark:drop-shadow-[0_2px_8px_rgba(0,0,0,0.15)]\",\n descriptionSizeClasses[size]\n )}>\n {description}\n </p>\n \n {(primaryAction || secondaryAction) && (\n <div className=\"flex flex-col sm:flex-row gap-4 justify-center mb-8\">\n {primaryAction && (\n <Button\n href={primaryAction.href}\n variant=\"gradient\"\n size={size === \"xl\" ? \"lg\" : \"md\"}\n className=\"inline-flex items-center\"\n >\n {primaryAction.icon && <span className=\"mr-2\">{primaryAction.icon}</span>}\n {primaryAction.label}\n </Button>\n )}\n \n {secondaryAction && (\n <Button\n href={secondaryAction.href}\n variant=\"outline\"\n size={size === \"xl\" ? \"lg\" : \"md\"}\n className=\"inline-flex items-center\"\n >\n {secondaryAction.icon && <span className=\"mr-2\">{secondaryAction.icon}</span>}\n {secondaryAction.label}\n </Button>\n )}\n </div>\n )}\n </div>\n </section>\n )\n }\n)\n\nHeroSection.displayName = \"HeroSection\"\n\nexport { HeroSection } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport type { IconName } from \"../lib/icons\"\n\n/**\n * InfoCard 컴포넌트의 props / InfoCard component props\n * @typedef {Object} InfoCardProps\n * @property {string} title - 카드 제목 / Card title\n * @property {IconName} icon - 카드 아이콘 / Card icon\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\"} [tone=\"blue\"] - InfoCard 톤 색상 / InfoCard tone color\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface InfoCardProps extends React.HTMLAttributes<HTMLDivElement> {\n title: string\n icon: IconName\n tone?: \"blue\" | \"purple\" | \"green\" | \"orange\"\n}\n\nconst toneClasses: Record<NonNullable<InfoCardProps[\"tone\"]>, { container: string; icon: string; title: string; body: string }> = {\n blue: {\n container: \"bg-gradient-to-r from-blue-50 to-indigo-50 dark:from-blue-900/20 dark:to-indigo-900/20 rounded-lg p-4 border border-blue-200 dark:border-blue-700\",\n icon: \"h-5 w-5 text-blue-600 dark:text-blue-400 mr-3 mt-0.5 flex-shrink-0\",\n title: \"text-sm font-medium text-blue-900 dark:text-blue-100 mb-2 block\",\n body: \"text-gray-800 dark:text-gray-200 text-sm leading-relaxed\",\n },\n purple: {\n container: \"bg-gradient-to-r from-purple-50 to-pink-50 dark:from-purple-900/20 dark:to-pink-900/20 rounded-lg p-4 border border-purple-200 dark:border-purple-700\",\n icon: \"h-5 w-5 text-purple-600 dark:text-purple-400 mr-3 mt-0.5 flex-shrink-0\",\n title: \"text-sm font-medium text-purple-900 dark:text-purple-100 mb-2 block\",\n body: \"text-gray-800 dark:text-gray-200 text-sm leading-relaxed\",\n },\n green: {\n container: \"bg-gradient-to-r from-green-50 to-emerald-50 dark:from-green-900/20 dark:to-emerald-900/20 rounded-lg p-4 border border-green-200 dark:border-green-700\",\n icon: \"h-5 w-5 text-green-600 dark:text-green-400 mr-3 mt-0.5 flex-shrink-0\",\n title: \"text-sm font-medium text-green-900 dark:text-green-100 mb-2 block\",\n body: \"text-gray-800 dark:text-gray-200 text-sm leading-relaxed\",\n },\n orange: {\n container: \"bg-gradient-to-r from-orange-50 to-rose-50 dark:from-orange-900/20 dark:to-rose-900/20 rounded-lg p-4 border border-orange-200 dark:border-orange-700\",\n icon: \"h-5 w-5 text-orange-600 dark:text-orange-400 mr-3 mt-0.5 flex-shrink-0\",\n title: \"text-sm font-medium text-orange-900 dark:text-orange-100 mb-2 block\",\n body: \"text-gray-800 dark:text-gray-200 text-sm leading-relaxed\",\n },\n}\n\n/**\n * InfoCard 컴포넌트 / InfoCard component\n * \n * 정보를 표시하는 카드 컴포넌트입니다.\n * 아이콘, 제목, 내용을 포함하며, 다양한 톤 색상을 지원합니다.\n * \n * Card component that displays information.\n * Includes icon, title, and content, supports various tone colors.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <InfoCard\n * icon=\"info\"\n * title=\"정보\"\n * tone=\"blue\"\n * >\n * 이것은 정보 카드입니다.\n * </InfoCard>\n * \n * @example\n * // 다양한 톤 / Various tones\n * <InfoCard icon=\"check\" title=\"성공\" tone=\"green\">\n * 작업이 완료되었습니다.\n * </InfoCard>\n * \n * @param {InfoCardProps} props - InfoCard 컴포넌트의 props / InfoCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} InfoCard 컴포넌트 / InfoCard component\n */\nexport const InfoCard = React.forwardRef<HTMLDivElement, InfoCardProps>(({ className, title, icon, tone = \"blue\", children, ...props }, ref) => {\n const t = toneClasses[tone]\n return (\n <div ref={ref} className={merge(t.container, className)} {...props}>\n <div className=\"flex items-start mb-2\">\n <Icon name={icon} className={t.icon} />\n <div className=\"flex-1\">\n <span className={t.title}>{title}</span>\n <div className={t.body}>{children}</div>\n </div>\n </div>\n </div>\n )\n})\n\nInfoCard.displayName = \"InfoCard\"\n\nexport default InfoCard\n\n\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {a as a$1}from'./chunk-ACEKLG37.mjs';import {l}from'./chunk-DMYT7RZ4.mjs';import {a}from'./chunk-UUHAXGMO.mjs';import A from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var oe=A.forwardRef(({className:r,type:l,...t},n)=>{let g=t["aria-invalid"],s=g!==void 0?g:false;return jsx("input",{type:l,className:a("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-all duration-200 hover:border-blue-400 hover:shadow-sm",s&&"border-red-500 focus-visible:ring-red-500",r),ref:n,"aria-invalid":s||void 0,...t})});oe.displayName="Input";var le=A.forwardRef(({className:r,children:l,trigger:t,open:n,onOpenChange:g,position:s="bottom",align:o="center",offset:c=8,disabled:f=false,...k},d)=>{let[i,N]=A.useState(false),y=A.useRef(null),x=A.useRef(null),m=n!==void 0,b=m?n:i,h=v=>{f||(m||N(v),g==null||g(v));},D=()=>{h(!b);};A.useEffect(()=>{let v=I=>{y.current&&x.current&&!y.current.contains(I.target)&&!x.current.contains(I.target)&&h(false);};if(b)return document.addEventListener("mousedown",v),()=>{document.removeEventListener("mousedown",v);}},[b]);let M=()=>{let v="absolute z-50";switch(s){case "top":return a(v,"bottom-full left-0",`mb-${Math.max(1,Math.floor(c/4))}`);case "bottom":return a(v,"top-full left-0",`mt-${Math.max(1,Math.floor(c/4))}`);case "left":return a(v,"right-full top-0",`mr-${Math.max(1,Math.floor(c/4))}`);case "right":return a(v,"left-full top-0",`ml-${Math.max(1,Math.floor(c/4))}`);default:return a(v,"top-full left-0",`mt-${Math.max(1,Math.floor(c/4))}`)}},R=()=>{switch(o){case "start":return s==="top"||s==="bottom"?"left-0":"top-0";case "end":return s==="top"||s==="bottom"?"right-0":"bottom-0";default:return s==="top"||s==="bottom"?"left-1/2 -translate-x-1/2":"top-1/2 -translate-y-1/2"}},F=()=>{let v="absolute w-0 h-0 border-4 border-transparent";switch(s){case "top":return `${v} top-full left-1/2 -translate-x-1/2 border-t-gray-200 dark:border-t-gray-700`;case "bottom":return `${v} bottom-full left-1/2 -translate-x-1/2 border-b-gray-200 dark:border-b-gray-700`;case "left":return `${v} left-full top-1/2 -translate-y-1/2 border-l-gray-200 dark:border-l-gray-700`;case "right":return `${v} right-full top-1/2 -translate-y-1/2 border-r-gray-200 dark:border-r-gray-700`;default:return `${v} bottom-full left-1/2 -translate-x-1/2 border-b-gray-200 dark:border-b-gray-700`}};return jsxs("div",{ref:d,className:a("relative",r),...k,children:[jsx("div",{ref:y,onClick:D,className:"inline-block cursor-pointer",children:t}),b&&jsxs("div",{ref:x,className:a("bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg p-4 min-w-[200px]",M(),R()),children:[jsx("div",{className:F()}),jsx("div",{className:"relative z-10",children:l})]})]})});le.displayName="Popover";var Me=A.forwardRef(({className:r,children:l,...t},n)=>jsx("div",{ref:n,className:a("inline-block cursor-pointer",r),...t,children:l}));Me.displayName="PopoverTrigger";var De=A.forwardRef(({className:r,children:l,...t},n)=>jsx("div",{ref:n,className:a("bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg p-4",r),...t,children:l}));De.displayName="PopoverContent";var Re=A.forwardRef(({className:r,children:l,onSubmit:t,variant:n="default",...g},s)=>jsx("form",{ref:s,onSubmit:f=>{f.preventDefault(),t==null||t(f);},className:a({default:"space-y-6",glass:"space-y-6 bg-white/10 backdrop-blur-sm border border-white/20 rounded-xl p-6 shadow-xl dark:bg-slate-800/20 dark:border-slate-700/50"}[n],r),...g,children:l}));Re.displayName="Form";var Te=A.forwardRef(({className:r,children:l,error:t,required:n,...g},s)=>{let o=A.useId(),c=A.Children.map(l,f=>{if(A.isValidElement(f)){let k=f.props,d=f.type,i=false;if(typeof d=="object"&&d!==null){let y=d,x=y.displayName,m=y.name;i=x==="Input"||x==="Select"||x==="Textarea"||m==="Input"||m==="Select"||m==="Textarea";}let N=typeof d=="string"&&["input","select","textarea"].includes(d.toLowerCase());if(i||N){let y=k["aria-describedby"],x=t?y?`${y} ${o}`:o:y;return A.cloneElement(f,{"aria-describedby":x,"aria-invalid":t?true:k["aria-invalid"],required:n||k.required})}}return f});return jsxs("div",{ref:s,className:a("space-y-2",r),...g,children:[c,t&&jsx("p",{id:o,className:"text-sm text-red-600 dark:text-red-400",role:"alert","aria-live":"polite",children:t})]})});Te.displayName="FormField";var Le=A.forwardRef(({className:r,children:l,inline:t=false,...n},g)=>jsx("div",{ref:g,className:a(t?"flex gap-4":"space-y-4",r),...n,children:l}));Le.displayName="FormGroup";var Ie=A.forwardRef(({className:r,children:l,required:t=false,error:n=false,disabled:g=false,variant:s="default",...o},c)=>{let f={default:a("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",n&&"text-red-600 dark:text-red-400",g&&"text-slate-400 dark:text-slate-500",!n&&!g&&"text-slate-700 dark:text-slate-300"),glass:a("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",n&&"text-red-400",g&&"text-white/50",!n&&!g&&"text-white")};return jsxs("label",{ref:c,className:a(f[s],r),"aria-required":t?true:void 0,...o,children:[l,t&&jsx("span",{className:s==="glass"?"text-red-400 ml-1":"text-red-500 ml-1","aria-label":"\uD544\uC218 \uD544\uB4DC",children:"*"})]})});Ie.displayName="Label";var Se=A.forwardRef(({className:r,variant:l$1="default",size:t="md",error:n=false,success:g=false,label:s,description:o,id:c,...f},k)=>{var D;let d=c||A.useId(),i=s?`${d}-label`:void 0,N=o?`${d}-description`:void 0,y={sm:"w-4 h-4",md:"w-5 h-5",lg:"w-6 h-6"},x={sm:12,md:14,lg:16},m={default:"border-gray-300 bg-white text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-800 dark:focus:ring-blue-400",outline:"border-2 border-gray-200 bg-transparent text-blue-600 focus:ring-blue-500 dark:border-gray-700 dark:focus:ring-blue-400",filled:"border-transparent bg-gray-50 text-blue-600 focus:bg-white focus:ring-blue-500 dark:bg-gray-700 dark:focus:bg-gray-800 dark:focus:ring-blue-400",glass:"border-white/30 bg-white/10 backdrop-blur-sm text-white focus:ring-blue-400/50 focus:bg-white/20 dark:border-slate-600/50 dark:bg-slate-800/10 dark:focus:ring-blue-400/50 dark:focus:bg-slate-700/20"},b=n?"border-red-500 focus:ring-red-500 dark:border-red-400 dark:focus:ring-red-400":g?"border-green-500 focus:ring-green-500 dark:border-green-400 dark:focus:ring-green-400":"",h=(D=f.checked)!=null?D:false;return jsxs("div",{className:"flex items-start space-x-3",children:[jsxs("div",{className:"relative",children:[jsx("input",{type:"checkbox",id:d,className:a("peer absolute inset-0 w-full h-full opacity-0 cursor-pointer z-10",r),ref:k,"aria-checked":h,"aria-invalid":n,"aria-label":s?void 0:f["aria-label"],"aria-labelledby":s?i:void 0,"aria-describedby":N,role:"checkbox",...f}),jsx("div",{className:a("flex items-center justify-center rounded border transition-all duration-200 cursor-pointer relative","peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-offset-2","peer-hover:border-blue-400 peer-hover:shadow-sm","peer-disabled:cursor-not-allowed peer-disabled:opacity-50 peer-disabled:hover:border-gray-300",y[t],m[l$1],b,h&&"bg-blue-600 border-blue-600 dark:bg-blue-500 dark:border-blue-500 shadow-md shadow-blue-500/20",!h&&"bg-white dark:bg-gray-800"),children:jsx(l,{name:"check",size:x[t],className:a("text-white transition-all duration-200",h?"opacity-100 scale-100":"opacity-0 scale-0")})})]}),(s||o)&&jsxs("div",{className:"flex flex-col",children:[s&&jsx("label",{htmlFor:d,id:i,className:"text-sm font-medium text-gray-900 dark:text-white cursor-pointer",children:s}),o&&jsx("p",{id:N,className:"text-sm text-gray-500 dark:text-gray-400",children:o})]})]})});Se.displayName="Checkbox";var Pe=A.forwardRef(({className:r,variant:l="default",size:t="md",error:n=false,success:g=false,label:s,description:o,id:c,...f},k)=>{var h;let d=c||A.useId(),i=s?`${d}-label`:void 0,N=o?`${d}-description`:void 0,y={sm:"w-4 h-4",md:"w-5 h-5",lg:"w-6 h-6"},x={sm:"w-1.5 h-1.5",md:"w-2 h-2",lg:"w-2.5 h-2.5"},m={default:"border-gray-300 bg-white text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-800 dark:focus:ring-blue-400",outline:"border-2 border-gray-200 bg-transparent text-blue-600 focus:ring-blue-500 dark:border-gray-700 dark:focus:ring-blue-400",filled:"border-transparent bg-gray-50 text-blue-600 focus:bg-white focus:ring-blue-500 dark:bg-gray-700 dark:focus:bg-gray-800 dark:focus:ring-blue-400",glass:"border-white/30 bg-white/10 backdrop-blur-sm text-white focus:ring-blue-400/50 focus:bg-white/20 dark:border-slate-600/50 dark:bg-slate-800/10 dark:focus:ring-blue-400/50 dark:focus:bg-slate-700/20"},b=n?"border-red-500 focus:ring-red-500 dark:border-red-400 dark:focus:ring-red-400":g?"border-green-500 focus:ring-green-500 dark:border-green-400 dark:focus:ring-green-400":"";return jsxs("div",{className:"flex items-start space-x-3",children:[jsxs("div",{className:"relative",children:[jsx("input",{type:"radio",id:d,className:a("peer sr-only",r),ref:k,"aria-checked":(h=f.checked)!=null?h:false,"aria-invalid":n,"aria-label":s?void 0:f["aria-label"],"aria-labelledby":s?i:void 0,"aria-describedby":N,role:"radio",...f}),jsx("div",{className:a("flex items-center justify-center rounded-full border transition-all duration-200 cursor-pointer","peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-offset-2","peer-disabled:cursor-not-allowed peer-disabled:opacity-50",y[t],m[l],b,"peer-checked:border-blue-600 dark:peer-checked:border-blue-500"),children:jsx("div",{className:a("rounded-full bg-blue-600 dark:bg-blue-500 opacity-0 peer-checked:opacity-100 transition-opacity duration-200",x[t])})})]}),(s||o)&&jsxs("div",{className:"flex flex-col",children:[s&&jsx("label",{htmlFor:d,id:i,className:"text-sm font-medium text-gray-900 dark:text-white cursor-pointer",children:s}),o&&jsx("p",{id:N,className:"text-sm text-gray-500 dark:text-gray-400",children:o})]})]})});Pe.displayName="Radio";var Ae=A.forwardRef(({className:r,variant:l$1="default",size:t="md",error:n=false,success:g=false,leftIcon:s,placeholder:o,children:c,"aria-label":f,"aria-invalid":k,...d},i)=>{let N={default:"border-gray-300 bg-white text-gray-900 focus:border-blue-500 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:focus:border-blue-400 dark:focus:ring-blue-400",outline:"border-2 border-gray-200 bg-transparent text-gray-900 focus:border-blue-500 focus:ring-blue-500 dark:border-gray-700 dark:text-white dark:focus:border-blue-400 dark:focus:ring-blue-400",filled:"border-transparent bg-gray-50 text-gray-900 focus:bg-white focus:border-blue-500 focus:ring-blue-500 dark:bg-gray-700 dark:text-white dark:focus:bg-gray-800 dark:focus:border-blue-400 dark:focus:ring-blue-400",ghost:"border-transparent bg-transparent text-gray-900 focus:bg-gray-50 focus:border-gray-300 focus:ring-gray-500 dark:text-white dark:focus:bg-gray-800 dark:focus:border-gray-600 dark:focus:ring-gray-400",glass:"border-white/30 bg-white/10 backdrop-blur-sm text-white focus:border-blue-400/50 focus:ring-blue-400/20 focus:bg-white/20 dark:border-slate-600/50 dark:bg-slate-800/10 dark:text-slate-200 dark:focus:border-blue-400/50 dark:focus:ring-blue-400/20 dark:focus:bg-slate-700/20"},y={sm:"h-8 px-3 text-sm",md:"h-10 px-4 text-base",lg:"h-12 px-4 text-lg"},x=n?"border-red-500 focus:border-red-500 focus:ring-red-500 dark:border-red-400 dark:focus:border-red-400 dark:focus:ring-red-400":g?"border-green-500 focus:border-green-500 focus:ring-green-500 dark:border-green-400 dark:focus:border-green-400 dark:focus:ring-green-400":"",m=A.useRef(null),b=A.useCallback(M=>{m.current=M,typeof i=="function"?i(M):i&&(i.current=M);},[i]),[h,D]=A.useState(false);return jsxs("div",{className:"relative",children:[s&&jsx("div",{className:"absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 dark:text-gray-500 pointer-events-none z-10",children:s}),jsxs("select",{ref:b,className:a("flex w-full appearance-none rounded-md border transition-all duration-200","focus:outline-none focus:ring-2 focus:ring-offset-2","hover:border-blue-400 hover:shadow-sm","disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:border-gray-300",N[l$1],y[t],x,s?"pl-10":"","pr-10",r),"aria-label":f||(o?void 0:"\uC120\uD0DD"),"aria-invalid":k!==void 0?k:n||void 0,onFocus:M=>{var R;D(true),(R=d.onFocus)==null||R.call(d,M);},onBlur:M=>{var R;D(false),(R=d.onBlur)==null||R.call(d,M);},...d,children:[o&&jsx("option",{value:"",disabled:true,children:o}),c]}),jsx("div",{className:a("absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 dark:text-gray-500 pointer-events-none transition-transform duration-200",h&&"rotate-180"),children:jsx(l,{name:"chevronDown",size:16})})]})});Ae.displayName="Select";var $e=A.forwardRef(({className:r,...l},t)=>jsx("option",{className:r||"",ref:t,...l}));$e.displayName="SelectOption";var ze=A.forwardRef(({className:r,variant:l="default",size:t="md",error:n=false,success:g=false,label:s,description:o,id:c,...f},k)=>{var h;let d=c||A.useId(),i=s?`${d}-label`:void 0,N=o?`${d}-description`:void 0,y={sm:"w-8 h-4",md:"w-11 h-6",lg:"w-14 h-7"},x={sm:"w-3 h-3",md:"w-5 h-5",lg:"w-6 h-6"},m={default:"bg-gray-200 peer-checked:bg-blue-600 dark:bg-gray-700 dark:peer-checked:bg-blue-500",outline:"bg-transparent border-2 border-gray-300 peer-checked:border-blue-600 peer-checked:bg-blue-600 dark:border-gray-600 dark:peer-checked:border-blue-500 dark:peer-checked:bg-blue-500",filled:"bg-gray-100 peer-checked:bg-blue-600 dark:bg-gray-800 dark:peer-checked:bg-blue-500",glass:"bg-white/20 backdrop-blur-sm border border-white/30 peer-checked:bg-blue-400/50 peer-checked:border-blue-300/50 dark:bg-slate-800/20 dark:border-slate-700/50 dark:peer-checked:bg-blue-400/50 dark:peer-checked:border-blue-300/50"},b=n?"bg-red-200 peer-checked:bg-red-600 dark:bg-red-800 dark:peer-checked:bg-red-500":g?"bg-green-200 peer-checked:bg-green-600 dark:bg-green-800 dark:peer-checked:bg-green-500":"";return jsxs("div",{className:"flex items-start space-x-3",children:[jsxs("div",{className:"relative",children:[jsx("input",{type:"checkbox",id:d,className:a("peer sr-only",r),ref:k,"aria-checked":(h=f.checked)!=null?h:false,"aria-invalid":n,"aria-label":s?void 0:f["aria-label"],"aria-labelledby":s?i:void 0,"aria-describedby":N,role:"switch",...f}),jsx("div",{className:a("relative inline-flex cursor-pointer items-center rounded-full transition-colors duration-200 ease-in-out","peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-blue-500 peer-focus:ring-offset-2","peer-disabled:cursor-not-allowed peer-disabled:opacity-50",y[t],m[l],b),children:jsx("div",{className:a("pointer-events-none block rounded-full bg-white shadow-lg ring-0 transition-transform duration-200 ease-in-out","peer-checked:translate-x-full",x[t],t==="sm"?"translate-x-0.5 peer-checked:translate-x-4.5":"",t==="md"?"translate-x-0.5 peer-checked:translate-x-5.5":"",t==="lg"?"translate-x-0.5 peer-checked:translate-x-7":"")})})]}),(s||o)&&jsxs("div",{className:"flex flex-col",children:[s&&jsx("label",{htmlFor:d,id:i,className:"text-sm font-medium text-gray-900 dark:text-white cursor-pointer",children:s}),o&&jsx("p",{id:N,className:"text-sm text-gray-500 dark:text-gray-400",children:o})]})]})});ze.displayName="Switch";var Ye=A.forwardRef(({className:r,variant:l="default",size:t="md",showValue:n=false,showLabel:g=false,label:s,min:o=0,max:c=100,step:f=1,value:k=0,onValueChange:d,orientation:i="horizontal",disabled:N=false,...y},x)=>{let m=Array.isArray(k),b=m?k:[k],h=w=>{let T=parseFloat(w.target.value);if(d)if(m){let O=parseInt(w.target.dataset.index||"0"),$=[...b];$[O]=T,d($);}else d(T);},D={default:"bg-gray-200 dark:bg-gray-700",primary:"bg-blue-200 dark:bg-blue-700",success:"bg-green-200 dark:bg-green-700",warning:"bg-yellow-200 dark:bg-yellow-700",danger:"bg-red-200 dark:bg-red-700"},M={default:"bg-gray-400 hover:bg-gray-500 dark:bg-gray-500 dark:hover:bg-gray-400",primary:"bg-blue-500 hover:bg-blue-600 dark:bg-blue-400 dark:hover:bg-blue-500",success:"bg-green-500 hover:bg-green-600 dark:bg-green-400 dark:hover:bg-green-500",warning:"bg-yellow-500 hover:bg-yellow-600 dark:bg-yellow-400 dark:hover:bg-yellow-500",danger:"bg-red-500 hover:bg-red-600 dark:bg-red-400 dark:hover:bg-red-500"},R={sm:i==="horizontal"?"h-1":"w-1",md:i==="horizontal"?"h-2":"w-2",lg:i==="horizontal"?"h-3":"w-3"},F={sm:"w-3 h-3",md:"w-4 h-4",lg:"w-6 h-6"},v=i==="vertical"?"flex-col h-full":"flex-row w-full",I=(w=0)=>jsx("input",{ref:w===0?x:void 0,type:"range",min:o,max:c,step:f,value:b[w],onChange:h,"data-index":w,disabled:N,className:a("appearance-none cursor-pointer rounded-full transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",R[t],D[l],i==="vertical"?"writing-mode: bt-lr; -webkit-appearance: slider-vertical":"",r),style:{...i==="vertical"&&{writingMode:"vertical-rl",WebkitAppearance:"slider-vertical"}},...y},w),u=()=>n?m?jsx("div",{className:"flex gap-2 text-sm text-gray-600 dark:text-gray-400",children:b.map((w,T)=>jsx("span",{className:"font-mono",children:w},T))}):jsx("span",{className:"text-sm font-mono text-gray-600 dark:text-gray-400",children:b[0]}):null;return jsxs("div",{className:a("flex items-center gap-4",v),children:[g&&s&&jsx("label",{className:"text-sm font-medium text-gray-700 dark:text-gray-300 min-w-0",children:s}),jsxs("div",{className:"flex-1 relative",children:[jsxs("div",{className:a("relative",i==="vertical"?"h-full":"w-full"),children:[jsx("div",{className:a("absolute rounded-full",R[t],D[l],i==="vertical"?"w-full bottom-0":"h-full left-0")}),m?jsx("div",{className:a("absolute rounded-full bg-blue-500 dark:bg-blue-400",R[t],i==="vertical"?"w-full bottom-0":"h-full left-0"),style:{...i==="vertical"?{bottom:`${(b[0]-o)/(c-o)*100}%`,height:`${(b[1]-b[0])/(c-o)*100}%`}:{left:`${(b[0]-o)/(c-o)*100}%`,width:`${(b[1]-b[0])/(c-o)*100}%`}}}):jsx("div",{className:a("absolute rounded-full bg-blue-500 dark:bg-blue-400",R[t],i==="vertical"?"w-full bottom-0":"h-full left-0"),style:{...i==="vertical"?{height:`${(b[0]-o)/(c-o)*100}%`}:{width:`${(b[0]-o)/(c-o)*100}%`}}}),m?b.map((w,T)=>jsx("div",{className:a("absolute rounded-full border-2 border-white shadow-lg transition-all duration-200 hover:scale-110",F[t],M[l],i==="vertical"?"left-1/2 transform -translate-x-1/2":"top-1/2 transform -translate-y-1/2"),style:{...i==="vertical"?{bottom:`${(b[T]-o)/(c-o)*100}%`}:{left:`${(b[T]-o)/(c-o)*100}%`}}},T)):jsx("div",{className:a("absolute rounded-full border-2 border-white shadow-lg transition-all duration-200 hover:scale-110",F[t],M[l],i==="vertical"?"left-1/2 transform -translate-x-1/2":"top-1/2 transform -translate-y-1/2"),style:{...i==="vertical"?{bottom:`${(b[0]-o)/(c-o)*100}%`}:{left:`${(b[0]-o)/(c-o)*100}%`}}})]}),jsx("div",{className:"absolute inset-0 opacity-0",children:m?b.map((w,T)=>I(T)):I()})]}),u()]})});Ye.displayName="Slider";var Ue=A.forwardRef(({className:r,variant:l="default",size:t="md",error:n=false,success:g=false,resize:s="vertical",...o},c)=>{let f={default:"border-gray-300 bg-white text-gray-900 placeholder-gray-500 focus:border-blue-500 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-400 dark:focus:border-blue-400 dark:focus:ring-blue-400 transition-all duration-200 hover:border-blue-400 hover:shadow-sm",outline:"border-2 border-gray-200 bg-transparent text-gray-900 placeholder-gray-500 focus:border-blue-500 focus:ring-blue-500 dark:border-gray-700 dark:text-white dark:placeholder-gray-400 dark:focus:border-blue-400 dark:focus:ring-blue-400 transition-all duration-200 hover:border-blue-400 hover:shadow-sm",filled:"border-transparent bg-gray-50 text-gray-900 placeholder-gray-500 focus:bg-white focus:border-blue-500 focus:ring-blue-500 dark:bg-gray-700 dark:text-white dark:placeholder-gray-400 dark:focus:bg-gray-800 dark:focus:border-blue-400 dark:focus:ring-blue-400 transition-all duration-200 hover:bg-gray-100 dark:hover:bg-gray-600",ghost:"border-transparent bg-transparent text-gray-900 placeholder-gray-500 focus:bg-gray-50 focus:border-gray-300 focus:ring-gray-500 dark:text-white dark:placeholder-gray-400 dark:focus:bg-gray-800 dark:focus:border-gray-600 dark:focus:ring-gray-400 transition-all duration-200 hover:bg-gray-50 dark:hover:bg-gray-800",glass:"border-white/30 bg-white/10 backdrop-blur-sm text-white placeholder-white/60 focus:border-blue-400/50 focus:ring-blue-400/20 focus:bg-white/20 dark:border-slate-600/50 dark:bg-slate-800/10 dark:text-slate-200 dark:placeholder-slate-400 dark:focus:border-blue-400/50 dark:focus:ring-blue-400/20 dark:focus:bg-slate-700/20 transition-all duration-200 hover:border-blue-400/40 hover:bg-white/15 dark:hover:bg-slate-700/15"},k={sm:"px-3 py-2 text-sm min-h-[80px]",md:"px-4 py-3 text-base min-h-[100px]",lg:"px-4 py-3 text-lg min-h-[120px]"},d={none:"resize-none",vertical:"resize-y",horizontal:"resize-x",both:"resize"},i=n?"border-red-500 focus:border-red-500 focus:ring-red-500 dark:border-red-400 dark:focus:border-red-400 dark:focus:ring-red-400":g?"border-green-500 focus:border-green-500 focus:ring-green-500 dark:border-green-400 dark:focus:border-green-400 dark:focus:ring-green-400":"",N=o["aria-invalid"],y=n||(N!==void 0?N:false);return jsx("textarea",{className:a("flex w-full rounded-md border transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",f[l],k[t],d[s],i,r),ref:c,"aria-invalid":y||void 0,...o})});Ue.displayName="Textarea";var Ke={sm:"h-8 text-sm px-3",md:"h-10 text-sm px-4",lg:"h-12 text-base px-5"},qe=(r,l="YYYY-MM-DD",t="ko-KR")=>{if(!r)return "";let n=r.getFullYear(),g=String(r.getMonth()+1).padStart(2,"0"),s=String(r.getDate()).padStart(2,"0");return l.replace("YYYY",String(n)).replace("MM",g).replace("DD",s)},Ge=(r,l)=>new Date(r,l+1,0).getDate(),We=(r,l)=>new Date(r,l,1).getDay(),_e=A.forwardRef(({value:r,onChange:l$1,minDate:t,maxDate:n,placeholder:g="\uB0A0\uC9DC\uB97C \uC120\uD0DD\uD558\uC138\uC694",disabled:s=false,error:o=false,dateFormat:c="YYYY-MM-DD",locale:f="ko-KR",size:k="md",className:d,...i},N)=>{let[y,x]=A.useState(false),[m,b]=A.useState(r?new Date(r.getFullYear(),r.getMonth()):new Date),[h,D]=A.useState(null),M=r?qe(r,c,f):"",R=e=>{t&&e<t||n&&e>n||(l$1==null||l$1(e),x(false));},F=()=>{b(new Date(m.getFullYear(),m.getMonth()-1));},v=()=>{b(new Date(m.getFullYear(),m.getMonth()+1));},I=()=>{let e=new Date;e.setHours(0,0,0,0),R(e);},u=m.getFullYear(),w=m.getMonth(),T=Ge(u,w),O=We(u,w),$=f==="ko-KR"?["\uC77C","\uC6D4","\uD654","\uC218","\uBAA9","\uAE08","\uD1A0"]:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],j=e=>!!(t&&e<t||n&&e>n),ee=e=>r?e.getFullYear()===r.getFullYear()&&e.getMonth()===r.getMonth()&&e.getDate()===r.getDate():false,re=e=>{let p=new Date;return e.getFullYear()===p.getFullYear()&&e.getMonth()===p.getMonth()&&e.getDate()===p.getDate()},Y=[];for(let e=O-1;e>=0;e--){let p=new Date(u,w,-e);Y.push(p);}for(let e=1;e<=T;e++)Y.push(new Date(u,w,e));let te=42-Y.length;for(let e=1;e<=te;e++)Y.push(new Date(u,w+1,e));let ae=jsxs("button",{type:"button",disabled:s,className:a("flex w-full items-center justify-between rounded-lg border bg-white px-4 py-2 text-left text-sm transition-colors","hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2","dark:bg-gray-800 dark:border-gray-700 dark:hover:bg-gray-700",o&&"border-red-500 focus:ring-red-500",s&&"cursor-not-allowed opacity-50",Ke[k]),"aria-label":M||g,children:[jsx("span",{className:a("flex-1",!M&&"text-gray-400 dark:text-gray-500"),children:M||g}),jsx(l,{name:"calendar",className:a("ml-2 h-4 w-4 transition-transform",y&&"rotate-180")})]});return jsx("div",{ref:N,className:a("relative",d),...i,children:jsx(le,{open:y,onOpenChange:x,trigger:ae,position:"bottom",align:"start",children:jsx("div",{className:"w-auto p-0",children:jsxs("div",{className:"p-4",children:[jsxs("div",{className:"flex items-center justify-between mb-4",children:[jsx("button",{type:"button",onClick:F,className:"rounded-lg p-2 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors","aria-label":"\uC774\uC804 \uB2EC",children:jsx(l,{name:"chevronLeft",className:"h-4 w-4"})}),jsxs("div",{className:"text-lg font-semibold text-gray-900 dark:text-white",children:[u,"\uB144 ",w+1,"\uC6D4"]}),jsx("button",{type:"button",onClick:v,className:"rounded-lg p-2 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors","aria-label":"\uB2E4\uC74C \uB2EC",children:jsx(l,{name:"chevronRight",className:"h-4 w-4"})})]}),jsx("div",{className:"grid grid-cols-7 gap-1 mb-2",children:$.map((e,p)=>jsx("div",{className:a("text-center text-xs font-medium py-2",p===0&&"text-red-500 dark:text-red-400",p===6&&"text-blue-500 dark:text-blue-400"),children:e},p))}),jsx("div",{className:"grid grid-cols-7 gap-1",children:Y.map((e,p)=>{if(!e)return jsx("div",{},p);let S=e.getMonth()===w,V=j(e),se=ee(e),ke=re(e),xe=h&&e.getFullYear()===h.getFullYear()&&e.getMonth()===h.getMonth()&&e.getDate()===h.getDate();return jsx("button",{type:"button",disabled:V,onClick:()=>R(e),onMouseEnter:()=>D(e),onMouseLeave:()=>D(null),className:a("relative h-9 w-9 rounded-lg text-sm font-medium transition-all","hover:bg-blue-50 dark:hover:bg-blue-900/20","focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-1",!S&&"text-gray-400 dark:text-gray-500",V&&"cursor-not-allowed opacity-30",se&&"bg-blue-600 text-white hover:bg-blue-700 shadow-md",ke&&!se&&"ring-2 ring-blue-500",xe&&!se&&"bg-blue-100 dark:bg-blue-900/30"),"aria-label":`${u}\uB144 ${w+1}\uC6D4 ${e.getDate()}\uC77C`,children:e.getDate()},p)})}),jsx("div",{className:"mt-4 pt-4 border-t border-gray-200 dark:border-gray-700",children:jsx(a$1,{variant:"outline",size:"sm",onClick:I,className:"w-full",children:"\uC624\uB298"})})]})})})})});_e.displayName="DatePicker";var ge=r=>{if(r===0)return "0 Bytes";let l=1024,t=["Bytes","KB","MB","GB"],n=Math.floor(Math.log(r)/Math.log(l));return Math.round(r/Math.pow(l,n)*100)/100+" "+t[n]},Je=r=>r.startsWith("image/")?"image":r.startsWith("video/")?"video":r.includes("pdf")||r.includes("word")||r.includes("document")||r.includes("excel")||r.includes("spreadsheet")?"fileText":"file",Qe=A.forwardRef(({files:r=[],onChange:l$1,onRemove:t,multiple:n=false,accept:g,maxSize:s,maxFiles:o,disabled:c=false,dragDrop:f=true,placeholder:k="\uD30C\uC77C\uC744 \uC120\uD0DD\uD558\uAC70\uB098 \uC5EC\uAE30\uC5D0 \uB4DC\uB798\uADF8\uD558\uC138\uC694",size:d="md",className:i,...N},y)=>{let x=A.useRef(null),[m,b]=A.useState(false),h=u=>{if(!u||u.length===0)return;let w=Array.from(u);if(o&&r.length+w.length>o){alert(`\uCD5C\uB300 ${o}\uAC1C\uC758 \uD30C\uC77C\uB9CC \uC5C5\uB85C\uB4DC\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.`);return}let T=w.filter(O=>s&&O.size>s?(alert(`\uD30C\uC77C \uD06C\uAE30\uB294 ${ge(s)}\uB97C \uCD08\uACFC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${O.name}`),false):true);T.length>0&&(l$1==null||l$1(T));},D=()=>{var u;c||(u=x.current)==null||u.click();},M=u=>{u.preventDefault(),!c&&f&&b(true);},R=u=>{u.preventDefault(),b(false);},F=u=>{u.preventDefault(),b(false),!c&&f&&h(u.dataTransfer.files);},v=u=>{t==null||t(u);},I={sm:"p-4",md:"p-6",lg:"p-8"};return jsxs("div",{ref:y,className:a("w-full",i),...N,children:[jsxs("div",{onClick:D,onDragOver:M,onDragLeave:R,onDrop:F,className:a("relative border-2 border-dashed rounded-xl transition-all cursor-pointer","bg-gray-50 dark:bg-gray-900/50","border-gray-300 dark:border-gray-700",m&&"border-blue-500 bg-blue-50 dark:bg-blue-900/20",c&&"cursor-not-allowed opacity-50",I[d]),children:[jsx("input",{ref:x,type:"file",multiple:n,accept:g,disabled:c,onChange:u=>h(u.target.files),className:"hidden","aria-label":"\uD30C\uC77C \uC120\uD0DD"}),jsxs("div",{className:"flex flex-col items-center justify-center text-center",children:[jsx("div",{className:a("rounded-full bg-blue-100 dark:bg-blue-900/30 p-4 mb-4",m&&"bg-blue-200 dark:bg-blue-900/50"),children:jsx(l,{name:"upload",className:a("h-8 w-8 text-blue-600 dark:text-blue-400",m&&"scale-110")})}),jsx("p",{className:"text-sm font-medium text-gray-700 dark:text-gray-300 mb-1",children:k}),jsxs("p",{className:"text-xs text-gray-500 dark:text-gray-400",children:[g&&`\uC9C0\uC6D0 \uD615\uC2DD: ${g}`,s&&` \u2022 \uCD5C\uB300 \uD06C\uAE30: ${ge(s)}`,o&&` \u2022 \uCD5C\uB300 ${o}\uAC1C`]})]})]}),r.length>0&&jsx("div",{className:"mt-4 space-y-2",children:r.map(u=>jsxs("div",{className:a("flex items-center gap-3 p-3 rounded-lg border","bg-white dark:bg-gray-800","border-gray-200 dark:border-gray-700",u.status==="error"&&"border-red-300 dark:border-red-700 bg-red-50 dark:bg-red-900/20"),children:[jsx("div",{className:"flex-shrink-0",children:jsx("div",{className:"rounded-lg bg-gray-100 dark:bg-gray-700 p-2",children:jsx(l,{name:Je(u.type),className:"h-5 w-5 text-gray-600 dark:text-gray-400"})})}),jsxs("div",{className:"flex-1 min-w-0",children:[jsx("p",{className:"text-sm font-medium text-gray-900 dark:text-white truncate",children:u.name}),jsxs("div",{className:"flex items-center gap-2 mt-1",children:[jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400",children:ge(u.size)}),u.status==="uploading"&&u.progress!==void 0&&jsxs(Fragment,{children:[jsx("div",{className:"flex-1 h-1.5 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden",children:jsx("div",{className:"h-full bg-blue-600 transition-all duration-300",style:{width:`${u.progress}%`}})}),jsxs("span",{className:"text-xs text-gray-500 dark:text-gray-400",children:[u.progress,"%"]})]}),u.status==="success"&&jsxs("span",{className:"text-xs text-green-600 dark:text-green-400 flex items-center gap-1",children:[jsx(l,{name:"check",className:"h-3 w-3"}),"\uC644\uB8CC"]}),u.status==="error"&&jsx("span",{className:"text-xs text-red-600 dark:text-red-400",children:u.error||"\uC5C5\uB85C\uB4DC \uC2E4\uD328"})]})]}),t&&jsx("button",{type:"button",onClick:()=>v(u),className:"flex-shrink-0 rounded-lg p-1.5 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors","aria-label":"\uD30C\uC77C \uC81C\uAC70",children:jsx(l,{name:"close",className:"h-4 w-4 text-gray-500 dark:text-gray-400"})})]},u.id))})]})});Qe.displayName="Upload";var Ze={sm:"h-8 text-sm",md:"h-10 text-sm",lg:"h-12 text-base"},je=A.forwardRef(({options:r,value:l$1,onChange:t,placeholder:n="\uAC80\uC0C9\uD558\uAC70\uB098 \uC120\uD0DD\uD558\uC138\uC694",disabled:g=false,error:s=false,loading:o=false,maxHeight:c=300,clearable:f=true,filterable:k=true,onSearch:d,emptyText:i="\uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4",size:N="md",className:y,...x},m)=>{let[b,h]=A.useState(false),[D,M]=A.useState(""),[R,F]=A.useState(r),[v,I]=A.useState(-1),[u,w]=A.useState(false),T=A.useRef(null),O=A.useRef(null),$=A.useMemo(()=>r.find(e=>e.value===l$1),[r,l$1]);A.useEffect(()=>{$?M($.label):l$1||M("");},[$,l$1]),A.useEffect(()=>{if(d){w(true);let e=d(D);e instanceof Promise?e.then(p=>{F(p),w(false);}):(F(e),w(false));}else if(k)if(!D.trim())F(r);else {let e=r.filter(p=>{var S;return p.label.toLowerCase().includes(D.toLowerCase())||p.value.toLowerCase().includes(D.toLowerCase())||((S=p.description)==null?void 0:S.toLowerCase().includes(D.toLowerCase()))});F(e);}else F(r);},[D,r,k,d]);let j=e=>{let p=e.target.value;M(p),h(true),I(-1),!p&&f&&(t==null||t(""));},ee=()=>{h(true);},re=e=>{var p;(p=O.current)!=null&&p.contains(e.relatedTarget)||(h(false),I(-1),$&&M($.label));},Y=e=>{var p;M(e.label),t==null||t(e.value,e),h(false),(p=T.current)==null||p.blur();},te=()=>{var e;M(""),t==null||t(""),(e=T.current)==null||e.focus();},ae=e=>{var p;if(!b||R.length===0){e.key==="ArrowDown"&&h(true);return}switch(e.key){case "ArrowDown":e.preventDefault(),I(S=>S<R.length-1?S+1:S);break;case "ArrowUp":e.preventDefault(),I(S=>S>0?S-1:-1);break;case "Enter":e.preventDefault(),v>=0&&R[v]&&Y(R[v]);break;case "Escape":h(false),(p=T.current)==null||p.blur();break}};return jsxs("div",{ref:m,className:a("relative w-full",y),...x,children:[jsxs("div",{className:"relative",children:[jsx(oe,{ref:T,type:"text",value:D,onChange:j,onFocus:ee,onBlur:re,onKeyDown:ae,placeholder:n,disabled:g,"aria-invalid":s,"aria-autocomplete":"list","aria-expanded":b,"aria-controls":"autocomplete-list",className:a(Ze[N],"pr-10")}),jsx("div",{className:"absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-1",children:o||u?jsx(l,{name:"loader",className:"h-4 w-4 animate-spin text-gray-400"}):f&&D?jsx("button",{type:"button",onClick:te,className:"rounded p-1 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors","aria-label":"\uC9C0\uC6B0\uAE30",children:jsx(l,{name:"close",className:"h-4 w-4 text-gray-400"})}):jsx(l,{name:"chevronDown",className:"h-4 w-4 text-gray-400"})})]}),b&&jsx("div",{ref:O,id:"autocomplete-list",role:"listbox",className:a("absolute z-50 w-full mt-1 rounded-lg border shadow-lg","bg-white dark:bg-gray-800","border-gray-200 dark:border-gray-700","overflow-hidden"),style:{maxHeight:`${c}px`},children:jsx("div",{className:"overflow-y-auto",style:{maxHeight:`${c}px`},children:R.length===0?jsx("div",{className:"px-4 py-8 text-center text-sm text-gray-500 dark:text-gray-400",children:i}):R.map((e,p)=>{let S=v===p,V=l$1===e.value;return jsx("div",{role:"option","aria-selected":V,onClick:()=>Y(e),onMouseEnter:()=>I(p),className:a("px-4 py-3 cursor-pointer transition-colors","hover:bg-gray-100 dark:hover:bg-gray-700",S&&"bg-blue-50 dark:bg-blue-900/20",V&&"bg-blue-100 dark:bg-blue-900/30"),children:jsxs("div",{className:"flex items-center gap-3",children:[e.icon&&jsx("div",{className:"flex-shrink-0 text-gray-400",children:e.icon}),jsxs("div",{className:"flex-1 min-w-0",children:[jsxs("div",{className:"flex items-center gap-2",children:[jsx("p",{className:"text-sm font-medium text-gray-900 dark:text-white",children:e.label}),V&&jsx(l,{name:"check",className:"h-4 w-4 text-blue-600 dark:text-blue-400 flex-shrink-0"})]}),e.description&&jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400 mt-0.5",children:e.description})]})]})},e.value)})})})]})});je.displayName="Autocomplete";export{oe as a,le as b,Me as c,De as d,Re as e,Te as f,Le as g,Ie as h,Se as i,Pe as j,Ae as k,$e as l,ze as m,Ye as n,Ue as o,_e as p,Qe as q,je as r};//# sourceMappingURL=chunk-6NXF6ATP.mjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-6NXF6ATP.mjs.map
|