@victusvinceere/saas-core 0.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/dist/auth/index.d.mts +40 -0
- package/dist/auth/index.d.ts +40 -0
- package/dist/auth/index.js +147 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/index.mjs +111 -0
- package/dist/auth/index.mjs.map +1 -0
- package/dist/authorization/index.d.mts +78 -0
- package/dist/authorization/index.d.ts +78 -0
- package/dist/authorization/index.js +137 -0
- package/dist/authorization/index.js.map +1 -0
- package/dist/authorization/index.mjs +104 -0
- package/dist/authorization/index.mjs.map +1 -0
- package/dist/components/auth/index.d.mts +26 -0
- package/dist/components/auth/index.d.ts +26 -0
- package/dist/components/auth/index.js +733 -0
- package/dist/components/auth/index.js.map +1 -0
- package/dist/components/auth/index.mjs +696 -0
- package/dist/components/auth/index.mjs.map +1 -0
- package/dist/components/dashboard/index.d.mts +32 -0
- package/dist/components/dashboard/index.d.ts +32 -0
- package/dist/components/dashboard/index.js +440 -0
- package/dist/components/dashboard/index.js.map +1 -0
- package/dist/components/dashboard/index.mjs +401 -0
- package/dist/components/dashboard/index.mjs.map +1 -0
- package/dist/components/ui/index.d.mts +351 -0
- package/dist/components/ui/index.d.ts +351 -0
- package/dist/components/ui/index.js +14342 -0
- package/dist/components/ui/index.js.map +1 -0
- package/dist/components/ui/index.mjs +14173 -0
- package/dist/components/ui/index.mjs.map +1 -0
- package/dist/config/index.d.mts +45 -0
- package/dist/config/index.d.ts +45 -0
- package/dist/config/index.js +71 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/index.mjs +44 -0
- package/dist/config/index.mjs.map +1 -0
- package/dist/hooks/index.d.mts +20 -0
- package/dist/hooks/index.d.ts +20 -0
- package/dist/hooks/index.js +103 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/index.mjs +65 -0
- package/dist/hooks/index.mjs.map +1 -0
- package/dist/index.d.mts +21 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +459 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +401 -0
- package/dist/index.mjs.map +1 -0
- package/dist/prisma/index.d.mts +11 -0
- package/dist/prisma/index.d.ts +11 -0
- package/dist/prisma/index.js +46 -0
- package/dist/prisma/index.js.map +1 -0
- package/dist/prisma/index.mjs +20 -0
- package/dist/prisma/index.mjs.map +1 -0
- package/dist/providers/index.d.mts +37 -0
- package/dist/providers/index.d.ts +37 -0
- package/dist/providers/index.js +97 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/index.mjs +69 -0
- package/dist/providers/index.mjs.map +1 -0
- package/dist/sidebar-ttX_iZ40.d.mts +22 -0
- package/dist/sidebar-ttX_iZ40.d.ts +22 -0
- package/package.json +122 -0
- package/prisma/schema.prisma +106 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/dashboard/index.ts","../../../src/components/dashboard/sidebar.tsx","../../../src/lib/utils.ts","../../../src/components/ui/button.tsx","../../../src/components/ui/badge.tsx","../../../src/components/ui/tooltip.tsx","../../../src/components/dashboard/mobile-sidebar.tsx","../../../src/components/ui/sheet.tsx","../../../src/components/dashboard/header.tsx","../../../src/components/dashboard/dashboard-layout.tsx"],"sourcesContent":["export { Sidebar } from \"./sidebar\";\nexport type { SidebarProps, SidebarNavItem, SidebarNavGroup } from \"./sidebar\";\n\nexport { MobileSidebar } from \"./mobile-sidebar\";\nexport type { MobileSidebarProps } from \"./mobile-sidebar\";\n\nexport { Header } from \"./header\";\nexport type { HeaderProps } from \"./header\";\n\nexport { DashboardLayout } from \"./dashboard-layout\";\nexport type { DashboardLayoutProps } from \"./dashboard-layout\";\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { usePathname } from \"next/navigation\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../ui/button\";\nimport { Badge } from \"../ui/badge\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../ui/tooltip\";\nimport { ChevronLeft, ChevronRight, type LucideIcon } from \"lucide-react\";\nimport { useState } from \"react\";\n\nexport interface SidebarNavItem {\n title: string;\n href: string;\n icon: LucideIcon;\n disabled?: boolean;\n badge?: string;\n}\n\nexport interface SidebarNavGroup {\n title: string;\n items: SidebarNavItem[];\n}\n\nexport interface SidebarProps {\n config: SidebarNavGroup[];\n siteName?: string;\n logo?: React.ReactNode;\n}\n\nexport function Sidebar({ config, siteName = \"SaaS Kit\", logo }: SidebarProps) {\n const pathname = usePathname();\n const [isCollapsed, setIsCollapsed] = useState(false);\n\n return (\n <TooltipProvider delayDuration={0}>\n <aside\n className={cn(\n \"hidden lg:fixed lg:inset-y-0 lg:z-50 lg:flex lg:flex-col transition-all duration-300\",\n isCollapsed ? \"lg:w-16\" : \"lg:w-64\"\n )}\n >\n <div className=\"flex grow flex-col gap-y-5 overflow-y-auto border-r bg-background pb-4\">\n {/* Logo */}\n <div\n className={cn(\n \"flex h-16 shrink-0 items-center border-b px-4\",\n isCollapsed && \"justify-center px-2\"\n )}\n >\n <Link href=\"/\" className=\"flex items-center gap-2\">\n {logo || (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-lg bg-primary text-primary-foreground font-bold\">\n S\n </div>\n )}\n {!isCollapsed && (\n <span className=\"text-lg font-semibold\">{siteName}</span>\n )}\n </Link>\n </div>\n\n {/* Navigation */}\n <nav className=\"flex flex-1 flex-col px-2\">\n <ul role=\"list\" className=\"flex flex-1 flex-col gap-y-4\">\n {config.map((group) => (\n <li key={group.title}>\n {!isCollapsed && (\n <div className=\"mb-2 px-2 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {group.title}\n </div>\n )}\n <ul role=\"list\" className=\"space-y-1\">\n {group.items.map((item) => {\n const isActive = pathname === item.href;\n\n const linkContent = (\n <Link\n href={item.disabled ? \"#\" : item.href}\n className={cn(\n \"group flex items-center gap-x-3 rounded-lg px-3 py-2 text-sm font-medium transition-colors\",\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"text-muted-foreground hover:bg-muted hover:text-foreground\",\n item.disabled &&\n \"pointer-events-none opacity-50\",\n isCollapsed && \"justify-center px-2\"\n )}\n >\n <item.icon className=\"h-5 w-5 shrink-0\" />\n {!isCollapsed && (\n <>\n <span className=\"flex-1\">{item.title}</span>\n {item.badge && (\n <Badge\n variant=\"secondary\"\n className=\"ml-auto text-xs\"\n >\n {item.badge}\n </Badge>\n )}\n </>\n )}\n </Link>\n );\n\n if (isCollapsed) {\n return (\n <li key={item.title}>\n <Tooltip>\n <TooltipTrigger asChild>\n {linkContent}\n </TooltipTrigger>\n <TooltipContent side=\"right\" className=\"flex items-center gap-2\">\n {item.title}\n {item.badge && (\n <Badge variant=\"secondary\" className=\"text-xs\">\n {item.badge}\n </Badge>\n )}\n </TooltipContent>\n </Tooltip>\n </li>\n );\n }\n\n return <li key={item.title}>{linkContent}</li>;\n })}\n </ul>\n </li>\n ))}\n </ul>\n </nav>\n\n {/* Collapse Button */}\n <div className=\"px-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"w-full justify-center\",\n !isCollapsed && \"justify-start\"\n )}\n onClick={() => setIsCollapsed(!isCollapsed)}\n >\n {isCollapsed ? (\n <ChevronRight className=\"h-4 w-4\" />\n ) : (\n <>\n <ChevronLeft className=\"h-4 w-4 mr-2\" />\n <span>Collapse</span>\n </>\n )}\n </Button>\n </div>\n </div>\n </aside>\n </TooltipProvider>\n );\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n destructive:\n \"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant,\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n )\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { usePathname } from \"next/navigation\";\nimport { cn } from \"../../lib/utils\";\nimport { Badge } from \"../ui/badge\";\nimport type { SidebarNavGroup } from \"./sidebar\";\n\nexport interface MobileSidebarProps {\n config: SidebarNavGroup[];\n siteName?: string;\n logo?: React.ReactNode;\n}\n\nexport function MobileSidebar({ config, siteName = \"SaaS Kit\", logo }: MobileSidebarProps) {\n const pathname = usePathname();\n\n return (\n <div className=\"flex grow flex-col gap-y-5 overflow-y-auto bg-background px-4 pb-4\">\n {/* Logo */}\n <div className=\"flex h-16 shrink-0 items-center border-b\">\n <Link href=\"/\" className=\"flex items-center gap-2\">\n {logo || (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-lg bg-primary text-primary-foreground font-bold\">\n S\n </div>\n )}\n <span className=\"text-lg font-semibold\">{siteName}</span>\n </Link>\n </div>\n\n {/* Navigation */}\n <nav className=\"flex flex-1 flex-col\">\n <ul role=\"list\" className=\"flex flex-1 flex-col gap-y-4\">\n {config.map((group) => (\n <li key={group.title}>\n <div className=\"mb-2 px-2 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {group.title}\n </div>\n <ul role=\"list\" className=\"space-y-1\">\n {group.items.map((item) => {\n const isActive =\n pathname === item.href ||\n pathname.startsWith(item.href + \"/\");\n\n return (\n <li key={item.title}>\n <Link\n href={item.disabled ? \"#\" : item.href}\n className={cn(\n \"group flex items-center gap-x-3 rounded-lg px-3 py-2 text-sm font-medium transition-colors\",\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"text-muted-foreground hover:bg-muted hover:text-foreground\",\n item.disabled && \"pointer-events-none opacity-50\"\n )}\n >\n <item.icon className=\"h-5 w-5 shrink-0\" />\n <span className=\"flex-1\">{item.title}</span>\n {item.badge && (\n <Badge variant=\"secondary\" className=\"ml-auto text-xs\">\n {item.badge}\n </Badge>\n )}\n </Link>\n </li>\n );\n })}\n </ul>\n </li>\n ))}\n </ul>\n </nav>\n </div>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n side === \"right\" &&\n \"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm\",\n side === \"left\" &&\n \"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm\",\n side === \"top\" &&\n \"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b\",\n side === \"bottom\" &&\n \"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t\",\n className\n )}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","\"use client\";\n\nimport { Button } from \"../ui/button\";\nimport { Sheet, SheetContent, SheetTrigger } from \"../ui/sheet\";\nimport { Menu } from \"lucide-react\";\nimport { MobileSidebar } from \"./mobile-sidebar\";\nimport type { SidebarNavGroup } from \"./sidebar\";\nimport { type ReactNode } from \"react\";\n\nexport interface HeaderProps {\n sidebarConfig: SidebarNavGroup[];\n siteName?: string;\n logo?: ReactNode;\n children?: ReactNode;\n}\n\nexport function Header({\n sidebarConfig,\n siteName,\n logo,\n children,\n}: HeaderProps) {\n return (\n <header className=\"sticky top-0 z-40 flex h-16 shrink-0 items-center gap-x-4 border-b bg-background px-4 shadow-sm sm:gap-x-6 sm:px-6 lg:px-8\">\n <Sheet>\n <SheetTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"lg:hidden\">\n <Menu className=\"h-6 w-6\" />\n <span className=\"sr-only\">Open sidebar</span>\n </Button>\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"w-64 p-0\">\n <MobileSidebar\n config={sidebarConfig}\n siteName={siteName}\n logo={logo}\n />\n </SheetContent>\n </Sheet>\n\n <div className=\"h-6 w-px bg-border lg:hidden\" />\n\n <div className=\"flex flex-1 gap-x-4 self-stretch lg:gap-x-6\">\n <div className=\"flex flex-1\" />\n <div className=\"flex items-center gap-x-4 lg:gap-x-6\">{children}</div>\n </div>\n </header>\n );\n}\n","\"use client\";\n\nimport { type ReactNode } from \"react\";\nimport { Sidebar } from \"./sidebar\";\nimport { Header } from \"./header\";\nimport type { SidebarNavGroup } from \"./sidebar\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface DashboardLayoutProps {\n children: ReactNode;\n sidebarConfig: SidebarNavGroup[];\n siteName?: string;\n logo?: ReactNode;\n headerContent?: ReactNode;\n className?: string;\n}\n\nexport function DashboardLayout({\n children,\n sidebarConfig,\n siteName = \"SaaS Kit\",\n logo,\n headerContent,\n className,\n}: DashboardLayoutProps) {\n return (\n <div className=\"min-h-screen bg-background\">\n <Sidebar config={sidebarConfig} siteName={siteName} logo={logo} />\n <div className=\"lg:pl-64\">\n <Header sidebarConfig={sidebarConfig} siteName={siteName} logo={logo}>\n {headerContent}\n </Header>\n <main className={cn(\"p-4 sm:p-6 lg:p-8\", className)}>{children}</main>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["import_react_slot","import_class_variance_authority","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","Link","import_link","import_navigation","import_jsx_runtime","Link","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime"]}
|
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/components/dashboard/sidebar.tsx
|
|
4
|
+
import Link from "next/link";
|
|
5
|
+
import { usePathname } from "next/navigation";
|
|
6
|
+
|
|
7
|
+
// src/lib/utils.ts
|
|
8
|
+
import { clsx } from "clsx";
|
|
9
|
+
import { twMerge } from "tailwind-merge";
|
|
10
|
+
function cn(...inputs) {
|
|
11
|
+
return twMerge(clsx(inputs));
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// src/components/ui/button.tsx
|
|
15
|
+
import { Slot } from "@radix-ui/react-slot";
|
|
16
|
+
import { cva } from "class-variance-authority";
|
|
17
|
+
import { jsx } from "react/jsx-runtime";
|
|
18
|
+
var buttonVariants = cva(
|
|
19
|
+
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
|
|
20
|
+
{
|
|
21
|
+
variants: {
|
|
22
|
+
variant: {
|
|
23
|
+
default: "bg-primary text-primary-foreground hover:bg-primary/90",
|
|
24
|
+
destructive: "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
|
|
25
|
+
outline: "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
|
|
26
|
+
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
27
|
+
ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
|
|
28
|
+
link: "text-primary underline-offset-4 hover:underline"
|
|
29
|
+
},
|
|
30
|
+
size: {
|
|
31
|
+
default: "h-9 px-4 py-2 has-[>svg]:px-3",
|
|
32
|
+
sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
|
|
33
|
+
lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
|
|
34
|
+
icon: "size-9",
|
|
35
|
+
"icon-sm": "size-8",
|
|
36
|
+
"icon-lg": "size-10"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
defaultVariants: {
|
|
40
|
+
variant: "default",
|
|
41
|
+
size: "default"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
function Button({
|
|
46
|
+
className,
|
|
47
|
+
variant = "default",
|
|
48
|
+
size = "default",
|
|
49
|
+
asChild = false,
|
|
50
|
+
...props
|
|
51
|
+
}) {
|
|
52
|
+
const Comp = asChild ? Slot : "button";
|
|
53
|
+
return /* @__PURE__ */ jsx(
|
|
54
|
+
Comp,
|
|
55
|
+
{
|
|
56
|
+
"data-slot": "button",
|
|
57
|
+
"data-variant": variant,
|
|
58
|
+
"data-size": size,
|
|
59
|
+
className: cn(buttonVariants({ variant, size, className })),
|
|
60
|
+
...props
|
|
61
|
+
}
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// src/components/ui/badge.tsx
|
|
66
|
+
import { Slot as Slot2 } from "@radix-ui/react-slot";
|
|
67
|
+
import { cva as cva2 } from "class-variance-authority";
|
|
68
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
69
|
+
var badgeVariants = cva2(
|
|
70
|
+
"inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
|
|
71
|
+
{
|
|
72
|
+
variants: {
|
|
73
|
+
variant: {
|
|
74
|
+
default: "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
|
|
75
|
+
secondary: "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
|
|
76
|
+
destructive: "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
|
|
77
|
+
outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground"
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
defaultVariants: {
|
|
81
|
+
variant: "default"
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
);
|
|
85
|
+
function Badge({
|
|
86
|
+
className,
|
|
87
|
+
variant,
|
|
88
|
+
asChild = false,
|
|
89
|
+
...props
|
|
90
|
+
}) {
|
|
91
|
+
const Comp = asChild ? Slot2 : "span";
|
|
92
|
+
return /* @__PURE__ */ jsx2(
|
|
93
|
+
Comp,
|
|
94
|
+
{
|
|
95
|
+
"data-slot": "badge",
|
|
96
|
+
className: cn(badgeVariants({ variant }), className),
|
|
97
|
+
...props
|
|
98
|
+
}
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// src/components/ui/tooltip.tsx
|
|
103
|
+
import * as TooltipPrimitive from "@radix-ui/react-tooltip";
|
|
104
|
+
import { jsx as jsx3, jsxs } from "react/jsx-runtime";
|
|
105
|
+
function TooltipProvider({
|
|
106
|
+
delayDuration = 0,
|
|
107
|
+
...props
|
|
108
|
+
}) {
|
|
109
|
+
return /* @__PURE__ */ jsx3(
|
|
110
|
+
TooltipPrimitive.Provider,
|
|
111
|
+
{
|
|
112
|
+
"data-slot": "tooltip-provider",
|
|
113
|
+
delayDuration,
|
|
114
|
+
...props
|
|
115
|
+
}
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
function Tooltip({
|
|
119
|
+
...props
|
|
120
|
+
}) {
|
|
121
|
+
return /* @__PURE__ */ jsx3(TooltipProvider, { children: /* @__PURE__ */ jsx3(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props }) });
|
|
122
|
+
}
|
|
123
|
+
function TooltipTrigger({
|
|
124
|
+
...props
|
|
125
|
+
}) {
|
|
126
|
+
return /* @__PURE__ */ jsx3(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
|
|
127
|
+
}
|
|
128
|
+
function TooltipContent({
|
|
129
|
+
className,
|
|
130
|
+
sideOffset = 0,
|
|
131
|
+
children,
|
|
132
|
+
...props
|
|
133
|
+
}) {
|
|
134
|
+
return /* @__PURE__ */ jsx3(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
|
|
135
|
+
TooltipPrimitive.Content,
|
|
136
|
+
{
|
|
137
|
+
"data-slot": "tooltip-content",
|
|
138
|
+
sideOffset,
|
|
139
|
+
className: cn(
|
|
140
|
+
"bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance",
|
|
141
|
+
className
|
|
142
|
+
),
|
|
143
|
+
...props,
|
|
144
|
+
children: [
|
|
145
|
+
children,
|
|
146
|
+
/* @__PURE__ */ jsx3(TooltipPrimitive.Arrow, { className: "bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]" })
|
|
147
|
+
]
|
|
148
|
+
}
|
|
149
|
+
) });
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// src/components/dashboard/sidebar.tsx
|
|
153
|
+
import { ChevronLeft, ChevronRight } from "lucide-react";
|
|
154
|
+
import { useState } from "react";
|
|
155
|
+
import { Fragment, jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
156
|
+
function Sidebar({ config, siteName = "SaaS Kit", logo }) {
|
|
157
|
+
const pathname = usePathname();
|
|
158
|
+
const [isCollapsed, setIsCollapsed] = useState(false);
|
|
159
|
+
return /* @__PURE__ */ jsx4(TooltipProvider, { delayDuration: 0, children: /* @__PURE__ */ jsx4(
|
|
160
|
+
"aside",
|
|
161
|
+
{
|
|
162
|
+
className: cn(
|
|
163
|
+
"hidden lg:fixed lg:inset-y-0 lg:z-50 lg:flex lg:flex-col transition-all duration-300",
|
|
164
|
+
isCollapsed ? "lg:w-16" : "lg:w-64"
|
|
165
|
+
),
|
|
166
|
+
children: /* @__PURE__ */ jsxs2("div", { className: "flex grow flex-col gap-y-5 overflow-y-auto border-r bg-background pb-4", children: [
|
|
167
|
+
/* @__PURE__ */ jsx4(
|
|
168
|
+
"div",
|
|
169
|
+
{
|
|
170
|
+
className: cn(
|
|
171
|
+
"flex h-16 shrink-0 items-center border-b px-4",
|
|
172
|
+
isCollapsed && "justify-center px-2"
|
|
173
|
+
),
|
|
174
|
+
children: /* @__PURE__ */ jsxs2(Link, { href: "/", className: "flex items-center gap-2", children: [
|
|
175
|
+
logo || /* @__PURE__ */ jsx4("div", { className: "flex h-8 w-8 items-center justify-center rounded-lg bg-primary text-primary-foreground font-bold", children: "S" }),
|
|
176
|
+
!isCollapsed && /* @__PURE__ */ jsx4("span", { className: "text-lg font-semibold", children: siteName })
|
|
177
|
+
] })
|
|
178
|
+
}
|
|
179
|
+
),
|
|
180
|
+
/* @__PURE__ */ jsx4("nav", { className: "flex flex-1 flex-col px-2", children: /* @__PURE__ */ jsx4("ul", { role: "list", className: "flex flex-1 flex-col gap-y-4", children: config.map((group) => /* @__PURE__ */ jsxs2("li", { children: [
|
|
181
|
+
!isCollapsed && /* @__PURE__ */ jsx4("div", { className: "mb-2 px-2 text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: group.title }),
|
|
182
|
+
/* @__PURE__ */ jsx4("ul", { role: "list", className: "space-y-1", children: group.items.map((item) => {
|
|
183
|
+
const isActive = pathname === item.href;
|
|
184
|
+
const linkContent = /* @__PURE__ */ jsxs2(
|
|
185
|
+
Link,
|
|
186
|
+
{
|
|
187
|
+
href: item.disabled ? "#" : item.href,
|
|
188
|
+
className: cn(
|
|
189
|
+
"group flex items-center gap-x-3 rounded-lg px-3 py-2 text-sm font-medium transition-colors",
|
|
190
|
+
isActive ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-muted hover:text-foreground",
|
|
191
|
+
item.disabled && "pointer-events-none opacity-50",
|
|
192
|
+
isCollapsed && "justify-center px-2"
|
|
193
|
+
),
|
|
194
|
+
children: [
|
|
195
|
+
/* @__PURE__ */ jsx4(item.icon, { className: "h-5 w-5 shrink-0" }),
|
|
196
|
+
!isCollapsed && /* @__PURE__ */ jsxs2(Fragment, { children: [
|
|
197
|
+
/* @__PURE__ */ jsx4("span", { className: "flex-1", children: item.title }),
|
|
198
|
+
item.badge && /* @__PURE__ */ jsx4(
|
|
199
|
+
Badge,
|
|
200
|
+
{
|
|
201
|
+
variant: "secondary",
|
|
202
|
+
className: "ml-auto text-xs",
|
|
203
|
+
children: item.badge
|
|
204
|
+
}
|
|
205
|
+
)
|
|
206
|
+
] })
|
|
207
|
+
]
|
|
208
|
+
}
|
|
209
|
+
);
|
|
210
|
+
if (isCollapsed) {
|
|
211
|
+
return /* @__PURE__ */ jsx4("li", { children: /* @__PURE__ */ jsxs2(Tooltip, { children: [
|
|
212
|
+
/* @__PURE__ */ jsx4(TooltipTrigger, { asChild: true, children: linkContent }),
|
|
213
|
+
/* @__PURE__ */ jsxs2(TooltipContent, { side: "right", className: "flex items-center gap-2", children: [
|
|
214
|
+
item.title,
|
|
215
|
+
item.badge && /* @__PURE__ */ jsx4(Badge, { variant: "secondary", className: "text-xs", children: item.badge })
|
|
216
|
+
] })
|
|
217
|
+
] }) }, item.title);
|
|
218
|
+
}
|
|
219
|
+
return /* @__PURE__ */ jsx4("li", { children: linkContent }, item.title);
|
|
220
|
+
}) })
|
|
221
|
+
] }, group.title)) }) }),
|
|
222
|
+
/* @__PURE__ */ jsx4("div", { className: "px-2", children: /* @__PURE__ */ jsx4(
|
|
223
|
+
Button,
|
|
224
|
+
{
|
|
225
|
+
variant: "ghost",
|
|
226
|
+
size: "sm",
|
|
227
|
+
className: cn(
|
|
228
|
+
"w-full justify-center",
|
|
229
|
+
!isCollapsed && "justify-start"
|
|
230
|
+
),
|
|
231
|
+
onClick: () => setIsCollapsed(!isCollapsed),
|
|
232
|
+
children: isCollapsed ? /* @__PURE__ */ jsx4(ChevronRight, { className: "h-4 w-4" }) : /* @__PURE__ */ jsxs2(Fragment, { children: [
|
|
233
|
+
/* @__PURE__ */ jsx4(ChevronLeft, { className: "h-4 w-4 mr-2" }),
|
|
234
|
+
/* @__PURE__ */ jsx4("span", { children: "Collapse" })
|
|
235
|
+
] })
|
|
236
|
+
}
|
|
237
|
+
) })
|
|
238
|
+
] })
|
|
239
|
+
}
|
|
240
|
+
) });
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// src/components/dashboard/mobile-sidebar.tsx
|
|
244
|
+
import Link2 from "next/link";
|
|
245
|
+
import { usePathname as usePathname2 } from "next/navigation";
|
|
246
|
+
import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
247
|
+
function MobileSidebar({ config, siteName = "SaaS Kit", logo }) {
|
|
248
|
+
const pathname = usePathname2();
|
|
249
|
+
return /* @__PURE__ */ jsxs3("div", { className: "flex grow flex-col gap-y-5 overflow-y-auto bg-background px-4 pb-4", children: [
|
|
250
|
+
/* @__PURE__ */ jsx5("div", { className: "flex h-16 shrink-0 items-center border-b", children: /* @__PURE__ */ jsxs3(Link2, { href: "/", className: "flex items-center gap-2", children: [
|
|
251
|
+
logo || /* @__PURE__ */ jsx5("div", { className: "flex h-8 w-8 items-center justify-center rounded-lg bg-primary text-primary-foreground font-bold", children: "S" }),
|
|
252
|
+
/* @__PURE__ */ jsx5("span", { className: "text-lg font-semibold", children: siteName })
|
|
253
|
+
] }) }),
|
|
254
|
+
/* @__PURE__ */ jsx5("nav", { className: "flex flex-1 flex-col", children: /* @__PURE__ */ jsx5("ul", { role: "list", className: "flex flex-1 flex-col gap-y-4", children: config.map((group) => /* @__PURE__ */ jsxs3("li", { children: [
|
|
255
|
+
/* @__PURE__ */ jsx5("div", { className: "mb-2 px-2 text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: group.title }),
|
|
256
|
+
/* @__PURE__ */ jsx5("ul", { role: "list", className: "space-y-1", children: group.items.map((item) => {
|
|
257
|
+
const isActive = pathname === item.href || pathname.startsWith(item.href + "/");
|
|
258
|
+
return /* @__PURE__ */ jsx5("li", { children: /* @__PURE__ */ jsxs3(
|
|
259
|
+
Link2,
|
|
260
|
+
{
|
|
261
|
+
href: item.disabled ? "#" : item.href,
|
|
262
|
+
className: cn(
|
|
263
|
+
"group flex items-center gap-x-3 rounded-lg px-3 py-2 text-sm font-medium transition-colors",
|
|
264
|
+
isActive ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-muted hover:text-foreground",
|
|
265
|
+
item.disabled && "pointer-events-none opacity-50"
|
|
266
|
+
),
|
|
267
|
+
children: [
|
|
268
|
+
/* @__PURE__ */ jsx5(item.icon, { className: "h-5 w-5 shrink-0" }),
|
|
269
|
+
/* @__PURE__ */ jsx5("span", { className: "flex-1", children: item.title }),
|
|
270
|
+
item.badge && /* @__PURE__ */ jsx5(Badge, { variant: "secondary", className: "ml-auto text-xs", children: item.badge })
|
|
271
|
+
]
|
|
272
|
+
}
|
|
273
|
+
) }, item.title);
|
|
274
|
+
}) })
|
|
275
|
+
] }, group.title)) }) })
|
|
276
|
+
] });
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// src/components/ui/sheet.tsx
|
|
280
|
+
import * as SheetPrimitive from "@radix-ui/react-dialog";
|
|
281
|
+
import { XIcon } from "lucide-react";
|
|
282
|
+
import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
283
|
+
function Sheet({ ...props }) {
|
|
284
|
+
return /* @__PURE__ */ jsx6(SheetPrimitive.Root, { "data-slot": "sheet", ...props });
|
|
285
|
+
}
|
|
286
|
+
function SheetTrigger({
|
|
287
|
+
...props
|
|
288
|
+
}) {
|
|
289
|
+
return /* @__PURE__ */ jsx6(SheetPrimitive.Trigger, { "data-slot": "sheet-trigger", ...props });
|
|
290
|
+
}
|
|
291
|
+
function SheetPortal({
|
|
292
|
+
...props
|
|
293
|
+
}) {
|
|
294
|
+
return /* @__PURE__ */ jsx6(SheetPrimitive.Portal, { "data-slot": "sheet-portal", ...props });
|
|
295
|
+
}
|
|
296
|
+
function SheetOverlay({
|
|
297
|
+
className,
|
|
298
|
+
...props
|
|
299
|
+
}) {
|
|
300
|
+
return /* @__PURE__ */ jsx6(
|
|
301
|
+
SheetPrimitive.Overlay,
|
|
302
|
+
{
|
|
303
|
+
"data-slot": "sheet-overlay",
|
|
304
|
+
className: cn(
|
|
305
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",
|
|
306
|
+
className
|
|
307
|
+
),
|
|
308
|
+
...props
|
|
309
|
+
}
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
function SheetContent({
|
|
313
|
+
className,
|
|
314
|
+
children,
|
|
315
|
+
side = "right",
|
|
316
|
+
...props
|
|
317
|
+
}) {
|
|
318
|
+
return /* @__PURE__ */ jsxs4(SheetPortal, { children: [
|
|
319
|
+
/* @__PURE__ */ jsx6(SheetOverlay, {}),
|
|
320
|
+
/* @__PURE__ */ jsxs4(
|
|
321
|
+
SheetPrimitive.Content,
|
|
322
|
+
{
|
|
323
|
+
"data-slot": "sheet-content",
|
|
324
|
+
className: cn(
|
|
325
|
+
"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
|
|
326
|
+
side === "right" && "data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm",
|
|
327
|
+
side === "left" && "data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm",
|
|
328
|
+
side === "top" && "data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b",
|
|
329
|
+
side === "bottom" && "data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t",
|
|
330
|
+
className
|
|
331
|
+
),
|
|
332
|
+
...props,
|
|
333
|
+
children: [
|
|
334
|
+
children,
|
|
335
|
+
/* @__PURE__ */ jsxs4(SheetPrimitive.Close, { className: "ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none", children: [
|
|
336
|
+
/* @__PURE__ */ jsx6(XIcon, { className: "size-4" }),
|
|
337
|
+
/* @__PURE__ */ jsx6("span", { className: "sr-only", children: "Close" })
|
|
338
|
+
] })
|
|
339
|
+
]
|
|
340
|
+
}
|
|
341
|
+
)
|
|
342
|
+
] });
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// src/components/dashboard/header.tsx
|
|
346
|
+
import { Menu } from "lucide-react";
|
|
347
|
+
import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
348
|
+
function Header({
|
|
349
|
+
sidebarConfig,
|
|
350
|
+
siteName,
|
|
351
|
+
logo,
|
|
352
|
+
children
|
|
353
|
+
}) {
|
|
354
|
+
return /* @__PURE__ */ jsxs5("header", { className: "sticky top-0 z-40 flex h-16 shrink-0 items-center gap-x-4 border-b bg-background px-4 shadow-sm sm:gap-x-6 sm:px-6 lg:px-8", children: [
|
|
355
|
+
/* @__PURE__ */ jsxs5(Sheet, { children: [
|
|
356
|
+
/* @__PURE__ */ jsx7(SheetTrigger, { asChild: true, children: /* @__PURE__ */ jsxs5(Button, { variant: "ghost", size: "icon", className: "lg:hidden", children: [
|
|
357
|
+
/* @__PURE__ */ jsx7(Menu, { className: "h-6 w-6" }),
|
|
358
|
+
/* @__PURE__ */ jsx7("span", { className: "sr-only", children: "Open sidebar" })
|
|
359
|
+
] }) }),
|
|
360
|
+
/* @__PURE__ */ jsx7(SheetContent, { side: "left", className: "w-64 p-0", children: /* @__PURE__ */ jsx7(
|
|
361
|
+
MobileSidebar,
|
|
362
|
+
{
|
|
363
|
+
config: sidebarConfig,
|
|
364
|
+
siteName,
|
|
365
|
+
logo
|
|
366
|
+
}
|
|
367
|
+
) })
|
|
368
|
+
] }),
|
|
369
|
+
/* @__PURE__ */ jsx7("div", { className: "h-6 w-px bg-border lg:hidden" }),
|
|
370
|
+
/* @__PURE__ */ jsxs5("div", { className: "flex flex-1 gap-x-4 self-stretch lg:gap-x-6", children: [
|
|
371
|
+
/* @__PURE__ */ jsx7("div", { className: "flex flex-1" }),
|
|
372
|
+
/* @__PURE__ */ jsx7("div", { className: "flex items-center gap-x-4 lg:gap-x-6", children })
|
|
373
|
+
] })
|
|
374
|
+
] });
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// src/components/dashboard/dashboard-layout.tsx
|
|
378
|
+
import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
379
|
+
function DashboardLayout({
|
|
380
|
+
children,
|
|
381
|
+
sidebarConfig,
|
|
382
|
+
siteName = "SaaS Kit",
|
|
383
|
+
logo,
|
|
384
|
+
headerContent,
|
|
385
|
+
className
|
|
386
|
+
}) {
|
|
387
|
+
return /* @__PURE__ */ jsxs6("div", { className: "min-h-screen bg-background", children: [
|
|
388
|
+
/* @__PURE__ */ jsx8(Sidebar, { config: sidebarConfig, siteName, logo }),
|
|
389
|
+
/* @__PURE__ */ jsxs6("div", { className: "lg:pl-64", children: [
|
|
390
|
+
/* @__PURE__ */ jsx8(Header, { sidebarConfig, siteName, logo, children: headerContent }),
|
|
391
|
+
/* @__PURE__ */ jsx8("main", { className: cn("p-4 sm:p-6 lg:p-8", className), children })
|
|
392
|
+
] })
|
|
393
|
+
] });
|
|
394
|
+
}
|
|
395
|
+
export {
|
|
396
|
+
DashboardLayout,
|
|
397
|
+
Header,
|
|
398
|
+
MobileSidebar,
|
|
399
|
+
Sidebar
|
|
400
|
+
};
|
|
401
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/dashboard/sidebar.tsx","../../../src/lib/utils.ts","../../../src/components/ui/button.tsx","../../../src/components/ui/badge.tsx","../../../src/components/ui/tooltip.tsx","../../../src/components/dashboard/mobile-sidebar.tsx","../../../src/components/ui/sheet.tsx","../../../src/components/dashboard/header.tsx","../../../src/components/dashboard/dashboard-layout.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { usePathname } from \"next/navigation\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../ui/button\";\nimport { Badge } from \"../ui/badge\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../ui/tooltip\";\nimport { ChevronLeft, ChevronRight, type LucideIcon } from \"lucide-react\";\nimport { useState } from \"react\";\n\nexport interface SidebarNavItem {\n title: string;\n href: string;\n icon: LucideIcon;\n disabled?: boolean;\n badge?: string;\n}\n\nexport interface SidebarNavGroup {\n title: string;\n items: SidebarNavItem[];\n}\n\nexport interface SidebarProps {\n config: SidebarNavGroup[];\n siteName?: string;\n logo?: React.ReactNode;\n}\n\nexport function Sidebar({ config, siteName = \"SaaS Kit\", logo }: SidebarProps) {\n const pathname = usePathname();\n const [isCollapsed, setIsCollapsed] = useState(false);\n\n return (\n <TooltipProvider delayDuration={0}>\n <aside\n className={cn(\n \"hidden lg:fixed lg:inset-y-0 lg:z-50 lg:flex lg:flex-col transition-all duration-300\",\n isCollapsed ? \"lg:w-16\" : \"lg:w-64\"\n )}\n >\n <div className=\"flex grow flex-col gap-y-5 overflow-y-auto border-r bg-background pb-4\">\n {/* Logo */}\n <div\n className={cn(\n \"flex h-16 shrink-0 items-center border-b px-4\",\n isCollapsed && \"justify-center px-2\"\n )}\n >\n <Link href=\"/\" className=\"flex items-center gap-2\">\n {logo || (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-lg bg-primary text-primary-foreground font-bold\">\n S\n </div>\n )}\n {!isCollapsed && (\n <span className=\"text-lg font-semibold\">{siteName}</span>\n )}\n </Link>\n </div>\n\n {/* Navigation */}\n <nav className=\"flex flex-1 flex-col px-2\">\n <ul role=\"list\" className=\"flex flex-1 flex-col gap-y-4\">\n {config.map((group) => (\n <li key={group.title}>\n {!isCollapsed && (\n <div className=\"mb-2 px-2 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {group.title}\n </div>\n )}\n <ul role=\"list\" className=\"space-y-1\">\n {group.items.map((item) => {\n const isActive = pathname === item.href;\n\n const linkContent = (\n <Link\n href={item.disabled ? \"#\" : item.href}\n className={cn(\n \"group flex items-center gap-x-3 rounded-lg px-3 py-2 text-sm font-medium transition-colors\",\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"text-muted-foreground hover:bg-muted hover:text-foreground\",\n item.disabled &&\n \"pointer-events-none opacity-50\",\n isCollapsed && \"justify-center px-2\"\n )}\n >\n <item.icon className=\"h-5 w-5 shrink-0\" />\n {!isCollapsed && (\n <>\n <span className=\"flex-1\">{item.title}</span>\n {item.badge && (\n <Badge\n variant=\"secondary\"\n className=\"ml-auto text-xs\"\n >\n {item.badge}\n </Badge>\n )}\n </>\n )}\n </Link>\n );\n\n if (isCollapsed) {\n return (\n <li key={item.title}>\n <Tooltip>\n <TooltipTrigger asChild>\n {linkContent}\n </TooltipTrigger>\n <TooltipContent side=\"right\" className=\"flex items-center gap-2\">\n {item.title}\n {item.badge && (\n <Badge variant=\"secondary\" className=\"text-xs\">\n {item.badge}\n </Badge>\n )}\n </TooltipContent>\n </Tooltip>\n </li>\n );\n }\n\n return <li key={item.title}>{linkContent}</li>;\n })}\n </ul>\n </li>\n ))}\n </ul>\n </nav>\n\n {/* Collapse Button */}\n <div className=\"px-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"w-full justify-center\",\n !isCollapsed && \"justify-start\"\n )}\n onClick={() => setIsCollapsed(!isCollapsed)}\n >\n {isCollapsed ? (\n <ChevronRight className=\"h-4 w-4\" />\n ) : (\n <>\n <ChevronLeft className=\"h-4 w-4 mr-2\" />\n <span>Collapse</span>\n </>\n )}\n </Button>\n </div>\n </div>\n </aside>\n </TooltipProvider>\n );\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n destructive:\n \"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant,\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n )\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { usePathname } from \"next/navigation\";\nimport { cn } from \"../../lib/utils\";\nimport { Badge } from \"../ui/badge\";\nimport type { SidebarNavGroup } from \"./sidebar\";\n\nexport interface MobileSidebarProps {\n config: SidebarNavGroup[];\n siteName?: string;\n logo?: React.ReactNode;\n}\n\nexport function MobileSidebar({ config, siteName = \"SaaS Kit\", logo }: MobileSidebarProps) {\n const pathname = usePathname();\n\n return (\n <div className=\"flex grow flex-col gap-y-5 overflow-y-auto bg-background px-4 pb-4\">\n {/* Logo */}\n <div className=\"flex h-16 shrink-0 items-center border-b\">\n <Link href=\"/\" className=\"flex items-center gap-2\">\n {logo || (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-lg bg-primary text-primary-foreground font-bold\">\n S\n </div>\n )}\n <span className=\"text-lg font-semibold\">{siteName}</span>\n </Link>\n </div>\n\n {/* Navigation */}\n <nav className=\"flex flex-1 flex-col\">\n <ul role=\"list\" className=\"flex flex-1 flex-col gap-y-4\">\n {config.map((group) => (\n <li key={group.title}>\n <div className=\"mb-2 px-2 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {group.title}\n </div>\n <ul role=\"list\" className=\"space-y-1\">\n {group.items.map((item) => {\n const isActive =\n pathname === item.href ||\n pathname.startsWith(item.href + \"/\");\n\n return (\n <li key={item.title}>\n <Link\n href={item.disabled ? \"#\" : item.href}\n className={cn(\n \"group flex items-center gap-x-3 rounded-lg px-3 py-2 text-sm font-medium transition-colors\",\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"text-muted-foreground hover:bg-muted hover:text-foreground\",\n item.disabled && \"pointer-events-none opacity-50\"\n )}\n >\n <item.icon className=\"h-5 w-5 shrink-0\" />\n <span className=\"flex-1\">{item.title}</span>\n {item.badge && (\n <Badge variant=\"secondary\" className=\"ml-auto text-xs\">\n {item.badge}\n </Badge>\n )}\n </Link>\n </li>\n );\n })}\n </ul>\n </li>\n ))}\n </ul>\n </nav>\n </div>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n side === \"right\" &&\n \"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm\",\n side === \"left\" &&\n \"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm\",\n side === \"top\" &&\n \"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b\",\n side === \"bottom\" &&\n \"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t\",\n className\n )}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","\"use client\";\n\nimport { Button } from \"../ui/button\";\nimport { Sheet, SheetContent, SheetTrigger } from \"../ui/sheet\";\nimport { Menu } from \"lucide-react\";\nimport { MobileSidebar } from \"./mobile-sidebar\";\nimport type { SidebarNavGroup } from \"./sidebar\";\nimport { type ReactNode } from \"react\";\n\nexport interface HeaderProps {\n sidebarConfig: SidebarNavGroup[];\n siteName?: string;\n logo?: ReactNode;\n children?: ReactNode;\n}\n\nexport function Header({\n sidebarConfig,\n siteName,\n logo,\n children,\n}: HeaderProps) {\n return (\n <header className=\"sticky top-0 z-40 flex h-16 shrink-0 items-center gap-x-4 border-b bg-background px-4 shadow-sm sm:gap-x-6 sm:px-6 lg:px-8\">\n <Sheet>\n <SheetTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"lg:hidden\">\n <Menu className=\"h-6 w-6\" />\n <span className=\"sr-only\">Open sidebar</span>\n </Button>\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"w-64 p-0\">\n <MobileSidebar\n config={sidebarConfig}\n siteName={siteName}\n logo={logo}\n />\n </SheetContent>\n </Sheet>\n\n <div className=\"h-6 w-px bg-border lg:hidden\" />\n\n <div className=\"flex flex-1 gap-x-4 self-stretch lg:gap-x-6\">\n <div className=\"flex flex-1\" />\n <div className=\"flex items-center gap-x-4 lg:gap-x-6\">{children}</div>\n </div>\n </header>\n );\n}\n","\"use client\";\n\nimport { type ReactNode } from \"react\";\nimport { Sidebar } from \"./sidebar\";\nimport { Header } from \"./header\";\nimport type { SidebarNavGroup } from \"./sidebar\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface DashboardLayoutProps {\n children: ReactNode;\n sidebarConfig: SidebarNavGroup[];\n siteName?: string;\n logo?: ReactNode;\n headerContent?: ReactNode;\n className?: string;\n}\n\nexport function DashboardLayout({\n children,\n sidebarConfig,\n siteName = \"SaaS Kit\",\n logo,\n headerContent,\n className,\n}: DashboardLayoutProps) {\n return (\n <div className=\"min-h-screen bg-background\">\n <Sidebar config={sidebarConfig} siteName={siteName} logo={logo} />\n <div className=\"lg:pl-64\">\n <Header sidebarConfig={sidebarConfig} siteName={siteName} logo={logo}>\n {headerContent}\n </Header>\n <main className={cn(\"p-4 sm:p-6 lg:p-8\", className)}>{children}</main>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["Slot","cva","jsx","cva","Slot","jsx","jsx","jsxs","Link","usePathname","jsx","jsxs","usePathname","Link","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs"]}
|