@greatapps/greatauth-ui 0.3.6 → 0.3.8

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auth/auth-client.ts","../src/auth/middleware.ts","../src/hooks/use-auth.ts","../src/components/ui/tooltip.tsx","../src/lib/utils.ts","../src/components/ui/sidebar.tsx","../src/hooks/use-mobile.ts","../src/components/ui/button.tsx","../src/components/ui/input.tsx","../src/components/ui/separator.tsx","../src/components/ui/sheet.tsx","../src/components/ui/skeleton.tsx","../src/components/app-sidebar.tsx","../src/components/ui/collapsible.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/avatar.tsx","../src/components/ui/badge.tsx","../src/components/app-header.tsx","../src/components/ui/breadcrumb.tsx","../src/components/theme-toggle.tsx","../src/components/app-shell.tsx","../src/components/login-form.tsx","../src/components/ui/label.tsx"],"sourcesContent":["\"use client\";\n\nimport { createAuthClient } from \"better-auth/react\";\n\nexport const authClient = createAuthClient();\nexport const { useSession, signIn, signUp, signOut } = authClient;\n","import { NextResponse, type NextRequest } from \"next/server\";\n\nexport interface AuthMiddlewareConfig {\n publicPaths: string[];\n preserveSearchParams?: boolean;\n}\n\nexport function createAuthMiddleware(config: AuthMiddlewareConfig) {\n const { publicPaths, preserveSearchParams = false } = config;\n\n return function middleware(request: NextRequest) {\n const { pathname, search } = request.nextUrl;\n\n if (publicPaths.some((path) => pathname.startsWith(path))) {\n return NextResponse.next();\n }\n\n const sessionToken =\n request.cookies.get(\"better-auth.session_token\")?.value ||\n request.cookies.get(\"__Secure-better-auth.session_token\")?.value;\n\n if (!sessionToken) {\n const callbackUrl = preserveSearchParams\n ? pathname + search\n : pathname;\n\n const loginUrl = new URL(\"/login\", request.url);\n loginUrl.searchParams.set(\"callbackUrl\", callbackUrl);\n return NextResponse.redirect(loginUrl);\n }\n\n return NextResponse.next();\n };\n}\n\nexport const authMiddlewareConfig = {\n matcher: [\"/((?!_next/static|_next/image|favicon.ico|api/auth).*)\"],\n};\n","\"use client\";\n\nimport { useSession } from \"../auth/auth-client\";\n\ninterface JwtClaimsConfig {\n [jwtClaimName: string]: string;\n}\n\ninterface UseAuthConfig {\n jwtClaims?: JwtClaimsConfig;\n accountIdOverride?: (user: Record<string, unknown> | null) => string | null;\n extraUserFields?: string[];\n}\n\nfunction decodeJwtPayload(token: string): Record<string, unknown> | null {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) return null;\n const payload = parts[1];\n const decoded = atob(payload.replace(/-/g, \"+\").replace(/_/g, \"/\"));\n return JSON.parse(decoded);\n } catch {\n return null;\n }\n}\n\nexport function createUseAuth(config?: UseAuthConfig) {\n return function useAuth() {\n const { data: sessionData, isPending, error } = useSession();\n\n const session = sessionData?.session ?? null;\n const user = sessionData?.user ?? null;\n\n const sessionObj = session as Record<string, unknown> | null;\n const userObj = user as Record<string, unknown> | null;\n\n // Read from session first (per-login, isolated per app), fallback to user record (backward compat)\n const gauthToken = (sessionObj?.gauthToken ?? userObj?.gauthToken ?? null) as string | null;\n const idAccount = (sessionObj?.idAccount ?? userObj?.idAccount ?? null) as string | null;\n const gauthProfile = (sessionObj?.gauthProfile ?? userObj?.gauthProfile ?? null) as Record<string, unknown> | null;\n\n const result: Record<string, unknown> = {\n session,\n user,\n gauthToken,\n idAccount,\n gauthProfile,\n isLoading: isPending,\n isAuthenticated: !!session && !!user,\n error: error ?? null,\n };\n\n if (config?.jwtClaims && gauthToken) {\n const payload = decodeJwtPayload(gauthToken);\n if (payload) {\n for (const [jwtKey, fieldName] of Object.entries(config.jwtClaims)) {\n result[fieldName] = payload[jwtKey] ?? null;\n }\n }\n }\n\n if (config?.accountIdOverride) {\n const overriddenId = config.accountIdOverride(user as Record<string, unknown> | null);\n if (overriddenId !== null) {\n result.idAccount = overriddenId;\n }\n }\n\n if (config?.extraUserFields && user) {\n for (const field of config.extraUserFields) {\n result[field] = (user as Record<string, unknown>)[field] ?? null;\n }\n }\n\n return result;\n };\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\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 <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\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 \"data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-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 rounded-md px-3 py-1.5 text-xs bg-foreground text-background z-50 w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin)\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"size-2.5 rotate-45 rounded-[2px] bg-foreground fill-foreground z-50 translate-y-[calc(-50%_-_2px)]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\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","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\nimport { PanelLeft } from \"lucide-react\"\n\nimport { useIsMobile } from \"../../hooks/use-mobile\"\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Separator } from \"./separator\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"./sheet\"\nimport { Skeleton } from \"./skeleton\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"./tooltip\"\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open]\n )\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </SidebarContext.Provider>\n )\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n dir,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n dir={dir}\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n className=\"group peer text-sidebar-foreground hidden md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"transition-[width] duration-200 ease-linear relative w-(--sidebar-width) bg-transparent\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n data-side={side}\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex\",\n // Adjust the padding for floating and inset variants.\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"bg-sidebar group-data-[variant=floating]:ring-sidebar-border group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 flex size-full flex-col\"\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <PanelLeft />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2 relative flex w-full flex-1 flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"bg-background h-8 w-full shadow-none\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"gap-2 p-2 flex flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"gap-2 p-2 flex flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"bg-sidebar-border mx-2 w-auto\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"no-scrollbar gap-2 flex min-h-0 flex-1 flex-col overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\n \"p-2 relative flex w-full min-w-0 flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"div\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"text-sidebar-foreground/70 ring-sidebar-ring h-8 rounded-md px-2 text-xs font-medium transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 flex shrink-0 items-center outline-hidden [&>svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 w-5 rounded-md p-0 focus-visible:ring-2 [&>svg]:size-4 flex aspect-square items-center justify-center outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 md:after:hidden [&>svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"text-sm w-full\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"gap-1 flex w-full min-w-0 flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground gap-2 rounded-md p-2 text-left text-sm transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! focus-visible:ring-2 data-active:font-medium peer/menu-button flex w-full items-center overflow-hidden outline-hidden group/menu-button disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline: \"bg-background hover:bg-sidebar-accent hover:text-sidebar-accent-foreground shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot.Root : \"button\"\n const { isMobile, state } = useSidebar()\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n )\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n showOnHover?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 aspect-square w-5 rounded-md p-0 peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 focus-visible:ring-2 [&>svg]:size-4 flex items-center justify-center outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 md:after:hidden [&>svg]:shrink-0\",\n showOnHover &&\n \"peer-data-active/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 aria-expanded:opacity-100 md:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuBadge({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"text-sidebar-foreground peer-hover/menu-button:text-sidebar-accent-foreground peer-data-active/menu-button:text-sidebar-accent-foreground pointer-events-none absolute right-1 h-5 min-w-5 rounded-md px-1 text-xs font-medium peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 flex items-center justify-center tabular-nums select-none group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n}) {\n // Random width between 50 to 90%.\n const [width] = React.useState(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`\n })\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"h-8 gap-2 rounded-md px-2 flex items-center\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-md\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n )\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\"border-sidebar-border mx-3.5 translate-x-px gap-1 border-l px-2.5 py-0.5 group-data-[collapsible=icon]:hidden flex min-w-0 flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n size?: \"sm\" | \"md\"\n isActive?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"a\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground h-7 gap-2 rounded-md px-2 focus-visible:ring-2 data-[size=md]:text-sm data-[size=sm]:text-xs [&>svg]:size-4 flex min-w-0 -translate-x-px items-center overflow-hidden outline-hidden group-data-[collapsible=icon]:hidden disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = useState<boolean | undefined>(undefined);\n\n useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n const onChange = () => setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n mql.addEventListener(\"change\", onChange);\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n return () => mql.removeEventListener(\"change\", onChange);\n }, []);\n\n return !!isMobile;\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-md border border-transparent bg-clip-padding text-sm font-medium focus-visible:ring-3 aria-invalid:ring-3 [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline: \"border-border bg-background hover:bg-muted hover:text-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 aria-expanded:bg-muted aria-expanded:text-foreground shadow-xs\",\n secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost: \"hover:bg-muted hover:text-foreground dark:hover:bg-muted/50 aria-expanded:bg-muted aria-expanded:text-foreground\",\n destructive: \"bg-destructive/10 hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/20 text-destructive focus-visible:border-destructive/40 dark:hover:bg-destructive/30\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 gap-1.5 px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-[min(var(--radius-md),8px)] px-2 text-xs in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 gap-1 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5\",\n lg: \"h-10 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3\",\n icon: \"size-9\",\n \"icon-xs\": \"size-6 rounded-[min(var(--radius-md),8px)] in-data-[slot=button-group]:rounded-md [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md\",\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.Root : \"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\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"dark:bg-input/30 border-input focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 h-9 rounded-md border bg-transparent px-2.5 py-1 text-base shadow-xs transition-[color,box-shadow] file:h-7 file:text-sm file:font-medium focus-visible:ring-3 aria-invalid:ring-3 md:text-sm file:text-foreground placeholder:text-muted-foreground w-full min-w-0 outline-none file:inline-flex file:border-0 file:bg-transparent disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Separator as SeparatorPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"bg-border shrink-0 data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as SheetPrimitive } from \"radix-ui\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\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(\"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/10 duration-100 data-ending-style:opacity-0 data-starting-style:opacity-0 supports-backdrop-filter:backdrop-blur-xs fixed inset-0 z-50\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n data-side={side}\n className={cn(\"bg-background data-open:animate-in data-closed:animate-out data-[side=right]:data-closed:slide-out-to-right-10 data-[side=right]:data-open:slide-in-from-right-10 data-[side=left]:data-closed:slide-out-to-left-10 data-[side=left]:data-open:slide-in-from-left-10 data-[side=top]:data-closed:slide-out-to-top-10 data-[side=top]:data-open:slide-in-from-top-10 data-closed:fade-out-0 data-open:fade-in-0 data-[side=bottom]:data-closed:slide-out-to-bottom-10 data-[side=bottom]:data-open:slide-in-from-bottom-10 fixed z-50 flex flex-col gap-4 bg-clip-padding text-sm shadow-lg transition duration-200 ease-in-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm\", className)}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close data-slot=\"sheet-close\" asChild>\n <Button variant=\"ghost\" className=\"absolute top-4 right-4\" size=\"icon-sm\">\n <X />\n <span className=\"sr-only\">Close</span>\n </Button>\n </SheetPrimitive.Close>\n )}\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(\"gap-1.5 p-4 flex flex-col\", 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(\"gap-2 p-4 mt-auto flex flex-col\", 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-medium\", 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","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"bg-muted rounded-md animate-pulse\", className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n","\"use client\";\n\nimport { usePathname, useRouter } from \"next/navigation\";\nimport Link from \"next/link\";\nimport { ChevronUp, ChevronRight, LogOut } from \"lucide-react\";\nimport { useSession } from \"../auth\";\nimport type { AppShellConfig, MenuGroup, MenuItem } from \"../types\";\nimport { signOut } from \"../auth\";\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n} from \"./ui/sidebar\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"./ui/collapsible\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"./ui/dropdown-menu\";\nimport { Avatar, AvatarFallback, AvatarImage } from \"./ui/avatar\";\nimport { Badge } from \"./ui/badge\";\n\ninterface AppSidebarProps {\n config: AppShellConfig;\n}\n\nfunction getUserInitials(name: string, email: string): string {\n if (!name) return email?.[0]?.toUpperCase() || \"?\";\n\n const parts = name.trim().split(/\\s+/);\n if (parts.length > 1) {\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n return parts[0][0].toUpperCase();\n}\n\nfunction SimpleMenuItem({ item, pathname }: { item: MenuItem; pathname: string }) {\n const isActive = pathname.startsWith(item.href);\n const Icon = item.icon;\n\n return (\n <SidebarMenuItem>\n <SidebarMenuButton asChild isActive={isActive} tooltip={item.label}>\n <Link href={item.href} onClick={item.onClick}>\n <Icon className=\"size-4\" />\n <span>{item.label}</span>\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n );\n}\n\nfunction CollapsibleMenuItem({ item, pathname }: { item: MenuItem; pathname: string }) {\n const Icon = item.icon;\n const isChildActive = item.children?.some((child) => pathname.startsWith(child.href)) ?? false;\n\n return (\n <Collapsible defaultOpen={isChildActive} className=\"group/collapsible\">\n <SidebarMenuItem>\n <CollapsibleTrigger asChild>\n <SidebarMenuButton tooltip={item.label}>\n <Icon className=\"size-4\" />\n <span>{item.label}</span>\n <ChevronRight className=\"ml-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90\" />\n </SidebarMenuButton>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <SidebarMenu className=\"ml-4 border-l pl-2\">\n {item.children?.map((child) => (\n <SimpleMenuItem key={child.href} item={child} pathname={pathname} />\n ))}\n </SidebarMenu>\n </CollapsibleContent>\n </SidebarMenuItem>\n </Collapsible>\n );\n}\n\nexport function AppSidebar({ config }: AppSidebarProps) {\n const pathname = usePathname();\n const router = useRouter();\n const { data: session } = useSession();\n\n const handleLogout = async () => {\n config.onLogout?.();\n await signOut({ fetchOptions: { onSuccess: () => router.push(\"/login\") } });\n };\n\n const userName = session?.user?.name || \"\";\n const userEmail = session?.user?.email || \"\";\n const userImage = session?.user?.image || \"\";\n const initials = getUserInitials(userName, userEmail);\n\n return (\n <Sidebar>\n <SidebarHeader>\n <SidebarMenu>\n <SidebarMenuItem>\n <SidebarMenuButton size=\"lg\" asChild>\n <div className=\"flex items-center gap-2\">\n {config.appIcon}\n <span className=\"font-semibold\">{config.appName}</span>\n {config.appBadge && (\n <Badge variant=\"destructive\">{config.appBadge}</Badge>\n )}\n </div>\n </SidebarMenuButton>\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarHeader>\n\n <SidebarContent>\n {config.menuGroups.map((group: MenuGroup) => (\n <SidebarGroup key={group.label}>\n <SidebarGroupLabel>{group.label}</SidebarGroupLabel>\n <SidebarGroupContent>\n <SidebarMenu>\n {group.items.map((item: MenuItem) =>\n item.children && item.children.length > 0 ? (\n <CollapsibleMenuItem key={item.href} item={item} pathname={pathname} />\n ) : (\n <SimpleMenuItem key={item.href} item={item} pathname={pathname} />\n )\n )}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n ))}\n </SidebarContent>\n\n <SidebarFooter>\n <SidebarMenu>\n <SidebarMenuItem>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton size=\"lg\">\n <Avatar className=\"size-8\">\n {userImage && <AvatarImage src={userImage} alt={userName} />}\n <AvatarFallback>{initials}</AvatarFallback>\n </Avatar>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-semibold\">{userName}</span>\n <span className=\"truncate text-xs text-muted-foreground\">{userEmail}</span>\n </div>\n <ChevronUp className=\"ml-auto size-4\" />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className=\"w-(--radix-dropdown-menu-trigger-width) min-w-56\"\n side=\"top\"\n align=\"end\"\n sideOffset={4}\n >\n <DropdownMenuLabel className=\"font-normal\">\n <div className=\"flex flex-col space-y-1\">\n <p className=\"text-sm font-medium leading-none\">{userName}</p>\n <p className=\"text-xs leading-none text-muted-foreground\">{userEmail}</p>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {config.footerExtra}\n <DropdownMenuItem onClick={handleLogout}>\n <LogOut className=\"size-4\" />\n Sair\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarFooter>\n </Sidebar>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Collapsible as CollapsiblePrimitive } from \"radix-ui\"\n\nfunction Collapsible({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {\n return <CollapsiblePrimitive.Root data-slot=\"collapsible\" {...props} />\n}\n\nfunction CollapsibleTrigger({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {\n return (\n <CollapsiblePrimitive.CollapsibleTrigger\n data-slot=\"collapsible-trigger\"\n {...props}\n />\n )\n}\n\nfunction CollapsibleContent({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) {\n return (\n <CollapsiblePrimitive.CollapsibleContent\n data-slot=\"collapsible-content\"\n {...props}\n />\n )\n}\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\"\nimport { Check, ChevronRight } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n align = \"start\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n align={align}\n className={cn(\"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-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 ring-foreground/10 bg-popover text-popover-foreground min-w-32 rounded-md p-1 shadow-md ring-1 duration-100 z-50 max-h-(--radix-dropdown-menu-content-available-height) w-(--radix-dropdown-menu-trigger-width) origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto data-[state=closed]:overflow-hidden\", className )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:text-destructive not-data-[variant=destructive]:focus:**:text-accent-foreground gap-2 rounded-sm px-2 py-1.5 text-sm data-inset:pl-8 [&_svg:not([class*='size-'])]:size-4 group/dropdown-menu-item relative flex cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm data-inset:pl-8 [&_svg:not([class*='size-'])]:size-4 relative flex cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span\n className=\"absolute right-2 flex items-center justify-center pointer-events-none\"\n data-slot=\"dropdown-menu-checkbox-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <Check />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm data-inset:pl-8 [&_svg:not([class*='size-'])]:size-4 relative flex cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n {...props}\n >\n <span\n className=\"absolute right-2 flex items-center justify-center pointer-events-none\"\n data-slot=\"dropdown-menu-radio-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <Check />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\"text-muted-foreground px-2 py-1.5 text-xs font-medium data-inset:pl-8\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\"text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground ml-auto text-xs tracking-widest\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-open:bg-accent data-open:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground gap-2 rounded-sm px-2 py-1.5 text-sm data-inset:pl-8 [&_svg:not([class*='size-'])]:size-4 flex cursor-default items-center outline-hidden select-none [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-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 ring-foreground/10 bg-popover text-popover-foreground min-w-[96px] rounded-md p-1 shadow-lg ring-1 duration-100 z-50 origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden\", className )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Avatar as AvatarPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Avatar({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root> & {\n size?: \"default\" | \"sm\" | \"lg\"\n}) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n className={cn(\n \"size-8 rounded-full after:rounded-full data-[size=lg]:size-10 data-[size=sm]:size-6 after:border-border group/avatar relative flex shrink-0 select-none after:absolute after:inset-0 after:border after:mix-blend-darken dark:after:mix-blend-lighten\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\n \"rounded-full aspect-square size-full object-cover\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"bg-muted text-muted-foreground rounded-full flex size-full items-center justify-center text-sm group-data-[size=sm]/avatar:text-xs\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarBadge({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"avatar-badge\"\n className={cn(\n \"bg-primary text-primary-foreground ring-background absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-blend-color ring-2 select-none\",\n \"group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden\",\n \"group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2\",\n \"group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group\"\n className={cn(\n \"*:data-[slot=avatar]:ring-background group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroupCount({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group-count\"\n className={cn(\"bg-muted text-muted-foreground size-8 rounded-full text-sm group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3 ring-background relative flex shrink-0 items-center justify-center ring-2\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarBadge,\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst badgeVariants = cva(\n \"h-5 gap-1 rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium transition-all has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&>svg]:size-3! inline-flex items-center justify-center w-fit whitespace-nowrap shrink-0 [&>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 overflow-hidden group/badge\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n secondary: \"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80\",\n destructive: \"bg-destructive/10 [a]:hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 text-destructive dark:bg-destructive/20\",\n outline: \"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground\",\n ghost: \"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n data-variant={variant}\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n","\"use client\";\n\nimport { Fragment } from \"react\";\nimport { usePathname } from \"next/navigation\";\nimport type { AppShellConfig } from \"../types\";\nimport { SidebarTrigger } from \"./ui/sidebar\";\nimport { Separator } from \"./ui/separator\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"./ui/breadcrumb\";\nimport { ThemeToggle } from \"./theme-toggle\";\n\ninterface AppHeaderProps {\n config: AppShellConfig;\n}\n\nexport function AppHeader({ config }: AppHeaderProps) {\n const pathname = usePathname();\n const segments = pathname.split(\"/\").filter(Boolean);\n const breadcrumbs = segments\n .map((seg) => config.routeLabels[seg])\n .filter(Boolean);\n\n return (\n <header className=\"flex h-14 shrink-0 items-center gap-2 border-b px-4\">\n <SidebarTrigger className=\"-ml-1\" />\n <Separator orientation=\"vertical\" className=\"mr-2 !h-4\" />\n\n <Breadcrumb className=\"flex-1\">\n <BreadcrumbList>\n {breadcrumbs.length > 0 ? (\n breadcrumbs.map((label, i) => (\n <Fragment key={i}>\n {i > 0 && <BreadcrumbSeparator />}\n <BreadcrumbItem>\n <BreadcrumbPage>{label}</BreadcrumbPage>\n </BreadcrumbItem>\n </Fragment>\n ))\n ) : config.defaultBreadcrumb ? (\n <BreadcrumbItem>\n <BreadcrumbPage>{config.defaultBreadcrumb}</BreadcrumbPage>\n </BreadcrumbItem>\n ) : null}\n </BreadcrumbList>\n </Breadcrumb>\n\n <ThemeToggle />\n </header>\n );\n}\n","import * as React from \"react\"\nimport { Slot } from \"radix-ui\"\nimport { ChevronRight, MoreHorizontal } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Breadcrumb({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n aria-label=\"breadcrumb\"\n data-slot=\"breadcrumb\"\n className={cn(className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<\"ol\">) {\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n \"text-muted-foreground gap-1.5 text-sm sm:gap-2.5 flex flex-wrap items-center wrap-break-word\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\"gap-1.5 inline-flex items-center\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbLink({\n asChild,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"a\"\n\n return (\n <Comp\n data-slot=\"breadcrumb-link\"\n className={cn(\"hover:text-foreground transition-colors\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-page\"\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\"text-foreground font-normal\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"[&>svg]:size-3.5\", className)}\n {...props}\n >\n {children ?? (\n <ChevronRight />\n )}\n </li>\n )\n}\n\nfunction BreadcrumbEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-ellipsis\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\n \"size-5 [&>svg]:size-4 flex items-center justify-center\",\n className\n )}\n {...props}\n >\n <MoreHorizontal />\n <span className=\"sr-only\">More</span>\n </span>\n )\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n}\n","\"use client\";\n\nimport { useTheme } from \"next-themes\";\nimport { Sun, Moon } from \"lucide-react\";\nimport { Button } from \"./ui/button\";\nimport { useCallback, type MouseEvent } from \"react\";\n\nexport function ThemeToggle() {\n const { theme, setTheme } = useTheme();\n\n const toggleTheme = useCallback(\n (e: MouseEvent<HTMLButtonElement>) => {\n const nextTheme = theme === \"dark\" ? \"light\" : \"dark\";\n\n // Fallback for browsers without View Transitions API\n if (!(document as Document & { startViewTransition?: unknown }).startViewTransition) {\n setTheme(nextTheme);\n return;\n }\n\n // Set click coordinates as CSS custom properties for the reveal animation\n const x = e.clientX;\n const y = e.clientY;\n document.documentElement.style.setProperty(\"--theme-toggle-x\", `${x}px`);\n document.documentElement.style.setProperty(\"--theme-toggle-y\", `${y}px`);\n\n (document as Document & { startViewTransition: (cb: () => void) => void }).startViewTransition(() => {\n setTheme(nextTheme);\n });\n },\n [theme, setTheme]\n );\n\n return (\n <Button variant=\"ghost\" size=\"icon\" onClick={toggleTheme}>\n <Sun className=\"h-5 w-5 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0\" />\n <Moon className=\"absolute h-5 w-5 rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100\" />\n <span className=\"sr-only\">Alternar tema</span>\n </Button>\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport type { AppShellConfig } from \"../types\";\nimport { TooltipProvider } from \"./ui/tooltip\";\nimport { SidebarProvider, SidebarInset } from \"./ui/sidebar\";\nimport { AppSidebar } from \"./app-sidebar\";\nimport { AppHeader } from \"./app-header\";\n\ninterface AppShellProps {\n config: AppShellConfig;\n children: ReactNode;\n renderAbove?: ReactNode;\n}\n\nexport function AppShell({ config, children, renderAbove }: AppShellProps) {\n return (\n <>\n {renderAbove}\n <TooltipProvider>\n <SidebarProvider className=\"!h-svh !overflow-hidden\">\n <AppSidebar config={config} />\n <SidebarInset className=\"flex flex-col min-w-0 overflow-hidden\">\n <AppHeader config={config} />\n <main className=\"flex-1 overflow-auto\">\n {children}\n </main>\n </SidebarInset>\n </SidebarProvider>\n </TooltipProvider>\n </>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useRouter, useSearchParams } from \"next/navigation\";\nimport { Loader2, Mail, Lock, AlertCircle } from \"lucide-react\";\nimport type { LoginFormConfig } from \"../types\";\nimport { authClient } from \"../auth\";\nimport { Button } from \"./ui/button\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\nimport { Badge } from \"./ui/badge\";\nimport { cn } from \"../lib/utils\";\n\ninterface LoginFormProps {\n config: LoginFormConfig;\n}\n\nexport function LoginForm({ config }: LoginFormProps) {\n const router = useRouter();\n const searchParams = useSearchParams();\n const callbackUrl = searchParams.get(\"callbackUrl\") || config.callbackUrlDefault;\n\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (loading) return;\n setLoading(true);\n setError(\"\");\n\n try {\n const { data, error: signInError } = await authClient.signIn.email({\n email,\n password,\n callbackURL: callbackUrl,\n });\n\n if (signInError) {\n setError(signInError.message || \"Erro ao entrar\");\n setLoading(false);\n return;\n }\n\n if (config.onPostLoginSuccess) {\n const gauthToken = (data as Record<string, unknown>)?.user\n ? ((data as Record<string, unknown>).user as Record<string, unknown>)\n ?.gauthToken as string | undefined\n : undefined;\n const redirectUrl = await config.onPostLoginSuccess(data?.user, gauthToken);\n if (redirectUrl) {\n router.push(redirectUrl);\n return;\n }\n }\n\n router.push(callbackUrl);\n } catch {\n setError(\"Erro ao entrar\");\n setLoading(false);\n }\n };\n\n return (\n <div className=\"flex min-h-svh items-center justify-center bg-muted/30 p-4\">\n <div className=\"w-full max-w-[400px]\">\n {/* Header */}\n <div className=\"mb-8 text-center\">\n <div className=\"mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-xl bg-primary text-primary-foreground shadow-sm\">\n {config.icon}\n </div>\n <div className=\"flex items-center justify-center gap-2\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">\n {config.appName}\n </h1>\n {config.appBadge && (\n <Badge variant={config.appBadge.variant} className=\"text-xs\">\n {config.appBadge.text}\n </Badge>\n )}\n </div>\n <p className=\"mt-1.5 text-sm text-muted-foreground\">\n {config.description}\n </p>\n </div>\n\n {/* Form Card */}\n <div className=\"rounded-xl border bg-card p-6 shadow-sm\">\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n {error && (\n <div className=\"flex items-center gap-2 rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2.5 text-sm text-destructive\">\n <AlertCircle className=\"h-4 w-4 shrink-0\" />\n {error}\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"login-email\" className=\"text-sm font-medium\">\n Email\n </Label>\n <div className=\"relative\">\n <Mail className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n id=\"login-email\"\n type=\"email\"\n placeholder=\"email@exemplo.com\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n className=\"pl-9\"\n autoComplete=\"email\"\n required\n />\n </div>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"login-password\" className=\"text-sm font-medium\">\n Senha\n </Label>\n <div className=\"relative\">\n <Lock className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n id=\"login-password\"\n type=\"password\"\n placeholder=\"••••••••\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n className=\"pl-9\"\n autoComplete=\"current-password\"\n required\n />\n </div>\n </div>\n\n <Button\n type=\"submit\"\n className={cn(\"w-full\", loading && \"cursor-wait\")}\n disabled={loading}\n >\n {loading ? (\n <>\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n A entrar...\n </>\n ) : (\n \"Entrar\"\n )}\n </Button>\n </form>\n </div>\n\n {/* Footer */}\n <p className=\"mt-6 text-center text-xs text-muted-foreground\">\n {config.footerText || \"Acesso restrito a utilizadores autorizados\"}\n </p>\n </div>\n </div>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Label as LabelPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"gap-2 text-sm leading-none font-medium group-data-[disabled=true]:opacity-50 peer-disabled:opacity-50 flex items-center select-none group-data-[disabled=true]:pointer-events-none peer-disabled:cursor-not-allowed\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n"],"mappings":";AAEA,SAAS,wBAAwB;AAE1B,IAAM,aAAa,iBAAiB;AACpC,IAAM,EAAE,YAAY,QAAQ,QAAQ,QAAQ,IAAI;;;ACLvD,SAAS,oBAAsC;AAOxC,SAAS,qBAAqB,QAA8B;AACjE,QAAM,EAAE,aAAa,uBAAuB,MAAM,IAAI;AAEtD,SAAO,SAAS,WAAW,SAAsB;AAC/C,UAAM,EAAE,UAAU,OAAO,IAAI,QAAQ;AAErC,QAAI,YAAY,KAAK,CAAC,SAAS,SAAS,WAAW,IAAI,CAAC,GAAG;AACzD,aAAO,aAAa,KAAK;AAAA,IAC3B;AAEA,UAAM,eACJ,QAAQ,QAAQ,IAAI,2BAA2B,GAAG,SAClD,QAAQ,QAAQ,IAAI,oCAAoC,GAAG;AAE7D,QAAI,CAAC,cAAc;AACjB,YAAM,cAAc,uBAChB,WAAW,SACX;AAEJ,YAAM,WAAW,IAAI,IAAI,UAAU,QAAQ,GAAG;AAC9C,eAAS,aAAa,IAAI,eAAe,WAAW;AACpD,aAAO,aAAa,SAAS,QAAQ;AAAA,IACvC;AAEA,WAAO,aAAa,KAAK;AAAA,EAC3B;AACF;AAEO,IAAM,uBAAuB;AAAA,EAClC,SAAS,CAAC,wDAAwD;AACpE;;;ACvBA,SAAS,iBAAiB,OAA+C;AACvE,MAAI;AACF,UAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,UAAM,UAAU,MAAM,CAAC;AACvB,UAAM,UAAU,KAAK,QAAQ,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG,CAAC;AAClE,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,cAAc,QAAwB;AACpD,SAAO,SAAS,UAAU;AACxB,UAAM,EAAE,MAAM,aAAa,WAAW,MAAM,IAAI,WAAW;AAE3D,UAAM,UAAU,aAAa,WAAW;AACxC,UAAM,OAAO,aAAa,QAAQ;AAElC,UAAM,aAAa;AACnB,UAAM,UAAU;AAGhB,UAAM,aAAc,YAAY,cAAc,SAAS,cAAc;AACrE,UAAM,YAAa,YAAY,aAAa,SAAS,aAAa;AAClE,UAAM,eAAgB,YAAY,gBAAgB,SAAS,gBAAgB;AAE3E,UAAM,SAAkC;AAAA,MACtC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,iBAAiB,CAAC,CAAC,WAAW,CAAC,CAAC;AAAA,MAChC,OAAO,SAAS;AAAA,IAClB;AAEA,QAAI,QAAQ,aAAa,YAAY;AACnC,YAAM,UAAU,iBAAiB,UAAU;AAC3C,UAAI,SAAS;AACX,mBAAW,CAAC,QAAQ,SAAS,KAAK,OAAO,QAAQ,OAAO,SAAS,GAAG;AAClE,iBAAO,SAAS,IAAI,QAAQ,MAAM,KAAK;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,mBAAmB;AAC7B,YAAM,eAAe,OAAO,kBAAkB,IAAsC;AACpF,UAAI,iBAAiB,MAAM;AACzB,eAAO,YAAY;AAAA,MACrB;AAAA,IACF;AAEA,QAAI,QAAQ,mBAAmB,MAAM;AACnC,iBAAW,SAAS,OAAO,iBAAiB;AAC1C,eAAO,KAAK,IAAK,KAAiC,KAAK,KAAK;AAAA,MAC9D;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;ACzEA,SAAS,WAAW,wBAAwB;;;ACH5C,SAAS,YAA6B;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ADOI,cA4BE,YA5BF;AALJ,SAAS,gBAAgB;AAAA,EACvB,gBAAgB;AAAA,EAChB,GAAG;AACL,GAA2D;AACzD,SACE;AAAA,IAAC,iBAAiB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,QAAQ;AAAA,EACf,GAAG;AACL,GAAuD;AACrD,SAAO,oBAAC,iBAAiB,MAAjB,EAAsB,aAAU,WAAW,GAAG,OAAO;AAC/D;AAEA,SAAS,eAAe;AAAA,EACtB,GAAG;AACL,GAA0D;AACxD,SAAO,oBAAC,iBAAiB,SAAjB,EAAyB,aAAU,mBAAmB,GAAG,OAAO;AAC1E;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,GAAG;AACL,GAA0D;AACxD,SACE,oBAAC,iBAAiB,QAAjB,EACC;AAAA,IAAC,iBAAiB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,QACD,oBAAC,iBAAiB,OAAjB,EAAuB,WAAU,sGAAqG;AAAA;AAAA;AAAA,EACzI,GACF;AAEJ;;;AEpDA,YAAY,WAAW;AACvB,SAAS,OAAAA,YAA8B;AACvC,SAAS,QAAAC,aAAY;AACrB,SAAS,iBAAiB;;;ACH1B,SAAS,WAAW,gBAAgB;AAEpC,IAAM,oBAAoB;AAEnB,SAAS,cAAc;AAC5B,QAAM,CAAC,UAAU,WAAW,IAAI,SAA8B,MAAS;AAEvE,YAAU,MAAM;AACd,UAAM,MAAM,OAAO,WAAW,eAAe,oBAAoB,CAAC,KAAK;AACvE,UAAM,WAAW,MAAM,YAAY,OAAO,aAAa,iBAAiB;AACxE,QAAI,iBAAiB,UAAU,QAAQ;AACvC,gBAAY,OAAO,aAAa,iBAAiB;AACjD,WAAO,MAAM,IAAI,oBAAoB,UAAU,QAAQ;AAAA,EACzD,GAAG,CAAC,CAAC;AAEL,SAAO,CAAC,CAAC;AACX;;;ACjBA,SAAS,WAA8B;AACvC,SAAS,YAAY;AA+CjB,gBAAAC,YAAA;AA3CJ,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,QACP,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,WAAW;AAAA,QACX,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,OAAO;AAAA,EACd;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,GAAG;AACL,GAGK;AACH,QAAM,OAAO,UAAU,KAAK,OAAO;AAEnC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,aAAW;AAAA,MACX,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC;AAAA,MACzD,GAAG;AAAA;AAAA,EACN;AAEJ;;;ACnDI,gBAAAC,YAAA;AAFJ,SAAS,MAAM,EAAE,WAAW,MAAM,GAAG,MAAM,GAAkC;AAC3E,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;;;ACbA,SAAS,aAAa,0BAA0B;AAW5C,gBAAAC,YAAA;AAPJ,SAAS,UAAU;AAAA,EACjB;AAAA,EACA,cAAc;AAAA,EACd,aAAa;AAAA,EACb,GAAG;AACL,GAAyD;AACvD,SACE,gBAAAA;AAAA,IAAC,mBAAmB;AAAA,IAAnB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;;;ACtBA,SAAS,UAAU,sBAAsB;AACzC,SAAS,SAAS;AAMT,gBAAAC,MAwDG,QAAAC,aAxDH;AADT,SAAS,MAAM,EAAE,GAAG,MAAM,GAAqD;AAC7E,SAAO,gBAAAD,KAAC,eAAe,MAAf,EAAoB,aAAU,SAAS,GAAG,OAAO;AAC3D;AAcA,SAAS,YAAY;AAAA,EACnB,GAAG;AACL,GAAuD;AACrD,SAAO,gBAAAE,KAAC,eAAe,QAAf,EAAsB,aAAU,gBAAgB,GAAG,OAAO;AACpE;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA,GAAG;AACL,GAAwD;AACtD,SACE,gBAAAA;AAAA,IAAC,eAAe;AAAA,IAAf;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,2OAA2O,SAAS;AAAA,MACjQ,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,GAAG;AACL,GAGG;AACD,SACE,gBAAAC,MAAC,eACC;AAAA,oBAAAD,KAAC,gBAAa;AAAA,IACd,gBAAAC;AAAA,MAAC,eAAe;AAAA,MAAf;AAAA,QACC,aAAU;AAAA,QACV,aAAW;AAAA,QACX,WAAW,GAAG,0mCAA0mC,SAAS;AAAA,QAChoC,GAAG;AAAA,QAEH;AAAA;AAAA,UACA,mBACC,gBAAAD,KAAC,eAAe,OAAf,EAAqB,aAAU,eAAc,SAAO,MACnD,0BAAAC,MAAC,UAAO,SAAQ,SAAQ,WAAU,0BAAyB,MAAK,WAC9D;AAAA,4BAAAD,KAAC,KAAE;AAAA,YACH,gBAAAA,KAAC,UAAK,WAAU,WAAU,mBAAK;AAAA,aACjC,GACF;AAAA;AAAA;AAAA,IAEJ;AAAA,KACF;AAEJ;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAgC;AACzE,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,6BAA6B,SAAS;AAAA,MACnD,GAAG;AAAA;AAAA,EACN;AAEJ;AAYA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA,GAAG;AACL,GAAsD;AACpD,SACE,gBAAAE;AAAA,IAAC,eAAe;AAAA,IAAf;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,+BAA+B,SAAS;AAAA,MACrD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA,GAAG;AACL,GAA4D;AAC1D,SACE,gBAAAA;AAAA,IAAC,eAAe;AAAA,IAAf;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,iCAAiC,SAAS;AAAA,MACvD,GAAG;AAAA;AAAA,EACN;AAEJ;;;ACnHI,gBAAAC,YAAA;;;AN2HE,gBAAAC,MAmEI,QAAAC,aAnEJ;AAvGN,IAAM,sBAAsB;AAC5B,IAAM,yBAAyB,KAAK,KAAK,KAAK;AAC9C,IAAM,gBAAgB;AACtB,IAAM,uBAAuB;AAC7B,IAAM,qBAAqB;AAC3B,IAAM,4BAA4B;AAYlC,IAAM,iBAAuB,oBAA0C,IAAI;AAE3E,SAAS,aAAa;AACpB,QAAM,UAAgB,iBAAW,cAAc;AAC/C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB;AAAA,EACvB,cAAc;AAAA,EACd,MAAM;AAAA,EACN,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAIG;AACD,QAAM,WAAW,YAAY;AAC7B,QAAM,CAAC,YAAY,aAAa,IAAU,eAAS,KAAK;AAIxD,QAAM,CAAC,OAAO,QAAQ,IAAU,eAAS,WAAW;AACpD,QAAM,OAAO,YAAY;AACzB,QAAM,UAAgB;AAAA,IACpB,CAAC,UAAmD;AAClD,YAAM,YAAY,OAAO,UAAU,aAAa,MAAM,IAAI,IAAI;AAC9D,UAAI,aAAa;AACf,oBAAY,SAAS;AAAA,MACvB,OAAO;AACL,iBAAS,SAAS;AAAA,MACpB;AAGA,eAAS,SAAS,GAAG,mBAAmB,IAAI,SAAS,qBAAqB,sBAAsB;AAAA,IAClG;AAAA,IACA,CAAC,aAAa,IAAI;AAAA,EACpB;AAGA,QAAM,gBAAsB,kBAAY,MAAM;AAC5C,WAAO,WAAW,cAAc,CAACC,UAAS,CAACA,KAAI,IAAI,QAAQ,CAACA,UAAS,CAACA,KAAI;AAAA,EAC5E,GAAG,CAAC,UAAU,SAAS,aAAa,CAAC;AAGrC,EAAM,gBAAU,MAAM;AACpB,UAAM,gBAAgB,CAAC,UAAyB;AAC9C,UACE,MAAM,QAAQ,8BACb,MAAM,WAAW,MAAM,UACxB;AACA,cAAM,eAAe;AACrB,sBAAc;AAAA,MAChB;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAClE,GAAG,CAAC,aAAa,CAAC;AAIlB,QAAM,QAAQ,OAAO,aAAa;AAElC,QAAM,eAAqB;AAAA,IACzB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,OAAO,MAAM,SAAS,UAAU,YAAY,eAAe,aAAa;AAAA,EAC3E;AAEA,SACE,gBAAAF,KAAC,eAAe,UAAf,EAAwB,OAAO,cAC9B,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,OACE;AAAA,QACE,mBAAmB;AAAA,QACnB,wBAAwB;AAAA,QACxB,GAAG;AAAA,MACL;AAAA,MAEF,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH,GACF;AAEJ;AAEA,SAAS,QAAQ;AAAA,EACf,OAAO;AAAA,EACP,UAAU;AAAA,EACV,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAIG;AACD,QAAM,EAAE,UAAU,OAAO,YAAY,cAAc,IAAI,WAAW;AAElE,MAAI,gBAAgB,QAAQ;AAC1B,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,aAAU;AAAA,QACV,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,EAEJ;AAEA,MAAI,UAAU;AACZ,WACE,gBAAAA,KAAC,SAAM,MAAM,YAAY,cAAc,eAAgB,GAAG,OACxD,0BAAAC;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,gBAAa;AAAA,QACb,aAAU;AAAA,QACV,eAAY;AAAA,QACZ,WAAU;AAAA,QACV,OACE;AAAA,UACE,mBAAmB;AAAA,QACrB;AAAA,QAEF;AAAA,QAEA;AAAA,0BAAAA,MAAC,eAAY,WAAU,WACrB;AAAA,4BAAAD,KAAC,cAAW,qBAAO;AAAA,YACnB,gBAAAA,KAAC,oBAAiB,0CAA4B;AAAA,aAChD;AAAA,UACA,gBAAAA,KAAC,SAAI,WAAU,+BAA+B,UAAS;AAAA;AAAA;AAAA,IACzD,GACF;AAAA,EAEJ;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,cAAY;AAAA,MACZ,oBAAkB,UAAU,cAAc,cAAc;AAAA,MACxD,gBAAc;AAAA,MACd,aAAW;AAAA,MACX,aAAU;AAAA,MAGV;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,aAAU;AAAA,YACV,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA,YAAY,cAAc,YAAY,UAClC,qFACA;AAAA,YACN;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,aAAU;AAAA,YACV,aAAW;AAAA,YACX,WAAW;AAAA,cACT;AAAA;AAAA,cAEA,YAAY,cAAc,YAAY,UAClC,6FACA;AAAA,cACJ;AAAA,YACF;AAAA,YACC,GAAG;AAAA,YAEJ,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,gBAAa;AAAA,gBACb,aAAU;AAAA,gBACV,WAAU;AAAA,gBAET;AAAA;AAAA,YACH;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAwC;AACtC,QAAM,EAAE,cAAc,IAAI,WAAW;AAErC,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,gBAAa;AAAA,MACb,aAAU;AAAA,MACV,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,WAAW,GAAG,SAAS;AAAA,MACvB,SAAS,CAAC,UAAU;AAClB,kBAAU,KAAK;AACf,sBAAc;AAAA,MAChB;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,wBAAAD,KAAC,aAAU;AAAA,QACX,gBAAAA,KAAC,UAAK,WAAU,WAAU,4BAAc;AAAA;AAAA;AAAA,EAC1C;AAEJ;AA2BA,SAAS,aAAa,EAAE,WAAW,GAAG,MAAM,GAAiC;AAC3E,SACE,gBAAAG;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAgBA,SAAS,cAAc,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC3E,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW,GAAG,2BAA2B,SAAS;AAAA,MACjD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC3E,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW,GAAG,2BAA2B,SAAS;AAAA,MACjD,GAAG;AAAA;AAAA,EACN;AAEJ;AAgBA,SAAS,eAAe,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC5E,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC1E,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACL,GAAwD;AACtD,QAAM,OAAO,UAAUC,MAAK,OAAO;AAEnC,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAsBA,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE,gBAAAE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW,GAAG,kBAAkB,SAAS;AAAA,MACxC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAA+B;AACxE,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW,GAAG,sCAAsC,SAAS;AAAA,MAC5D,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,gBAAgB,EAAE,WAAW,GAAG,MAAM,GAA+B;AAC5E,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,WAAW,GAAG,4BAA4B,SAAS;AAAA,MAClD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,IAAM,4BAA4BC;AAAA,EAChC;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB;AAAA,EACzB,UAAU;AAAA,EACV,WAAW;AAAA,EACX,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAIoD;AAClD,QAAM,OAAO,UAAUC,MAAK,OAAO;AACnC,QAAM,EAAE,UAAU,MAAM,IAAI,WAAW;AAEvC,QAAM,SACJ,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAa;AAAA,MACb,aAAW;AAAA,MACX,eAAa;AAAA,MACb,WAAW,GAAG,0BAA0B,EAAE,SAAS,KAAK,CAAC,GAAG,SAAS;AAAA,MACpE,GAAG;AAAA;AAAA,EACN;AAGF,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,YAAY,UAAU;AAC/B,cAAU;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,SACE,gBAAAG,MAAC,WACC;AAAA,oBAAAH,KAAC,kBAAe,SAAO,MAAE,kBAAO;AAAA,IAChC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,OAAM;AAAA,QACN,QAAQ,UAAU,eAAe;AAAA,QAChC,GAAG;AAAA;AAAA,IACN;AAAA,KACF;AAEJ;;;AOzhBA,SAAS,aAAa,iBAAiB;AACvC,OAAO,UAAU;AACjB,SAAS,WAAW,gBAAAI,eAAc,cAAc;;;ACDhD,SAAS,eAAe,4BAA4B;AAK3C,gBAAAC,YAAA;AAHT,SAAS,YAAY;AAAA,EACnB,GAAG;AACL,GAA2D;AACzD,SAAO,gBAAAA,KAAC,qBAAqB,MAArB,EAA0B,aAAU,eAAe,GAAG,OAAO;AACvE;AAEA,SAAS,mBAAmB;AAAA,EAC1B,GAAG;AACL,GAAyE;AACvE,SACE,gBAAAA;AAAA,IAAC,qBAAqB;AAAA,IAArB;AAAA,MACC,aAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,mBAAmB;AAAA,EAC1B,GAAG;AACL,GAAyE;AACvE,SACE,gBAAAA;AAAA,IAAC,qBAAqB;AAAA,IAArB;AAAA,MACC,aAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACN;AAEJ;;;AC5BA,SAAS,gBAAgB,6BAA6B;AACtD,SAAS,OAAO,oBAAoB;AAO3B,gBAAAC,MAkFL,QAAAC,aAlFK;AAHT,SAAS,aAAa;AAAA,EACpB,GAAG;AACL,GAA4D;AAC1D,SAAO,gBAAAD,KAAC,sBAAsB,MAAtB,EAA2B,aAAU,iBAAiB,GAAG,OAAO;AAC1E;AAUA,SAAS,oBAAoB;AAAA,EAC3B,GAAG;AACL,GAA+D;AAC7D,SACE,gBAAAE;AAAA,IAAC,sBAAsB;AAAA,IAAtB;AAAA,MACC,aAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,GAAG;AACL,GAA+D;AAC7D,SACE,gBAAAA,KAAC,sBAAsB,QAAtB,EACC,0BAAAA;AAAA,IAAC,sBAAsB;AAAA,IAAtB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,WAAW,GAAG,knBAAknB,SAAU;AAAA,MACzoB,GAAG;AAAA;AAAA,EACN,GACF;AAEJ;AAUA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACL,GAGG;AACD,SACE,gBAAAC;AAAA,IAAC,sBAAsB;AAAA,IAAtB;AAAA,MACC,aAAU;AAAA,MACV,cAAY;AAAA,MACZ,gBAAc;AAAA,MACd,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AA6EA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAEG;AACD,SACE,gBAAAC;AAAA,IAAC,sBAAsB;AAAA,IAAtB;AAAA,MACC,aAAU;AAAA,MACV,cAAY;AAAA,MACZ,WAAW,GAAG,yEAAyE,SAAS;AAAA,MAC/F,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA,GAAG;AACL,GAAiE;AAC/D,SACE,gBAAAA;AAAA,IAAC,sBAAsB;AAAA,IAAtB;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,6BAA6B,SAAS;AAAA,MACnD,GAAG;AAAA;AAAA,EACN;AAEJ;;;ACvLA,SAAS,UAAU,uBAAuB;AAYtC,gBAAAC,aAAA;AARJ,SAAS,OAAO;AAAA,EACd;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACL,GAEG;AACD,SACE,gBAAAA;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,aAAU;AAAA,MACV,aAAW;AAAA,MACX,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA,GAAG;AACL,GAAuD;AACrD,SACE,gBAAAA;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA,GAAG;AACL,GAA0D;AACxD,SACE,gBAAAA;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;;;ACxDA,SAAS,OAAAC,YAA8B;AACvC,SAAS,QAAAC,aAAY;AAiCjB,gBAAAC,aAAA;AA7BJ,IAAM,gBAAgBC;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,WAAW;AAAA,QACX,aAAa;AAAA,QACb,SAAS;AAAA,QACT,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,MAAM;AAAA,EACb;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV,GAAG;AACL,GAC8D;AAC5D,QAAM,OAAO,UAAUC,MAAK,OAAO;AAEnC,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS;AAAA,MAClD,GAAG;AAAA;AAAA,EACN;AAEJ;;;AJeQ,SACE,OAAAG,OADF,QAAAC,aAAA;AAjBR,SAAS,gBAAgB,MAAc,OAAuB;AAC5D,MAAI,CAAC,KAAM,QAAO,QAAQ,CAAC,GAAG,YAAY,KAAK;AAE/C,QAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,KAAK;AACrC,MAAI,MAAM,SAAS,GAAG;AACpB,YAAQ,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,MAAM,SAAS,CAAC,EAAE,CAAC,GAAG,YAAY;AAAA,EAChE;AACA,SAAO,MAAM,CAAC,EAAE,CAAC,EAAE,YAAY;AACjC;AAEA,SAAS,eAAe,EAAE,MAAM,SAAS,GAAyC;AAChF,QAAM,WAAW,SAAS,WAAW,KAAK,IAAI;AAC9C,QAAM,OAAO,KAAK;AAElB,SACE,gBAAAD,MAAC,mBACC,0BAAAA,MAAC,qBAAkB,SAAO,MAAC,UAAoB,SAAS,KAAK,OAC3D,0BAAAC,MAAC,QAAK,MAAM,KAAK,MAAM,SAAS,KAAK,SACnC;AAAA,oBAAAD,MAAC,QAAK,WAAU,UAAS;AAAA,IACzB,gBAAAA,MAAC,UAAM,eAAK,OAAM;AAAA,KACpB,GACF,GACF;AAEJ;AAEA,SAAS,oBAAoB,EAAE,MAAM,SAAS,GAAyC;AACrF,QAAM,OAAO,KAAK;AAClB,QAAM,gBAAgB,KAAK,UAAU,KAAK,CAAC,UAAU,SAAS,WAAW,MAAM,IAAI,CAAC,KAAK;AAEzF,SACE,gBAAAA,MAAC,eAAY,aAAa,eAAe,WAAU,qBACjD,0BAAAC,MAAC,mBACC;AAAA,oBAAAD,MAAC,sBAAmB,SAAO,MACzB,0BAAAC,MAAC,qBAAkB,SAAS,KAAK,OAC/B;AAAA,sBAAAD,MAAC,QAAK,WAAU,UAAS;AAAA,MACzB,gBAAAA,MAAC,UAAM,eAAK,OAAM;AAAA,MAClB,gBAAAA,MAACE,eAAA,EAAa,WAAU,2FAA0F;AAAA,OACpH,GACF;AAAA,IACA,gBAAAF,MAAC,sBACC,0BAAAA,MAAC,eAAY,WAAU,sBACpB,eAAK,UAAU,IAAI,CAAC,UACnB,gBAAAA,MAAC,kBAAgC,MAAM,OAAO,YAAzB,MAAM,IAAuC,CACnE,GACH,GACF;AAAA,KACF,GACF;AAEJ;AAEO,SAAS,WAAW,EAAE,OAAO,GAAoB;AACtD,QAAM,WAAW,YAAY;AAC7B,QAAM,SAAS,UAAU;AACzB,QAAM,EAAE,MAAM,QAAQ,IAAI,WAAW;AAErC,QAAM,eAAe,YAAY;AAC/B,WAAO,WAAW;AAClB,UAAM,QAAQ,EAAE,cAAc,EAAE,WAAW,MAAM,OAAO,KAAK,QAAQ,EAAE,EAAE,CAAC;AAAA,EAC5E;AAEA,QAAM,WAAW,SAAS,MAAM,QAAQ;AACxC,QAAM,YAAY,SAAS,MAAM,SAAS;AAC1C,QAAM,YAAY,SAAS,MAAM,SAAS;AAC1C,QAAM,WAAW,gBAAgB,UAAU,SAAS;AAEpD,SACE,gBAAAC,MAAC,WACC;AAAA,oBAAAD,MAAC,iBACC,0BAAAA,MAAC,eACC,0BAAAA,MAAC,mBACC,0BAAAA,MAAC,qBAAkB,MAAK,MAAK,SAAO,MAClC,0BAAAC,MAAC,SAAI,WAAU,2BACZ;AAAA,aAAO;AAAA,MACR,gBAAAD,MAAC,UAAK,WAAU,iBAAiB,iBAAO,SAAQ;AAAA,MAC/C,OAAO,YACN,gBAAAA,MAAC,SAAM,SAAQ,eAAe,iBAAO,UAAS;AAAA,OAElD,GACF,GACF,GACF,GACF;AAAA,IAEA,gBAAAA,MAAC,kBACE,iBAAO,WAAW,IAAI,CAAC,UACtB,gBAAAC,MAAC,gBACC;AAAA,sBAAAD,MAAC,qBAAmB,gBAAM,OAAM;AAAA,MAChC,gBAAAA,MAAC,uBACC,0BAAAA,MAAC,eACE,gBAAM,MAAM;AAAA,QAAI,CAAC,SAChB,KAAK,YAAY,KAAK,SAAS,SAAS,IACtC,gBAAAA,MAAC,uBAAoC,MAAY,YAAvB,KAAK,IAAsC,IAErE,gBAAAA,MAAC,kBAA+B,MAAY,YAAvB,KAAK,IAAsC;AAAA,MAEpE,GACF,GACF;AAAA,SAZiB,MAAM,KAazB,CACD,GACH;AAAA,IAEA,gBAAAA,MAAC,iBACC,0BAAAA,MAAC,eACC,0BAAAA,MAAC,mBACC,0BAAAC,MAAC,gBACC;AAAA,sBAAAD,MAAC,uBAAoB,SAAO,MAC1B,0BAAAC,MAAC,qBAAkB,MAAK,MACtB;AAAA,wBAAAA,MAAC,UAAO,WAAU,UACf;AAAA,uBAAa,gBAAAD,MAAC,eAAY,KAAK,WAAW,KAAK,UAAU;AAAA,UAC1D,gBAAAA,MAAC,kBAAgB,oBAAS;AAAA,WAC5B;AAAA,QACA,gBAAAC,MAAC,SAAI,WAAU,+CACb;AAAA,0BAAAD,MAAC,UAAK,WAAU,0BAA0B,oBAAS;AAAA,UACnD,gBAAAA,MAAC,UAAK,WAAU,0CAA0C,qBAAU;AAAA,WACtE;AAAA,QACA,gBAAAA,MAAC,aAAU,WAAU,kBAAiB;AAAA,SACxC,GACF;AAAA,MACA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,OAAM;AAAA,UACN,YAAY;AAAA,UAEZ;AAAA,4BAAAD,MAAC,qBAAkB,WAAU,eAC3B,0BAAAC,MAAC,SAAI,WAAU,2BACb;AAAA,8BAAAD,MAAC,OAAE,WAAU,oCAAoC,oBAAS;AAAA,cAC1D,gBAAAA,MAAC,OAAE,WAAU,8CAA8C,qBAAU;AAAA,eACvE,GACF;AAAA,YACA,gBAAAA,MAAC,yBAAsB;AAAA,YACtB,OAAO;AAAA,YACR,gBAAAC,MAAC,oBAAiB,SAAS,cACzB;AAAA,8BAAAD,MAAC,UAAO,WAAU,UAAS;AAAA,cAAE;AAAA,eAE/B;AAAA;AAAA;AAAA,MACF;AAAA,OACF,GACF,GACF,GACF;AAAA,KACF;AAEJ;;;AKxLA,SAAS,gBAAgB;AACzB,SAAS,eAAAG,oBAAmB;;;ACF5B,SAAS,QAAAC,aAAY;AACrB,SAAS,gBAAAC,eAAc,sBAAsB;AAMzC,gBAAAC,OAwFA,QAAAC,aAxFA;AAFJ,SAAS,WAAW,EAAE,WAAW,GAAG,MAAM,GAAgC;AACxE,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,cAAW;AAAA,MACX,aAAU;AAAA,MACV,WAAW,GAAG,SAAS;AAAA,MACtB,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,eAAe,EAAE,WAAW,GAAG,MAAM,GAA+B;AAC3E,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,eAAe,EAAE,WAAW,GAAG,MAAM,GAA+B;AAC3E,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,oCAAoC,SAAS;AAAA,MAC1D,GAAG;AAAA;AAAA,EACN;AAEJ;AAoBA,SAAS,eAAe,EAAE,WAAW,GAAG,MAAM,GAAiC;AAC7E,SACE,gBAAAE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,MAAK;AAAA,MACL,iBAAc;AAAA,MACd,gBAAa;AAAA,MACb,WAAW,GAAG,+BAA+B,SAAS;AAAA,MACrD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA+B;AAC7B,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,MAAK;AAAA,MACL,eAAY;AAAA,MACZ,WAAW,GAAG,oBAAoB,SAAS;AAAA,MAC1C,GAAG;AAAA,MAEH,sBACC,gBAAAA,MAACC,eAAA,EAAa;AAAA;AAAA,EAElB;AAEJ;;;ACvFA,SAAS,gBAAgB;AACzB,SAAS,KAAK,YAAY;AAE1B,SAAS,eAAAC,oBAAoC;AA6BzC,SACE,OAAAC,OADF,QAAAC,aAAA;AA3BG,SAAS,cAAc;AAC5B,QAAM,EAAE,OAAO,SAAS,IAAI,SAAS;AAErC,QAAM,cAAcF;AAAA,IAClB,CAAC,MAAqC;AACpC,YAAM,YAAY,UAAU,SAAS,UAAU;AAG/C,UAAI,CAAE,SAA0D,qBAAqB;AACnF,iBAAS,SAAS;AAClB;AAAA,MACF;AAGA,YAAM,IAAI,EAAE;AACZ,YAAM,IAAI,EAAE;AACZ,eAAS,gBAAgB,MAAM,YAAY,oBAAoB,GAAG,CAAC,IAAI;AACvE,eAAS,gBAAgB,MAAM,YAAY,oBAAoB,GAAG,CAAC,IAAI;AAEvE,MAAC,SAA0E,oBAAoB,MAAM;AACnG,iBAAS,SAAS;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,IACA,CAAC,OAAO,QAAQ;AAAA,EAClB;AAEA,SACE,gBAAAE,MAAC,UAAO,SAAQ,SAAQ,MAAK,QAAO,SAAS,aAC3C;AAAA,oBAAAD,MAAC,OAAI,WAAU,0EAAyE;AAAA,IACxF,gBAAAA,MAAC,QAAK,WAAU,kFAAiF;AAAA,IACjG,gBAAAA,MAAC,UAAK,WAAU,WAAU,2BAAa;AAAA,KACzC;AAEJ;;;AFXM,gBAAAE,OAOQ,QAAAC,aAPR;AATC,SAAS,UAAU,EAAE,OAAO,GAAmB;AACpD,QAAM,WAAWC,aAAY;AAC7B,QAAM,WAAW,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AACnD,QAAM,cAAc,SACjB,IAAI,CAAC,QAAQ,OAAO,YAAY,GAAG,CAAC,EACpC,OAAO,OAAO;AAEjB,SACE,gBAAAD,MAAC,YAAO,WAAU,uDAChB;AAAA,oBAAAD,MAAC,kBAAe,WAAU,SAAQ;AAAA,IAClC,gBAAAA,MAAC,aAAU,aAAY,YAAW,WAAU,aAAY;AAAA,IAExD,gBAAAA,MAAC,cAAW,WAAU,UACpB,0BAAAA,MAAC,kBACE,sBAAY,SAAS,IACpB,YAAY,IAAI,CAAC,OAAO,MACtB,gBAAAC,MAAC,YACE;AAAA,UAAI,KAAK,gBAAAD,MAAC,uBAAoB;AAAA,MAC/B,gBAAAA,MAAC,kBACC,0BAAAA,MAAC,kBAAgB,iBAAM,GACzB;AAAA,SAJa,CAKf,CACD,IACC,OAAO,oBACT,gBAAAA,MAAC,kBACC,0BAAAA,MAAC,kBAAgB,iBAAO,mBAAkB,GAC5C,IACE,MACN,GACF;AAAA,IAEA,gBAAAA,MAAC,eAAY;AAAA,KACf;AAEJ;;;AGrCI,qBAAAG,WAIM,OAAAC,OACA,QAAAC,aALN;AAFG,SAAS,SAAS,EAAE,QAAQ,UAAU,YAAY,GAAkB;AACzE,SACE,gBAAAA,MAAAF,WAAA,EACG;AAAA;AAAA,IACD,gBAAAC,MAAC,mBACC,0BAAAC,MAAC,mBAAgB,WAAU,2BACzB;AAAA,sBAAAD,MAAC,cAAW,QAAgB;AAAA,MAC5B,gBAAAC,MAAC,gBAAa,WAAU,yCACtB;AAAA,wBAAAD,MAAC,aAAU,QAAgB;AAAA,QAC3B,gBAAAA,MAAC,UAAK,WAAU,wBACb,UACH;AAAA,SACF;AAAA,OACF,GACF;AAAA,KACF;AAEJ;;;AC9BA,SAAS,YAAAE,iBAAgB;AACzB,SAAS,aAAAC,YAAW,uBAAuB;AAC3C,SAAS,SAAS,MAAM,MAAM,mBAAmB;;;ACDjD,SAAS,SAAS,sBAAsB;AASpC,gBAAAC,aAAA;AALJ,SAAS,MAAM;AAAA,EACb;AAAA,EACA,GAAG;AACL,GAAqD;AACnD,SACE,gBAAAA;AAAA,IAAC,eAAe;AAAA,IAAf;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;;;ADiDU,SAwEM,YAAAC,WAxEN,OAAAC,OAGA,QAAAC,cAHA;AArDH,SAAS,UAAU,EAAE,OAAO,GAAmB;AACpD,QAAM,SAASC,WAAU;AACzB,QAAM,eAAe,gBAAgB;AACrC,QAAM,cAAc,aAAa,IAAI,aAAa,KAAK,OAAO;AAE9D,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAS,EAAE;AACrC,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,EAAE;AAC3C,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AAErC,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,QAAI,QAAS;AACb,eAAW,IAAI;AACf,aAAS,EAAE;AAEX,QAAI;AACF,YAAM,EAAE,MAAM,OAAO,YAAY,IAAI,MAAM,WAAW,OAAO,MAAM;AAAA,QACjE;AAAA,QACA;AAAA,QACA,aAAa;AAAA,MACf,CAAC;AAED,UAAI,aAAa;AACf,iBAAS,YAAY,WAAW,gBAAgB;AAChD,mBAAW,KAAK;AAChB;AAAA,MACF;AAEA,UAAI,OAAO,oBAAoB;AAC7B,cAAM,aAAc,MAAkC,OAChD,KAAiC,MAC/B,aACJ;AACJ,cAAM,cAAc,MAAM,OAAO,mBAAmB,MAAM,MAAM,UAAU;AAC1E,YAAI,aAAa;AACf,iBAAO,KAAK,WAAW;AACvB;AAAA,QACF;AAAA,MACF;AAEA,aAAO,KAAK,WAAW;AAAA,IACzB,QAAQ;AACN,eAAS,gBAAgB;AACzB,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,SACE,gBAAAH,MAAC,SAAI,WAAU,8DACb,0BAAAC,OAAC,SAAI,WAAU,wBAEb;AAAA,oBAAAA,OAAC,SAAI,WAAU,oBACb;AAAA,sBAAAD,MAAC,SAAI,WAAU,mHACZ,iBAAO,MACV;AAAA,MACA,gBAAAC,OAAC,SAAI,WAAU,0CACb;AAAA,wBAAAD,MAAC,QAAG,WAAU,yCACX,iBAAO,SACV;AAAA,QACC,OAAO,YACN,gBAAAA,MAAC,SAAM,SAAS,OAAO,SAAS,SAAS,WAAU,WAChD,iBAAO,SAAS,MACnB;AAAA,SAEJ;AAAA,MACA,gBAAAA,MAAC,OAAE,WAAU,wCACV,iBAAO,aACV;AAAA,OACF;AAAA,IAGA,gBAAAA,MAAC,SAAI,WAAU,2CACb,0BAAAC,OAAC,UAAK,UAAU,cAAc,WAAU,aACrC;AAAA,eACC,gBAAAA,OAAC,SAAI,WAAU,yHACb;AAAA,wBAAAD,MAAC,eAAY,WAAU,oBAAmB;AAAA,QACzC;AAAA,SACH;AAAA,MAGF,gBAAAC,OAAC,SAAI,WAAU,eACb;AAAA,wBAAAD,MAAC,SAAM,SAAQ,eAAc,WAAU,uBAAsB,mBAE7D;AAAA,QACA,gBAAAC,OAAC,SAAI,WAAU,YACb;AAAA,0BAAAD,MAAC,QAAK,WAAU,8FAA6F;AAAA,UAC7G,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAK;AAAA,cACL,aAAY;AAAA,cACZ,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,cACxC,WAAU;AAAA,cACV,cAAa;AAAA,cACb,UAAQ;AAAA;AAAA,UACV;AAAA,WACF;AAAA,SACF;AAAA,MAEA,gBAAAC,OAAC,SAAI,WAAU,eACb;AAAA,wBAAAD,MAAC,SAAM,SAAQ,kBAAiB,WAAU,uBAAsB,mBAEhE;AAAA,QACA,gBAAAC,OAAC,SAAI,WAAU,YACb;AAAA,0BAAAD,MAAC,QAAK,WAAU,8FAA6F;AAAA,UAC7G,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAK;AAAA,cACL,aAAY;AAAA,cACZ,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,cAC3C,WAAU;AAAA,cACV,cAAa;AAAA,cACb,UAAQ;AAAA;AAAA,UACV;AAAA,WACF;AAAA,SACF;AAAA,MAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW,GAAG,UAAU,WAAW,aAAa;AAAA,UAChD,UAAU;AAAA,UAET,oBACC,gBAAAC,OAAAF,WAAA,EACE;AAAA,4BAAAC,MAAC,WAAQ,WAAU,wBAAuB;AAAA,YAAE;AAAA,aAE9C,IAEA;AAAA;AAAA,MAEJ;AAAA,OACF,GACF;AAAA,IAGA,gBAAAA,MAAC,OAAE,WAAU,kDACV,iBAAO,cAAc,8CACxB;AAAA,KACF,GACF;AAEJ;","names":["cva","Slot","jsx","jsx","jsx","jsx","jsxs","jsx","jsxs","jsx","jsx","jsx","jsxs","open","jsx","jsx","jsx","Slot","jsx","cva","Slot","jsxs","ChevronRight","jsx","jsx","jsxs","jsx","jsx","jsx","jsx","cva","Slot","jsx","cva","Slot","jsx","jsxs","ChevronRight","usePathname","Slot","ChevronRight","jsx","jsxs","jsx","ChevronRight","useCallback","jsx","jsxs","jsx","jsxs","usePathname","Fragment","jsx","jsxs","useState","useRouter","jsx","Fragment","jsx","jsxs","useRouter","useState"]}
1
+ {"version":3,"sources":["../src/auth/auth-client.ts","../src/auth/middleware.ts","../src/hooks/use-auth.ts","../src/components/ui/tooltip.tsx","../src/lib/utils.ts","../src/components/ui/sidebar.tsx","../src/hooks/use-mobile.ts","../src/components/ui/button.tsx","../src/components/ui/input.tsx","../src/components/ui/separator.tsx","../src/components/ui/sheet.tsx","../src/components/ui/skeleton.tsx","../src/components/app-sidebar.tsx","../src/components/ui/collapsible.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/avatar.tsx","../src/components/ui/badge.tsx","../src/components/app-header.tsx","../src/components/ui/breadcrumb.tsx","../src/components/theme-toggle.tsx","../src/components/app-shell.tsx","../src/components/login-form.tsx","../src/components/ui/label.tsx","../src/components/entity-avatar.tsx","../src/components/image-crop-upload.tsx","../src/components/ui/dialog.tsx","../src/components/ui/slider.tsx","../src/lib/image-utils.ts","../src/hooks/use-users.ts","../src/components/users/users-page.tsx","../src/components/users/user-form-dialog.tsx","../src/components/ui/select.tsx","../src/components/users/user-profile-badge.tsx","../src/components/users/data-table.tsx","../src/components/ui/table.tsx","../src/components/ui/alert-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { createAuthClient } from \"better-auth/react\";\n\nexport const authClient = createAuthClient();\nexport const { useSession, signIn, signUp, signOut } = authClient;\n","import { NextResponse, type NextRequest } from \"next/server\";\n\nexport interface AuthMiddlewareConfig {\n publicPaths: string[];\n preserveSearchParams?: boolean;\n}\n\nexport function createAuthMiddleware(config: AuthMiddlewareConfig) {\n const { publicPaths, preserveSearchParams = false } = config;\n\n return function middleware(request: NextRequest) {\n const { pathname, search } = request.nextUrl;\n\n if (publicPaths.some((path) => pathname.startsWith(path))) {\n return NextResponse.next();\n }\n\n const sessionToken =\n request.cookies.get(\"better-auth.session_token\")?.value ||\n request.cookies.get(\"__Secure-better-auth.session_token\")?.value;\n\n if (!sessionToken) {\n const callbackUrl = preserveSearchParams\n ? pathname + search\n : pathname;\n\n const loginUrl = new URL(\"/login\", request.url);\n loginUrl.searchParams.set(\"callbackUrl\", callbackUrl);\n return NextResponse.redirect(loginUrl);\n }\n\n return NextResponse.next();\n };\n}\n\nexport const authMiddlewareConfig = {\n matcher: [\"/((?!_next/static|_next/image|favicon.ico|api/auth).*)\"],\n};\n","\"use client\";\n\nimport { useSession } from \"../auth/auth-client\";\n\ninterface JwtClaimsConfig {\n [jwtClaimName: string]: string;\n}\n\ninterface UseAuthConfig {\n jwtClaims?: JwtClaimsConfig;\n accountIdOverride?: (user: Record<string, unknown> | null) => string | null;\n extraUserFields?: string[];\n}\n\nfunction decodeJwtPayload(token: string): Record<string, unknown> | null {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) return null;\n const payload = parts[1];\n const decoded = atob(payload.replace(/-/g, \"+\").replace(/_/g, \"/\"));\n return JSON.parse(decoded);\n } catch {\n return null;\n }\n}\n\nexport function createUseAuth(config?: UseAuthConfig) {\n return function useAuth() {\n const { data: sessionData, isPending, error } = useSession();\n\n const session = sessionData?.session ?? null;\n const user = sessionData?.user ?? null;\n\n const sessionObj = session as Record<string, unknown> | null;\n const userObj = user as Record<string, unknown> | null;\n\n // Read from session first (per-login, isolated per app), fallback to user record (backward compat)\n const gauthToken = (sessionObj?.gauthToken ?? userObj?.gauthToken ?? null) as string | null;\n const idAccount = (sessionObj?.idAccount ?? userObj?.idAccount ?? null) as string | null;\n const gauthProfile = (sessionObj?.gauthProfile ?? userObj?.gauthProfile ?? null) as Record<string, unknown> | null;\n\n const result: Record<string, unknown> = {\n session,\n user,\n gauthToken,\n idAccount,\n gauthProfile,\n isLoading: isPending,\n isAuthenticated: !!session && !!user,\n error: error ?? null,\n };\n\n if (config?.jwtClaims && gauthToken) {\n const payload = decodeJwtPayload(gauthToken);\n if (payload) {\n for (const [jwtKey, fieldName] of Object.entries(config.jwtClaims)) {\n result[fieldName] = payload[jwtKey] ?? null;\n }\n }\n }\n\n if (config?.accountIdOverride) {\n const overriddenId = config.accountIdOverride(user as Record<string, unknown> | null);\n if (overriddenId !== null) {\n result.idAccount = overriddenId;\n }\n }\n\n if (config?.extraUserFields && user) {\n for (const field of config.extraUserFields) {\n result[field] = (user as Record<string, unknown>)[field] ?? null;\n }\n }\n\n return result;\n };\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\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 <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\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 \"data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-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 rounded-md px-3 py-1.5 text-xs bg-foreground text-background z-50 w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin)\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"size-2.5 rotate-45 rounded-[2px] bg-foreground fill-foreground z-50 translate-y-[calc(-50%_-_2px)]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\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","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\nimport { PanelLeft } from \"lucide-react\"\n\nimport { useIsMobile } from \"../../hooks/use-mobile\"\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Separator } from \"./separator\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"./sheet\"\nimport { Skeleton } from \"./skeleton\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"./tooltip\"\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open]\n )\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </SidebarContext.Provider>\n )\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n dir,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n dir={dir}\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n className=\"group peer text-sidebar-foreground hidden md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"transition-[width] duration-200 ease-linear relative w-(--sidebar-width) bg-transparent\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n data-side={side}\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex\",\n // Adjust the padding for floating and inset variants.\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"bg-sidebar group-data-[variant=floating]:ring-sidebar-border group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 flex size-full flex-col\"\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <PanelLeft />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2 relative flex w-full flex-1 flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"bg-background h-8 w-full shadow-none\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"gap-2 p-2 flex flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"gap-2 p-2 flex flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"bg-sidebar-border mx-2 w-auto\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"no-scrollbar gap-2 flex min-h-0 flex-1 flex-col overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\n \"p-2 relative flex w-full min-w-0 flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"div\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"text-sidebar-foreground/70 ring-sidebar-ring h-8 rounded-md px-2 text-xs font-medium transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 flex shrink-0 items-center outline-hidden [&>svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 w-5 rounded-md p-0 focus-visible:ring-2 [&>svg]:size-4 flex aspect-square items-center justify-center outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 md:after:hidden [&>svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"text-sm w-full\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"gap-1 flex w-full min-w-0 flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground gap-2 rounded-md p-2 text-left text-sm transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! focus-visible:ring-2 data-active:font-medium peer/menu-button flex w-full items-center overflow-hidden outline-hidden group/menu-button disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline: \"bg-background hover:bg-sidebar-accent hover:text-sidebar-accent-foreground shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot.Root : \"button\"\n const { isMobile, state } = useSidebar()\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n )\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n showOnHover?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 aspect-square w-5 rounded-md p-0 peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 focus-visible:ring-2 [&>svg]:size-4 flex items-center justify-center outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 md:after:hidden [&>svg]:shrink-0\",\n showOnHover &&\n \"peer-data-active/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 aria-expanded:opacity-100 md:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuBadge({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"text-sidebar-foreground peer-hover/menu-button:text-sidebar-accent-foreground peer-data-active/menu-button:text-sidebar-accent-foreground pointer-events-none absolute right-1 h-5 min-w-5 rounded-md px-1 text-xs font-medium peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 flex items-center justify-center tabular-nums select-none group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n}) {\n // Random width between 50 to 90%.\n const [width] = React.useState(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`\n })\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"h-8 gap-2 rounded-md px-2 flex items-center\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-md\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n )\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\"border-sidebar-border mx-3.5 translate-x-px gap-1 border-l px-2.5 py-0.5 group-data-[collapsible=icon]:hidden flex min-w-0 flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n size?: \"sm\" | \"md\"\n isActive?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"a\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground h-7 gap-2 rounded-md px-2 focus-visible:ring-2 data-[size=md]:text-sm data-[size=sm]:text-xs [&>svg]:size-4 flex min-w-0 -translate-x-px items-center overflow-hidden outline-hidden group-data-[collapsible=icon]:hidden disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = useState<boolean | undefined>(undefined);\n\n useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n const onChange = () => setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n mql.addEventListener(\"change\", onChange);\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n return () => mql.removeEventListener(\"change\", onChange);\n }, []);\n\n return !!isMobile;\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-md border border-transparent bg-clip-padding text-sm font-medium focus-visible:ring-3 aria-invalid:ring-3 [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline: \"border-border bg-background hover:bg-muted hover:text-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 aria-expanded:bg-muted aria-expanded:text-foreground shadow-xs\",\n secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost: \"hover:bg-muted hover:text-foreground dark:hover:bg-muted/50 aria-expanded:bg-muted aria-expanded:text-foreground\",\n destructive: \"bg-destructive/10 hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/20 text-destructive focus-visible:border-destructive/40 dark:hover:bg-destructive/30\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 gap-1.5 px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-[min(var(--radius-md),8px)] px-2 text-xs in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 gap-1 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5\",\n lg: \"h-10 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3\",\n icon: \"size-9\",\n \"icon-xs\": \"size-6 rounded-[min(var(--radius-md),8px)] in-data-[slot=button-group]:rounded-md [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md\",\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.Root : \"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\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"dark:bg-input/30 border-input focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 h-9 rounded-md border bg-transparent px-2.5 py-1 text-base shadow-xs transition-[color,box-shadow] file:h-7 file:text-sm file:font-medium focus-visible:ring-3 aria-invalid:ring-3 md:text-sm file:text-foreground placeholder:text-muted-foreground w-full min-w-0 outline-none file:inline-flex file:border-0 file:bg-transparent disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Separator as SeparatorPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"bg-border shrink-0 data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as SheetPrimitive } from \"radix-ui\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\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(\"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/10 duration-100 data-ending-style:opacity-0 data-starting-style:opacity-0 supports-backdrop-filter:backdrop-blur-xs fixed inset-0 z-50\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n data-side={side}\n className={cn(\"bg-background data-open:animate-in data-closed:animate-out data-[side=right]:data-closed:slide-out-to-right-10 data-[side=right]:data-open:slide-in-from-right-10 data-[side=left]:data-closed:slide-out-to-left-10 data-[side=left]:data-open:slide-in-from-left-10 data-[side=top]:data-closed:slide-out-to-top-10 data-[side=top]:data-open:slide-in-from-top-10 data-closed:fade-out-0 data-open:fade-in-0 data-[side=bottom]:data-closed:slide-out-to-bottom-10 data-[side=bottom]:data-open:slide-in-from-bottom-10 fixed z-50 flex flex-col gap-4 bg-clip-padding text-sm shadow-lg transition duration-200 ease-in-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm\", className)}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close data-slot=\"sheet-close\" asChild>\n <Button variant=\"ghost\" className=\"absolute top-4 right-4\" size=\"icon-sm\">\n <X />\n <span className=\"sr-only\">Close</span>\n </Button>\n </SheetPrimitive.Close>\n )}\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(\"gap-1.5 p-4 flex flex-col\", 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(\"gap-2 p-4 mt-auto flex flex-col\", 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-medium\", 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","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"bg-muted rounded-md animate-pulse\", className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n","\"use client\";\n\nimport { usePathname, useRouter } from \"next/navigation\";\nimport Link from \"next/link\";\nimport { ChevronUp, ChevronRight, LogOut } from \"lucide-react\";\nimport { useSession } from \"../auth\";\nimport type { AppShellConfig, MenuGroup, MenuItem } from \"../types\";\nimport { signOut } from \"../auth\";\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n} from \"./ui/sidebar\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"./ui/collapsible\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"./ui/dropdown-menu\";\nimport { Avatar, AvatarFallback, AvatarImage } from \"./ui/avatar\";\nimport { Badge } from \"./ui/badge\";\n\ninterface AppSidebarProps {\n config: AppShellConfig;\n}\n\nfunction getUserInitials(name: string, email: string): string {\n if (!name) return email?.[0]?.toUpperCase() || \"?\";\n\n const parts = name.trim().split(/\\s+/);\n if (parts.length > 1) {\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n return parts[0][0].toUpperCase();\n}\n\nfunction SimpleMenuItem({ item, pathname }: { item: MenuItem; pathname: string }) {\n const isActive = pathname.startsWith(item.href);\n const Icon = item.icon;\n\n return (\n <SidebarMenuItem>\n <SidebarMenuButton asChild isActive={isActive} tooltip={item.label}>\n <Link href={item.href} onClick={item.onClick}>\n <Icon className=\"size-4\" />\n <span>{item.label}</span>\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n );\n}\n\nfunction CollapsibleMenuItem({ item, pathname }: { item: MenuItem; pathname: string }) {\n const Icon = item.icon;\n const isChildActive = item.children?.some((child) => pathname.startsWith(child.href)) ?? false;\n\n return (\n <Collapsible defaultOpen={isChildActive} className=\"group/collapsible\">\n <SidebarMenuItem>\n <CollapsibleTrigger asChild>\n <SidebarMenuButton tooltip={item.label}>\n <Icon className=\"size-4\" />\n <span>{item.label}</span>\n <ChevronRight className=\"ml-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90\" />\n </SidebarMenuButton>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <SidebarMenu className=\"ml-4 border-l pl-2\">\n {item.children?.map((child) => (\n <SimpleMenuItem key={child.href} item={child} pathname={pathname} />\n ))}\n </SidebarMenu>\n </CollapsibleContent>\n </SidebarMenuItem>\n </Collapsible>\n );\n}\n\nexport function AppSidebar({ config }: AppSidebarProps) {\n const pathname = usePathname();\n const router = useRouter();\n const { data: session } = useSession();\n\n const handleLogout = async () => {\n config.onLogout?.();\n await signOut({ fetchOptions: { onSuccess: () => router.push(\"/login\") } });\n };\n\n const userName = session?.user?.name || \"\";\n const userEmail = session?.user?.email || \"\";\n const userImage = session?.user?.image || \"\";\n const initials = getUserInitials(userName, userEmail);\n\n return (\n <Sidebar>\n <SidebarHeader>\n <SidebarMenu>\n <SidebarMenuItem>\n <SidebarMenuButton size=\"lg\" asChild>\n <div className=\"flex items-center gap-2\">\n {config.appIcon}\n <span className=\"font-semibold\">{config.appName}</span>\n {config.appBadge && (\n <Badge variant=\"destructive\">{config.appBadge}</Badge>\n )}\n </div>\n </SidebarMenuButton>\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarHeader>\n\n <SidebarContent>\n {config.menuGroups.map((group: MenuGroup) => (\n <SidebarGroup key={group.label}>\n <SidebarGroupLabel>{group.label}</SidebarGroupLabel>\n <SidebarGroupContent>\n <SidebarMenu>\n {group.items.map((item: MenuItem) =>\n item.children && item.children.length > 0 ? (\n <CollapsibleMenuItem key={item.href} item={item} pathname={pathname} />\n ) : (\n <SimpleMenuItem key={item.href} item={item} pathname={pathname} />\n )\n )}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n ))}\n </SidebarContent>\n\n <SidebarFooter>\n <SidebarMenu>\n <SidebarMenuItem>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton size=\"lg\">\n <Avatar className=\"size-8\">\n {userImage && <AvatarImage src={userImage} alt={userName} />}\n <AvatarFallback>{initials}</AvatarFallback>\n </Avatar>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-semibold\">{userName}</span>\n <span className=\"truncate text-xs text-muted-foreground\">{userEmail}</span>\n </div>\n <ChevronUp className=\"ml-auto size-4\" />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className=\"w-(--radix-dropdown-menu-trigger-width) min-w-56\"\n side=\"top\"\n align=\"end\"\n sideOffset={4}\n >\n <DropdownMenuLabel className=\"font-normal\">\n <div className=\"flex flex-col space-y-1\">\n <p className=\"text-sm font-medium leading-none\">{userName}</p>\n <p className=\"text-xs leading-none text-muted-foreground\">{userEmail}</p>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {config.footerExtra}\n <DropdownMenuItem onClick={handleLogout}>\n <LogOut className=\"size-4\" />\n Sair\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarFooter>\n </Sidebar>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Collapsible as CollapsiblePrimitive } from \"radix-ui\"\n\nfunction Collapsible({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {\n return <CollapsiblePrimitive.Root data-slot=\"collapsible\" {...props} />\n}\n\nfunction CollapsibleTrigger({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {\n return (\n <CollapsiblePrimitive.CollapsibleTrigger\n data-slot=\"collapsible-trigger\"\n {...props}\n />\n )\n}\n\nfunction CollapsibleContent({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) {\n return (\n <CollapsiblePrimitive.CollapsibleContent\n data-slot=\"collapsible-content\"\n {...props}\n />\n )\n}\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\"\nimport { Check, ChevronRight } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n align = \"start\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n align={align}\n className={cn(\"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-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 ring-foreground/10 bg-popover text-popover-foreground min-w-32 rounded-md p-1 shadow-md ring-1 duration-100 z-50 max-h-(--radix-dropdown-menu-content-available-height) w-(--radix-dropdown-menu-trigger-width) origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto data-[state=closed]:overflow-hidden\", className )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:text-destructive not-data-[variant=destructive]:focus:**:text-accent-foreground gap-2 rounded-sm px-2 py-1.5 text-sm data-inset:pl-8 [&_svg:not([class*='size-'])]:size-4 group/dropdown-menu-item relative flex cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm data-inset:pl-8 [&_svg:not([class*='size-'])]:size-4 relative flex cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span\n className=\"absolute right-2 flex items-center justify-center pointer-events-none\"\n data-slot=\"dropdown-menu-checkbox-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <Check />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm data-inset:pl-8 [&_svg:not([class*='size-'])]:size-4 relative flex cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n {...props}\n >\n <span\n className=\"absolute right-2 flex items-center justify-center pointer-events-none\"\n data-slot=\"dropdown-menu-radio-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <Check />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\"text-muted-foreground px-2 py-1.5 text-xs font-medium data-inset:pl-8\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\"text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground ml-auto text-xs tracking-widest\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-open:bg-accent data-open:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground gap-2 rounded-sm px-2 py-1.5 text-sm data-inset:pl-8 [&_svg:not([class*='size-'])]:size-4 flex cursor-default items-center outline-hidden select-none [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-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 ring-foreground/10 bg-popover text-popover-foreground min-w-[96px] rounded-md p-1 shadow-lg ring-1 duration-100 z-50 origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden\", className )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Avatar as AvatarPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Avatar({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root> & {\n size?: \"default\" | \"sm\" | \"lg\"\n}) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n className={cn(\n \"size-8 rounded-full after:rounded-full data-[size=lg]:size-10 data-[size=sm]:size-6 after:border-border group/avatar relative flex shrink-0 select-none after:absolute after:inset-0 after:border after:mix-blend-darken dark:after:mix-blend-lighten\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\n \"rounded-full aspect-square size-full object-cover\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"bg-muted text-muted-foreground rounded-full flex size-full items-center justify-center text-sm group-data-[size=sm]/avatar:text-xs\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarBadge({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"avatar-badge\"\n className={cn(\n \"bg-primary text-primary-foreground ring-background absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-blend-color ring-2 select-none\",\n \"group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden\",\n \"group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2\",\n \"group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group\"\n className={cn(\n \"*:data-[slot=avatar]:ring-background group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroupCount({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group-count\"\n className={cn(\"bg-muted text-muted-foreground size-8 rounded-full text-sm group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3 ring-background relative flex shrink-0 items-center justify-center ring-2\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarBadge,\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst badgeVariants = cva(\n \"h-5 gap-1 rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium transition-all has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&>svg]:size-3! inline-flex items-center justify-center w-fit whitespace-nowrap shrink-0 [&>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 overflow-hidden group/badge\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n secondary: \"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80\",\n destructive: \"bg-destructive/10 [a]:hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 text-destructive dark:bg-destructive/20\",\n outline: \"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground\",\n ghost: \"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n data-variant={variant}\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n","\"use client\";\n\nimport { Fragment } from \"react\";\nimport { usePathname } from \"next/navigation\";\nimport type { AppShellConfig } from \"../types\";\nimport { SidebarTrigger } from \"./ui/sidebar\";\nimport { Separator } from \"./ui/separator\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"./ui/breadcrumb\";\nimport { ThemeToggle } from \"./theme-toggle\";\n\ninterface AppHeaderProps {\n config: AppShellConfig;\n}\n\nexport function AppHeader({ config }: AppHeaderProps) {\n const pathname = usePathname();\n const segments = pathname.split(\"/\").filter(Boolean);\n const breadcrumbs = segments\n .map((seg) => config.routeLabels[seg])\n .filter(Boolean);\n\n return (\n <header className=\"flex h-14 shrink-0 items-center gap-2 border-b px-4\">\n <SidebarTrigger className=\"-ml-1\" />\n <Separator orientation=\"vertical\" className=\"mr-2 !h-4\" />\n\n <Breadcrumb className=\"flex-1\">\n <BreadcrumbList>\n {breadcrumbs.length > 0 ? (\n breadcrumbs.map((label, i) => (\n <Fragment key={i}>\n {i > 0 && <BreadcrumbSeparator />}\n <BreadcrumbItem>\n <BreadcrumbPage>{label}</BreadcrumbPage>\n </BreadcrumbItem>\n </Fragment>\n ))\n ) : config.defaultBreadcrumb ? (\n <BreadcrumbItem>\n <BreadcrumbPage>{config.defaultBreadcrumb}</BreadcrumbPage>\n </BreadcrumbItem>\n ) : null}\n </BreadcrumbList>\n </Breadcrumb>\n\n <ThemeToggle />\n </header>\n );\n}\n","import * as React from \"react\"\nimport { Slot } from \"radix-ui\"\nimport { ChevronRight, MoreHorizontal } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Breadcrumb({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n aria-label=\"breadcrumb\"\n data-slot=\"breadcrumb\"\n className={cn(className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<\"ol\">) {\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n \"text-muted-foreground gap-1.5 text-sm sm:gap-2.5 flex flex-wrap items-center wrap-break-word\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\"gap-1.5 inline-flex items-center\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbLink({\n asChild,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"a\"\n\n return (\n <Comp\n data-slot=\"breadcrumb-link\"\n className={cn(\"hover:text-foreground transition-colors\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-page\"\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\"text-foreground font-normal\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"[&>svg]:size-3.5\", className)}\n {...props}\n >\n {children ?? (\n <ChevronRight />\n )}\n </li>\n )\n}\n\nfunction BreadcrumbEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-ellipsis\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\n \"size-5 [&>svg]:size-4 flex items-center justify-center\",\n className\n )}\n {...props}\n >\n <MoreHorizontal />\n <span className=\"sr-only\">More</span>\n </span>\n )\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n}\n","\"use client\";\n\nimport { useTheme } from \"next-themes\";\nimport { Sun, Moon } from \"lucide-react\";\nimport { Button } from \"./ui/button\";\nimport { useCallback, type MouseEvent } from \"react\";\n\nexport function ThemeToggle() {\n const { theme, setTheme } = useTheme();\n\n const toggleTheme = useCallback(\n (e: MouseEvent<HTMLButtonElement>) => {\n const nextTheme = theme === \"dark\" ? \"light\" : \"dark\";\n\n // Fallback for browsers without View Transitions API\n if (!(document as Document & { startViewTransition?: unknown }).startViewTransition) {\n setTheme(nextTheme);\n return;\n }\n\n // Set click coordinates as CSS custom properties for the reveal animation\n const x = e.clientX;\n const y = e.clientY;\n document.documentElement.style.setProperty(\"--theme-toggle-x\", `${x}px`);\n document.documentElement.style.setProperty(\"--theme-toggle-y\", `${y}px`);\n\n (document as Document & { startViewTransition: (cb: () => void) => void }).startViewTransition(() => {\n setTheme(nextTheme);\n });\n },\n [theme, setTheme]\n );\n\n return (\n <Button variant=\"ghost\" size=\"icon\" onClick={toggleTheme}>\n <Sun className=\"h-5 w-5 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0\" />\n <Moon className=\"absolute h-5 w-5 rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100\" />\n <span className=\"sr-only\">Alternar tema</span>\n </Button>\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport type { AppShellConfig } from \"../types\";\nimport { TooltipProvider } from \"./ui/tooltip\";\nimport { SidebarProvider, SidebarInset } from \"./ui/sidebar\";\nimport { AppSidebar } from \"./app-sidebar\";\nimport { AppHeader } from \"./app-header\";\n\ninterface AppShellProps {\n config: AppShellConfig;\n children: ReactNode;\n renderAbove?: ReactNode;\n}\n\nexport function AppShell({ config, children, renderAbove }: AppShellProps) {\n return (\n <>\n {renderAbove}\n <TooltipProvider>\n <SidebarProvider className=\"!h-svh !overflow-hidden\">\n <AppSidebar config={config} />\n <SidebarInset className=\"flex flex-col min-w-0 overflow-hidden\">\n <AppHeader config={config} />\n <main className=\"flex-1 overflow-auto\">\n {children}\n </main>\n </SidebarInset>\n </SidebarProvider>\n </TooltipProvider>\n </>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useRouter, useSearchParams } from \"next/navigation\";\nimport { Loader2, Mail, Lock, AlertCircle } from \"lucide-react\";\nimport type { LoginFormConfig } from \"../types\";\nimport { authClient } from \"../auth\";\nimport { Button } from \"./ui/button\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\nimport { Badge } from \"./ui/badge\";\nimport { cn } from \"../lib/utils\";\n\ninterface LoginFormProps {\n config: LoginFormConfig;\n}\n\nexport function LoginForm({ config }: LoginFormProps) {\n const router = useRouter();\n const searchParams = useSearchParams();\n const callbackUrl = searchParams.get(\"callbackUrl\") || config.callbackUrlDefault;\n\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (loading) return;\n setLoading(true);\n setError(\"\");\n\n try {\n const { data, error: signInError } = await authClient.signIn.email({\n email,\n password,\n callbackURL: callbackUrl,\n });\n\n if (signInError) {\n setError(signInError.message || \"Erro ao entrar\");\n setLoading(false);\n return;\n }\n\n if (config.onPostLoginSuccess) {\n const gauthToken = (data as Record<string, unknown>)?.user\n ? ((data as Record<string, unknown>).user as Record<string, unknown>)\n ?.gauthToken as string | undefined\n : undefined;\n const redirectUrl = await config.onPostLoginSuccess(data?.user, gauthToken);\n if (redirectUrl) {\n router.push(redirectUrl);\n return;\n }\n }\n\n router.push(callbackUrl);\n } catch {\n setError(\"Erro ao entrar\");\n setLoading(false);\n }\n };\n\n return (\n <div className=\"flex min-h-svh items-center justify-center bg-muted/30 p-4\">\n <div className=\"w-full max-w-[400px]\">\n {/* Header */}\n <div className=\"mb-8 text-center\">\n <div className=\"mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-xl bg-primary text-primary-foreground shadow-sm\">\n {config.icon}\n </div>\n <div className=\"flex items-center justify-center gap-2\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">\n {config.appName}\n </h1>\n {config.appBadge && (\n <Badge variant={config.appBadge.variant} className=\"text-xs\">\n {config.appBadge.text}\n </Badge>\n )}\n </div>\n <p className=\"mt-1.5 text-sm text-muted-foreground\">\n {config.description}\n </p>\n </div>\n\n {/* Form Card */}\n <div className=\"rounded-xl border bg-card p-6 shadow-sm\">\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n {error && (\n <div className=\"flex items-center gap-2 rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2.5 text-sm text-destructive\">\n <AlertCircle className=\"h-4 w-4 shrink-0\" />\n {error}\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"login-email\" className=\"text-sm font-medium\">\n Email\n </Label>\n <div className=\"relative\">\n <Mail className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n id=\"login-email\"\n type=\"email\"\n placeholder=\"email@exemplo.com\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n className=\"pl-9\"\n autoComplete=\"email\"\n required\n />\n </div>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"login-password\" className=\"text-sm font-medium\">\n Senha\n </Label>\n <div className=\"relative\">\n <Lock className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n id=\"login-password\"\n type=\"password\"\n placeholder=\"••••••••\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n className=\"pl-9\"\n autoComplete=\"current-password\"\n required\n />\n </div>\n </div>\n\n <Button\n type=\"submit\"\n className={cn(\"w-full\", loading && \"cursor-wait\")}\n disabled={loading}\n >\n {loading ? (\n <>\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n A entrar...\n </>\n ) : (\n \"Entrar\"\n )}\n </Button>\n </form>\n </div>\n\n {/* Footer */}\n <p className=\"mt-6 text-center text-xs text-muted-foreground\">\n {config.footerText || \"Acesso restrito a utilizadores autorizados\"}\n </p>\n </div>\n </div>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Label as LabelPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"gap-2 text-sm leading-none font-medium group-data-[disabled=true]:opacity-50 peer-disabled:opacity-50 flex items-center select-none group-data-[disabled=true]:pointer-events-none peer-disabled:cursor-not-allowed\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","\"use client\";\n\nimport { Avatar, AvatarFallback, AvatarImage } from \"./ui/avatar\";\nimport { cn } from \"../lib/utils\";\n\nconst COLORS = [\n \"bg-red-100 text-red-700 dark:bg-red-900 dark:text-red-300\",\n \"bg-orange-100 text-orange-700 dark:bg-orange-900 dark:text-orange-300\",\n \"bg-amber-100 text-amber-700 dark:bg-amber-900 dark:text-amber-300\",\n \"bg-emerald-100 text-emerald-700 dark:bg-emerald-900 dark:text-emerald-300\",\n \"bg-cyan-100 text-cyan-700 dark:bg-cyan-900 dark:text-cyan-300\",\n \"bg-blue-100 text-blue-700 dark:bg-blue-900 dark:text-blue-300\",\n \"bg-violet-100 text-violet-700 dark:bg-violet-900 dark:text-violet-300\",\n \"bg-pink-100 text-pink-700 dark:bg-pink-900 dark:text-pink-300\",\n];\n\nconst SIZE_MAP = {\n xs: \"h-5 w-5 text-[9px]\",\n sm: \"h-6 w-6 text-[10px]\",\n md: \"h-8 w-8 text-xs\",\n lg: \"h-10 w-10 text-sm\",\n xl: \"h-16 w-16 text-lg\",\n} as const;\n\nfunction hashCode(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n }\n return Math.abs(hash);\n}\n\nfunction getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n return (name[0] || \"?\").toUpperCase();\n}\n\nexport interface EntityAvatarProps {\n photo?: string | null;\n name: string | null;\n size?: keyof typeof SIZE_MAP;\n className?: string;\n}\n\nexport function EntityAvatar({\n photo,\n name,\n size = \"md\",\n className,\n}: EntityAvatarProps) {\n const displayName = name || \"?\";\n const color = COLORS[hashCode(displayName) % COLORS.length];\n const initials = getInitials(displayName);\n\n return (\n <Avatar className={cn(SIZE_MAP[size], className)}>\n {photo && (\n <AvatarImage\n src={photo}\n alt={displayName}\n className=\"object-cover\"\n />\n )}\n <AvatarFallback className={cn(\"font-medium\", color)}>\n {initials}\n </AvatarFallback>\n </Avatar>\n );\n}\n","\"use client\";\n\nimport { useCallback, useRef, useState } from \"react\";\nimport Cropper from \"react-easy-crop\";\nimport type { Area } from \"react-easy-crop\";\nimport { Button } from \"./ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"./ui/dialog\";\nimport { Slider } from \"./ui/slider\";\nimport { toast } from \"sonner\";\nimport { Camera, Trash2 } from \"lucide-react\";\nimport { EntityAvatar } from \"./entity-avatar\";\nimport {\n getCroppedImage,\n validateImageFile,\n fileToDataUrl,\n} from \"../lib/image-utils\";\n\nconst STORAGE_URL_MAP: Record<string, string> = {\n users: \"https://gauth-r2-storage.greatlabs.workers.dev\",\n agents: \"https://gagents-r2-storage.greatlabs.workers.dev\",\n contacts: \"https://gchat-r2-storage.greatlabs.workers.dev\",\n professionals: \"https://gclinic-r2-storage.greatlabs.workers.dev\",\n patients: \"https://gclinic-r2-storage.greatlabs.workers.dev\",\n clinics: \"https://gclinic-r2-storage.greatlabs.workers.dev\",\n};\n\nconst BUCKET_MAP: Record<string, string> = {\n users: \"gauth-r1-storage\",\n agents: \"gagents-r1-storage\",\n contacts: \"gchat-r1-storage\",\n professionals: \"gclinic-r1-storage\",\n patients: \"gclinic-r1-storage\",\n clinics: \"gclinic-r1-storage\",\n};\n\nconst DEFAULT_STORAGE_URL = \"https://gauth-r2-storage.greatlabs.workers.dev\";\nconst DEFAULT_BUCKET = \"gauth-r1-storage\";\n\nexport interface ImageCropUploadProps {\n value?: string | null;\n onChange: (url: string) => void;\n onRemove?: () => void;\n entityType: string;\n entityId?: number | string;\n idAccount: number;\n name?: string | null;\n disabled?: boolean;\n}\n\nexport function ImageCropUpload({\n value,\n onChange,\n onRemove,\n entityType,\n entityId,\n idAccount,\n name,\n disabled = false,\n}: ImageCropUploadProps) {\n const [imageSrc, setImageSrc] = useState<string | null>(null);\n const [crop, setCrop] = useState({ x: 0, y: 0 });\n const [zoom, setZoom] = useState(1);\n const [croppedArea, setCroppedArea] = useState<Area | null>(null);\n const [isOpen, setIsOpen] = useState(false);\n const [isUploading, setIsUploading] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const onCropComplete = useCallback((_: Area, croppedAreaPixels: Area) => {\n setCroppedArea(croppedAreaPixels);\n }, []);\n\n const handleFileSelect = useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n const error = validateImageFile(file);\n if (error) {\n toast.error(error);\n if (inputRef.current) inputRef.current.value = \"\";\n return;\n }\n\n const dataUrl = await fileToDataUrl(file);\n setImageSrc(dataUrl);\n setCrop({ x: 0, y: 0 });\n setZoom(1);\n setIsOpen(true);\n if (inputRef.current) inputRef.current.value = \"\";\n },\n [],\n );\n\n const handleConfirmCrop = useCallback(async () => {\n if (!imageSrc || !croppedArea) return;\n\n setIsUploading(true);\n\n try {\n const base64 = await getCroppedImage(imageSrc, croppedArea);\n const path = `${entityType}/${idAccount}/${entityId || \"temp\"}.webp`;\n const storageUrl = STORAGE_URL_MAP[entityType] || DEFAULT_STORAGE_URL;\n const bucket = BUCKET_MAP[entityType] || DEFAULT_BUCKET;\n\n const res = await fetch(storageUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ file: base64, bucket, path }),\n });\n\n const data = await res.json();\n\n if (data.status !== 1) {\n throw new Error(data.message || \"Erro ao enviar imagem\");\n }\n\n const publicUrl = `${storageUrl}/${path}?t=${Date.now()}`;\n onChange(publicUrl);\n toast.success(\"Imagem atualizada\");\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Erro ao enviar imagem\",\n );\n } finally {\n setIsUploading(false);\n setIsOpen(false);\n setImageSrc(null);\n }\n }, [imageSrc, croppedArea, entityType, entityId, idAccount, onChange]);\n\n const handleRemove = useCallback(async () => {\n if (!value) return;\n\n try {\n const path = `${entityType}/${idAccount}/${entityId || \"temp\"}.webp`;\n const storageUrl = STORAGE_URL_MAP[entityType] || DEFAULT_STORAGE_URL;\n const bucket = BUCKET_MAP[entityType] || DEFAULT_BUCKET;\n\n await fetch(storageUrl, {\n method: \"DELETE\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ bucket, path }),\n });\n\n onRemove?.();\n toast.success(\"Imagem removida\");\n } catch {\n toast.error(\"Erro ao remover imagem\");\n }\n }, [value, entityType, entityId, idAccount, onRemove]);\n\n return (\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"relative group\">\n <EntityAvatar photo={value} name={name ?? null} size=\"xl\" />\n {!disabled && (\n <button\n type=\"button\"\n onClick={() => inputRef.current?.click()}\n className=\"absolute inset-0 flex items-center justify-center rounded-full bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity cursor-pointer\"\n >\n <Camera className=\"h-5 w-5 text-white\" />\n </button>\n )}\n </div>\n\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/png,image/jpeg,image/webp\"\n onChange={handleFileSelect}\n className=\"hidden\"\n disabled={disabled}\n />\n\n {!disabled && value && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleRemove}\n className=\"text-destructive hover:text-destructive\"\n >\n <Trash2 className=\"h-4 w-4 mr-1\" />\n Remover\n </Button>\n )}\n\n <Dialog open={isOpen} onOpenChange={setIsOpen}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Recortar imagem</DialogTitle>\n </DialogHeader>\n\n <div className=\"relative w-full h-72 bg-muted rounded-md overflow-hidden\">\n {imageSrc && (\n <Cropper\n image={imageSrc}\n crop={crop}\n zoom={zoom}\n aspect={1}\n onCropChange={setCrop}\n onZoomChange={setZoom}\n onCropComplete={onCropComplete}\n cropShape=\"round\"\n showGrid={false}\n />\n )}\n </div>\n\n <div className=\"flex items-center gap-3 px-1\">\n <span className=\"text-sm text-muted-foreground whitespace-nowrap\">\n Zoom\n </span>\n <Slider\n value={[zoom]}\n onValueChange={(v: number[]) => setZoom(v[0])}\n min={1}\n max={3}\n step={0.1}\n className=\"flex-1\"\n />\n </div>\n\n <DialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => {\n setIsOpen(false);\n setImageSrc(null);\n }}\n disabled={isUploading}\n >\n Cancelar\n </Button>\n <Button\n onClick={handleConfirmCrop}\n disabled={isUploading || !croppedArea}\n >\n {isUploading ? \"Enviando...\" : \"Confirmar\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as DialogPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { X } from \"lucide-react\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs fixed inset-0 isolate z-50\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"bg-background data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 ring-foreground/10 grid max-w-[calc(100%-2rem)] gap-6 rounded-xl p-6 text-sm ring-1 duration-100 sm:max-w-md fixed top-1/2 left-1/2 z-50 w-full -translate-x-1/2 -translate-y-1/2 outline-none\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close data-slot=\"dialog-close\" asChild>\n <Button variant=\"ghost\" className=\"absolute top-4 right-4\" size=\"icon-sm\">\n <X />\n <span className=\"sr-only\">Close</span>\n </Button>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"gap-2 flex flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"leading-none font-medium\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-muted-foreground *:[a]:hover:text-foreground text-sm *:[a]:underline *:[a]:underline-offset-3\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Slider as SliderPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Slider({\n className,\n defaultValue,\n value,\n min = 0,\n max = 100,\n ...props\n}: React.ComponentProps<typeof SliderPrimitive.Root>) {\n const _values = React.useMemo(\n () =>\n Array.isArray(value)\n ? value\n : Array.isArray(defaultValue)\n ? defaultValue\n : [min, max],\n [value, defaultValue, min, max]\n )\n\n return (\n <SliderPrimitive.Root\n data-slot=\"slider\"\n defaultValue={defaultValue}\n value={value}\n min={min}\n max={max}\n className={cn(\n \"data-vertical:min-h-40 relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-vertical:h-full data-vertical:w-auto data-vertical:flex-col\",\n className\n )}\n {...props}\n >\n <SliderPrimitive.Track\n data-slot=\"slider-track\"\n className=\"bg-muted rounded-full data-horizontal:h-1.5 data-vertical:w-1.5 relative grow overflow-hidden data-horizontal:w-full data-vertical:h-full\"\n >\n <SliderPrimitive.Range\n data-slot=\"slider-range\"\n className=\"bg-primary absolute select-none data-horizontal:h-full data-vertical:w-full\"\n />\n </SliderPrimitive.Track>\n {Array.from({ length: _values.length }, (_, index) => (\n <SliderPrimitive.Thumb\n data-slot=\"slider-thumb\"\n key={index}\n className=\"border-primary ring-ring/50 size-4 rounded-full border bg-white shadow-sm transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden block shrink-0 select-none disabled:pointer-events-none disabled:opacity-50\"\n />\n ))}\n </SliderPrimitive.Root>\n )\n}\n\nexport { Slider }\n","import type { Area } from \"react-easy-crop\";\n\nexport async function getCroppedImage(\n imageSrc: string,\n cropArea: Area,\n outputSize = 400,\n quality = 0.85,\n): Promise<string> {\n const image = await loadImage(imageSrc);\n const canvas = document.createElement(\"canvas\");\n canvas.width = outputSize;\n canvas.height = outputSize;\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) throw new Error(\"Canvas context not available\");\n\n ctx.drawImage(\n image,\n cropArea.x,\n cropArea.y,\n cropArea.width,\n cropArea.height,\n 0,\n 0,\n outputSize,\n outputSize,\n );\n\n const blob = await new Promise<Blob>((resolve, reject) => {\n canvas.toBlob(\n (b) => (b ? resolve(b) : reject(new Error(\"Failed to create blob\"))),\n \"image/webp\",\n quality,\n );\n });\n\n return blobToBase64(blob);\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = \"anonymous\";\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = src;\n });\n}\n\nfunction blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result as string;\n resolve(result.split(\",\")[1]);\n };\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nconst ACCEPTED_TYPES = [\"image/png\", \"image/jpeg\", \"image/jpg\", \"image/webp\"];\nconst MAX_SIZE_BYTES = 5 * 1024 * 1024;\n\nexport function validateImageFile(file: File): string | null {\n if (!ACCEPTED_TYPES.includes(file.type)) {\n return \"Formato não suportado. Use PNG, JPG ou WEBP\";\n }\n if (file.size > MAX_SIZE_BYTES) {\n return \"Imagem muito grande. Máximo: 5MB\";\n }\n return null;\n}\n\nexport function fileToDataUrl(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n}\n","\"use client\";\n\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { GauthUser, GauthUserHookConfig, ApiResponse } from \"../types/users\";\n\nfunction buildUrl(config: GauthUserHookConfig, path: string): string {\n const lang = config.language || \"pt-br\";\n const idWl = config.idWl || \"1\";\n return `${config.gauthApiUrl}/v1/${lang}/${idWl}/accounts/${config.accountId}/${path}`;\n}\n\nasync function request<T>(url: string, token: string, options?: RequestInit): Promise<ApiResponse<T>> {\n const res = await fetch(url, {\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n ...options,\n });\n if (!res.ok) {\n let message = `HTTP ${res.status}`;\n try { const b = await res.json(); message = b.message || message; } catch {}\n throw new Error(message);\n }\n const json = await res.json();\n if (json.status === 0) throw new Error(json.message || \"Operação falhou\");\n return json;\n}\n\nexport function useUsers(config: GauthUserHookConfig, params?: Record<string, string>) {\n return useQuery({\n queryKey: [\"greatauth\", \"users\", config.accountId, params],\n queryFn: () => {\n const qs = params ? \"?\" + new URLSearchParams(params).toString() : \"\";\n return request<GauthUser[]>(buildUrl(config, `users${qs}`), config.token!);\n },\n enabled: !!config.token && !!config.accountId,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n\nexport function useCreateUser(config: GauthUserHookConfig) {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (data: { name: string; last_name?: string; email: string; password?: string; profile?: string; photo?: string | null }) =>\n request<GauthUser>(buildUrl(config, \"users\"), config.token!, {\n method: \"POST\",\n body: JSON.stringify(data),\n }),\n onSuccess: () => qc.invalidateQueries({ queryKey: [\"greatauth\", \"users\"] }),\n });\n}\n\nexport function useUpdateUser(config: GauthUserHookConfig) {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: ({ id, body }: { id: number; body: Record<string, unknown> }) =>\n request<GauthUser>(buildUrl(config, `users/${id}`), config.token!, {\n method: \"PUT\",\n body: JSON.stringify(body),\n }),\n onSuccess: () => qc.invalidateQueries({ queryKey: [\"greatauth\", \"users\"] }),\n });\n}\n\nexport function useDeleteUser(config: GauthUserHookConfig) {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (id: number) =>\n request<void>(buildUrl(config, `users/${id}`), config.token!, { method: \"DELETE\" }),\n onSuccess: () => qc.invalidateQueries({ queryKey: [\"greatauth\", \"users\"] }),\n });\n}\n\nexport function useResetPassword(config: GauthUserHookConfig) {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (id: number) =>\n request<{ message: string }>(buildUrl(config, `users/${id}/reset-password`), config.token!, { method: \"POST\" }),\n onSuccess: () => qc.invalidateQueries({ queryKey: [\"greatauth\", \"users\"] }),\n });\n}\n","\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport type { ColumnDef } from \"@tanstack/react-table\";\nimport type { GauthUser, GauthUserHookConfig } from \"../../types/users\";\nimport { useUsers, useDeleteUser, useResetPassword } from \"../../hooks/use-users\";\nimport { UserFormDialog } from \"./user-form-dialog\";\nimport { UserProfileBadge } from \"./user-profile-badge\";\nimport { DataTable } from \"./data-table\";\nimport { EntityAvatar } from \"../entity-avatar\";\nimport { Input } from \"../ui/input\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../ui/select\";\nimport { Tooltip, TooltipTrigger, TooltipContent } from \"../ui/tooltip\";\nimport {\n AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent,\n AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle,\n} from \"../ui/alert-dialog\";\nimport { Button } from \"../ui/button\";\nimport { Pencil, Trash2, Search, Forward, Plus } from \"lucide-react\";\nimport { format } from \"date-fns\";\nimport { ptBR } from \"date-fns/locale\";\nimport { toast } from \"sonner\";\n\nconst PAGE_SIZE = 15;\n\nconst PROFILE_FILTER_OPTIONS = [\n { value: \"all\", label: \"Todos os perfis\" },\n { value: \"owner\", label: \"Proprietário\" },\n { value: \"admin\", label: \"Administrador\" },\n { value: \"collaborator\", label: \"Colaborador\" },\n { value: \"attendant\", label: \"Atendente\" },\n { value: \"viewer\", label: \"Visualizador\" },\n];\n\nfunction useColumns(\n onEdit: (user: GauthUser) => void,\n onDelete: (id: number) => void,\n onResetPassword: (user: GauthUser) => void,\n): ColumnDef<GauthUser>[] {\n return [\n {\n accessorKey: \"name\",\n header: \"Nome\",\n cell: ({ row }) => (\n <div className=\"flex items-center gap-2\">\n <EntityAvatar\n photo={row.original.photo}\n name={`${row.original.name} ${row.original.last_name}`.trim()}\n size=\"sm\"\n />\n <span className=\"font-medium\">\n {row.original.name} {row.original.last_name}\n </span>\n </div>\n ),\n sortingFn: (rowA, rowB) => {\n const a = `${rowA.original.name} ${rowA.original.last_name}`.toLowerCase();\n const b = `${rowB.original.name} ${rowB.original.last_name}`.toLowerCase();\n return a.localeCompare(b);\n },\n },\n {\n accessorKey: \"email\",\n header: \"E-mail\",\n },\n {\n accessorKey: \"profile\",\n header: \"Perfil\",\n cell: ({ row }) => <UserProfileBadge profile={row.original.profile} />,\n sortingFn: (rowA, rowB) => rowA.original.profile.localeCompare(rowB.original.profile),\n },\n {\n accessorKey: \"last_login\",\n header: \"Último acesso\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground text-sm\">\n {row.original.last_login\n ? format(new Date(row.original.last_login), \"dd/MM/yyyy HH:mm\", { locale: ptBR })\n : \"—\"}\n </span>\n ),\n },\n {\n accessorKey: \"datetime_add\",\n header: \"Criado em\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground text-sm\">\n {format(new Date(row.original.datetime_add), \"dd/MM/yyyy\", { locale: ptBR })}\n </span>\n ),\n },\n {\n id: \"actions\",\n size: 120,\n enableSorting: false,\n cell: ({ row }) => (\n <div className=\"flex items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\" onClick={() => onResetPassword(row.original)}>\n <Forward className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Resetar senha</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\" onClick={() => onEdit(row.original)}>\n <Pencil className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Editar</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-destructive hover:text-destructive\" onClick={() => onDelete(row.original.id)}>\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Excluir</TooltipContent>\n </Tooltip>\n </div>\n ),\n },\n ];\n}\n\nexport interface UsersPageProps {\n config: GauthUserHookConfig;\n profileOptions?: { value: string; label: string }[];\n renderPhones?: (idUser: number) => React.ReactNode;\n}\n\nexport function UsersPage({ config, profileOptions, renderPhones }: UsersPageProps) {\n const [search, setSearch] = useState(\"\");\n const [profileFilter, setProfileFilter] = useState(\"all\");\n const [page, setPage] = useState(1);\n\n const queryParams = useMemo(() => {\n const params: Record<string, string> = {\n limit: String(PAGE_SIZE),\n page: String(page),\n };\n if (profileFilter !== \"all\") params.profile = profileFilter;\n return params;\n }, [profileFilter, page]);\n\n const { data, isLoading } = useUsers(config, queryParams);\n const deleteUser = useDeleteUser(config);\n const resetPassword = useResetPassword(config);\n const [editUser, setEditUser] = useState<GauthUser | null>(null);\n const [formOpen, setFormOpen] = useState(false);\n const [deleteId, setDeleteId] = useState<number | null>(null);\n const [resetUser, setResetUser] = useState<GauthUser | null>(null);\n\n const users = data?.data || [];\n const total = data?.total || 0;\n\n // Client-side search filter\n const filtered = useMemo(() => {\n if (!search) return users;\n const term = search.toLowerCase();\n return users.filter((u) =>\n `${u.name} ${u.last_name}`.toLowerCase().includes(term) ||\n u.email.toLowerCase().includes(term)\n );\n }, [users, search]);\n\n const columns = useColumns(\n (u) => { setEditUser(u); setFormOpen(true); },\n (id) => setDeleteId(id),\n (u) => setResetUser(u),\n );\n\n function handleDelete() {\n if (!deleteId) return;\n deleteUser.mutate(deleteId, {\n onSuccess: () => { toast.success(\"Usuário excluído\"); setDeleteId(null); },\n onError: () => toast.error(\"Erro ao excluir usuário\"),\n });\n }\n\n function handleResetPassword() {\n if (!resetUser) return;\n resetPassword.mutate(resetUser.id, {\n onSuccess: () => { toast.success(\"Senha resetada e email enviado\"); setResetUser(null); },\n onError: () => { toast.error(\"Erro ao resetar senha\"); setResetUser(null); },\n });\n }\n\n return (\n <div className=\"flex flex-col gap-4 p-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-semibold\">Usuários</h1>\n <p className=\"text-sm text-muted-foreground\">Gestão de usuários da conta</p>\n </div>\n <Button onClick={() => { setEditUser(null); setFormOpen(true); }} size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n Novo Usuário\n </Button>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <div className=\"relative flex-1 max-w-md\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Buscar por nome ou e-mail...\"\n value={search}\n onChange={(e) => { setSearch(e.target.value); setPage(1); }}\n className=\"pl-9\"\n />\n </div>\n <Select value={profileFilter} onValueChange={(v) => { setProfileFilter(v); setPage(1); }}>\n <SelectTrigger className=\"w-[180px]\"><SelectValue /></SelectTrigger>\n <SelectContent>\n {PROFILE_FILTER_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>{opt.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <DataTable\n columns={columns}\n data={search ? filtered : users}\n isLoading={isLoading}\n emptyMessage=\"Nenhum usuário encontrado\"\n total={search ? filtered.length : total}\n page={page}\n onPageChange={setPage}\n pageSize={PAGE_SIZE}\n />\n\n <UserFormDialog\n open={formOpen}\n onOpenChange={(open) => { setFormOpen(open); if (!open) setEditUser(null); }}\n user={editUser ?? undefined}\n config={config}\n profileOptions={profileOptions}\n renderPhones={renderPhones}\n />\n\n <AlertDialog open={!!deleteId} onOpenChange={(open) => !open && setDeleteId(null)}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Excluir usuário?</AlertDialogTitle>\n <AlertDialogDescription>Esta ação não pode ser desfeita. O usuário será removido permanentemente.</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancelar</AlertDialogCancel>\n <AlertDialogAction onClick={handleDelete} className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\">Excluir</AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n\n <AlertDialog open={!!resetUser} onOpenChange={(open) => !open && setResetUser(null)}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Resetar senha?</AlertDialogTitle>\n <AlertDialogDescription>\n A senha de <strong>{resetUser?.name} {resetUser?.last_name}</strong> ({resetUser?.email}) será removida e um email com link para definir nova senha será enviado.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancelar</AlertDialogCancel>\n <AlertDialogAction onClick={handleResetPassword}>Resetar e enviar</AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport type { GauthUser, GauthUserHookConfig } from \"../../types/users\";\nimport { useCreateUser, useUpdateUser } from \"../../hooks/use-users\";\nimport {\n Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter,\n} from \"../ui/dialog\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../ui/select\";\nimport { Loader2 } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { ImageCropUpload } from \"../image-crop-upload\";\n\nconst DEFAULT_PROFILES = [\n { value: \"owner\", label: \"Proprietário\" },\n { value: \"admin\", label: \"Administrador\" },\n { value: \"collaborator\", label: \"Colaborador\" },\n { value: \"attendant\", label: \"Atendente\" },\n { value: \"viewer\", label: \"Visualizador\" },\n];\n\nexport interface UserFormDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n user?: GauthUser;\n config: GauthUserHookConfig;\n profileOptions?: { value: string; label: string }[];\n renderPhones?: (idUser: number) => React.ReactNode;\n}\n\nexport function UserFormDialog({\n open,\n onOpenChange,\n user,\n config,\n profileOptions,\n renderPhones,\n}: UserFormDialogProps) {\n const isEditing = !!user;\n const createUser = useCreateUser(config);\n const updateUser = useUpdateUser(config);\n const profiles = profileOptions || DEFAULT_PROFILES;\n\n const [name, setName] = useState(\"\");\n const [lastName, setLastName] = useState(\"\");\n const [email, setEmail] = useState(\"\");\n const [profile, setProfile] = useState(\"collaborator\");\n const [password, setPassword] = useState(\"\");\n const [photo, setPhoto] = useState(\"\");\n\n useEffect(() => {\n if (user) {\n setName(user.name || \"\");\n setLastName(user.last_name || \"\");\n setEmail(user.email || \"\");\n setProfile(user.profile || \"collaborator\");\n setPhoto(user.photo || \"\");\n } else {\n setName(\"\"); setLastName(\"\"); setEmail(\"\"); setProfile(\"collaborator\"); setPhoto(\"\");\n }\n setPassword(\"\");\n }, [user, open]);\n\n const isPending = createUser.isPending || updateUser.isPending;\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault();\n if (!name.trim() || !email.trim()) return;\n\n try {\n if (isEditing) {\n await updateUser.mutateAsync({\n id: user.id,\n body: {\n name: name.trim(),\n last_name: lastName.trim() || undefined,\n email: email.trim(),\n profile,\n photo: photo || null,\n },\n });\n toast.success(\"Usuário atualizado\");\n } else {\n await createUser.mutateAsync({\n name: name.trim(),\n last_name: lastName.trim() || undefined,\n email: email.trim(),\n profile,\n password: password || undefined,\n photo: photo || null,\n });\n toast.success(\"Usuário criado\");\n }\n onOpenChange(false);\n } catch {\n toast.error(isEditing ? \"Erro ao atualizar usuário\" : \"Erro ao criar usuário\");\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{isEditing ? \"Editar Usuário\" : \"Novo Usuário\"}</DialogTitle>\n </DialogHeader>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"flex justify-center\">\n <ImageCropUpload\n value={photo || null}\n onChange={setPhoto}\n onRemove={() => setPhoto(\"\")}\n entityType=\"users\"\n entityId={user?.id}\n idAccount={Number(config.accountId) || 0}\n name={`${name} ${lastName}`.trim() || null}\n disabled={isPending}\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"user-name\">Nome *</Label>\n <Input id=\"user-name\" value={name} onChange={(e) => setName(e.target.value)} placeholder=\"Nome\" required disabled={isPending} />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"user-lastname\">Sobrenome</Label>\n <Input id=\"user-lastname\" value={lastName} onChange={(e) => setLastName(e.target.value)} placeholder=\"Sobrenome\" disabled={isPending} />\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"user-email\">E-mail *</Label>\n <Input id=\"user-email\" type=\"email\" value={email} onChange={(e) => setEmail(e.target.value)} placeholder=\"email@exemplo.com\" required disabled={isPending} />\n </div>\n {!isEditing && (\n <div className=\"space-y-2\">\n <Label htmlFor=\"user-password\">Senha</Label>\n <Input id=\"user-password\" type=\"password\" value={password} onChange={(e) => setPassword(e.target.value)} placeholder=\"Senha inicial (opcional)\" disabled={isPending} />\n </div>\n )}\n <div className=\"space-y-2\">\n <Label>Perfil de acesso</Label>\n <Select value={profile} onValueChange={setProfile} disabled={isPending}>\n <SelectTrigger className=\"w-full\"><SelectValue /></SelectTrigger>\n <SelectContent>\n {profiles.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>{opt.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n {isEditing && renderPhones && (\n <div className=\"border-t pt-4\">\n {renderPhones(user.id)}\n </div>\n )}\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => onOpenChange(false)} disabled={isPending}>Cancelar</Button>\n <Button type=\"submit\" disabled={isPending || !name.trim() || !email.trim()}>\n {isPending && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n {isEditing ? \"Salvar\" : \"Criar\"}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { ChevronsUpDown, Check, ChevronUp, ChevronDown } from \"lucide-react\"\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return (\n <SelectPrimitive.Group\n data-slot=\"select-group\"\n className={cn(\"scroll-my-1 p-1\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"border-input data-placeholder:text-muted-foreground dark:bg-input/30 dark:hover:bg-input/50 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 gap-1.5 rounded-md border bg-transparent py-2 pr-2 pl-2.5 text-sm shadow-xs transition-[color,box-shadow] focus-visible:ring-3 aria-invalid:ring-3 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:gap-1.5 [&_svg:not([class*='size-'])]:size-4 flex w-fit items-center justify-between whitespace-nowrap outline-none disabled:cursor-not-allowed disabled:opacity-50 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronsUpDown className=\"text-muted-foreground size-4 pointer-events-none\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"item-aligned\",\n align = \"center\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n data-align-trigger={position === \"item-aligned\"}\n className={cn(\"bg-popover text-popover-foreground data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-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 ring-foreground/10 min-w-36 rounded-md shadow-md ring-1 duration-100 relative z-50 max-h-(--radix-select-content-available-height) origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto data-[align-trigger=true]:animate-none\", position ===\"popper\"&&\"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\", className )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n data-position={position}\n className={cn(\n \"data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)\",\n position === \"popper\" && \"\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"text-muted-foreground px-2 py-1.5 text-xs\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2 relative flex w-full cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"pointer-events-none\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px pointer-events-none\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\"bg-popover z-10 flex cursor-default items-center justify-center py-1 [&_svg:not([class*='size-'])]:size-4\", className)}\n {...props}\n >\n <ChevronUp />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\"bg-popover z-10 flex cursor-default items-center justify-center py-1 [&_svg:not([class*='size-'])]:size-4\", className)}\n {...props}\n >\n <ChevronDown />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n","\"use client\";\n\nimport { Badge } from \"../ui/badge\";\nimport type { UserProfile } from \"../../types/users\";\n\nconst profileConfig: Record<string, { label: string; className: string }> = {\n owner: { label: \"Proprietário\", className: \"bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-200\" },\n proprietario: { label: \"Proprietário\", className: \"bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-200\" },\n admin: { label: \"Administrador\", className: \"bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200\" },\n administrador: { label: \"Administrador\", className: \"bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200\" },\n manager: { label: \"Gerente\", className: \"bg-teal-100 text-teal-800 dark:bg-teal-900 dark:text-teal-200\" },\n gerente: { label: \"Gerente\", className: \"bg-teal-100 text-teal-800 dark:bg-teal-900 dark:text-teal-200\" },\n supervisor: { label: \"Supervisor\", className: \"bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-200\" },\n collaborator: { label: \"Colaborador\", className: \"bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200\" },\n colaborador: { label: \"Colaborador\", className: \"bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200\" },\n attendant: { label: \"Atendente\", className: \"bg-amber-100 text-amber-800 dark:bg-amber-900 dark:text-amber-200\" },\n viewer: { label: \"Visualizador\", className: \"bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-200\" },\n};\n\nexport interface UserProfileBadgeProps {\n profile: UserProfile | string;\n}\n\nexport function UserProfileBadge({ profile }: UserProfileBadgeProps) {\n const config = profileConfig[profile] || { label: profile, className: \"\" };\n return (\n <Badge variant=\"secondary\" className={config.className}>\n {config.label}\n </Badge>\n );\n}\n","\"use client\";\n\nimport {\n type ColumnDef,\n type SortingState,\n flexRender,\n getCoreRowModel,\n getSortedRowModel,\n useReactTable,\n} from \"@tanstack/react-table\";\nimport { useState } from \"react\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"../ui/table\";\nimport { Button } from \"../ui/button\";\nimport { Skeleton } from \"../ui/skeleton\";\nimport { cn } from \"../../lib/utils\";\nimport { ChevronLeft, ChevronRight, ArrowUp, ArrowDown, ArrowUpDown } from \"lucide-react\";\n\nexport interface DataTableProps<TData, TValue> {\n columns: ColumnDef<TData, TValue>[];\n data: TData[];\n isLoading?: boolean;\n emptyMessage?: string;\n total?: number;\n page?: number;\n onPageChange?: (page: number) => void;\n pageSize?: number;\n onRowClick?: (row: TData) => void;\n selectedRowId?: string | number | null;\n getRowId?: (row: TData) => string | number;\n compact?: boolean;\n}\n\nexport function DataTable<TData, TValue>({\n columns,\n data,\n isLoading,\n emptyMessage = \"Nenhum registro encontrado\",\n total,\n page = 1,\n onPageChange,\n pageSize = 15,\n onRowClick,\n selectedRowId,\n getRowId,\n compact,\n}: DataTableProps<TData, TValue>) {\n const [sorting, setSorting] = useState<SortingState>([]);\n\n const table = useReactTable({\n data,\n columns,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n onSortingChange: setSorting,\n state: { sorting },\n });\n\n const totalPages = total ? Math.ceil(total / pageSize) : 1;\n const showPagination = onPageChange && total && total > pageSize;\n\n return (\n <div className=\"space-y-4\">\n <div className=\"rounded-md border\">\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead\n key={header.id}\n className={cn(compact && \"py-1.5 text-xs\")}\n style={{ width: header.getSize() !== 150 ? header.getSize() : undefined }}\n >\n {header.isPlaceholder ? null : header.column.getCanSort() ? (\n <button\n type=\"button\"\n className=\"flex items-center gap-1 hover:text-foreground -ml-1 px-1 py-0.5 rounded cursor-pointer select-none\"\n onClick={header.column.getToggleSortingHandler()}\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n {{\n asc: <ArrowUp className=\"h-3.5 w-3.5\" />,\n desc: <ArrowDown className=\"h-3.5 w-3.5\" />,\n }[header.column.getIsSorted() as string] ?? (\n <ArrowUpDown className=\"h-3.5 w-3.5 text-muted-foreground/50\" />\n )}\n </button>\n ) : (\n flexRender(header.column.columnDef.header, header.getContext())\n )}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {isLoading ? (\n Array.from({ length: compact ? 3 : 5 }).map((_, i) => (\n <TableRow key={i}>\n {columns.map((_, j) => (\n <TableCell key={j} className={cn(compact && \"py-1.5\")}>\n <Skeleton className=\"h-4 w-full max-w-[120px]\" />\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : table.getRowModel().rows.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={columns.length}\n className={cn(\n \"text-center text-muted-foreground\",\n compact ? \"py-4\" : \"py-8\",\n )}\n >\n {emptyMessage}\n </TableCell>\n </TableRow>\n ) : (\n table.getRowModel().rows.map((row) => {\n const rowId = getRowId ? getRowId(row.original) : undefined;\n const isSelected = selectedRowId != null && rowId != null && rowId === selectedRowId;\n\n return (\n <TableRow\n key={row.id}\n className={cn(\n onRowClick && \"cursor-pointer\",\n isSelected && \"bg-accent\",\n )}\n onClick={() => onRowClick?.(row.original)}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id} className={cn(compact && \"py-1.5\")}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n );\n })\n )}\n </TableBody>\n </Table>\n </div>\n\n {showPagination && (\n <div className=\"flex items-center justify-between px-2\">\n <p className=\"text-sm text-muted-foreground\">\n {total} registro{total !== 1 ? \"s\" : \"\"}\n </p>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onPageChange(page - 1)}\n disabled={page <= 1}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n Anterior\n </Button>\n <span className=\"text-sm text-muted-foreground\">\n {page} de {totalPages}\n </span>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onPageChange(page + 1)}\n disabled={page >= totalPages}\n >\n Próximo\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div data-slot=\"table-container\" className=\"relative w-full overflow-x-auto\">\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n )\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"[&_tr]:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\"bg-muted/50 border-t font-medium [&>tr]:last:border-b-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\"hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors\", className)}\n {...props}\n />\n )\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\"text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"text-muted-foreground mt-4 text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { AlertDialog as AlertDialogPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\n\nfunction AlertDialog({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />\n}\n\nfunction AlertDialogTrigger({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {\n return (\n <AlertDialogPrimitive.Trigger data-slot=\"alert-dialog-trigger\" {...props} />\n )\n}\n\nfunction AlertDialogPortal({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {\n return (\n <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\n )\n}\n\nfunction AlertDialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {\n return (\n <AlertDialogPrimitive.Overlay\n data-slot=\"alert-dialog-overlay\"\n className={cn(\"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs fixed inset-0 z-50\", className)}\n {...props}\n />\n )\n}\n\nfunction AlertDialogContent({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Content> & {\n size?: \"default\" | \"sm\"\n}) {\n return (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n data-slot=\"alert-dialog-content\"\n data-size={size}\n className={cn(\n \"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 bg-background ring-foreground/10 gap-6 rounded-xl p-6 ring-1 duration-100 data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-lg group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 outline-none\",\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n )\n}\n\nfunction AlertDialogHeader({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(\"grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]\", className)}\n {...props}\n />\n )\n}\n\nfunction AlertDialogFooter({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {\n return (\n <AlertDialogPrimitive.Title\n data-slot=\"alert-dialog-title\"\n className={cn(\"text-lg font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2\", className)}\n {...props}\n />\n )\n}\n\nfunction AlertDialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {\n return (\n <AlertDialogPrimitive.Description\n data-slot=\"alert-dialog-description\"\n className={cn(\"text-muted-foreground *:[a]:hover:text-foreground text-sm text-balance md:text-pretty *:[a]:underline *:[a]:underline-offset-3\", className)}\n {...props}\n />\n )\n}\n\nfunction AlertDialogAction({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Action> &\n Partial<Pick<React.ComponentProps<typeof Button>, \"variant\" | \"size\">>) {\n return (\n <Button variant={variant} size={size} asChild>\n <AlertDialogPrimitive.Action\n data-slot=\"alert-dialog-action\"\n className={cn(className)}\n {...props}\n />\n </Button>\n )\n}\n\nfunction AlertDialogCancel({\n className,\n variant = \"outline\",\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Cancel> &\n Partial<Pick<React.ComponentProps<typeof Button>, \"variant\" | \"size\">>) {\n return (\n <Button variant={variant} size={size} asChild>\n <AlertDialogPrimitive.Cancel\n data-slot=\"alert-dialog-cancel\"\n className={cn(className)}\n {...props}\n />\n </Button>\n )\n}\n\nexport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogTrigger,\n}\n"],"mappings":"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","names":["request","cva","Slot","jsx","jsx","jsx","jsx","jsxs","jsx","jsxs","jsx","jsx","jsx","jsxs","open","jsx","jsx","jsx","Slot","jsx","cva","Slot","jsxs","ChevronRight","jsx","jsx","jsxs","jsx","jsx","jsx","jsx","cva","Slot","jsx","cva","Slot","jsx","jsxs","ChevronRight","usePathname","Slot","ChevronRight","jsx","jsxs","jsx","ChevronRight","useCallback","jsx","jsxs","jsx","jsxs","usePathname","Fragment","jsx","jsxs","useState","useRouter","jsx","Fragment","jsx","jsxs","useRouter","useState","jsx","jsxs","useCallback","useState","X","jsx","jsxs","jsx","jsx","jsxs","X","React","jsx","jsxs","jsx","jsxs","useState","useCallback","useMemo","useState","useEffect","useState","Check","ChevronUp","jsx","jsxs","jsx","jsxs","jsxs","jsx","Check","jsx","ChevronUp","Loader2","toast","jsx","jsxs","useState","useEffect","toast","Loader2","jsx","useState","jsx","jsx","ChevronRight","jsx","jsxs","useState","_","jsx","jsxs","jsx","jsxs","Trash2","toast","jsx","jsxs","useState","useMemo"]}