@reinvented/design 0.3.0 → 1.0.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/package.json +55 -21
- 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/index.css +6 -0
- package/src/styles/tokens.css +30 -18
- package/tailwind.config.js +120 -98
- package/tsconfig.json +2 -2
- 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
|
+
}
|