@reinvented/design 0.4.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/SKILL.md +214 -0
- package/package.json +58 -23
- package/skills/apps/analytics.md +103 -0
- package/skills/apps/booking-scheduling.md +97 -0
- package/skills/apps/content-management.md +52 -0
- package/skills/apps/crm.md +80 -0
- package/skills/apps/e-commerce.md +109 -0
- package/skills/apps/education.md +79 -0
- package/skills/apps/finance.md +68 -0
- package/skills/apps/health-fitness.md +72 -0
- package/skills/apps/marketplace.md +99 -0
- package/skills/apps/messaging.md +84 -0
- package/skills/apps/portfolio-personal.md +90 -0
- package/skills/apps/project-management.md +95 -0
- package/skills/apps/saas-dashboard.md +104 -0
- package/skills/apps/social-platform.md +50 -0
- package/skills/blocks/auth.md +106 -0
- package/skills/blocks/communication.md +98 -0
- package/skills/blocks/content.md +107 -0
- package/skills/blocks/data-management.md +109 -0
- package/skills/blocks/data-viz.md +92 -0
- package/skills/blocks/ecommerce.md +126 -0
- package/skills/blocks/feedback.md +97 -0
- package/skills/blocks/filtering.md +127 -0
- package/skills/blocks/marketing.md +136 -0
- package/skills/blocks/media.md +102 -0
- package/skills/blocks/navigation.md +136 -0
- package/skills/blocks/onboarding.md +75 -0
- package/skills/blocks/profiles.md +131 -0
- package/skills/blocks/scheduling.md +117 -0
- package/skills/blocks/settings.md +102 -0
- package/skills/components/advanced-components.md +142 -0
- package/skills/components/avatar.md +92 -0
- package/skills/components/badge.md +105 -0
- package/skills/components/button.md +87 -0
- package/skills/components/card.md +144 -0
- package/skills/components/chart.md +88 -0
- package/skills/components/dialog.md +109 -0
- package/skills/components/dropdown-menu.md +117 -0
- package/skills/components/extended-components.md +187 -0
- package/skills/components/feedback.md +165 -0
- package/skills/components/form.md +112 -0
- package/skills/components/input.md +107 -0
- package/skills/components/map.md +53 -0
- package/skills/components/navigation.md +73 -0
- package/skills/components/overlay.md +77 -0
- package/skills/components/page-header.md +51 -0
- package/skills/components/select.md +175 -0
- package/skills/components/table.md +102 -0
- package/skills/components/tabs.md +105 -0
- package/skills/components/utilities.md +138 -0
- package/skills/devices/desktop.md +43 -0
- package/skills/devices/mobile.md +77 -0
- package/skills/foundation/design-principles.md +77 -0
- package/skills/foundation/design-tokens.md +121 -0
- package/skills/foundation/mockup-generation.md +118 -0
- package/skills/foundation/rules.md +54 -0
- package/skills/foundation/tailwind-usage.md +204 -0
- package/skills/layouts/dashboard.md +71 -0
- package/skills/layouts/full-page-form.md +75 -0
- package/skills/layouts/list-detail.md +70 -0
- package/skills/layouts/marketing.md +70 -0
- package/skills/layouts/responsive.md +67 -0
- package/skills/layouts/settings-page.md +106 -0
- package/skills/layouts/sidebar.md +73 -0
- package/skills/layouts/topbar.md +68 -0
- package/skills/patterns/auth.md +131 -0
- package/skills/patterns/content-display.md +164 -0
- package/skills/patterns/dashboards.md +104 -0
- package/skills/patterns/data-tables.md +113 -0
- package/skills/patterns/empty-states.md +71 -0
- package/skills/patterns/error-states.md +73 -0
- package/skills/patterns/forms.md +136 -0
- package/skills/patterns/loading-states.md +92 -0
- package/skills/patterns/navigation.md +113 -0
- package/skills/patterns/notifications.md +91 -0
- package/skills/patterns/onboarding.md +42 -0
- package/skills/patterns/search.md +55 -0
- package/skills/patterns/settings.md +132 -0
- package/skills/patterns/user-profiles.md +67 -0
- package/skills/personas/business-operator.md +114 -0
- package/skills/personas/consumer-casual.md +60 -0
- package/skills/personas/consumer-power-user.md +109 -0
- package/skills/personas/creative-professional.md +109 -0
- package/skills/personas/enterprise-admin.md +134 -0
- package/skills/visual/color-usage.md +62 -0
- package/skills/visual/dark-mode.md +50 -0
- package/skills/visual/polish-techniques.md +101 -0
- package/skills/visual/spacing-composition.md +69 -0
- package/skills/visual/transitions-animations.md +66 -0
- package/skills/visual/typography-hierarchy.md +66 -0
- package/src/components/blocks/auth/auth-card/AuthCard.tsx +62 -0
- package/src/components/blocks/auth/auth-card/index.ts +1 -0
- package/src/components/blocks/auth/index.ts +3 -0
- package/src/components/blocks/auth/social-login/SocialLoginGroup.tsx +75 -0
- package/src/components/blocks/auth/social-login/index.ts +1 -0
- package/src/components/blocks/auth/two-factor/TwoFactorForm.tsx +59 -0
- package/src/components/blocks/auth/two-factor/index.ts +1 -0
- package/src/components/blocks/communication/activity-item/ActivityItem.tsx +17 -0
- package/src/components/blocks/communication/activity-item/ActivityItemAvatar.tsx +21 -0
- package/src/components/blocks/communication/activity-item/ActivityItemContent.tsx +16 -0
- package/src/components/blocks/communication/activity-item/index.ts +3 -0
- package/src/components/blocks/communication/chat-bubble/ChatBubble.tsx +21 -0
- package/src/components/blocks/communication/chat-bubble/ChatBubbleAvatar.tsx +19 -0
- package/src/components/blocks/communication/chat-bubble/ChatBubbleMessage.tsx +35 -0
- package/src/components/blocks/communication/chat-bubble/ChatBubbleTimestamp.tsx +15 -0
- package/src/components/blocks/communication/chat-bubble/index.ts +4 -0
- package/src/components/blocks/communication/index.ts +2 -0
- package/src/components/blocks/content/article-header/ArticleHeader.tsx +73 -0
- package/src/components/blocks/content/article-header/index.ts +1 -0
- package/src/components/blocks/content/author-card/AuthorCard.tsx +46 -0
- package/src/components/blocks/content/author-card/index.ts +1 -0
- package/src/components/blocks/content/index.ts +3 -0
- package/src/components/blocks/content/rich-text/RichTextContent.tsx +27 -0
- package/src/components/blocks/content/rich-text/index.ts +1 -0
- package/src/components/blocks/data-management/index.ts +2 -0
- package/src/components/blocks/data-management/kanban/KanbanBoard.tsx +10 -0
- package/src/components/blocks/data-management/kanban/KanbanCard.tsx +102 -0
- package/src/components/blocks/data-management/kanban/KanbanColumn.tsx +41 -0
- package/src/components/blocks/data-management/kanban/index.ts +3 -0
- package/src/components/blocks/data-management/tree-view/TreeItem.tsx +68 -0
- package/src/components/blocks/data-management/tree-view/TreeView.tsx +10 -0
- package/src/components/blocks/data-management/tree-view/index.ts +2 -0
- package/src/components/blocks/data-viz/financial-ticker/FinancialTicker.tsx +35 -0
- package/src/components/blocks/data-viz/financial-ticker/index.ts +1 -0
- package/src/components/blocks/data-viz/index.ts +3 -0
- package/src/components/blocks/data-viz/kpi-card/KpiCard.tsx +61 -0
- package/src/components/blocks/data-viz/kpi-card/index.ts +1 -0
- package/src/components/blocks/data-viz/stat-grid/StatGrid.tsx +28 -0
- package/src/components/blocks/data-viz/stat-grid/index.ts +1 -0
- package/src/components/blocks/ecommerce/index.ts +3 -0
- package/src/components/blocks/ecommerce/pricing-tier/PricingFeatureList.tsx +27 -0
- package/src/components/blocks/ecommerce/pricing-tier/PricingHeader.tsx +25 -0
- package/src/components/blocks/ecommerce/pricing-tier/PricingTier.tsx +31 -0
- package/src/components/blocks/ecommerce/pricing-tier/index.ts +3 -0
- package/src/components/blocks/ecommerce/product-card/ProductCard.tsx +17 -0
- package/src/components/blocks/ecommerce/product-card/ProductCardContent.tsx +15 -0
- package/src/components/blocks/ecommerce/product-card/ProductCardImage.tsx +20 -0
- package/src/components/blocks/ecommerce/product-card/ProductCardPrice.tsx +20 -0
- package/src/components/blocks/ecommerce/product-card/index.ts +4 -0
- package/src/components/blocks/ecommerce/rating-summary/RatingStars.tsx +32 -0
- package/src/components/blocks/ecommerce/rating-summary/index.ts +1 -0
- package/src/components/blocks/feedback/empty-state/EmptyState.tsx +53 -0
- package/src/components/blocks/feedback/empty-state/index.ts +1 -0
- package/src/components/blocks/feedback/error-state/ErrorState.tsx +50 -0
- package/src/components/blocks/feedback/error-state/index.ts +1 -0
- package/src/components/blocks/feedback/index.ts +3 -0
- package/src/components/blocks/feedback/not-found/NotFoundState.tsx +47 -0
- package/src/components/blocks/feedback/not-found/index.ts +1 -0
- package/src/components/blocks/filtering/faceted-sidebar/FacetedGroup.tsx +32 -0
- package/src/components/blocks/filtering/faceted-sidebar/FacetedSidebar.tsx +26 -0
- package/src/components/blocks/filtering/faceted-sidebar/index.ts +2 -0
- package/src/components/blocks/filtering/filter-bar/FilterBar.tsx +85 -0
- package/src/components/blocks/filtering/filter-bar/index.ts +1 -0
- package/src/components/blocks/filtering/index.ts +3 -0
- package/src/components/blocks/filtering/search-result/SearchResultItem.tsx +70 -0
- package/src/components/blocks/filtering/search-result/index.ts +1 -0
- package/src/components/blocks/index.ts +21 -0
- package/src/components/blocks/marketing/cta-block/CtaBlock.tsx +80 -0
- package/src/components/blocks/marketing/cta-block/index.ts +1 -0
- package/src/components/blocks/marketing/feature-grid/FeatureGrid.tsx +47 -0
- package/src/components/blocks/marketing/feature-grid/index.ts +1 -0
- package/src/components/blocks/marketing/hero-section/HeroSection.tsx +89 -0
- package/src/components/blocks/marketing/hero-section/index.ts +1 -0
- package/src/components/blocks/marketing/index.ts +4 -0
- package/src/components/blocks/marketing/testimonial-card/TestimonialCard.tsx +71 -0
- package/src/components/blocks/marketing/testimonial-card/index.ts +1 -0
- package/src/components/blocks/media/call-controls/CallControlButton.tsx +52 -0
- package/src/components/blocks/media/call-controls/CallControls.tsx +10 -0
- package/src/components/blocks/media/call-controls/index.ts +2 -0
- package/src/components/blocks/media/index.ts +2 -0
- package/src/components/blocks/media/media-player/MediaPlayer.tsx +20 -0
- package/src/components/blocks/media/media-player/MediaPlayerControls.tsx +16 -0
- package/src/components/blocks/media/media-player/MediaPlayerScrubber.tsx +29 -0
- package/src/components/blocks/media/media-player/MediaPlayerVideo.tsx +25 -0
- package/src/components/blocks/media/media-player/index.ts +4 -0
- package/src/components/blocks/navigation/app-sidebar/AppSidebar.tsx +32 -0
- package/src/components/blocks/navigation/app-sidebar/NavItem.tsx +43 -0
- package/src/components/blocks/navigation/app-sidebar/index.ts +2 -0
- package/src/components/blocks/navigation/context-switcher/ContextSwitcher.tsx +77 -0
- package/src/components/blocks/navigation/context-switcher/index.ts +1 -0
- package/src/components/blocks/navigation/index.ts +3 -0
- package/src/components/blocks/navigation/top-navbar/TopNavbar.tsx +47 -0
- package/src/components/blocks/navigation/top-navbar/index.ts +1 -0
- package/src/components/blocks/onboarding/index.ts +2 -0
- package/src/components/blocks/onboarding/onboarding-welcome/OnboardingWelcome.tsx +74 -0
- package/src/components/blocks/onboarding/onboarding-welcome/index.ts +1 -0
- package/src/components/blocks/onboarding/step-wizard/StepWizard.tsx +72 -0
- package/src/components/blocks/onboarding/step-wizard/index.ts +1 -0
- package/src/components/blocks/profiles/connection-list/ConnectionItem.tsx +35 -0
- package/src/components/blocks/profiles/connection-list/ConnectionList.tsx +16 -0
- package/src/components/blocks/profiles/connection-list/index.ts +2 -0
- package/src/components/blocks/profiles/index.ts +3 -0
- package/src/components/blocks/profiles/profile-header/ProfileHeader.tsx +88 -0
- package/src/components/blocks/profiles/profile-header/index.ts +1 -0
- package/src/components/blocks/profiles/profile-stats/ProfileStats.tsx +20 -0
- package/src/components/blocks/profiles/profile-stats/index.ts +1 -0
- package/src/components/blocks/scheduling/booking-slot/BookingSlot.tsx +44 -0
- package/src/components/blocks/scheduling/booking-slot/index.ts +1 -0
- package/src/components/blocks/scheduling/event-card/EventCard.tsx +85 -0
- package/src/components/blocks/scheduling/event-card/index.ts +1 -0
- package/src/components/blocks/scheduling/index.ts +3 -0
- package/src/components/blocks/scheduling/timeline-row/TimelineRow.tsx +82 -0
- package/src/components/blocks/scheduling/timeline-row/index.ts +1 -0
- package/src/components/blocks/settings/billing-usage/BillingUsage.tsx +49 -0
- package/src/components/blocks/settings/billing-usage/index.ts +1 -0
- package/src/components/blocks/settings/index.ts +3 -0
- package/src/components/blocks/settings/integration-card/IntegrationCard.tsx +62 -0
- package/src/components/blocks/settings/integration-card/index.ts +1 -0
- package/src/components/blocks/settings/settings-section/SettingsSection.tsx +23 -0
- package/src/components/blocks/settings/settings-section/index.ts +1 -0
- package/src/components/ui/accordion.tsx +56 -0
- package/src/components/ui/alert-dialog.tsx +141 -0
- package/src/components/ui/alert.tsx +59 -0
- package/src/components/ui/aspect-ratio.tsx +5 -0
- package/src/components/ui/avatar.tsx +50 -0
- package/src/components/ui/badge.tsx +36 -0
- package/src/components/ui/breadcrumb.tsx +115 -0
- package/src/components/ui/button.tsx +56 -0
- package/src/components/ui/calendar.tsx +211 -0
- package/src/components/ui/card.tsx +79 -0
- package/src/components/ui/carousel.tsx +262 -0
- package/src/components/ui/chart.tsx +367 -0
- package/src/components/ui/checkbox.tsx +28 -0
- package/src/components/ui/collapsible.tsx +11 -0
- package/src/components/ui/command.tsx +153 -0
- package/src/components/ui/component-placeholder.tsx +38 -0
- package/src/components/ui/context-menu.tsx +198 -0
- package/src/components/ui/dialog.tsx +122 -0
- package/src/components/ui/drawer.tsx +116 -0
- package/src/components/ui/dropdown-menu.tsx +200 -0
- package/src/components/ui/form.tsx +176 -0
- package/src/components/ui/hover-card.tsx +27 -0
- package/src/components/ui/input-otp.tsx +69 -0
- package/src/components/ui/input.tsx +22 -0
- package/src/components/ui/label.tsx +24 -0
- package/src/components/ui/menubar.tsx +256 -0
- package/src/components/ui/navigation-menu.tsx +128 -0
- package/src/components/ui/pagination.tsx +117 -0
- package/src/components/ui/popover.tsx +29 -0
- package/src/components/ui/progress.tsx +28 -0
- package/src/components/ui/radio-group.tsx +42 -0
- package/src/components/ui/resizable.tsx +45 -0
- package/src/components/ui/scroll-area.tsx +46 -0
- package/src/components/ui/select.tsx +160 -0
- package/src/components/ui/separator.tsx +29 -0
- package/src/components/ui/sheet.tsx +140 -0
- package/src/components/ui/skeleton.tsx +15 -0
- package/src/components/ui/slider.tsx +26 -0
- package/src/components/ui/sonner.tsx +45 -0
- package/src/components/ui/switch.tsx +27 -0
- package/src/components/ui/table.tsx +117 -0
- package/src/components/ui/tabs.tsx +53 -0
- package/src/components/ui/textarea.tsx +22 -0
- package/src/components/ui/toast.tsx +127 -0
- package/src/components/ui/toaster.tsx +33 -0
- package/src/components/ui/toggle-group.tsx +61 -0
- package/src/components/ui/toggle.tsx +45 -0
- package/src/components/ui/tooltip.tsx +28 -0
- package/src/hooks/use-toast.ts +194 -0
- package/src/index.ts +53 -56
- package/src/styles/tokens.css +30 -14
- package/tailwind.config.js +120 -98
- package/tsconfig.json +2 -2
- package/DESIGN_GUIDE.md +0 -148
- package/src/components/ui/accordion/Accordion.vue +0 -13
- package/src/components/ui/accordion/AccordionContent.vue +0 -20
- package/src/components/ui/accordion/AccordionItem.vue +0 -15
- package/src/components/ui/accordion/AccordionTrigger.vue +0 -25
- package/src/components/ui/accordion/index.ts +0 -4
- package/src/components/ui/alert/Alert.vue +0 -38
- package/src/components/ui/alert/AlertDescription.vue +0 -12
- package/src/components/ui/alert/AlertTitle.vue +0 -12
- package/src/components/ui/alert/index.ts +0 -3
- package/src/components/ui/alert-dialog/AlertDialog.vue +0 -13
- package/src/components/ui/alert-dialog/AlertDialogAction.vue +0 -21
- package/src/components/ui/alert-dialog/AlertDialogCancel.vue +0 -21
- package/src/components/ui/alert-dialog/AlertDialogContent.vue +0 -39
- package/src/components/ui/alert-dialog/AlertDialogDescription.vue +0 -15
- package/src/components/ui/alert-dialog/AlertDialogFooter.vue +0 -12
- package/src/components/ui/alert-dialog/AlertDialogHeader.vue +0 -12
- package/src/components/ui/alert-dialog/AlertDialogTitle.vue +0 -15
- package/src/components/ui/alert-dialog/AlertDialogTrigger.vue +0 -11
- package/src/components/ui/alert-dialog/index.ts +0 -9
- package/src/components/ui/avatar/Avatar.vue +0 -14
- package/src/components/ui/avatar/index.ts +0 -1
- package/src/components/ui/badge/Badge.vue +0 -27
- package/src/components/ui/badge/index.ts +0 -1
- package/src/components/ui/breadcrumb/Breadcrumb.vue +0 -6
- package/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue +0 -12
- package/src/components/ui/breadcrumb/BreadcrumbItem.vue +0 -6
- package/src/components/ui/breadcrumb/BreadcrumbLink.vue +0 -20
- package/src/components/ui/breadcrumb/BreadcrumbList.vue +0 -6
- package/src/components/ui/breadcrumb/BreadcrumbPage.vue +0 -6
- package/src/components/ui/breadcrumb/BreadcrumbSeparator.vue +0 -11
- package/src/components/ui/breadcrumb/index.ts +0 -7
- package/src/components/ui/button/Button.vue +0 -65
- package/src/components/ui/button/index.ts +0 -1
- package/src/components/ui/card/Card.vue +0 -13
- package/src/components/ui/card/CardContent.vue +0 -7
- package/src/components/ui/card/CardDescription.vue +0 -7
- package/src/components/ui/card/CardFooter.vue +0 -7
- package/src/components/ui/card/CardHeader.vue +0 -9
- package/src/components/ui/card/CardTitle.vue +0 -7
- package/src/components/ui/card/index.ts +0 -6
- package/src/components/ui/checkbox/Checkbox.vue +0 -25
- package/src/components/ui/checkbox/index.ts +0 -1
- package/src/components/ui/collapsible/Collapsible.vue +0 -13
- package/src/components/ui/collapsible/index.ts +0 -2
- package/src/components/ui/command/Command.vue +0 -16
- package/src/components/ui/command/CommandEmpty.vue +0 -5
- package/src/components/ui/command/CommandGroup.vue +0 -22
- package/src/components/ui/command/CommandInput.vue +0 -21
- package/src/components/ui/command/CommandItem.vue +0 -22
- package/src/components/ui/command/CommandList.vue +0 -17
- package/src/components/ui/command/CommandSeparator.vue +0 -5
- package/src/components/ui/command/index.ts +0 -7
- package/src/components/ui/context-menu/ContextMenuContent.vue +0 -24
- package/src/components/ui/context-menu/ContextMenuItem.vue +0 -16
- package/src/components/ui/context-menu/ContextMenuLabel.vue +0 -9
- package/src/components/ui/context-menu/ContextMenuSeparator.vue +0 -9
- package/src/components/ui/context-menu/ContextMenuSubContent.vue +0 -14
- package/src/components/ui/context-menu/index.ts +0 -9
- package/src/components/ui/dialog/Dialog.vue +0 -14
- package/src/components/ui/dialog/DialogClose.vue +0 -12
- package/src/components/ui/dialog/DialogContent.vue +0 -48
- package/src/components/ui/dialog/DialogDescription.vue +0 -23
- package/src/components/ui/dialog/DialogFooter.vue +0 -12
- package/src/components/ui/dialog/DialogHeader.vue +0 -12
- package/src/components/ui/dialog/DialogScrollContent.vue +0 -47
- package/src/components/ui/dialog/DialogTitle.vue +0 -23
- package/src/components/ui/dialog/DialogTrigger.vue +0 -12
- package/src/components/ui/dialog/index.ts +0 -9
- package/src/components/ui/dropdown-menu/DropdownMenu.vue +0 -13
- package/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +0 -28
- package/src/components/ui/dropdown-menu/DropdownMenuContent.vue +0 -33
- package/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +0 -11
- package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +0 -27
- package/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +0 -23
- package/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +0 -13
- package/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +0 -27
- package/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +0 -13
- package/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +0 -12
- package/src/components/ui/dropdown-menu/DropdownMenuSub.vue +0 -13
- package/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +0 -27
- package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +0 -23
- package/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +0 -11
- package/src/components/ui/dropdown-menu/index.ts +0 -14
- package/src/components/ui/form/FormControl.vue +0 -3
- package/src/components/ui/form/FormDescription.vue +0 -6
- package/src/components/ui/form/FormItem.vue +0 -6
- package/src/components/ui/form/FormLabel.vue +0 -10
- package/src/components/ui/form/FormMessage.vue +0 -10
- package/src/components/ui/form/index.ts +0 -9
- package/src/components/ui/hover-card/HoverCard.vue +0 -13
- package/src/components/ui/hover-card/HoverCardContent.vue +0 -26
- package/src/components/ui/hover-card/HoverCardTrigger.vue +0 -11
- package/src/components/ui/hover-card/index.ts +0 -3
- package/src/components/ui/input/Input.vue +0 -23
- package/src/components/ui/input/index.ts +0 -1
- package/src/components/ui/label/Label.vue +0 -18
- package/src/components/ui/label/index.ts +0 -1
- package/src/components/ui/lib/utils.ts +0 -2
- package/src/components/ui/menubar/MenubarContent.vue +0 -15
- package/src/components/ui/menubar/MenubarItem.vue +0 -13
- package/src/components/ui/menubar/MenubarTrigger.vue +0 -13
- package/src/components/ui/menubar/index.ts +0 -5
- package/src/components/ui/navigation-menu/NavigationMenuContent.vue +0 -14
- package/src/components/ui/navigation-menu/NavigationMenuTrigger.vue +0 -15
- package/src/components/ui/navigation-menu/index.ts +0 -4
- package/src/components/ui/pagination/PaginationContent.vue +0 -13
- package/src/components/ui/pagination/PaginationEllipsis.vue +0 -12
- package/src/components/ui/pagination/PaginationNext.vue +0 -14
- package/src/components/ui/pagination/PaginationPrev.vue +0 -14
- package/src/components/ui/pagination/index.ts +0 -6
- package/src/components/ui/popover/Popover.vue +0 -13
- package/src/components/ui/popover/PopoverContent.vue +0 -27
- package/src/components/ui/popover/PopoverTrigger.vue +0 -11
- package/src/components/ui/popover/index.ts +0 -3
- package/src/components/ui/progress/Progress.vue +0 -21
- package/src/components/ui/progress/index.ts +0 -1
- package/src/components/ui/radio-group/RadioGroup.vue +0 -16
- package/src/components/ui/radio-group/RadioGroupItem.vue +0 -24
- package/src/components/ui/radio-group/index.ts +0 -2
- package/src/components/ui/scroll-area/ScrollArea.vue +0 -13
- package/src/components/ui/scroll-area/index.ts +0 -1
- package/src/components/ui/select/Select.vue +0 -13
- package/src/components/ui/select/SelectContent.vue +0 -40
- package/src/components/ui/select/SelectGroup.vue +0 -15
- package/src/components/ui/select/SelectItem.vue +0 -30
- package/src/components/ui/select/SelectLabel.vue +0 -15
- package/src/components/ui/select/SelectSeparator.vue +0 -13
- package/src/components/ui/select/SelectTrigger.vue +0 -23
- package/src/components/ui/select/SelectValue.vue +0 -11
- package/src/components/ui/select/index.ts +0 -8
- package/src/components/ui/separator/Separator.vue +0 -16
- package/src/components/ui/separator/index.ts +0 -1
- package/src/components/ui/sheet/Sheet.vue +0 -13
- package/src/components/ui/sheet/SheetClose.vue +0 -11
- package/src/components/ui/sheet/SheetContent.vue +0 -65
- package/src/components/ui/sheet/SheetDescription.vue +0 -15
- package/src/components/ui/sheet/SheetFooter.vue +0 -12
- package/src/components/ui/sheet/SheetHeader.vue +0 -12
- package/src/components/ui/sheet/SheetTitle.vue +0 -15
- package/src/components/ui/sheet/SheetTrigger.vue +0 -11
- package/src/components/ui/sheet/index.ts +0 -8
- package/src/components/ui/skeleton/Skeleton.vue +0 -9
- package/src/components/ui/skeleton/index.ts +0 -1
- package/src/components/ui/slider/Slider.vue +0 -26
- package/src/components/ui/slider/index.ts +0 -1
- package/src/components/ui/switch/Switch.vue +0 -24
- package/src/components/ui/switch/index.ts +0 -1
- package/src/components/ui/table/Table.vue +0 -13
- package/src/components/ui/table/TableBody.vue +0 -6
- package/src/components/ui/table/TableCaption.vue +0 -6
- package/src/components/ui/table/TableCell.vue +0 -6
- package/src/components/ui/table/TableFooter.vue +0 -6
- package/src/components/ui/table/TableHead.vue +0 -6
- package/src/components/ui/table/TableHeader.vue +0 -6
- package/src/components/ui/table/TableRow.vue +0 -6
- package/src/components/ui/table/index.ts +0 -8
- package/src/components/ui/tabs/Tabs.vue +0 -13
- package/src/components/ui/tabs/TabsContent.vue +0 -21
- package/src/components/ui/tabs/TabsList.vue +0 -21
- package/src/components/ui/tabs/TabsTrigger.vue +0 -21
- package/src/components/ui/tabs/index.ts +0 -4
- package/src/components/ui/textarea/Textarea.vue +0 -29
- package/src/components/ui/textarea/index.ts +0 -1
- package/src/components/ui/toggle/Toggle.vue +0 -40
- package/src/components/ui/toggle/index.ts +0 -1
- package/src/components/ui/toggle-group/ToggleGroup.vue +0 -16
- package/src/components/ui/toggle-group/ToggleGroupItem.vue +0 -21
- package/src/components/ui/toggle-group/index.ts +0 -2
- package/src/components/ui/tooltip/Tooltip.vue +0 -13
- package/src/components/ui/tooltip/TooltipContent.vue +0 -27
- package/src/components/ui/tooltip/TooltipProvider.vue +0 -12
- package/src/components/ui/tooltip/TooltipTrigger.vue +0 -11
- package/src/components/ui/tooltip/index.ts +0 -4
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { cn } from '@/lib/utils'
|
|
3
|
+
import { Button } from '@/components/ui/button'
|
|
4
|
+
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'
|
|
5
|
+
|
|
6
|
+
interface CallControlButtonProps {
|
|
7
|
+
tooltip?: string
|
|
8
|
+
active?: boolean
|
|
9
|
+
destructive?: boolean
|
|
10
|
+
className?: string
|
|
11
|
+
children?: React.ReactNode
|
|
12
|
+
onClick?: React.MouseEventHandler<HTMLButtonElement>
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function CallControlButton({
|
|
16
|
+
tooltip,
|
|
17
|
+
active,
|
|
18
|
+
destructive,
|
|
19
|
+
className,
|
|
20
|
+
children,
|
|
21
|
+
onClick,
|
|
22
|
+
}: CallControlButtonProps) {
|
|
23
|
+
const variant = destructive ? 'destructive' : active ? 'default' : 'secondary'
|
|
24
|
+
|
|
25
|
+
const button = (
|
|
26
|
+
<Button
|
|
27
|
+
size="icon"
|
|
28
|
+
variant={variant}
|
|
29
|
+
className={cn('rounded-full h-12 w-12', className)}
|
|
30
|
+
onClick={onClick}
|
|
31
|
+
>
|
|
32
|
+
{children}
|
|
33
|
+
</Button>
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
if (tooltip) {
|
|
37
|
+
return (
|
|
38
|
+
<TooltipProvider>
|
|
39
|
+
<Tooltip>
|
|
40
|
+
<TooltipTrigger asChild>
|
|
41
|
+
{button}
|
|
42
|
+
</TooltipTrigger>
|
|
43
|
+
<TooltipContent>
|
|
44
|
+
<p>{tooltip}</p>
|
|
45
|
+
</TooltipContent>
|
|
46
|
+
</Tooltip>
|
|
47
|
+
</TooltipProvider>
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return button
|
|
52
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { cn } from '@/lib/utils'
|
|
3
|
+
|
|
4
|
+
export function CallControls({ className, children }: { className?: string; children?: React.ReactNode }) {
|
|
5
|
+
return (
|
|
6
|
+
<div className={cn('flex items-center justify-center gap-3 bg-background p-3 rounded-full shadow-sm border mx-auto w-fit', className)}>
|
|
7
|
+
{children}
|
|
8
|
+
</div>
|
|
9
|
+
)
|
|
10
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { cn } from '@/lib/utils'
|
|
3
|
+
|
|
4
|
+
export function MediaPlayer({
|
|
5
|
+
className,
|
|
6
|
+
children,
|
|
7
|
+
...props
|
|
8
|
+
}: React.HTMLAttributes<HTMLDivElement>) {
|
|
9
|
+
return (
|
|
10
|
+
<div
|
|
11
|
+
className={cn(
|
|
12
|
+
'relative rounded-xl overflow-hidden bg-black flex flex-col shadow-sm border',
|
|
13
|
+
className,
|
|
14
|
+
)}
|
|
15
|
+
{...props}
|
|
16
|
+
>
|
|
17
|
+
{children}
|
|
18
|
+
</div>
|
|
19
|
+
)
|
|
20
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { cn } from '@/lib/utils'
|
|
3
|
+
|
|
4
|
+
export function MediaPlayerControls({
|
|
5
|
+
className,
|
|
6
|
+
children,
|
|
7
|
+
}: {
|
|
8
|
+
className?: string
|
|
9
|
+
children?: React.ReactNode
|
|
10
|
+
}) {
|
|
11
|
+
return (
|
|
12
|
+
<div className={cn('p-4 bg-background/95 backdrop-blur flex flex-col gap-2 relative z-10 w-full', className)}>
|
|
13
|
+
{children}
|
|
14
|
+
</div>
|
|
15
|
+
)
|
|
16
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { Slider } from '@/components/ui/slider'
|
|
3
|
+
|
|
4
|
+
interface MediaPlayerScrubberProps {
|
|
5
|
+
defaultValue?: number[]
|
|
6
|
+
max?: number
|
|
7
|
+
currentTime?: string
|
|
8
|
+
totalTime?: string
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function MediaPlayerScrubber({
|
|
12
|
+
defaultValue,
|
|
13
|
+
max,
|
|
14
|
+
currentTime,
|
|
15
|
+
totalTime,
|
|
16
|
+
}: MediaPlayerScrubberProps) {
|
|
17
|
+
return (
|
|
18
|
+
<div className="flex items-center gap-3">
|
|
19
|
+
<span className="text-xs text-muted-foreground tabular-nums">{currentTime || '0:00'}</span>
|
|
20
|
+
<Slider
|
|
21
|
+
defaultValue={defaultValue || [0]}
|
|
22
|
+
max={max || 100}
|
|
23
|
+
step={1}
|
|
24
|
+
className="flex-1"
|
|
25
|
+
/>
|
|
26
|
+
<span className="text-xs text-muted-foreground tabular-nums">{totalTime || '0:00'}</span>
|
|
27
|
+
</div>
|
|
28
|
+
)
|
|
29
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import type { HTMLAttributes } from 'react'
|
|
3
|
+
import { cn } from '@/lib/utils'
|
|
4
|
+
import { Play } from 'lucide-react'
|
|
5
|
+
|
|
6
|
+
interface MediaPlayerVideoProps {
|
|
7
|
+
src?: string
|
|
8
|
+
poster?: string
|
|
9
|
+
className?: HTMLAttributes<HTMLElement>['className']
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function MediaPlayerVideo({ src, poster, className }: MediaPlayerVideoProps) {
|
|
13
|
+
return (
|
|
14
|
+
<div className={cn('relative aspect-video bg-muted flex items-center justify-center group', className)}>
|
|
15
|
+
{poster && (
|
|
16
|
+
<img src={poster} className="absolute inset-0 w-full h-full object-cover opacity-60" />
|
|
17
|
+
)}
|
|
18
|
+
<div className="absolute inset-0 bg-black/20 group-hover:bg-black/40 transition-colors flex items-center justify-center cursor-pointer">
|
|
19
|
+
<div className="h-12 w-12 rounded-full bg-background/90 text-foreground flex items-center justify-center shadow-lg transform transition-transform group-hover:scale-110">
|
|
20
|
+
<Play className="h-5 w-5 ml-1" />
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
)
|
|
25
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { cn } from '@/lib/utils'
|
|
3
|
+
import { ScrollArea } from '@/components/ui/scroll-area'
|
|
4
|
+
|
|
5
|
+
interface AppSidebarProps {
|
|
6
|
+
className?: string
|
|
7
|
+
header?: React.ReactNode
|
|
8
|
+
footer?: React.ReactNode
|
|
9
|
+
children?: React.ReactNode
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function AppSidebar({ className, header, footer, children }: AppSidebarProps) {
|
|
13
|
+
return (
|
|
14
|
+
<div className={cn('flex flex-col h-screen w-64 border-r bg-muted/10 text-foreground shrink-0', className)}>
|
|
15
|
+
<div className="h-14 px-4 border-b flex items-center shrink-0">
|
|
16
|
+
{header}
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
<ScrollArea className="flex-1 py-4">
|
|
20
|
+
<div className="px-3 flex flex-col gap-1">
|
|
21
|
+
{children}
|
|
22
|
+
</div>
|
|
23
|
+
</ScrollArea>
|
|
24
|
+
|
|
25
|
+
{footer && (
|
|
26
|
+
<div className="p-4 border-t shrink-0">
|
|
27
|
+
{footer}
|
|
28
|
+
</div>
|
|
29
|
+
)}
|
|
30
|
+
</div>
|
|
31
|
+
)
|
|
32
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { cn } from '@/lib/utils'
|
|
3
|
+
|
|
4
|
+
interface NavItemProps {
|
|
5
|
+
href?: string
|
|
6
|
+
icon?: React.ComponentType<React.SVGProps<SVGSVGElement>>
|
|
7
|
+
title: string
|
|
8
|
+
isActive?: boolean
|
|
9
|
+
className?: string
|
|
10
|
+
badge?: React.ReactNode
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function NavItem({ href, icon: Icon, title, isActive, className, badge }: NavItemProps) {
|
|
14
|
+
const classes = cn(
|
|
15
|
+
'flex items-center gap-3 px-3 py-2 rounded-md text-sm font-medium transition-colors w-full text-left',
|
|
16
|
+
isActive
|
|
17
|
+
? 'bg-primary/5 text-primary hover:bg-primary/10'
|
|
18
|
+
: 'text-muted-foreground hover:text-foreground hover:bg-muted',
|
|
19
|
+
className
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
const content = (
|
|
23
|
+
<>
|
|
24
|
+
{Icon && <Icon className="h-4 w-4 shrink-0" />}
|
|
25
|
+
<span className="truncate flex-1">{title}</span>
|
|
26
|
+
{badge}
|
|
27
|
+
</>
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
if (href) {
|
|
31
|
+
return (
|
|
32
|
+
<a href={href} className={classes}>
|
|
33
|
+
{content}
|
|
34
|
+
</a>
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return (
|
|
39
|
+
<button className={classes}>
|
|
40
|
+
{content}
|
|
41
|
+
</button>
|
|
42
|
+
)
|
|
43
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import {
|
|
3
|
+
DropdownMenu,
|
|
4
|
+
DropdownMenuTrigger,
|
|
5
|
+
DropdownMenuContent,
|
|
6
|
+
DropdownMenuItem,
|
|
7
|
+
DropdownMenuLabel,
|
|
8
|
+
DropdownMenuSeparator,
|
|
9
|
+
} from '@/components/ui/dropdown-menu'
|
|
10
|
+
import { ChevronsUpDown, Building2 } from 'lucide-react'
|
|
11
|
+
import { Avatar, AvatarImage, AvatarFallback } from '@/components/ui/avatar'
|
|
12
|
+
import { cn } from '@/lib/utils'
|
|
13
|
+
|
|
14
|
+
interface ContextItem {
|
|
15
|
+
id: string
|
|
16
|
+
name: string
|
|
17
|
+
avatar?: string
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
interface ContextSwitcherProps {
|
|
21
|
+
contexts: ContextItem[]
|
|
22
|
+
activeId?: string
|
|
23
|
+
className?: string
|
|
24
|
+
onSelect?: (id: string) => void
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function ContextSwitcher({ contexts, activeId, className, onSelect }: ContextSwitcherProps) {
|
|
28
|
+
const activeContext = contexts.find((c) => c.id === activeId)
|
|
29
|
+
|
|
30
|
+
return (
|
|
31
|
+
<DropdownMenu>
|
|
32
|
+
<DropdownMenuTrigger asChild>
|
|
33
|
+
<button
|
|
34
|
+
className={cn(
|
|
35
|
+
'flex items-center gap-2 hover:bg-accent hover:text-accent-foreground px-2 py-1.5 rounded-md transition-colors w-full outline-none focus-visible:ring-2 focus-visible:ring-ring',
|
|
36
|
+
className
|
|
37
|
+
)}
|
|
38
|
+
>
|
|
39
|
+
<Avatar className="h-6 w-6 rounded-md shrink-0 border shadow-sm">
|
|
40
|
+
{activeContext?.avatar && <AvatarImage src={activeContext.avatar} />}
|
|
41
|
+
<AvatarFallback className="rounded-md bg-primary/10 text-primary text-xs">
|
|
42
|
+
<Building2 className="h-3 w-3" />
|
|
43
|
+
</AvatarFallback>
|
|
44
|
+
</Avatar>
|
|
45
|
+
<span className="truncate text-sm font-medium flex-1 text-left">
|
|
46
|
+
{activeContext?.name || 'Select Workspace'}
|
|
47
|
+
</span>
|
|
48
|
+
<ChevronsUpDown className="h-3 w-3 shrink-0 text-muted-foreground ml-1" />
|
|
49
|
+
</button>
|
|
50
|
+
</DropdownMenuTrigger>
|
|
51
|
+
<DropdownMenuContent className="w-56" align="start">
|
|
52
|
+
<DropdownMenuLabel className="text-xs text-muted-foreground uppercase tracking-wider font-semibold">
|
|
53
|
+
Workspaces
|
|
54
|
+
</DropdownMenuLabel>
|
|
55
|
+
{contexts.map((ctx) => (
|
|
56
|
+
<DropdownMenuItem
|
|
57
|
+
key={ctx.id}
|
|
58
|
+
onClick={() => onSelect?.(ctx.id)}
|
|
59
|
+
className="gap-2 cursor-pointer py-2"
|
|
60
|
+
>
|
|
61
|
+
<Avatar className="h-5 w-5 rounded shrink-0 border">
|
|
62
|
+
{ctx.avatar && <AvatarImage src={ctx.avatar} />}
|
|
63
|
+
<AvatarFallback className="rounded text-[10px]">
|
|
64
|
+
{ctx.name.substring(0, 2).toUpperCase()}
|
|
65
|
+
</AvatarFallback>
|
|
66
|
+
</Avatar>
|
|
67
|
+
<span className="truncate flex-1">{ctx.name}</span>
|
|
68
|
+
</DropdownMenuItem>
|
|
69
|
+
))}
|
|
70
|
+
<DropdownMenuSeparator />
|
|
71
|
+
<DropdownMenuItem className="cursor-pointer">
|
|
72
|
+
<span className="text-muted-foreground">Create Workspace...</span>
|
|
73
|
+
</DropdownMenuItem>
|
|
74
|
+
</DropdownMenuContent>
|
|
75
|
+
</DropdownMenu>
|
|
76
|
+
)
|
|
77
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ContextSwitcher'
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { cn } from '@/lib/utils'
|
|
3
|
+
import { Menu } from 'lucide-react'
|
|
4
|
+
import { Button } from '@/components/ui/button'
|
|
5
|
+
|
|
6
|
+
interface TopNavbarProps {
|
|
7
|
+
className?: string
|
|
8
|
+
onMenuClick?: () => void
|
|
9
|
+
brand?: React.ReactNode
|
|
10
|
+
center?: React.ReactNode
|
|
11
|
+
actions?: React.ReactNode
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function TopNavbar({ className, onMenuClick, brand, center, actions }: TopNavbarProps) {
|
|
15
|
+
return (
|
|
16
|
+
<header
|
|
17
|
+
className={cn(
|
|
18
|
+
'sticky top-0 z-40 w-full border-b bg-background/95 backdrop-blur flex h-14 items-center gap-4 px-4 sm:px-6 shadow-sm',
|
|
19
|
+
className
|
|
20
|
+
)}
|
|
21
|
+
>
|
|
22
|
+
<Button
|
|
23
|
+
variant="ghost"
|
|
24
|
+
size="icon"
|
|
25
|
+
className="md:hidden shrink-0"
|
|
26
|
+
onClick={onMenuClick}
|
|
27
|
+
>
|
|
28
|
+
<Menu className="h-5 w-5" />
|
|
29
|
+
<span className="sr-only">Toggle menu</span>
|
|
30
|
+
</Button>
|
|
31
|
+
|
|
32
|
+
<div className="flex items-center gap-2 md:gap-4 shrink-0 font-bold text-lg">
|
|
33
|
+
{brand}
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<div className="flex-1 flex items-center justify-end md:justify-between gap-4">
|
|
37
|
+
<div className="hidden md:flex flex-[0_1_auto] w-full max-w-sm mr-auto ml-4">
|
|
38
|
+
{center}
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
<div className="flex items-center gap-2 shrink-0">
|
|
42
|
+
{actions}
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
</header>
|
|
46
|
+
)
|
|
47
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './TopNavbar'
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { Card, CardContent } from '@/components/ui/card'
|
|
3
|
+
import { Button } from '@/components/ui/button'
|
|
4
|
+
import { CheckCircle2, ArrowRight } from 'lucide-react'
|
|
5
|
+
import { cn } from '@/lib/utils'
|
|
6
|
+
|
|
7
|
+
interface OnboardingWelcomeProps {
|
|
8
|
+
title: string
|
|
9
|
+
description: string
|
|
10
|
+
image?: string
|
|
11
|
+
features?: string[]
|
|
12
|
+
primaryAction?: string
|
|
13
|
+
secondaryAction?: string
|
|
14
|
+
className?: string
|
|
15
|
+
onPrimary?: () => void
|
|
16
|
+
onSecondary?: () => void
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function OnboardingWelcome({
|
|
20
|
+
title,
|
|
21
|
+
description,
|
|
22
|
+
image,
|
|
23
|
+
features,
|
|
24
|
+
primaryAction,
|
|
25
|
+
secondaryAction,
|
|
26
|
+
className,
|
|
27
|
+
onPrimary,
|
|
28
|
+
onSecondary,
|
|
29
|
+
}: OnboardingWelcomeProps) {
|
|
30
|
+
return (
|
|
31
|
+
<Card className={cn('overflow-hidden border-none shadow-lg max-w-2xl mx-auto', className)}>
|
|
32
|
+
{image ? (
|
|
33
|
+
<div className="w-full h-48 sm:h-64 bg-muted relative">
|
|
34
|
+
<img src={image} className="w-full h-full object-cover" />
|
|
35
|
+
<div className="absolute inset-0 bg-gradient-to-t from-background via-background/20 to-transparent"></div>
|
|
36
|
+
</div>
|
|
37
|
+
) : (
|
|
38
|
+
<div className="w-full h-32 bg-gradient-to-br from-primary/20 via-primary/5 to-background"></div>
|
|
39
|
+
)}
|
|
40
|
+
|
|
41
|
+
<CardContent className="p-8 sm:p-10 relative z-10 -mt-8 sm:-mt-12 bg-background/95 backdrop-blur shadow-sm mx-6 sm:mx-10 rounded-xl border mb-8">
|
|
42
|
+
<h2 className="text-2xl sm:text-3xl font-bold tracking-tight mb-3 text-center">{title}</h2>
|
|
43
|
+
<p className="text-muted-foreground text-center mb-8 leading-relaxed">
|
|
44
|
+
{description}
|
|
45
|
+
</p>
|
|
46
|
+
|
|
47
|
+
{features && features.length > 0 && (
|
|
48
|
+
<div className="space-y-4 mb-8">
|
|
49
|
+
{features.map((feature) => (
|
|
50
|
+
<div key={feature} className="flex items-start gap-3">
|
|
51
|
+
<CheckCircle2 className="h-5 w-5 text-primary shrink-0 mt-0.5" />
|
|
52
|
+
<span className="text-sm font-medium leading-relaxed">{feature}</span>
|
|
53
|
+
</div>
|
|
54
|
+
))}
|
|
55
|
+
</div>
|
|
56
|
+
)}
|
|
57
|
+
|
|
58
|
+
<div className="flex flex-col sm:flex-row gap-3 mt-auto">
|
|
59
|
+
{secondaryAction && (
|
|
60
|
+
<Button variant="outline" className="w-full sm:w-1/2" onClick={onSecondary}>
|
|
61
|
+
{secondaryAction}
|
|
62
|
+
</Button>
|
|
63
|
+
)}
|
|
64
|
+
{primaryAction && (
|
|
65
|
+
<Button className={cn('w-full', secondaryAction && 'sm:w-1/2')} onClick={onPrimary}>
|
|
66
|
+
{primaryAction}
|
|
67
|
+
<ArrowRight className="ml-2 h-4 w-4" />
|
|
68
|
+
</Button>
|
|
69
|
+
)}
|
|
70
|
+
</div>
|
|
71
|
+
</CardContent>
|
|
72
|
+
</Card>
|
|
73
|
+
)
|
|
74
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './OnboardingWelcome'
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { cn } from '@/lib/utils'
|
|
3
|
+
import { Check } from 'lucide-react'
|
|
4
|
+
|
|
5
|
+
interface StepWizardProps {
|
|
6
|
+
steps: { title: string; description?: string }[]
|
|
7
|
+
currentStep: number // 1-indexed
|
|
8
|
+
className?: string
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function StepWizard({ steps, currentStep, className }: StepWizardProps) {
|
|
12
|
+
const progressWidth = steps.length > 1
|
|
13
|
+
? ((currentStep - 1) / (steps.length - 1)) * 100
|
|
14
|
+
: 0
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<div className={cn('w-full', className)}>
|
|
18
|
+
<div className="flex items-center justify-between w-full relative">
|
|
19
|
+
{/* Background Connecting Line */}
|
|
20
|
+
<div
|
|
21
|
+
className="absolute top-4 left-0 h-0.5 bg-muted-foreground/20 -z-10"
|
|
22
|
+
style={{ width: '100%' }}
|
|
23
|
+
/>
|
|
24
|
+
|
|
25
|
+
{/* Colored Progress Line */}
|
|
26
|
+
<div
|
|
27
|
+
className="absolute top-4 left-0 h-0.5 bg-primary transition-all duration-300 -z-10"
|
|
28
|
+
style={{ width: `${progressWidth}%` }}
|
|
29
|
+
/>
|
|
30
|
+
|
|
31
|
+
{steps.map((step, index) => (
|
|
32
|
+
<div
|
|
33
|
+
key={step.title}
|
|
34
|
+
className="flex flex-col items-center relative z-10"
|
|
35
|
+
>
|
|
36
|
+
<div
|
|
37
|
+
className={cn(
|
|
38
|
+
'w-8 h-8 rounded-full flex items-center justify-center text-sm font-semibold transition-colors duration-200 shadow-sm',
|
|
39
|
+
index + 1 < currentStep
|
|
40
|
+
? 'bg-primary text-primary-foreground ring-2 ring-primary ring-offset-2 ring-offset-background'
|
|
41
|
+
: index + 1 === currentStep
|
|
42
|
+
? 'bg-primary text-primary-foreground ring-4 ring-primary/20'
|
|
43
|
+
: 'bg-background text-muted-foreground border-2 border-muted-foreground/30'
|
|
44
|
+
)}
|
|
45
|
+
>
|
|
46
|
+
{index + 1 < currentStep ? (
|
|
47
|
+
<Check className="h-4 w-4" />
|
|
48
|
+
) : (
|
|
49
|
+
<span>{index + 1}</span>
|
|
50
|
+
)}
|
|
51
|
+
</div>
|
|
52
|
+
<div className="mt-3 text-center hidden sm:flex flex-col items-center max-w-[120px]">
|
|
53
|
+
<h4
|
|
54
|
+
className={cn(
|
|
55
|
+
'text-sm font-semibold whitespace-nowrap',
|
|
56
|
+
index + 1 <= currentStep ? 'text-foreground' : 'text-muted-foreground'
|
|
57
|
+
)}
|
|
58
|
+
>
|
|
59
|
+
{step.title}
|
|
60
|
+
</h4>
|
|
61
|
+
{step.description && (
|
|
62
|
+
<p className="text-xs text-muted-foreground mt-0.5 text-center line-clamp-2">
|
|
63
|
+
{step.description}
|
|
64
|
+
</p>
|
|
65
|
+
)}
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
))}
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
)
|
|
72
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './StepWizard'
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'
|
|
3
|
+
import { Card } from '@/components/ui/card'
|
|
4
|
+
import { cn } from '@/lib/utils'
|
|
5
|
+
|
|
6
|
+
interface ConnectionItemProps {
|
|
7
|
+
name: string
|
|
8
|
+
description?: string
|
|
9
|
+
avatar?: string
|
|
10
|
+
className?: string
|
|
11
|
+
action?: React.ReactNode
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function ConnectionItem({ name, description, avatar, className, action }: ConnectionItemProps) {
|
|
15
|
+
return (
|
|
16
|
+
<Card className={cn('flex items-center justify-between p-4 shadow-sm hover:shadow transition-shadow border-muted', className)}>
|
|
17
|
+
<div className="flex items-center gap-4">
|
|
18
|
+
<Avatar className="h-12 w-12 border border-border/50">
|
|
19
|
+
{avatar && <AvatarImage src={avatar} />}
|
|
20
|
+
<AvatarFallback>{name.substring(0, 2).toUpperCase()}</AvatarFallback>
|
|
21
|
+
</Avatar>
|
|
22
|
+
<div className="flex flex-col">
|
|
23
|
+
<span className="font-semibold text-foreground text-sm lg:text-base leading-tight">{name}</span>
|
|
24
|
+
{description && (
|
|
25
|
+
<span className="text-xs lg:text-sm text-muted-foreground mt-0.5">{description}</span>
|
|
26
|
+
)}
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<div className="shrink-0 flex items-center ml-4">
|
|
31
|
+
{action}
|
|
32
|
+
</div>
|
|
33
|
+
</Card>
|
|
34
|
+
)
|
|
35
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { cn } from '@/lib/utils'
|
|
3
|
+
|
|
4
|
+
export function ConnectionList({
|
|
5
|
+
className,
|
|
6
|
+
children,
|
|
7
|
+
}: {
|
|
8
|
+
className?: string
|
|
9
|
+
children?: React.ReactNode
|
|
10
|
+
}) {
|
|
11
|
+
return (
|
|
12
|
+
<div className={cn('flex flex-col gap-4', className)}>
|
|
13
|
+
{children}
|
|
14
|
+
</div>
|
|
15
|
+
)
|
|
16
|
+
}
|