@djangocfg/layouts 2.1.101 → 2.1.102

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.
Files changed (49) hide show
  1. package/dist/AIChatWidget-LUPM7S2O.mjs +1644 -0
  2. package/dist/AIChatWidget-LUPM7S2O.mjs.map +1 -0
  3. package/dist/AIChatWidget-O23TJJ7C.mjs +3 -0
  4. package/dist/AIChatWidget-O23TJJ7C.mjs.map +1 -0
  5. package/dist/chunk-53YKWR6F.mjs +6 -0
  6. package/dist/chunk-53YKWR6F.mjs.map +1 -0
  7. package/dist/chunk-EI7TDN2G.mjs +1652 -0
  8. package/dist/chunk-EI7TDN2G.mjs.map +1 -0
  9. package/dist/components.cjs +925 -0
  10. package/dist/components.cjs.map +1 -0
  11. package/dist/components.d.mts +583 -0
  12. package/dist/components.d.ts +583 -0
  13. package/dist/components.mjs +879 -0
  14. package/dist/components.mjs.map +1 -0
  15. package/dist/index.cjs +7573 -0
  16. package/dist/index.cjs.map +1 -0
  17. package/dist/index.d.mts +2376 -0
  18. package/dist/index.d.ts +2376 -0
  19. package/dist/index.mjs +5673 -0
  20. package/dist/index.mjs.map +1 -0
  21. package/dist/layouts.cjs +6530 -0
  22. package/dist/layouts.cjs.map +1 -0
  23. package/dist/layouts.d.mts +748 -0
  24. package/dist/layouts.d.ts +748 -0
  25. package/dist/layouts.mjs +4741 -0
  26. package/dist/layouts.mjs.map +1 -0
  27. package/dist/pages.cjs +178 -0
  28. package/dist/pages.cjs.map +1 -0
  29. package/dist/pages.d.mts +57 -0
  30. package/dist/pages.d.ts +57 -0
  31. package/dist/pages.mjs +168 -0
  32. package/dist/pages.mjs.map +1 -0
  33. package/dist/snippets.cjs +3793 -0
  34. package/dist/snippets.cjs.map +1 -0
  35. package/dist/snippets.d.mts +1192 -0
  36. package/dist/snippets.d.ts +1192 -0
  37. package/dist/snippets.mjs +3738 -0
  38. package/dist/snippets.mjs.map +1 -0
  39. package/dist/utils.cjs +34 -0
  40. package/dist/utils.cjs.map +1 -0
  41. package/dist/utils.d.mts +40 -0
  42. package/dist/utils.d.ts +40 -0
  43. package/dist/utils.mjs +25 -0
  44. package/dist/utils.mjs.map +1 -0
  45. package/package.json +38 -47
  46. package/src/components/errors/ErrorsTracker/components/ErrorButtons.tsx +2 -1
  47. package/src/layouts/ProfileLayout/ProfileLayout.tsx +507 -86
  48. package/src/layouts/ProfileLayout/components/DeleteAccountSection.tsx +2 -2
  49. package/src/snippets/AuthDialog/useAuthDialog.ts +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/layouts/_components/UserMenu.tsx","../src/components/core/ClientOnly.tsx","../src/components/core/LucideIcon.tsx","../src/components/core/Suspense.tsx","../src/components/errors/ErrorBoundary.tsx","../src/components/errors/ErrorsTracker/utils/formatters.ts","../src/components/errors/ErrorsTracker/utils/curl-generator.ts","../src/components/errors/ErrorsTracker/components/ErrorButtons.tsx","../src/components/errors/ErrorsTracker/components/ErrorToast.tsx","../src/components/errors/ErrorsTracker/types.ts","../src/components/errors/ErrorsTracker/providers/ErrorTrackingProvider.tsx","../src/snippets/Analytics/useAnalytics.ts","../src/snippets/Analytics/AnalyticsProvider.tsx","../src/snippets/AuthDialog/AuthDialog.tsx","../src/snippets/AuthDialog/events.ts","../src/snippets/AuthDialog/useAuthDialog.ts","../src/snippets/PushNotifications/utils/logger.ts","../src/snippets/PushNotifications/utils/platform.ts","../src/snippets/PushNotifications/utils/vapid.ts","../src/snippets/PushNotifications/hooks/usePushNotifications.ts","../src/snippets/PushNotifications/hooks/useDjangoPush.ts","../src/snippets/PushNotifications/context/DjangoPushContext.tsx","../src/snippets/PushNotifications/utils/localStorage.ts","../src/snippets/PushNotifications/components/PushPrompt.tsx","../src/snippets/PushNotifications/config.ts","../src/snippets/PWAInstall/utils/localStorage.ts","../src/snippets/PWAInstall/utils/logger.ts","../src/snippets/PWAInstall/utils/platform.ts","../src/snippets/PWAInstall/hooks/useInstallPrompt.ts","../src/snippets/PWAInstall/context/InstallContext.tsx","../src/snippets/PWAInstall/components/DesktopGuide.tsx","../src/snippets/PWAInstall/components/IOSGuideDrawer.tsx","../src/snippets/PWAInstall/components/IOSGuideModal.tsx","../src/snippets/PWAInstall/components/IOSGuide.tsx","../src/snippets/PWAInstall/components/A2HSHint.tsx","../src/snippets/PWAInstall/hooks/useIsPWA.ts","../src/snippets/PWAInstall/hooks/usePWAPageResume.ts","../src/snippets/PWAInstall/components/PWAPageResumeManager.tsx","../src/layouts/AppLayout/BaseApp.tsx","../src/layouts/AppLayout/AppLayout.tsx","../src/layouts/PublicLayout/components/PublicNavigation.tsx","../src/layouts/PublicLayout/components/PublicMobileDrawer.tsx","../src/layouts/PublicLayout/components/PublicFooter/DjangoCFGLogo.tsx","../src/layouts/PublicLayout/components/PublicFooter/FooterBottom.tsx","../src/layouts/PublicLayout/components/PublicFooter/FooterMenuSections.tsx","../src/layouts/PublicLayout/components/PublicFooter/FooterSocialLinks.tsx","../src/layouts/PublicLayout/components/PublicFooter/FooterProjectInfo.tsx","../src/layouts/PublicLayout/components/PublicFooter/PublicFooter.tsx","../src/layouts/PublicLayout/PublicLayout.tsx","../src/layouts/PrivateLayout/components/PrivateSidebar.tsx","../src/layouts/PrivateLayout/components/PrivateHeader.tsx","../src/layouts/PrivateLayout/components/PrivateContent.tsx","../src/layouts/PrivateLayout/PrivateLayout.tsx","../src/layouts/AuthLayout/context.tsx","../src/layouts/AuthLayout/components/AuthHelp.tsx","../src/layouts/AuthLayout/components/oauth/OAuthProviders.tsx","../src/layouts/AuthLayout/components/oauth/OAuthCallback.tsx","../src/layouts/AuthLayout/components/IdentifierForm.tsx","../src/utils/logger.ts","../src/layouts/AuthLayout/components/OTPForm.tsx","../src/layouts/AuthLayout/components/TwoFactorForm.tsx","../src/layouts/AuthLayout/components/TwoFactorSetup.tsx","../src/layouts/AuthLayout/components/AuthSuccess.tsx","../src/layouts/AuthLayout/AuthLayout.tsx","../src/layouts/AdminLayout/AdminLayout.tsx","../src/layouts/ProfileLayout/ProfileLayout.tsx"],"names":["jsx","defaultFallback","jsxs","ReactSuspense","Button","config","useState","useEffect","useAuth","Fragment","Dialog","DialogContent","DialogHeader","DialogTitle","useCallback","consola","nav","toast","error","createContext","STORAGE_KEYS","isDismissedRecentlyHelper","isDebugEnabled","pwaLogger","isStandalone","isMobileDevice","isStandaloneReliable","useContext","steps","StepCard","Card","CardContent","Check","ArrowUpRight","ArrowDown","CheckCircle","Share","DialogDescription","DialogFooter","DEFAULT_RESET_DAYS","cn","X","usePathname","useMemo","useIsMobile","Link","Menu","Drawer","DrawerContent","DrawerHeader","DrawerTitle","ThemeToggle","useRouter","Preloader","MessageCircle","Mail","Github","useGithubAuth","CardHeader","CardTitle","CardDescription","useRef","ShieldCheck","OTPInput","Input","Loader2","React","Alert","AlertDescription","CardFooter","Copy","useCfgRouter","ChevronRight","Avatar","AvatarFallback","User","Phone","LogOut"],"mappings":"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","file":"layouts.mjs","sourcesContent":["/**\n * User Menu Component for Layouts\n *\n * Flexible user menu component with group-based structure (like footer)\n * Uses useAuth() hook for authentication state\n *\n * @example\n * ```tsx\n * import { Settings, LogOut, User } from 'lucide-react';\n *\n * <UserMenu\n * groups={[\n * {\n * title: 'Account',\n * items: [\n * { label: 'Profile', href: '/profile', icon: Settings },\n * { label: 'Dashboard', href: '/dashboard', icon: User }\n * ]\n * },\n * {\n * items: [\n * { label: 'Sign Out', onClick: () => logout(), icon: LogOut, variant: 'destructive' }\n * ]\n * }\n * ]}\n * authPath=\"/auth\"\n * />\n * ```\n */\n\n'use client';\n\nimport { LogOut } from 'lucide-react';\nimport Link from 'next/link';\nimport React from 'react';\n\nimport { useAuth } from '@djangocfg/api/auth';\nimport {\n Avatar, AvatarFallback, AvatarImage, Button, DropdownMenu, DropdownMenuContent,\n DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator,\n DropdownMenuTrigger\n} from '@djangocfg/ui-nextjs/components';\n\nimport type { UserMenuGroup } from '../types';\n\nexport interface UserMenuProps {\n /** Display variant */\n variant?: 'desktop' | 'mobile';\n /** Menu groups for authenticated users */\n groups?: UserMenuGroup[];\n /** Auth page path (for sign in button) */\n authPath?: string;\n}\n\nexport function UserMenu({\n variant = 'desktop',\n groups,\n authPath = '/auth',\n}: UserMenuProps) {\n const { user, isAuthenticated, logout } = useAuth();\n const [mounted, setMounted] = React.useState(false);\n\n React.useEffect(() => {\n setMounted(true);\n }, []);\n\n // Prepare menu groups\n // Must be before early return to maintain hook order\n const menuGroups: UserMenuGroup[] = React.useMemo(() => {\n const allGroups: UserMenuGroup[] = [];\n\n // Add custom groups if provided\n if (groups && groups.length > 0) {\n allGroups.push(...groups);\n }\n\n // Always add Sign Out at the end\n allGroups.push({\n items: [\n {\n label: 'Sign Out',\n onClick: () => logout(),\n icon: LogOut,\n variant: 'destructive',\n },\n ],\n });\n\n return allGroups;\n }, [groups, logout]);\n\n if (!mounted) {\n return null;\n }\n\n if (!isAuthenticated || !user) {\n // Guest user - show sign in button\n if (variant === 'mobile') {\n return (\n <Link href={authPath}>\n <Button variant=\"default\" className=\"w-full\">\n Sign In\n </Button>\n </Link>\n );\n }\n return (\n <Link href={authPath}>\n <Button variant=\"default\" size=\"sm\">\n Sign In\n </Button>\n </Link>\n );\n }\n\n // Authenticated user\n const displayName = user.display_username || user.email || 'User';\n const userInitial = displayName.charAt(0).toUpperCase();\n const userAvatar = user.avatar || '';\n\n if (variant === 'mobile') {\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3 px-4 py-3\">\n <Avatar className=\"h-10 w-10\">\n <AvatarImage src={userAvatar} alt={displayName} />\n <AvatarFallback>{userInitial}</AvatarFallback>\n </Avatar>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground truncate\">\n {displayName}\n </p>\n <p className=\"text-xs text-muted-foreground truncate\">\n {user.email}\n </p>\n </div>\n </div>\n <div className=\"space-y-1\">\n {menuGroups.map((group, groupIndex) => (\n <div key={groupIndex}>\n {group.title && (\n <div className=\"px-4 py-2\">\n <p className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n {group.title}\n </p>\n </div>\n )}\n {group.items.map((item, itemIndex) => {\n const Icon = item.icon;\n const isDestructive = item.variant === 'destructive';\n const baseClasses = `flex items-center gap-3 px-4 py-3 text-sm font-medium rounded-sm transition-colors w-full text-left ${\n isDestructive\n ? 'text-destructive hover:bg-destructive/10'\n : 'text-foreground hover:bg-accent hover:text-accent-foreground'\n }`;\n\n if (item.onClick) {\n return (\n <button\n key={itemIndex}\n onClick={item.onClick}\n className={baseClasses}\n >\n {Icon && <Icon className=\"h-4 w-4\" />}\n {item.label}\n </button>\n );\n }\n\n if (item.href) {\n return (\n <Link key={itemIndex} href={item.href} className={baseClasses}>\n {Icon && <Icon className=\"h-4 w-4\" />}\n {item.label}\n </Link>\n );\n }\n\n return null;\n })}\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n // Desktop variant\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"rounded-full\">\n <Avatar className=\"h-8 w-8\">\n <AvatarImage src={userAvatar} alt={displayName} />\n <AvatarFallback>{userInitial}</AvatarFallback>\n </Avatar>\n <span className=\"sr-only\">User menu</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56\">\n <DropdownMenuLabel>\n <div className=\"flex flex-col space-y-1\">\n <p className=\"text-sm font-medium leading-none\">{displayName}</p>\n <p className=\"text-xs leading-none text-muted-foreground\">\n {user.email}\n </p>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {menuGroups.map((group, groupIndex) => (\n <React.Fragment key={groupIndex}>\n {groupIndex > 0 && <DropdownMenuSeparator />}\n <DropdownMenuGroup>\n {group.title && (\n <DropdownMenuLabel className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n {group.title}\n </DropdownMenuLabel>\n )}\n {group.items.map((item, itemIndex) => {\n const Icon = item.icon;\n const isDestructive = item.variant === 'destructive';\n\n if (item.onClick) {\n return (\n <DropdownMenuItem\n key={itemIndex}\n onClick={item.onClick}\n className={isDestructive ? 'text-destructive focus:text-destructive' : ''}\n >\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n <span>{item.label}</span>\n </DropdownMenuItem>\n );\n }\n\n if (item.href) {\n return (\n <DropdownMenuItem key={itemIndex} asChild>\n <Link\n href={item.href}\n className={`flex items-center ${isDestructive ? 'text-destructive' : ''}`}\n >\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n <span>{item.label}</span>\n </Link>\n </DropdownMenuItem>\n );\n }\n\n return null;\n })}\n </DropdownMenuGroup>\n </React.Fragment>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n","/**\n * ClientOnly Component\n *\n * Renders children only on the client side to prevent SSR hydration mismatch.\n * Shows a fallback (loading state) during SSR and initial client mount.\n *\n * @example\n * ```tsx\n * import { ClientOnly } from '@djangocfg/layouts/components';\n *\n * // With default loading fallback\n * <ClientOnly>\n * <ComponentThatUsesClientOnlyAPIs />\n * </ClientOnly>\n *\n * // With custom fallback\n * <ClientOnly fallback={<MyCustomLoader />}>\n * <ComponentThatUsesClientOnlyAPIs />\n * </ClientOnly>\n * ```\n */\n\n'use client';\n\nimport { ReactNode, useEffect, useState } from 'react';\n\nimport { Preloader } from '@djangocfg/ui-nextjs/components';\n\nexport interface ClientOnlyProps {\n children: ReactNode;\n /**\n * Fallback to show during SSR and initial mount\n * @default Preloader with \"Loading...\" text\n */\n fallback?: ReactNode;\n}\n\n/**\n * Default fallback - fullscreen preloader\n */\nconst defaultFallback = (\n <Preloader\n variant=\"fullscreen\"\n text=\"Loading...\"\n size=\"lg\"\n backdrop={true}\n backdropOpacity={80}\n />\n);\n\n/**\n * ClientOnly - Prevents SSR hydration mismatch\n *\n * Use this to wrap components that:\n * - Access browser-only APIs (window, localStorage, etc.)\n * - Have different initial state on server vs client\n * - Use authentication state that differs between SSR and CSR\n */\nexport function ClientOnly({\n children,\n fallback = defaultFallback,\n}: ClientOnlyProps) {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!mounted) {\n return <>{fallback}</>;\n }\n\n return <>{children}</>;\n}\n","/**\n * LucideIcon Component\n *\n * Smart component for rendering Lucide icons\n * Supports both string names and icon components\n *\n * Usage:\n * ```tsx\n * // By name (string)\n * <LucideIcon icon=\"CloudLightning\" className=\"w-4 h-4\" />\n *\n * // By component\n * import { CloudLightning } from 'lucide-react';\n * <LucideIcon icon={CloudLightning} className=\"w-4 h-4\" />\n * ```\n */\n\n'use client';\n\nimport * as LucideIcons from 'lucide-react';\nimport React from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport type { LucideIcon as LucideIconType } from 'lucide-react';\nexport interface LucideIconProps extends Omit<React.SVGProps<SVGSVGElement>, 'children'> {\n /**\n * Icon name (string) or icon component (LucideIcon)\n * If string, will be resolved from lucide-react\n * If component, will be used directly\n */\n icon?: LucideIconType | string;\n /**\n * Fallback icon if name not found\n * @default CloudLightning\n */\n fallback?: LucideIconType;\n /**\n * Additional CSS classes\n */\n className?: string;\n}\n\n/**\n * Get Lucide icon by name or return the icon component\n * @param icon - Icon name (string) or LucideIcon component\n * @param fallback - Fallback icon if name not found (default: CloudLightning)\n * @returns LucideIcon component\n */\nfunction getLucideIcon(\n icon: LucideIconType | string | undefined,\n fallback: LucideIconType = LucideIcons.CloudLightning\n): LucideIconType {\n if (!icon) {\n return fallback;\n }\n\n if (typeof icon === 'string') {\n const IconComponent = LucideIcons[icon as keyof typeof LucideIcons] as LucideIconType | undefined;\n return IconComponent || fallback;\n }\n\n return icon;\n}\n\n/**\n * LucideIcon Component\n *\n * Renders a Lucide icon either by name (string) or by component reference.\n * Automatically resolves icon names from lucide-react package.\n *\n * Usage:\n * ```tsx\n * // By name (string)\n * <LucideIcon icon=\"CloudLightning\" className=\"w-4 h-4\" />\n *\n * // By component\n * import { CloudLightning } from 'lucide-react';\n * <LucideIcon icon={CloudLightning} className=\"w-4 h-4\" />\n * ```\n */\nexport function LucideIcon({\n icon,\n fallback = LucideIcons.CloudLightning,\n className,\n ...props\n}: LucideIconProps) {\n const IconComponent = getLucideIcon(icon, fallback);\n\n return <IconComponent className={cn(className)} {...props} />;\n}\n\n","/**\n * Suspense Wrapper Component\n * \n * Reusable Suspense component with consistent loading fallback\n * Used for wrapping layouts that may use useSearchParams or other async hooks\n */\n\n'use client';\n\nimport { ReactNode, Suspense as ReactSuspense } from 'react';\n\ninterface SuspenseProps {\n children: ReactNode;\n fallback?: ReactNode;\n}\n\nconst defaultFallback = (\n <div className=\"flex items-center justify-center min-h-screen\">\n <div className=\"text-center\">\n <div className=\"inline-block h-8 w-8 animate-spin rounded-full border-4 border-solid border-current border-r-transparent align-[-0.125em] motion-reduce:animate-[spin_1.5s_linear_infinite]\" />\n <p className=\"mt-4 text-sm text-muted-foreground\">Loading...</p>\n </div>\n </div>\n);\n\nexport function Suspense({ children, fallback = defaultFallback }: SuspenseProps) {\n return <ReactSuspense fallback={fallback}>{children}</ReactSuspense>;\n}\n\n","/**\n * Simple ErrorBoundary Component\n * \n * Catches React errors and displays a fallback UI\n */\n\n'use client';\n\nimport React, { Component, ErrorInfo, ReactNode } from 'react';\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n supportEmail?: string;\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n // Call custom error handler if provided\n if (this.props.onError) {\n this.props.onError(error, errorInfo);\n }\n \n // Log to console in development\n if (process.env.NODE_ENV === 'development') {\n console.error('ErrorBoundary caught an error:', error, errorInfo);\n }\n }\n\n render() {\n if (this.state.hasError) {\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-background p-4\">\n <div className=\"max-w-md w-full space-y-4 text-center\">\n <h1 className=\"text-2xl font-bold text-foreground\">Something went wrong</h1>\n <p className=\"text-muted-foreground\">\n We're sorry, but something unexpected happened. Please try refreshing the page.\n </p>\n {this.props.supportEmail && (\n <p className=\"text-sm text-muted-foreground\">\n If the problem persists, please contact{' '}\n <a\n href={`mailto:${this.props.supportEmail}`}\n className=\"text-primary hover:underline\"\n >\n {this.props.supportEmail}\n </a>\n </p>\n )}\n <button\n onClick={() => window.location.reload()}\n className=\"px-4 py-2 bg-primary text-primary-foreground rounded-md hover:bg-primary/90\"\n >\n Refresh Page\n </button>\n </div>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n\n","/**\n * Error Formatters\n *\n * Format different error types for display and copying\n */\n\nimport type { ZodError } from 'zod';\nimport type { ValidationErrorDetail, CORSErrorDetail, NetworkErrorDetail, CentrifugoErrorDetail } from '../types';\n\n/**\n * Format Zod error issues for display\n */\nexport function formatZodIssues(error: ZodError, maxIssues: number = 3): string {\n const issues = error.issues.slice(0, maxIssues);\n const formatted = issues.map((issue) => {\n const path = issue.path.join('.') || 'root';\n return `${path}: ${issue.message}`;\n });\n\n if (error.issues.length > maxIssues) {\n formatted.push(`... and ${error.issues.length - maxIssues} more`);\n }\n\n return formatted.join(', ');\n}\n\n/**\n * Format validation error for clipboard\n */\nexport function formatValidationErrorForClipboard(detail: ValidationErrorDetail): string {\n const errorData = {\n type: 'validation',\n timestamp: detail.timestamp.toISOString(),\n operation: detail.operation,\n endpoint: {\n method: detail.method,\n path: detail.path,\n },\n validation_errors: detail.error.issues.map((issue) => ({\n path: issue.path.join('.') || 'root',\n message: issue.message,\n code: issue.code,\n ...(('expected' in issue) && { expected: issue.expected }),\n ...(('received' in issue) && { received: issue.received }),\n ...(('minimum' in issue) && { minimum: issue.minimum }),\n ...(('maximum' in issue) && { maximum: issue.maximum }),\n })),\n response: detail.response,\n total_errors: detail.error.issues.length,\n };\n\n return JSON.stringify(errorData, null, 2);\n}\n\n/**\n * Format CORS error for clipboard\n */\nexport function formatCORSErrorForClipboard(detail: CORSErrorDetail): string {\n const errorData = {\n type: 'cors',\n timestamp: detail.timestamp.toISOString(),\n url: detail.url,\n method: detail.method,\n error: detail.error,\n };\n\n return JSON.stringify(errorData, null, 2);\n}\n\n/**\n * Format network error for clipboard\n */\nexport function formatNetworkErrorForClipboard(detail: NetworkErrorDetail): string {\n const errorData = {\n type: 'network',\n timestamp: detail.timestamp.toISOString(),\n url: detail.url,\n method: detail.method,\n error: detail.error,\n ...(detail.statusCode && { statusCode: detail.statusCode }),\n };\n\n return JSON.stringify(errorData, null, 2);\n}\n\n/**\n * Format centrifugo error for clipboard\n */\nexport function formatCentrifugoErrorForClipboard(detail: CentrifugoErrorDetail): string {\n const errorData = {\n type: 'centrifugo',\n timestamp: detail.timestamp.toISOString(),\n method: detail.method,\n error: detail.error,\n ...(detail.code !== undefined && { code: detail.code }),\n ...(detail.data && { data: detail.data }),\n };\n\n return JSON.stringify(errorData, null, 2);\n}\n\n/**\n * Extract domain from URL\n */\nexport function extractDomain(url: string): string {\n try {\n const urlObj = new URL(url);\n return urlObj.origin;\n } catch {\n return url;\n }\n}\n\n/**\n * Format error title based on type\n */\nexport function formatErrorTitle(detail: ValidationErrorDetail | CORSErrorDetail | NetworkErrorDetail | CentrifugoErrorDetail): string {\n switch (detail.type) {\n case 'validation':\n return `❌ Validation Error in ${detail.operation}`;\n case 'cors':\n return '🚫 CORS Error';\n case 'network':\n return detail.statusCode\n ? `⚠️ Network Error (${detail.statusCode})`\n : '⚠️ Network Error';\n case 'centrifugo':\n return detail.code !== undefined\n ? `🔌 Centrifugo Error (${detail.code})`\n : '🔌 Centrifugo Error';\n default:\n return '❌ Error';\n }\n}\n","\"use client\"\n\n/**\n * cURL Generator\n *\n * Generates cURL commands from API request details with authentication token\n */\n\nimport consola from 'consola';\n\nexport interface CurlOptions {\n method: string;\n path: string;\n token?: string;\n body?: any;\n headers?: Record<string, string>;\n baseUrl?: string;\n queryParams?: Record<string, string>;\n}\n\n/**\n * Get authentication token from localStorage\n */\nexport function getAuthToken(): string | null {\n if (typeof window === 'undefined') return null;\n\n try {\n // Priority order: access_token > token > auth_token\n const token = localStorage.getItem('access_token') ||\n localStorage.getItem('token') ||\n localStorage.getItem('auth_token');\n\n return token;\n } catch (error) {\n consola.error('Failed to get auth token:', error);\n return null;\n }\n}\n\n/**\n * Format headers for cURL command\n */\nfunction formatHeaders(headers: Record<string, string>): string[] {\n return Object.entries(headers).map(\n ([key, value]) => `-H '${key}: ${value}'`\n );\n}\n\n/**\n * Escape single quotes in string for shell\n */\nfunction escapeShell(str: string): string {\n return str.replace(/'/g, \"'\\\\''\");\n}\n\n/**\n * Generate cURL command from request details\n */\nexport function generateCurl(options: CurlOptions): string {\n const {\n method,\n path,\n token = getAuthToken() || undefined, // Auto-fetch if not provided\n body,\n headers = {},\n baseUrl = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8000',\n } = options;\n\n const curlParts: string[] = ['curl'];\n\n // Build URL\n const url = `${baseUrl}${path}`;\n curlParts.push(`'${url}'`);\n\n // Add method if not GET\n if (method.toUpperCase() !== 'GET') {\n curlParts.push(`-X ${method.toUpperCase()}`);\n }\n\n // Default headers\n const allHeaders: Record<string, string> = {\n 'Accept': '*/*',\n 'Content-Type': 'application/json',\n ...headers,\n };\n\n // Add Authorization header if token exists\n if (token) {\n allHeaders['Authorization'] = `Bearer ${token}`;\n }\n\n // Add all headers\n const headerStrings = formatHeaders(allHeaders);\n curlParts.push(...headerStrings);\n\n // Add body for non-GET requests\n if (body && method.toUpperCase() !== 'GET') {\n const bodyJson = typeof body === 'string'\n ? body\n : JSON.stringify(body, null, 2);\n curlParts.push(`-d '${escapeShell(bodyJson)}'`);\n }\n\n // Join with line continuation\n return curlParts.join(' \\\\\\n ');\n}\n\n/**\n * Generate cURL from validation error details\n * Auto-fetches token from localStorage\n */\nexport function generateCurlFromError(detail: {\n method: string;\n path: string;\n response?: any;\n}): string {\n return generateCurl({\n method: detail.method,\n path: detail.path,\n // token is auto-fetched in generateCurl\n });\n}\n","/**\n * ErrorButtons - Universal copy buttons for all error types\n *\n * Provides copy functionality for validation, CORS, and network errors\n */\n\n'use client';\n\nimport { Copy, Terminal } from 'lucide-react';\nimport React from 'react';\n\nimport { Button } from '@djangocfg/ui-nextjs';\nimport { useCopy } from '@djangocfg/ui-core/hooks';\n\nimport { generateCurlFromError } from '../utils/curl-generator';\nimport {\n formatCentrifugoErrorForClipboard,\n formatCORSErrorForClipboard,\n formatNetworkErrorForClipboard,\n formatValidationErrorForClipboard\n} from '../utils/formatters';\n\nimport type { ValidationErrorDetail, CORSErrorDetail, NetworkErrorDetail, CentrifugoErrorDetail } from '../types';\nexport interface ErrorButtonsProps {\n detail: ValidationErrorDetail | CORSErrorDetail | NetworkErrorDetail | CentrifugoErrorDetail;\n}\n\n/**\n * Format error for clipboard based on type\n */\nfunction formatErrorForClipboard(detail: ValidationErrorDetail | CORSErrorDetail | NetworkErrorDetail | CentrifugoErrorDetail): string {\n switch (detail.type) {\n case 'validation':\n return formatValidationErrorForClipboard(detail);\n case 'cors':\n return formatCORSErrorForClipboard(detail);\n case 'network':\n return formatNetworkErrorForClipboard(detail);\n case 'centrifugo':\n return formatCentrifugoErrorForClipboard(detail);\n default:\n return JSON.stringify(detail, null, 2);\n }\n}\n\n/**\n * Check if error supports cURL generation\n */\nfunction supportsCurl(detail: ValidationErrorDetail | CORSErrorDetail | NetworkErrorDetail | CentrifugoErrorDetail): boolean {\n return detail.type === 'validation';\n}\n\n/**\n * Universal error buttons\n */\nexport function ErrorButtons({ detail }: ErrorButtonsProps) {\n const { copyToClipboard } = useCopy();\n\n const handleCopyError = async (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const formattedError = formatErrorForClipboard(detail);\n await copyToClipboard(formattedError, '✅ Error details copied');\n };\n\n const handleCopyCurl = async (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (detail.type === 'validation') {\n const curl = generateCurlFromError({\n method: detail.method,\n path: detail.path,\n response: detail.response,\n });\n await copyToClipboard(curl, '✅ cURL command copied');\n }\n };\n\n return (\n <div className=\"flex gap-2 mt-2\">\n <Button\n size=\"sm\"\n variant=\"secondary\"\n onClick={handleCopyError}\n className=\"h-8 text-xs bg-background hover:bg-background/80 text-foreground border border-border gap-1.5\"\n >\n <Copy className=\"h-3.5 w-3.5\" />\n Copy Error\n </Button>\n\n {supportsCurl(detail) && (\n <Button\n size=\"sm\"\n variant=\"secondary\"\n onClick={handleCopyCurl}\n className=\"h-8 text-xs bg-background hover:bg-background/80 text-foreground border border-border gap-1.5\"\n >\n <Terminal className=\"h-3.5 w-3.5\" />\n Copy cURL\n </Button>\n )}\n </div>\n );\n}\n","/**\n * ErrorToast - Universal toast for all error types\n *\n * Formats validation, CORS, and network errors with appropriate styling\n */\n\n'use client';\n\nimport React from 'react';\n\nimport { extractDomain, formatErrorTitle, formatZodIssues } from '../utils/formatters';\nimport { ErrorButtons } from './ErrorButtons';\n\nimport type {\n ValidationErrorDetail,\n CORSErrorDetail,\n NetworkErrorDetail,\n CentrifugoErrorDetail,\n ValidationErrorConfig,\n CORSErrorConfig,\n NetworkErrorConfig,\n CentrifugoErrorConfig,\n} from '../types';\n/**\n * Build validation error description\n */\nfunction buildValidationDescription(\n detail: ValidationErrorDetail,\n config: Required<ValidationErrorConfig>\n): React.ReactNode {\n const descriptionParts: string[] = [];\n\n // Add HTTP method and path\n if (config.showPath) {\n descriptionParts.push(`${detail.method} ${detail.path}`);\n }\n\n // Add error count\n if (config.showErrorCount) {\n const count = detail.error.issues.length;\n const plural = count === 1 ? 'error' : 'errors';\n descriptionParts.push(`${count} ${plural}`);\n }\n\n // Add formatted error messages\n const issuesText = formatZodIssues(detail.error, config.maxIssuesInToast);\n\n return (\n <div className=\"flex flex-col gap-2 text-sm\">\n {descriptionParts.length > 0 && (\n <div className=\"font-mono text-xs opacity-90\">\n {descriptionParts.join(' • ')}\n </div>\n )}\n <div className=\"opacity-90\">{issuesText}</div>\n <ErrorButtons detail={detail} />\n </div>\n );\n}\n\n/**\n * Build CORS error description\n */\nfunction buildCORSDescription(\n detail: CORSErrorDetail,\n config: Required<CORSErrorConfig>\n): React.ReactNode {\n const domain = extractDomain(detail.url);\n const parts: string[] = [];\n\n // Add method and URL info\n if (config.showMethod && config.showUrl) {\n parts.push(`${detail.method} ${detail.url}`);\n } else if (config.showUrl) {\n parts.push(detail.url);\n } else if (config.showMethod) {\n parts.push(`${detail.method} request blocked`);\n }\n\n return (\n <div className=\"flex flex-col gap-2 text-sm\">\n {parts.length > 0 && (\n <div className=\"font-mono text-xs opacity-90\">\n {parts.join(' • ')}\n </div>\n )}\n\n <div className=\"flex flex-col gap-2\">\n <div className=\"font-medium\">Request blocked by CORS policy</div>\n <div className=\"text-xs opacity-75\">\n Check CORS configuration on {domain}\n </div>\n </div>\n\n <ErrorButtons detail={detail} />\n </div>\n );\n}\n\n/**\n * Build network error description\n */\nfunction buildNetworkDescription(\n detail: NetworkErrorDetail,\n config: Required<NetworkErrorConfig>\n): React.ReactNode {\n const parts: string[] = [];\n\n // Add method and URL info\n if (config.showMethod && config.showUrl) {\n parts.push(`${detail.method} ${detail.url}`);\n } else if (config.showUrl) {\n parts.push(detail.url);\n } else if (config.showMethod) {\n parts.push(`${detail.method} request failed`);\n }\n\n // Add status code\n if (config.showStatusCode && detail.statusCode) {\n parts.push(`Status: ${detail.statusCode}`);\n }\n\n return (\n <div className=\"flex flex-col gap-2 text-sm\">\n {parts.length > 0 && (\n <div className=\"font-mono text-xs opacity-90\">\n {parts.join(' • ')}\n </div>\n )}\n\n <div className=\"opacity-90\">{detail.error}</div>\n\n <ErrorButtons detail={detail} />\n </div>\n );\n}\n\n/**\n * Build centrifugo error description\n */\nfunction buildCentrifugoDescription(\n detail: CentrifugoErrorDetail,\n config: Required<CentrifugoErrorConfig>\n): React.ReactNode {\n const parts: string[] = [];\n\n // Add method info\n if (config.showMethod) {\n parts.push(`RPC: ${detail.method}`);\n }\n\n // Add error code\n if (config.showCode && detail.code !== undefined) {\n parts.push(`Code: ${detail.code}`);\n }\n\n return (\n <div className=\"flex flex-col gap-2 text-sm\">\n {parts.length > 0 && (\n <div className=\"font-mono text-xs opacity-90\">\n {parts.join(' • ')}\n </div>\n )}\n\n <div className=\"opacity-90\">{detail.error}</div>\n\n <ErrorButtons detail={detail} />\n </div>\n );\n}\n\n/**\n * Create toast options for any error type\n */\nexport function createErrorToast(\n detail: ValidationErrorDetail | CORSErrorDetail | NetworkErrorDetail | CentrifugoErrorDetail,\n config: Required<ValidationErrorConfig | CORSErrorConfig | NetworkErrorConfig | CentrifugoErrorConfig>\n) {\n let description: React.ReactNode;\n\n // Build description based on error type\n if (detail.type === 'validation') {\n description = buildValidationDescription(detail, config as Required<ValidationErrorConfig>);\n } else if (detail.type === 'cors') {\n description = buildCORSDescription(detail, config as Required<CORSErrorConfig>);\n } else if (detail.type === 'centrifugo') {\n description = buildCentrifugoDescription(detail, config as Required<CentrifugoErrorConfig>);\n } else {\n description = buildNetworkDescription(detail, config as Required<NetworkErrorConfig>);\n }\n\n return {\n title: formatErrorTitle(detail),\n description,\n variant: 'destructive' as const,\n duration: config.duration,\n };\n}\n","/**\n * Error Tracking Types\n *\n * Common types for all error tracking functionality\n */\n\nimport type { ZodError } from 'zod';\n\n/**\n * Base error detail from CustomEvent\n */\nexport interface BaseErrorDetail {\n /** Timestamp of the error */\n timestamp: Date;\n}\n\n/**\n * Validation error detail (from zod-validation-error event)\n */\nexport interface ValidationErrorDetail extends BaseErrorDetail {\n type: 'validation';\n /** Operation/function name that failed validation */\n operation: string;\n /** API endpoint path */\n path: string;\n /** HTTP method */\n method: string;\n /** Zod validation error */\n error: ZodError;\n /** Raw response data that failed validation */\n response: any;\n}\n\n/**\n * CORS error detail (from cors-error event)\n */\nexport interface CORSErrorDetail extends BaseErrorDetail {\n type: 'cors';\n /** API endpoint that was blocked */\n url: string;\n /** HTTP method */\n method: string;\n /** Error message */\n error: string;\n}\n\n/**\n * Network error detail (from network-error event)\n */\nexport interface NetworkErrorDetail extends BaseErrorDetail {\n type: 'network';\n /** API endpoint that failed */\n url: string;\n /** HTTP method */\n method: string;\n /** Error message */\n error: string;\n /** Status code if available */\n statusCode?: number;\n}\n\n/**\n * Centrifugo error detail (from centrifugo-error event)\n */\nexport interface CentrifugoErrorDetail extends BaseErrorDetail {\n type: 'centrifugo';\n /** RPC method that failed */\n method: string;\n /** Error message */\n error: string;\n /** Error code from Centrifugo */\n code?: number;\n /** Additional data sent with the request */\n data?: any;\n}\n\n/**\n * Union type of all error details\n */\nexport type ErrorDetail = ValidationErrorDetail | CORSErrorDetail | NetworkErrorDetail | CentrifugoErrorDetail;\n\n/**\n * Stored error with unique ID\n */\nexport type StoredError<T extends ErrorDetail = ErrorDetail> = T & {\n /** Unique identifier for this error instance */\n id: string;\n};\n\n/**\n * Configuration for specific error type\n */\nexport interface ErrorTypeConfig {\n /**\n * Enable tracking for this error type\n * @default true\n */\n enabled?: boolean;\n\n /**\n * Show toast notifications\n * @default true\n */\n showToast?: boolean;\n\n /**\n * Maximum number of errors to keep in history\n * @default 50\n */\n maxErrors?: number;\n\n /**\n * Toast duration in milliseconds (0 = no auto-dismiss)\n * @default 8000 for validation, 0 for cors/network\n */\n duration?: number;\n}\n\n/**\n * Validation error specific config\n */\nexport interface ValidationErrorConfig extends ErrorTypeConfig {\n /**\n * Show operation name in toast\n * @default true\n */\n showOperation?: boolean;\n\n /**\n * Show endpoint path in toast\n * @default true\n */\n showPath?: boolean;\n\n /**\n * Show error count in toast\n * @default true\n */\n showErrorCount?: boolean;\n\n /**\n * Maximum number of issues to show in toast\n * @default 3\n */\n maxIssuesInToast?: number;\n}\n\n/**\n * CORS error specific config\n */\nexport interface CORSErrorConfig extends ErrorTypeConfig {\n /**\n * Show full URL in toast\n * @default true\n */\n showUrl?: boolean;\n\n /**\n * Show HTTP method in toast\n * @default true\n */\n showMethod?: boolean;\n}\n\n/**\n * Network error specific config\n */\nexport interface NetworkErrorConfig extends ErrorTypeConfig {\n /**\n * Show full URL in toast\n * @default true\n */\n showUrl?: boolean;\n\n /**\n * Show HTTP method in toast\n * @default true\n */\n showMethod?: boolean;\n\n /**\n * Show status code in toast\n * @default true\n */\n showStatusCode?: boolean;\n}\n\n/**\n * Centrifugo error specific config\n */\nexport interface CentrifugoErrorConfig extends ErrorTypeConfig {\n /**\n * Show RPC method in toast\n * @default true\n */\n showMethod?: boolean;\n\n /**\n * Show error code in toast\n * @default true\n */\n showCode?: boolean;\n}\n\n/**\n * Complete error tracking configuration\n */\nexport interface ErrorTrackingConfig {\n /**\n * Validation error tracking configuration\n */\n validation?: ValidationErrorConfig;\n\n /**\n * CORS error tracking configuration\n */\n cors?: CORSErrorConfig;\n\n /**\n * Network error tracking configuration\n */\n network?: NetworkErrorConfig;\n\n /**\n * Centrifugo error tracking configuration\n */\n centrifugo?: CentrifugoErrorConfig;\n\n /**\n * Custom error handler (called before toast for all errors)\n * Return false to prevent default toast notification\n */\n onError?: (error: ErrorDetail) => boolean | void;\n}\n\n/**\n * Error tracking context value\n */\nexport interface ErrorTrackingContextValue {\n /** All errors */\n errors: StoredError[];\n\n /** Validation errors only */\n validationErrors: StoredError<ValidationErrorDetail>[];\n\n /** CORS errors only */\n corsErrors: StoredError<CORSErrorDetail>[];\n\n /** Network errors only */\n networkErrors: StoredError<NetworkErrorDetail>[];\n\n /** Centrifugo errors only */\n centrifugoErrors: StoredError<CentrifugoErrorDetail>[];\n\n /** Clear all errors */\n clearErrors: () => void;\n\n /** Clear errors by type */\n clearErrorsByType: (type: 'validation' | 'cors' | 'network' | 'centrifugo') => void;\n\n /** Clear specific error by ID */\n clearError: (id: string) => void;\n\n /** Get error count */\n errorCount: number;\n\n /** Get latest error */\n latestError: StoredError | null;\n\n /** Configuration */\n config: {\n validation: Required<ValidationErrorConfig>;\n cors: Required<CORSErrorConfig>;\n network: Required<NetworkErrorConfig>;\n centrifugo: Required<CentrifugoErrorConfig>;\n };\n}\n\n/**\n * Event names for error tracking\n */\nexport const ERROR_EVENTS = {\n VALIDATION: 'zod-validation-error',\n CORS: 'cors-error',\n NETWORK: 'network-error',\n /** Unified Centrifugo event - filter by detail.type === 'error' */\n CENTRIFUGO: 'centrifugo',\n} as const;\n\n/**\n * Default configurations\n */\nexport const DEFAULT_ERROR_CONFIG: Required<ErrorTypeConfig> = {\n enabled: true,\n showToast: true,\n maxErrors: 50,\n duration: 8000,\n};\n\nexport const DEFAULT_VALIDATION_CONFIG: Required<ValidationErrorConfig> = {\n ...DEFAULT_ERROR_CONFIG,\n showOperation: true,\n showPath: true,\n showErrorCount: true,\n maxIssuesInToast: 3,\n};\n\nexport const DEFAULT_CORS_CONFIG: Required<CORSErrorConfig> = {\n ...DEFAULT_ERROR_CONFIG,\n duration: 0, // Don't auto-dismiss CORS errors\n showUrl: true,\n showMethod: true,\n};\n\nexport const DEFAULT_NETWORK_CONFIG: Required<NetworkErrorConfig> = {\n ...DEFAULT_ERROR_CONFIG,\n duration: 0, // Don't auto-dismiss network errors\n showUrl: true,\n showMethod: true,\n showStatusCode: true,\n};\n\nexport const DEFAULT_CENTRIFUGO_CONFIG: Required<CentrifugoErrorConfig> = {\n ...DEFAULT_ERROR_CONFIG,\n duration: 0, // Don't auto-dismiss centrifugo errors\n showMethod: true,\n showCode: true,\n};\n","/**\n * ErrorTrackingProvider - Universal error tracking\n *\n * Single provider that tracks all error types:\n * - Validation errors (Zod)\n * - CORS errors\n * - Network errors\n *\n * @example\n * ```tsx\n * // Default - all enabled\n * <ErrorTrackingProvider>\n * <App />\n * </ErrorTrackingProvider>\n *\n * // Custom configuration\n * <ErrorTrackingProvider\n * validation={{ showToast: true, maxErrors: 100 }}\n * cors={{ enabled: true }}\n * network={{ enabled: false }}\n * >\n * <App />\n * </ErrorTrackingProvider>\n * ```\n */\n\n'use client';\n\nimport React, {\n createContext, ReactNode, useCallback, useContext, useEffect, useState\n} from 'react';\n\nimport { toast } from '@djangocfg/ui-core/hooks';\n\nimport { createErrorToast } from '../components/ErrorToast';\nimport {\n DEFAULT_CENTRIFUGO_CONFIG,\n DEFAULT_CORS_CONFIG,\n DEFAULT_NETWORK_CONFIG,\n DEFAULT_VALIDATION_CONFIG,\n ERROR_EVENTS\n} from '../types';\n\nimport type {\n ErrorDetail,\n StoredError,\n ErrorTrackingConfig,\n ValidationErrorConfig,\n CORSErrorConfig,\n NetworkErrorConfig,\n CentrifugoErrorConfig,\n ValidationErrorDetail,\n CORSErrorDetail,\n NetworkErrorDetail,\n CentrifugoErrorDetail,\n ErrorTrackingContextValue,\n} from '../types';\nconst ErrorTrackingContext = createContext<ErrorTrackingContextValue | undefined>(undefined);\n\n/**\n * Generate unique ID for error\n */\nlet errorIdCounter = 0;\nfunction generateErrorId(type: string): string {\n return `${type}-error-${Date.now()}-${++errorIdCounter}`;\n}\n\nexport interface ErrorTrackingProviderProps {\n children: ReactNode;\n validation?: Partial<ValidationErrorConfig>;\n cors?: Partial<CORSErrorConfig>;\n network?: Partial<NetworkErrorConfig>;\n centrifugo?: Partial<CentrifugoErrorConfig>;\n onError?: (error: ErrorDetail) => boolean | void;\n}\n\n/**\n * Universal Error Tracking Provider\n *\n * Tracks all error types with a single provider\n */\nexport function ErrorTrackingProvider({\n children,\n validation: userValidationConfig,\n cors: userCorsConfig,\n network: userNetworkConfig,\n centrifugo: userCentrifugoConfig,\n onError,\n}: ErrorTrackingProviderProps) {\n const [errors, setErrors] = useState<StoredError[]>([]);\n\n // Merge user configs with defaults\n const validationConfig: Required<ValidationErrorConfig> = {\n ...DEFAULT_VALIDATION_CONFIG,\n ...userValidationConfig,\n };\n\n const corsConfig: Required<CORSErrorConfig> = {\n ...DEFAULT_CORS_CONFIG,\n ...userCorsConfig,\n };\n\n const networkConfig: Required<NetworkErrorConfig> = {\n ...DEFAULT_NETWORK_CONFIG,\n ...userNetworkConfig,\n };\n\n const centrifugoConfig: Required<CentrifugoErrorConfig> = {\n ...DEFAULT_CENTRIFUGO_CONFIG,\n ...userCentrifugoConfig,\n };\n\n /**\n * Clear all errors\n */\n const clearErrors = useCallback(() => {\n setErrors([]);\n }, []);\n\n /**\n * Clear errors by type\n */\n const clearErrorsByType = useCallback((type: 'validation' | 'cors' | 'network') => {\n setErrors((prev) => prev.filter((error) => error.type !== type));\n }, []);\n\n /**\n * Clear specific error\n */\n const clearError = useCallback((id: string) => {\n setErrors((prev) => prev.filter((error) => error.id !== id));\n }, []);\n\n /**\n * Handle any error event\n */\n const handleError = useCallback(\n (detail: ErrorDetail, config: Required<ValidationErrorConfig | CORSErrorConfig | NetworkErrorConfig | CentrifugoErrorConfig>) => {\n // Create stored error with ID\n const storedError: StoredError = {\n ...detail,\n id: generateErrorId(detail.type),\n };\n\n // Add to errors array (limited by maxErrors)\n setErrors((prev) => {\n const updated = [storedError, ...prev];\n return updated.slice(0, config.maxErrors);\n });\n\n // Call custom error handler\n const shouldShowToast = onError?.(detail) !== false;\n\n // Show toast notification using Sonner\n if (config.showToast && shouldShowToast) {\n const toastOptions = createErrorToast(detail, config);\n toast.error(toastOptions.title, {\n description: toastOptions.description,\n duration: toastOptions.duration,\n });\n }\n },\n [onError]\n );\n\n /**\n * Setup event listeners\n */\n useEffect(() => {\n // Only run in browser\n if (typeof window === 'undefined') return;\n\n const handlers: Array<{ event: string; handler: (e: Event) => void }> = [];\n\n // Validation errors\n if (validationConfig.enabled) {\n const handler = (event: Event) => {\n if (!(event instanceof CustomEvent)) return;\n const detail: ValidationErrorDetail = {\n ...event.detail,\n type: 'validation' as const,\n };\n handleError(detail, validationConfig);\n };\n window.addEventListener(ERROR_EVENTS.VALIDATION, handler);\n handlers.push({ event: ERROR_EVENTS.VALIDATION, handler });\n }\n\n // CORS errors\n if (corsConfig.enabled) {\n const handler = (event: Event) => {\n if (!(event instanceof CustomEvent)) return;\n const detail: CORSErrorDetail = {\n ...event.detail,\n type: 'cors' as const,\n };\n handleError(detail, corsConfig);\n };\n window.addEventListener(ERROR_EVENTS.CORS, handler);\n handlers.push({ event: ERROR_EVENTS.CORS, handler });\n }\n\n // Network errors\n if (networkConfig.enabled) {\n const handler = (event: Event) => {\n if (!(event instanceof CustomEvent)) return;\n const detail: NetworkErrorDetail = {\n ...event.detail,\n type: 'network' as const,\n };\n handleError(detail, networkConfig);\n };\n window.addEventListener(ERROR_EVENTS.NETWORK, handler);\n handlers.push({ event: ERROR_EVENTS.NETWORK, handler });\n }\n\n // Centrifugo errors (unified event with type discriminator)\n if (centrifugoConfig.enabled) {\n const handler = (event: Event) => {\n if (!(event instanceof CustomEvent)) return;\n // Filter: only handle 'error' type from unified centrifugo event\n if (event.detail?.type !== 'error') return;\n const detail: CentrifugoErrorDetail = {\n type: 'centrifugo' as const,\n method: event.detail.data?.method || 'unknown',\n error: event.detail.data?.error || 'Unknown error',\n code: event.detail.data?.code,\n data: event.detail.data?.data,\n timestamp: event.detail.timestamp || new Date(),\n };\n handleError(detail, centrifugoConfig);\n };\n window.addEventListener(ERROR_EVENTS.CENTRIFUGO, handler);\n handlers.push({ event: ERROR_EVENTS.CENTRIFUGO, handler });\n }\n\n // Cleanup\n return () => {\n handlers.forEach(({ event, handler }) => {\n window.removeEventListener(event, handler);\n });\n };\n }, [handleError, validationConfig, corsConfig, networkConfig, centrifugoConfig]);\n\n // Filter errors by type\n const validationErrors = errors.filter((e) => e.type === 'validation') as StoredError<ValidationErrorDetail>[];\n const corsErrors = errors.filter((e) => e.type === 'cors') as StoredError<CORSErrorDetail>[];\n const networkErrors = errors.filter((e) => e.type === 'network') as StoredError<NetworkErrorDetail>[];\n const centrifugoErrors = errors.filter((e) => e.type === 'centrifugo') as StoredError<CentrifugoErrorDetail>[];\n\n const value: ErrorTrackingContextValue = {\n errors,\n validationErrors,\n corsErrors,\n networkErrors,\n centrifugoErrors,\n clearErrors,\n clearErrorsByType,\n clearError,\n errorCount: errors.length,\n latestError: errors[0] || null,\n config: {\n validation: validationConfig,\n cors: corsConfig,\n network: networkConfig,\n centrifugo: centrifugoConfig,\n },\n };\n\n return (\n <ErrorTrackingContext.Provider value={value}>\n {children}\n </ErrorTrackingContext.Provider>\n );\n}\n\n/**\n * useErrors Hook\n *\n * Access errors from any component\n *\n * @example\n * ```tsx\n * function ErrorPanel() {\n * const { errors, validationErrors, clearErrors } = useErrors();\n *\n * return (\n * <div>\n * <h3>Errors ({errors.length})</h3>\n * <h4>Validation: {validationErrors.length}</h4>\n * <button onClick={clearErrors}>Clear All</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useErrors(): ErrorTrackingContextValue {\n const context = useContext(ErrorTrackingContext);\n\n if (context === undefined) {\n throw new Error('useErrors must be used within ErrorTrackingProvider');\n }\n\n return context;\n}\n","/**\n * useAnalytics Hook\n *\n * Provides Google Analytics tracking via react-ga4\n * Automatically tracks page views on route changes\n * Only works in production mode\n */\n\n'use client';\n\nimport { usePathname } from 'next/navigation';\nimport { useEffect } from 'react';\nimport ReactGA from 'react-ga4';\n\nimport { useAuth } from '@djangocfg/api/auth';\n\n// Check if we're in production\nconst isProduction = process.env.NODE_ENV === 'production';\n\n// Tracking state\nlet isInitialized = false;\nlet currentTrackingId: string | undefined;\n\n/**\n * Analytics utility object for standalone usage (outside React components)\n *\n * @example\n * ```ts\n * import { Analytics } from '@djangocfg/layouts';\n *\n * // In an event handler or utility function\n * Analytics.event('button_click', { category: 'engagement', label: 'signup' });\n * ```\n */\nexport const Analytics = {\n /**\n * Initialize Google Analytics (called automatically by useAnalytics hook)\n */\n init: (trackingId: string) => {\n if (!isProduction || !trackingId || isInitialized) return;\n ReactGA.initialize(trackingId);\n isInitialized = true;\n currentTrackingId = trackingId;\n },\n\n /**\n * Check if Analytics is enabled and initialized\n */\n isEnabled: () => isProduction && isInitialized,\n\n /**\n * Track a page view\n */\n pageview: (path: string) => {\n if (!Analytics.isEnabled()) return;\n ReactGA.send({ hitType: 'pageview', page: path });\n },\n\n /**\n * Track a custom event\n * @param name - Event name (action)\n * @param params - Optional event parameters\n */\n event: (name: string, params: Record<string, any> = {}) => {\n if (!Analytics.isEnabled()) return;\n ReactGA.event(name, params);\n },\n\n /**\n * Set user ID for tracking\n */\n setUser: (userId: string) => {\n if (!Analytics.isEnabled()) return;\n ReactGA.set({ user_id: userId });\n },\n\n /**\n * Set custom dimensions/metrics\n */\n set: (fieldsObject: Record<string, any>) => {\n if (!Analytics.isEnabled()) return;\n ReactGA.set(fieldsObject);\n },\n};\n\n/**\n * Hook for Google Analytics tracking via react-ga4\n *\n * Automatically initializes GA and tracks page views on route changes\n * Only works in production mode (NODE_ENV === 'production')\n *\n * @example\n * ```tsx\n * // Just call the hook - it auto-tracks pageviews\n * useAnalytics();\n *\n * // Or use the returned methods for custom tracking\n * const { event, isEnabled } = useAnalytics();\n * event('button_click', { category: 'engagement', label: 'signup' });\n * ```\n */\nexport function useAnalytics(trackingIdProp?: string) {\n const pathname = usePathname();\n const { user, isAuthenticated } = useAuth();\n\n // Use trackingId from prop (passed from AppLayout)\n const trackingId = trackingIdProp;\n const isEnabled = isProduction && Boolean(trackingId);\n\n // Initialize GA4\n useEffect(() => {\n if (!isEnabled || !trackingId) return;\n Analytics.init(trackingId);\n }, [isEnabled, trackingId]);\n\n // Auto-set user ID when authenticated\n useEffect(() => {\n if (!isEnabled || !isAuthenticated || !user?.id) return;\n Analytics.setUser(String(user.id));\n }, [isEnabled, isAuthenticated, user?.id]);\n\n // Auto-track page views on route change (App Router)\n useEffect(() => {\n if (!isEnabled || typeof window === 'undefined') return;\n\n // Track page view when pathname changes\n const url = pathname + (window.location.search || '');\n Analytics.pageview(url);\n }, [pathname, isEnabled]);\n\n return {\n isEnabled,\n trackingId,\n pageview: Analytics.pageview,\n event: Analytics.event,\n setUser: Analytics.setUser,\n set: Analytics.set,\n };\n}\n\nexport default useAnalytics;\n","/**\n * AnalyticsProvider Component\n *\n * Initializes Google Analytics and auto-tracks pageviews.\n * Can work standalone with trackingId prop, or use AppContext if available.\n */\n\n'use client';\n\nimport { ReactNode } from 'react';\n\nimport { useAnalytics } from './useAnalytics';\n\ninterface AnalyticsProviderProps {\n children: ReactNode;\n /** Google Analytics tracking ID (optional if using AppContext) */\n trackingId?: string;\n}\n\n/**\n * Analytics Provider that initializes tracking\n * Automatically:\n * - Initializes GA4 with tracking ID from prop or config\n * - Sets user ID when authenticated\n * - Tracks page views on route changes\n */\nexport function AnalyticsProvider({ children, trackingId }: AnalyticsProviderProps) {\n // If trackingId is provided as prop, use it directly\n // Otherwise, useAnalytics will try to get it from AppContext\n useAnalytics(trackingId);\n return <>{children}</>;\n}\n\nexport default AnalyticsProvider;\n","'use client';\n\nimport { LogIn } from 'lucide-react';\nimport React, { useState } from 'react';\n\nimport {\n Button, Dialog, DialogContent, DialogHeader, DialogTitle\n} from '@djangocfg/ui-nextjs/components';\nimport { useCfgRouter, useEventListener } from '@djangocfg/ui-nextjs/hooks';\n\n// Re-export events for backwards compatibility\nexport const DIALOG_EVENTS = {\n OPEN_AUTH_DIALOG: 'OPEN_AUTH_DIALOG',\n CLOSE_AUTH_DIALOG: 'CLOSE_AUTH_DIALOG',\n AUTH_SUCCESS: 'AUTH_SUCCESS',\n AUTH_FAILURE: 'AUTH_FAILURE',\n} as const;\n\ninterface AuthDialogProps {\n onAuthRequired?: () => void;\n authPath?: string;\n}\n\nexport const AuthDialog: React.FC<AuthDialogProps> = ({\n onAuthRequired,\n authPath = '/auth'\n}) => {\n const [open, setOpen] = useState(false);\n const [message, setMessage] = useState<string>('Please sign in to continue');\n const router = useCfgRouter();\n\n // Listen for open auth dialog event\n useEventListener(DIALOG_EVENTS.OPEN_AUTH_DIALOG, (payload: any) => {\n if (payload?.message) {\n setMessage(payload.message);\n }\n setOpen(true);\n });\n\n // Listen for close auth dialog event\n useEventListener(DIALOG_EVENTS.CLOSE_AUTH_DIALOG, () => {\n setOpen(false);\n });\n\n const handleClose = () => {\n setMessage('Please sign in to continue');\n setOpen(false);\n };\n\n const handleGoToAuth = () => {\n // Save current URL for redirect after successful auth\n if (typeof window !== 'undefined') {\n sessionStorage.setItem('redirectAfterAuth', window.location.pathname);\n }\n\n if (onAuthRequired) {\n onAuthRequired();\n } else {\n router.push(authPath);\n }\n\n handleClose();\n };\n\n return (\n <Dialog open={open} onOpenChange={handleClose}>\n <DialogContent className=\"max-w-sm\">\n <DialogHeader>\n <DialogTitle>Authentication Required</DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <p className=\"text-sm text-muted-foreground\">{message}</p>\n\n <Button onClick={handleGoToAuth} className=\"w-full\">\n <LogIn className=\"h-4 w-4 mr-2\" />\n Go to Sign In\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n","export const AUTH_EVENTS = {\n OPEN_AUTH_DIALOG: 'OPEN_AUTH_DIALOG',\n CLOSE_AUTH_DIALOG: 'CLOSE_AUTH_DIALOG',\n AUTH_SUCCESS: 'AUTH_SUCCESS',\n AUTH_FAILURE: 'AUTH_FAILURE',\n} as const;\n\nexport type AuthEventType = typeof AUTH_EVENTS[keyof typeof AUTH_EVENTS];\n\nexport interface OpenAuthDialogPayload {\n message?: string;\n redirectUrl?: string;\n}\n\nexport interface AuthSuccessPayload {\n user?: any;\n}\n\nexport interface AuthFailurePayload {\n error?: string;\n}\n","\"use client\"\n\nimport { useCallback } from 'react';\n\nimport { events } from '@djangocfg/ui-core/hooks';\n\nimport { AUTH_EVENTS, OpenAuthDialogPayload} from './events';\n\n/**\n * Hook to control auth dialog from anywhere in the app\n */\nexport function useAuthDialog() {\n const openAuthDialog = useCallback((options?: OpenAuthDialogPayload) => {\n events.publish({\n type: AUTH_EVENTS.OPEN_AUTH_DIALOG,\n payload: options,\n });\n }, []);\n\n const closeAuthDialog = useCallback(() => {\n events.publish({\n type: AUTH_EVENTS.CLOSE_AUTH_DIALOG,\n });\n }, []);\n\n return {\n openAuthDialog,\n closeAuthDialog,\n };\n}\n","/**\n * PWA Logger with Conditional Logging\n *\n * Provides logging utilities that respect environment and debug settings:\n * - In production: Only errors are logged\n * - In development: All levels are logged\n * - Debug mode: Can be enabled in production via localStorage\n *\n * @example\n * ```typescript\n * import { pwaLogger } from '../utils/logger';\n *\n * pwaLogger.info('Info message'); // Only in dev\n * pwaLogger.warn('Warning message'); // Only in dev\n * pwaLogger.error('Error message'); // Always logged\n * pwaLogger.debug('Debug message'); // Only when debug enabled\n * ```\n *\n * Enable debug mode in production:\n * ```typescript\n * import { enablePWADebug } from '../utils/logger';\n * enablePWADebug();\n * // or in console:\n * localStorage.setItem('pwa_debug', 'true');\n * ```\n */\n\nimport { consola } from 'consola';\n\nconst isDevelopment = process.env.NODE_ENV === 'development';\n\n/**\n * Check if debug mode is enabled via localStorage\n */\nfunction isDebugEnabled(): boolean {\n if (typeof window === 'undefined') return false;\n try {\n return localStorage.getItem('pwa_debug') === 'true';\n } catch {\n return false;\n }\n}\n\n/**\n * PWA Logger instance with conditional logging\n */\nexport const pwaLogger = {\n /**\n * Info level logging\n * Only logs in development or when debug is enabled\n */\n info: (...args: Parameters<typeof consola.info>): void => {\n if (isDevelopment || isDebugEnabled()) {\n consola.info(...args);\n }\n },\n\n /**\n * Warning level logging\n * Only logs in development or when debug is enabled\n */\n warn: (...args: Parameters<typeof consola.warn>): void => {\n if (isDevelopment || isDebugEnabled()) {\n consola.warn(...args);\n }\n },\n\n /**\n * Error level logging\n * Always logs (production + development)\n */\n error: (...args: Parameters<typeof consola.error>): void => {\n consola.error(...args);\n },\n\n /**\n * Debug level logging\n * Only logs when debug is explicitly enabled\n */\n debug: (...args: Parameters<typeof consola.debug>): void => {\n if (isDebugEnabled()) {\n consola.debug(...args);\n }\n },\n\n /**\n * Success level logging\n * Only logs in development or when debug is enabled\n */\n success: (...args: Parameters<typeof consola.success>): void => {\n if (isDevelopment || isDebugEnabled()) {\n consola.success(...args);\n }\n },\n};\n\n/**\n * Enable debug mode\n *\n * This allows seeing debug logs in production.\n * Call this function or set localStorage manually:\n * `localStorage.setItem('pwa_debug', 'true')`\n *\n * @example\n * ```typescript\n * import { enablePWADebug } from '@djangocfg/layouts/snippets';\n * enablePWADebug();\n * // Reload page to see debug logs\n * ```\n */\nexport function enablePWADebug(): void {\n if (typeof window !== 'undefined') {\n try {\n localStorage.setItem('pwa_debug', 'true');\n consola.info('[PWA] Debug mode enabled. Reload page to see debug logs.');\n } catch (e) {\n consola.error('[PWA] Failed to enable debug mode:', e);\n }\n }\n}\n\n/**\n * Disable debug mode\n *\n * @example\n * ```typescript\n * import { disablePWADebug } from '@djangocfg/layouts/snippets';\n * disablePWADebug();\n * ```\n */\nexport function disablePWADebug(): void {\n if (typeof window !== 'undefined') {\n try {\n localStorage.removeItem('pwa_debug');\n consola.info('[PWA] Debug mode disabled.');\n } catch (e) {\n consola.error('[PWA] Failed to disable debug mode:', e);\n }\n }\n}\n\n/**\n * Check if debug mode is currently active\n *\n * @returns true if debug mode is enabled\n */\nexport function isPWADebugEnabled(): boolean {\n return isDebugEnabled();\n}\n","/**\n * Platform Detection Utilities\n *\n * Centralized utilities for detecting PWA state, platform, and capabilities.\n * Used by hooks to avoid code duplication.\n */\n\n// ============================================================================\n// Browser Push Support Detection\n// ============================================================================\n\n/**\n * List of browsers/contexts known to NOT support Web Push Notifications\n */\nexport interface BrowserPushSupport {\n isSupported: boolean;\n browserName: string;\n reason?: string;\n}\n\n/**\n * Check if the current browser supports Web Push Notifications\n *\n * This checks for browsers that are known to NOT support push notifications:\n * - Opera Mini (no service worker support)\n * - Internet Explorer (deprecated, no Push API)\n * - UC Browser (unreliable push support)\n * - In-App browsers (Facebook, Instagram, TikTok, Snapchat, WeChat, etc.)\n * - Generic WebViews\n *\n * Note: Comet (Perplexity) is Chromium-based and DOES support push notifications.\n *\n * @returns Object with isSupported flag, browserName, and optional reason\n *\n * @example\n * ```typescript\n * const { isSupported, browserName, reason } = checkBrowserPushSupport();\n * if (!isSupported) {\n * console.log(`Push not supported in ${browserName}: ${reason}`);\n * }\n * ```\n */\nexport function checkBrowserPushSupport(): BrowserPushSupport {\n if (typeof window === 'undefined') {\n return { isSupported: false, browserName: 'unknown', reason: 'Server-side rendering' };\n }\n\n const ua = window.navigator.userAgent.toLowerCase();\n\n // ============================================================================\n // In-App Browsers (WebViews) - typically do NOT support push\n // ============================================================================\n\n // Facebook In-App Browser\n if (ua.includes('fban') || ua.includes('fbav') || ua.includes('fb_iab')) {\n return { isSupported: false, browserName: 'Facebook In-App', reason: 'In-app browsers do not support push notifications' };\n }\n\n // Instagram In-App Browser\n if (ua.includes('instagram')) {\n return { isSupported: false, browserName: 'Instagram In-App', reason: 'In-app browsers do not support push notifications' };\n }\n\n // TikTok In-App Browser\n if (ua.includes('tiktok') || ua.includes('bytedancewebview') || ua.includes('bytelocale')) {\n return { isSupported: false, browserName: 'TikTok In-App', reason: 'In-app browsers do not support push notifications' };\n }\n\n // Snapchat In-App Browser\n if (ua.includes('snapchat')) {\n return { isSupported: false, browserName: 'Snapchat In-App', reason: 'In-app browsers do not support push notifications' };\n }\n\n // WeChat In-App Browser\n if (ua.includes('micromessenger')) {\n return { isSupported: false, browserName: 'WeChat In-App', reason: 'In-app browsers do not support push notifications' };\n }\n\n // Threads In-App Browser (Meta's app - codename Barcelona)\n if (ua.includes('barcelona')) {\n return { isSupported: false, browserName: 'Threads In-App', reason: 'In-app browsers do not support push notifications' };\n }\n\n // Pinterest In-App Browser\n if (ua.includes('pinterest')) {\n return { isSupported: false, browserName: 'Pinterest In-App', reason: 'In-app browsers do not support push notifications' };\n }\n\n // Telegram In-App Browser\n if (ua.includes('telegram')) {\n return { isSupported: false, browserName: 'Telegram In-App', reason: 'In-app browsers do not support push notifications' };\n }\n\n // Line In-App Browser\n if (ua.includes('line/')) {\n return { isSupported: false, browserName: 'Line In-App', reason: 'In-app browsers do not support push notifications' };\n }\n\n // KakaoTalk In-App Browser\n if (ua.includes('kakaotalk')) {\n return { isSupported: false, browserName: 'KakaoTalk In-App', reason: 'In-app browsers do not support push notifications' };\n }\n\n // Note: Twitter and LinkedIn In-App on Android use Chrome WebView and DO support push\n // We don't block them here\n const isIOSDevice = ua.includes('iphone') || ua.includes('ipad') || ua.includes('ipod');\n\n // LinkedIn In-App on iOS - no push\n if (ua.includes('linkedinapp') && isIOSDevice) {\n return { isSupported: false, browserName: 'LinkedIn In-App', reason: 'LinkedIn In-App on iOS does not support push notifications' };\n }\n\n // Twitter In-App on iOS - no push\n if (ua.includes('twitter') && isIOSDevice) {\n return { isSupported: false, browserName: 'Twitter In-App', reason: 'Twitter In-App on iOS does not support push notifications' };\n }\n\n // ============================================================================\n // Browsers without Push Support\n // ============================================================================\n\n // Note: Comet Browser (Perplexity) is Chromium-based and DOES support push\n\n // Opera Mini\n if (ua.includes('opera mini') || ua.includes('opios')) {\n return { isSupported: false, browserName: 'Opera Mini', reason: 'Opera Mini does not support service workers' };\n }\n\n // Internet Explorer\n if (ua.includes('msie') || ua.includes('trident/')) {\n return { isSupported: false, browserName: 'Internet Explorer', reason: 'Internet Explorer does not support Push API' };\n }\n\n // UC Browser (unreliable support)\n if (ua.includes('ucbrowser') || ua.includes('uc browser')) {\n return { isSupported: false, browserName: 'UC Browser', reason: 'UC Browser has unreliable push notification support' };\n }\n\n // ============================================================================\n // Generic WebView Detection\n // ============================================================================\n\n const isWebView = ua.includes('wv)') ||\n ua.includes('webview') ||\n ua.includes('; wv') ||\n (ua.includes('iphone') && !ua.includes('safari')) ||\n (ua.includes('ipad') && !ua.includes('safari'));\n\n if (isWebView) {\n return { isSupported: false, browserName: 'WebView', reason: 'WebViews do not support push notifications' };\n }\n\n // ============================================================================\n // Determine Browser Name for supported browsers\n // ============================================================================\n\n let browserName = 'unknown';\n\n if (ua.includes('comet') || ua.includes('perplexity')) browserName = 'Comet';\n else if (ua.includes('edg/') || ua.includes('edge/')) browserName = 'Edge';\n else if ((window.navigator as any).brave) browserName = 'Brave';\n else if (ua.includes('arc/')) browserName = 'Arc';\n else if (ua.includes('vivaldi')) browserName = 'Vivaldi';\n else if (ua.includes('yabrowser')) browserName = 'Yandex';\n else if (ua.includes('samsungbrowser')) browserName = 'Samsung Internet';\n else if (ua.includes('opr/') || ua.includes('opera')) browserName = 'Opera';\n else if (ua.includes('firefox')) browserName = 'Firefox';\n else if (ua.includes('chrome')) browserName = 'Chrome';\n else if (ua.includes('safari') && ua.includes('version/')) browserName = 'Safari';\n\n return { isSupported: true, browserName };\n}\n\n/**\n * Quick check if push notifications are supported by the browser\n *\n * @returns true if browser supports push notifications\n */\nexport function isBrowserPushSupported(): boolean {\n return checkBrowserPushSupport().isSupported;\n}\n\n/**\n * Check if running as PWA (standalone mode)\n *\n * Checks if the app is running in standalone mode (added to home screen).\n * This is the primary indicator that a PWA has been installed.\n *\n * @returns true if app is running in standalone mode\n *\n * @example\n * ```typescript\n * if (isStandalone()) {\n * console.log('Running as PWA');\n * }\n * ```\n */\nexport function isStandalone(): boolean {\n if (typeof window === 'undefined') return false;\n\n // Fallback for older browsers without matchMedia\n if (!window.matchMedia) {\n // Use legacy iOS check only\n const nav = navigator as Navigator & { standalone?: boolean };\n return nav.standalone === true;\n }\n\n // Check display-mode media query (modern approach)\n const isStandaloneDisplay = window.matchMedia('(display-mode: standalone)').matches;\n\n // Legacy iOS check (navigator.standalone)\n const nav = navigator as Navigator & { standalone?: boolean };\n const isStandaloneNavigator = nav.standalone === true;\n\n return isStandaloneDisplay || isStandaloneNavigator;\n}\n\n/**\n * Check if device is mobile\n *\n * @returns true if device is mobile (iOS, Android, etc.)\n */\nexport function isMobileDevice(): boolean {\n if (typeof window === 'undefined') return false;\n return /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);\n}\n\n/**\n * Check if web app manifest exists and is valid\n *\n * @returns true if manifest link exists in document head\n */\nexport function hasValidManifest(): boolean {\n if (typeof document === 'undefined') return false;\n const manifestLink = document.querySelector('link[rel=\"manifest\"]');\n return !!manifestLink;\n}\n\n/**\n * Reliable check for PWA mode with edge case handling\n *\n * This function provides additional validation for desktop browsers\n * to avoid false positives (e.g., Safari macOS \"Add to Dock\").\n *\n * For mobile devices, standard standalone check is sufficient.\n * For desktop, additionally validates that a manifest exists.\n *\n * @returns true if app is running as a genuine PWA\n *\n * @example\n * ```typescript\n * // Use this for more reliable detection\n * if (isStandaloneReliable()) {\n * console.log('Definitely running as PWA');\n * }\n * ```\n */\nexport function isStandaloneReliable(): boolean {\n const standalone = isStandalone();\n if (!standalone) return false;\n\n // For mobile devices, standalone check is sufficient\n if (isMobileDevice()) return true;\n\n // For desktop browsers, additionally check for valid manifest\n // This prevents false positives like Safari macOS \"Add to Dock\"\n return hasValidManifest();\n}\n\n/**\n * Get display mode from media query\n *\n * @returns Current display mode: 'standalone', 'fullscreen', 'minimal-ui', or 'browser'\n */\nexport function getDisplayMode(): 'standalone' | 'fullscreen' | 'minimal-ui' | 'browser' {\n if (typeof window === 'undefined') return 'browser';\n\n if (!window.matchMedia) return 'browser';\n\n const modes: Array<'standalone' | 'fullscreen' | 'minimal-ui'> = [\n 'fullscreen',\n 'standalone',\n 'minimal-ui',\n ];\n\n for (const mode of modes) {\n if (window.matchMedia(`(display-mode: ${mode})`).matches) {\n return mode;\n }\n }\n\n return 'browser';\n}\n\n/**\n * Create a media query listener for display-mode changes\n *\n * @param callback - Function to call when display mode changes\n * @returns Cleanup function to remove listener\n *\n * @example\n * ```typescript\n * const cleanup = onDisplayModeChange((isStandalone) => {\n * console.log('Display mode changed:', isStandalone);\n * });\n *\n * // Later: cleanup();\n * ```\n */\nexport function onDisplayModeChange(callback: (isStandalone: boolean) => void): () => void {\n if (typeof window === 'undefined' || !window.matchMedia) {\n return () => {}; // No-op cleanup\n }\n\n const mediaQuery = window.matchMedia('(display-mode: standalone)');\n\n const handleChange = (e: MediaQueryListEvent) => {\n callback(e.matches);\n };\n\n mediaQuery.addEventListener('change', handleChange);\n\n return () => {\n mediaQuery.removeEventListener('change', handleChange);\n };\n}\n","/**\n * VAPID Key Utilities\n *\n * Provides validation and conversion utilities for VAPID public keys\n * used in push notification subscriptions.\n *\n * VAPID keys must be:\n * - Base64url encoded\n * - 65 bytes after decoding (P-256 uncompressed public key)\n * - Start with 0x04 (uncompressed point indicator)\n */\n\n/**\n * Custom error class for VAPID key validation failures\n */\nexport class VapidKeyError extends Error {\n constructor(\n message: string,\n public readonly code: VapidKeyErrorCode\n ) {\n super(message);\n this.name = 'VapidKeyError';\n }\n}\n\n/**\n * Error codes for VAPID key validation\n */\nexport type VapidKeyErrorCode =\n | 'VAPID_EMPTY'\n | 'VAPID_INVALID_TYPE'\n | 'VAPID_INVALID_BASE64'\n | 'VAPID_INVALID_LENGTH'\n | 'VAPID_INVALID_FORMAT';\n\n/**\n * Convert base64url VAPID public key to Uint8Array\n *\n * Validates and converts a VAPID public key from base64url format\n * to Uint8Array for use with PushManager.subscribe().\n *\n * @param base64String - VAPID public key in base64url format\n * @returns Uint8Array ready for pushManager.subscribe()\n * @throws VapidKeyError if key is invalid\n *\n * @example\n * ```typescript\n * try {\n * const key = urlBase64ToUint8Array(process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY);\n * await registration.pushManager.subscribe({\n * userVisibleOnly: true,\n * applicationServerKey: key,\n * });\n * } catch (e) {\n * if (e instanceof VapidKeyError) {\n * console.error('Invalid VAPID key:', e.message, e.code);\n * }\n * }\n * ```\n */\nexport function urlBase64ToUint8Array(base64String: string): Uint8Array {\n // 1. Validate input\n if (!base64String) {\n throw new VapidKeyError('VAPID public key is required', 'VAPID_EMPTY');\n }\n\n if (typeof base64String !== 'string') {\n throw new VapidKeyError('VAPID public key must be a string', 'VAPID_INVALID_TYPE');\n }\n\n // 2. Convert base64url to base64\n // base64url uses '-' and '_' instead of '+' and '/'\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n\n // 3. Decode base64\n let rawData: string;\n try {\n rawData = window.atob(base64);\n } catch (e) {\n throw new VapidKeyError(\n `Invalid base64url format: ${e instanceof Error ? e.message : String(e)}`,\n 'VAPID_INVALID_BASE64'\n );\n }\n\n // 4. Convert to Uint8Array\n const outputArray = new Uint8Array(rawData.length);\n for (let i = 0; i < rawData.length; i++) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n\n // 5. Validate length (P-256 uncompressed = 65 bytes)\n // Format: 0x04 (1 byte) + X coordinate (32 bytes) + Y coordinate (32 bytes)\n if (outputArray.length !== 65) {\n throw new VapidKeyError(\n `Invalid key length: expected 65 bytes (P-256 uncompressed), got ${outputArray.length} bytes`,\n 'VAPID_INVALID_LENGTH'\n );\n }\n\n // 6. Validate format (must start with 0x04 for uncompressed P-256 point)\n if (outputArray[0] !== 0x04) {\n throw new VapidKeyError(\n `Invalid key format: must start with 0x04 (uncompressed P-256 point), got 0x${outputArray[0]\n .toString(16)\n .padStart(2, '0')}`,\n 'VAPID_INVALID_FORMAT'\n );\n }\n\n return outputArray;\n}\n\n/**\n * Validate VAPID key without conversion\n *\n * Checks if a VAPID key is valid without converting it.\n * Useful for validation before attempting subscription.\n *\n * @param base64String - VAPID public key to validate\n * @returns true if key is valid\n *\n * @example\n * ```typescript\n * if (isValidVapidKey(vapidKey)) {\n * // Proceed with subscription\n * } else {\n * console.error('Invalid VAPID key configuration');\n * }\n * ```\n */\nexport function isValidVapidKey(base64String: string): boolean {\n try {\n urlBase64ToUint8Array(base64String);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get VAPID key information for debugging\n *\n * Returns detailed information about a VAPID key for troubleshooting.\n *\n * @param base64String - VAPID public key to inspect\n * @returns Key information object\n *\n * @example\n * ```typescript\n * const info = getVapidKeyInfo(process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY);\n * console.log('VAPID Key Info:', info);\n * // {\n * // valid: true,\n * // length: 65,\n * // firstByte: '0x04',\n * // format: 'P-256 uncompressed'\n * // }\n * ```\n */\nexport function getVapidKeyInfo(base64String: string): {\n valid: boolean;\n length?: number;\n firstByte?: string;\n format?: string;\n error?: string;\n errorCode?: VapidKeyErrorCode;\n} {\n try {\n const key = urlBase64ToUint8Array(base64String);\n return {\n valid: true,\n length: key.length,\n firstByte: `0x${key[0].toString(16).padStart(2, '0')}`,\n format: key[0] === 0x04 ? 'P-256 uncompressed' : 'Unknown',\n };\n } catch (e) {\n if (e instanceof VapidKeyError) {\n return {\n valid: false,\n error: e.message,\n errorCode: e.code,\n };\n }\n return {\n valid: false,\n error: String(e),\n };\n }\n}\n\n/**\n * Safe VAPID key conversion with error handling\n *\n * Attempts to convert a VAPID key with detailed error logging.\n * Returns null on failure instead of throwing.\n *\n * @param base64String - VAPID public key\n * @param onError - Optional error callback\n * @returns Uint8Array or null if conversion fails\n *\n * @example\n * ```typescript\n * const key = safeUrlBase64ToUint8Array(vapidKey, (error) => {\n * console.error('VAPID conversion failed:', error.message, error.code);\n * });\n *\n * if (key) {\n * // Use key for subscription\n * }\n * ```\n */\nexport function safeUrlBase64ToUint8Array(\n base64String: string,\n onError?: (error: VapidKeyError) => void\n): Uint8Array | null {\n try {\n return urlBase64ToUint8Array(base64String);\n } catch (e) {\n if (e instanceof VapidKeyError) {\n onError?.(e);\n }\n return null;\n }\n}\n","'use client';\n\n/**\n * Push Notifications Hook\n *\n * Manages push notification subscription state\n * Integrates with @djangocfg/nextjs/pwa\n */\n\nimport { useEffect, useState } from 'react';\n\nimport { pwaLogger } from '../utils/logger';\nimport { checkBrowserPushSupport } from '../utils/platform';\nimport { urlBase64ToUint8Array, VapidKeyError } from '../utils/vapid';\n\nimport type { PushNotificationState, PushNotificationOptions } from '../types';\nexport function usePushNotifications(options?: PushNotificationOptions) {\n const [state, setState] = useState<PushNotificationState>({\n isSupported: false,\n permission: 'default',\n isSubscribed: false,\n subscription: null,\n });\n\n // Check if push notifications are supported\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n // Check browser-level support first (blocks unsupported browsers like Comet, Opera Mini, etc.)\n const browserSupport = checkBrowserPushSupport();\n\n if (!browserSupport.isSupported) {\n pwaLogger.info(`[usePushNotifications] Browser does not support push: ${browserSupport.browserName} - ${browserSupport.reason}`);\n setState((prev) => ({\n ...prev,\n isSupported: false,\n permission: 'denied',\n }));\n return;\n }\n\n // Check API-level support\n const isSupported = 'serviceWorker' in navigator && 'PushManager' in window && 'Notification' in window;\n\n setState((prev) => ({\n ...prev,\n isSupported,\n permission: isSupported ? Notification.permission : 'denied',\n }));\n\n // Check existing subscription\n if (isSupported) {\n navigator.serviceWorker.ready\n .then((registration) => registration.pushManager.getSubscription())\n .then((subscription) => {\n setState((prev) => ({\n ...prev,\n isSubscribed: !!subscription,\n subscription,\n }));\n })\n .catch((error) => {\n pwaLogger.error('[usePushNotifications] Failed to get subscription:', error);\n });\n }\n }, []);\n\n /**\n * Subscribe to push notifications\n * @returns subscription on success, null on failure\n */\n const subscribe = async (): Promise<PushSubscription | null> => {\n if (!state.isSupported) {\n pwaLogger.warn('[usePushNotifications] Push notifications not supported');\n return null;\n }\n\n if (!options?.vapidPublicKey) {\n pwaLogger.error('[usePushNotifications] VAPID public key required');\n return null;\n }\n\n try {\n // Pre-flight check: Test network connectivity\n pwaLogger.debug('[usePushNotifications] Running pre-flight checks...');\n\n // Check if we're online\n if (!navigator.onLine) {\n pwaLogger.error('[usePushNotifications] No internet connection');\n throw new Error('No internet connection. Please check your network and try again.');\n }\n\n // Request permission\n const permission = await Notification.requestPermission();\n setState((prev) => ({ ...prev, permission }));\n\n if (permission !== 'granted') {\n pwaLogger.warn('[usePushNotifications] Permission not granted:', permission);\n return null;\n }\n\n // Subscribe to push\n const registration = await navigator.serviceWorker.ready;\n\n // Convert and validate VAPID key\n let applicationServerKey: Uint8Array;\n try {\n pwaLogger.debug('[usePushNotifications] Converting VAPID key...');\n applicationServerKey = urlBase64ToUint8Array(options.vapidPublicKey);\n pwaLogger.info('[usePushNotifications] VAPID key validated successfully');\n } catch (e) {\n if (e instanceof VapidKeyError) {\n pwaLogger.error(`[usePushNotifications] Invalid VAPID key: ${e.message} (code: ${e.code})`);\n } else {\n pwaLogger.error('[usePushNotifications] Failed to convert VAPID key:', e);\n }\n return null;\n }\n\n // Diagnostic logging (only in debug mode)\n pwaLogger.debug('[usePushNotifications] Service Worker state:', {\n controller: navigator.serviceWorker.controller ? 'active' : 'none',\n registrationActive: registration.active ? 'yes' : 'no',\n permission: Notification.permission,\n });\n\n // Check for existing subscription and unsubscribe\n const existingSub = await registration.pushManager.getSubscription();\n if (existingSub) {\n pwaLogger.debug('[usePushNotifications] Unsubscribing from existing subscription...');\n await existingSub.unsubscribe();\n }\n\n // Prepare subscription options\n const subscribeOptions = {\n userVisibleOnly: true,\n applicationServerKey: applicationServerKey as unknown as BufferSource,\n };\n\n pwaLogger.debug('[usePushNotifications] Subscribing with VAPID key...');\n\n // Attempt subscribe\n const subscription = await registration.pushManager.subscribe(subscribeOptions);\n\n // Send subscription to server (legacy endpoint support)\n if (options.subscribeEndpoint) {\n await fetch(options.subscribeEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(subscription),\n });\n }\n\n setState((prev) => ({\n ...prev,\n isSubscribed: true,\n subscription,\n }));\n\n pwaLogger.success('[usePushNotifications] Successfully subscribed to push notifications');\n return subscription;\n } catch (error: any) {\n pwaLogger.error('[usePushNotifications] Subscribe failed:', error);\n\n // Specific diagnostic for push service errors\n if (error.name === 'AbortError' || error.message?.includes('push service error')) {\n pwaLogger.error('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');\n pwaLogger.error('❌ PUSH SERVICE ERROR - Cannot connect to FCM');\n pwaLogger.error('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');\n pwaLogger.error('');\n pwaLogger.error('🔍 This is NOT a code bug - it\\'s a network/security block.');\n pwaLogger.error('');\n pwaLogger.error('✅ Quick Fixes (try in order):');\n pwaLogger.error(' 1. Disable VPN/Proxy and refresh page');\n pwaLogger.error(' 2. Open Incognito window (Cmd+Shift+N)');\n pwaLogger.error(' 3. Try different browser (Safari, Firefox)');\n pwaLogger.error(' 4. Use mobile hotspot instead of WiFi');\n pwaLogger.error('');\n pwaLogger.error('🔧 Technical Details:');\n pwaLogger.error(' • Browser tries to connect to FCM (ports 5228-5230)');\n pwaLogger.error(' • VPN/Firewall/Privacy settings may block these ports');\n pwaLogger.error(' • Check browser console for \"AbortError\" details');\n pwaLogger.error('');\n pwaLogger.error('📚 Learn more: https://web.dev/push-notifications-overview/');\n pwaLogger.error('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');\n } else if (error.message?.includes('No internet connection')) {\n pwaLogger.error('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');\n pwaLogger.error('❌ NO INTERNET CONNECTION');\n pwaLogger.error('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');\n pwaLogger.error('Please check your network connection and try again.');\n } else {\n pwaLogger.error('Unknown error:', error.name, error.message);\n }\n\n return null;\n }\n };\n\n const unsubscribe = async (): Promise<boolean> => {\n if (!state.subscription) {\n pwaLogger.warn('[usePushNotifications] No active subscription to unsubscribe');\n return false;\n }\n\n try {\n await state.subscription.unsubscribe();\n setState((prev) => ({\n ...prev,\n isSubscribed: false,\n subscription: null,\n }));\n pwaLogger.info('[usePushNotifications] Successfully unsubscribed from push notifications');\n return true;\n } catch (error) {\n pwaLogger.error('[usePushNotifications] Unsubscribe failed:', error);\n return false;\n }\n };\n\n return {\n ...state,\n subscribe,\n unsubscribe,\n };\n}\n","'use client';\n\n/**\n * Django Push Notifications Hook\n *\n * Integrates usePushNotifications with Django-CFG backend API.\n * Uses generated TypeScript client from @djangocfg/api for type-safe integration.\n * Requires authentication - opens AuthDialog if user is not logged in.\n *\n * Architecture:\n * - usePushNotifications: handles all browser Push API operations\n * - useDjangoPush: adds Django backend sync on top\n *\n * @example\n * ```tsx\n * import { useDjangoPush } from '@djangocfg/layouts/snippets';\n *\n * function NotificationsButton() {\n * const { subscribe, unsubscribe, isSubscribed } = useDjangoPush({\n * vapidPublicKey: 'YOUR_VAPID_KEY'\n * });\n *\n * return (\n * <button onClick={isSubscribed ? unsubscribe : subscribe}>\n * {isSubscribed ? 'Unsubscribe' : 'Subscribe'}\n * </button>\n * );\n * }\n * ```\n */\n\nimport { useCallback, useState } from 'react';\nimport { toast } from '@djangocfg/ui-core/hooks';\n\n// Auth\nimport { useAuth } from '@djangocfg/api/auth';\n// Import Django API client\n// @ts-ignore - optional peer dependency\nimport { apiWebPush } from '@djangocfg/api/clients';\n\nimport { useAuthDialog } from '../../AuthDialog';\nimport { pwaLogger } from '../utils/logger';\nimport { usePushNotifications } from './usePushNotifications';\n\nimport type { PushNotificationOptions } from '../types';\n\ninterface UseDjangoPushOptions extends PushNotificationOptions {\n /**\n * Callback when subscription created\n */\n onSubscribed?: (subscription: PushSubscription) => void;\n\n /**\n * Callback when subscription failed\n */\n onSubscribeError?: (error: Error) => void;\n\n /**\n * Callback when unsubscribed\n */\n onUnsubscribed?: () => void;\n}\n\ninterface UseDjangoPushReturn {\n // State (from usePushNotifications)\n isSupported: boolean;\n permission: NotificationPermission;\n isSubscribed: boolean;\n subscription: PushSubscription | null;\n\n // Local state\n isLoading: boolean;\n error: Error | null;\n\n // Actions\n subscribe: () => Promise<boolean>;\n unsubscribe: () => Promise<boolean>;\n sendTestPush: (message: { title: string; body: string; url?: string }) => Promise<boolean>;\n}\n\n/**\n * Hook for Django-CFG push notifications integration\n */\nexport function useDjangoPush(options: UseDjangoPushOptions): UseDjangoPushReturn {\n const { onSubscribed, onSubscribeError, onUnsubscribed, ...pushOptions } = options;\n\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Auth check\n const { isAuthenticated } = useAuth();\n const { openAuthDialog } = useAuthDialog();\n\n // Use base push notifications hook (handles all browser API)\n const pushNotifications = usePushNotifications(pushOptions);\n\n /**\n * Subscribe to push notifications and save to Django backend\n */\n const subscribe = useCallback(async (): Promise<boolean> => {\n // Auth check - require login for push subscriptions\n if (!isAuthenticated) {\n openAuthDialog({\n message: 'Please sign in to enable push notifications',\n });\n return false;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n // Step 1: Browser subscription via usePushNotifications\n const subscription = await pushNotifications.subscribe();\n\n if (!subscription) {\n // Permission denied or other browser error\n const err = new Error('Browser subscription failed');\n setError(err);\n onSubscribeError?.(err);\n return false;\n }\n\n pwaLogger.info('[useDjangoPush] Browser subscription created');\n\n // Step 2: Save to Django backend\n const result = await apiWebPush.web_push.webpushSubscribeCreate({\n endpoint: subscription.endpoint,\n keys: {\n p256dh: arrayBufferToBase64(subscription.getKey('p256dh')),\n auth: arrayBufferToBase64(subscription.getKey('auth')),\n },\n });\n\n pwaLogger.info('[useDjangoPush] Subscription saved to Django:', result);\n\n onSubscribed?.(subscription);\n toast.success('Push notifications enabled');\n return true;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n pwaLogger.error('[useDjangoPush] Subscribe failed:', error);\n setError(error);\n onSubscribeError?.(error);\n\n toast.error('Subscription Failed', {\n description: 'Could not save subscription to server. Please try again.',\n duration: 5000,\n });\n\n return false;\n } finally {\n setIsLoading(false);\n }\n }, [isAuthenticated, openAuthDialog, pushNotifications.subscribe, onSubscribed, onSubscribeError]);\n\n /**\n * Unsubscribe from push notifications\n */\n const unsubscribe = useCallback(async (): Promise<boolean> => {\n setIsLoading(true);\n setError(null);\n\n try {\n // Unsubscribe via usePushNotifications (handles browser API)\n const success = await pushNotifications.unsubscribe();\n\n if (!success) {\n return false;\n }\n\n pwaLogger.info('[useDjangoPush] Browser unsubscribed');\n\n // Note: Django backend auto-cleans up inactive subscriptions\n // when push delivery fails (410 Gone response)\n\n onUnsubscribed?.();\n toast.success('Push notifications disabled');\n return true;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n pwaLogger.error('[useDjangoPush] Unsubscribe failed:', error);\n setError(error);\n return false;\n } finally {\n setIsLoading(false);\n }\n }, [pushNotifications.unsubscribe, onUnsubscribed]);\n\n /**\n * Send test push notification\n */\n const sendTestPush = useCallback(\n async (message: { title: string; body: string; url?: string }): Promise<boolean> => {\n if (!pushNotifications.isSubscribed) {\n const err = new Error('Not subscribed');\n setError(err);\n return false;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await apiWebPush.web_push.webpushSendCreate({\n title: message.title,\n body: message.body,\n url: message.url || '/',\n icon: '/icon.png',\n });\n\n pwaLogger.info('[useDjangoPush] Test push sent:', result);\n return result.success;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n pwaLogger.error('[useDjangoPush] Send test push failed:', error);\n setError(error);\n return false;\n } finally {\n setIsLoading(false);\n }\n },\n [pushNotifications.isSubscribed]\n );\n\n return {\n // State from usePushNotifications\n isSupported: pushNotifications.isSupported,\n permission: pushNotifications.permission,\n isSubscribed: pushNotifications.isSubscribed,\n subscription: pushNotifications.subscription,\n\n // Local state\n isLoading,\n error,\n\n // Actions\n subscribe,\n unsubscribe,\n sendTestPush,\n };\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Convert ArrayBuffer to base64 string\n */\nfunction arrayBufferToBase64(buffer: ArrayBuffer | null): string {\n if (!buffer) return '';\n\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return window.btoa(binary);\n}\n","'use client';\n\n/**\n * Django Push Context\n *\n * Provider for Django-CFG push notifications integration.\n * Wraps useDjangoPush hook in React context for easy consumption.\n *\n * @example\n * ```tsx\n * import { DjangoPushProvider, useDjangoPushContext } from '@djangocfg/layouts/PWA';\n *\n * // In layout\n * <DjangoPushProvider vapidPublicKey={process.env.NEXT_PUBLIC_VAPID_KEY}>\n * {children}\n * </DjangoPushProvider>\n *\n * // In component\n * function NotifyButton() {\n * const { subscribe, isSubscribed } = useDjangoPushContext();\n * return <button onClick={subscribe}>Subscribe</button>;\n * }\n * ```\n */\n\nimport React, { createContext, useCallback, useContext, useEffect, useState } from 'react';\n\nimport { useDjangoPush } from '../hooks/useDjangoPush';\nimport { pwaLogger } from '../utils/logger';\n\nimport type { PushNotificationOptions } from '../types';\n\nexport interface PushMessage {\n id: string;\n title: string;\n body: string;\n icon?: string;\n badge?: string;\n tag?: string;\n timestamp: number;\n data?: Record<string, unknown>;\n}\n\ninterface DjangoPushContextValue {\n // State\n isSupported: boolean;\n permission: NotificationPermission;\n isSubscribed: boolean;\n subscription: PushSubscription | null;\n isLoading: boolean;\n error: Error | null;\n\n // Push history\n pushes: PushMessage[];\n\n // Actions\n subscribe: () => Promise<boolean>;\n unsubscribe: () => Promise<boolean>;\n sendTestPush: (message: { title: string; body: string; url?: string }) => Promise<boolean>;\n sendPush: (message: Omit<PushMessage, 'id' | 'timestamp'>) => Promise<void>;\n clearPushes: () => void;\n removePush: (id: string) => void;\n}\n\nconst DjangoPushContext = createContext<DjangoPushContextValue | undefined>(undefined);\n\ninterface DjangoPushProviderProps extends PushNotificationOptions {\n children: React.ReactNode;\n\n /**\n * Auto-subscribe on mount if permission granted\n * @default false\n */\n autoSubscribe?: boolean;\n\n /**\n * Callback when subscription created\n */\n onSubscribed?: (subscription: PushSubscription) => void;\n\n /**\n * Callback when subscription failed\n */\n onSubscribeError?: (error: Error) => void;\n\n /**\n * Callback when unsubscribed\n */\n onUnsubscribed?: () => void;\n}\n\n/**\n * Provider for Django push notifications\n */\nexport function DjangoPushProvider({\n children,\n vapidPublicKey,\n autoSubscribe = false,\n onSubscribed,\n onSubscribeError,\n onUnsubscribed,\n}: DjangoPushProviderProps) {\n const djangoPush = useDjangoPush({\n vapidPublicKey,\n onSubscribed,\n onSubscribeError,\n onUnsubscribed,\n });\n\n // Auto-subscribe on mount if permission already granted\n useEffect(() => {\n if (\n autoSubscribe &&\n djangoPush.isSupported &&\n djangoPush.permission === 'granted' &&\n !djangoPush.isSubscribed &&\n !djangoPush.isLoading\n ) {\n pwaLogger.info('[DjangoPushProvider] Auto-subscribing (permission already granted)');\n djangoPush.subscribe();\n }\n }, [autoSubscribe, djangoPush.isSupported, djangoPush.permission, djangoPush.isSubscribed, djangoPush.isLoading]);\n\n const [pushes, setPushes] = useState<PushMessage[]>([]);\n\n // Listen for push messages from service worker\n useEffect(() => {\n if (typeof window === 'undefined' || !('serviceWorker' in navigator)) {\n return;\n }\n\n const handleMessage = (event: MessageEvent) => {\n if (event.data && event.data.type === 'PUSH_RECEIVED') {\n const push: PushMessage = {\n id: crypto.randomUUID(),\n timestamp: Date.now(),\n ...event.data.notification,\n };\n\n setPushes(prev => [push, ...prev]);\n pwaLogger.info('[DjangoPushProvider] Push received:', push);\n }\n };\n\n navigator.serviceWorker.addEventListener('message', handleMessage);\n return () => navigator.serviceWorker.removeEventListener('message', handleMessage);\n }, []);\n\n const sendPush = useCallback(\n async (message: Omit<PushMessage, 'id' | 'timestamp'>) => {\n await djangoPush.sendTestPush({\n title: message.title,\n body: message.body,\n url: message.data?.url as string | undefined,\n });\n },\n [djangoPush]\n );\n\n const clearPushes = useCallback(() => {\n setPushes([]);\n pwaLogger.info('[DjangoPushProvider] Push history cleared');\n }, []);\n\n const removePush = useCallback((id: string) => {\n setPushes(prev => prev.filter(p => p.id !== id));\n pwaLogger.info('[DjangoPushProvider] Push removed:', id);\n }, []);\n\n const value: DjangoPushContextValue = {\n ...djangoPush,\n pushes,\n sendPush,\n clearPushes,\n removePush,\n };\n\n return <DjangoPushContext.Provider value={value}>{children}</DjangoPushContext.Provider>;\n}\n\n/**\n * Hook to access Django push context\n */\nexport function useDjangoPushContext(): DjangoPushContextValue {\n const context = useContext(DjangoPushContext);\n\n if (context === undefined) {\n throw new Error('useDjangoPushContext must be used within DjangoPushProvider');\n }\n\n return context;\n}\n","/**\n * LocalStorage utilities for Push Notifications state persistence\n */\n\n/**\n * Storage keys\n */\nexport const STORAGE_KEYS = {\n PUSH_DISMISSED: 'pwa_push_dismissed_at',\n} as const;\n\n/**\n * Check if push prompt was dismissed recently\n * @param resetDays Number of days before re-showing (default: 7)\n */\nexport function isPushDismissedRecently(resetDays: number = 7): boolean {\n return isDismissedRecentlyHelper(resetDays, STORAGE_KEYS.PUSH_DISMISSED);\n}\n\n/**\n * Mark push prompt as dismissed\n */\nexport function markPushDismissed(): void {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(STORAGE_KEYS.PUSH_DISMISSED, Date.now().toString());\n } catch {\n // Fail silently\n }\n}\n\n/**\n * Helper: Check if a key was dismissed recently\n * @internal\n */\nfunction isDismissedRecentlyHelper(resetDays: number, key: string): boolean {\n if (typeof window === 'undefined') return false;\n try {\n const dismissed = localStorage.getItem(key);\n if (!dismissed) return false;\n const dismissedAt = parseInt(dismissed, 10);\n const daysSince = (Date.now() - dismissedAt) / (1000 * 60 * 60 * 24);\n return daysSince < resetDays;\n } catch {\n return false;\n }\n}\n\n/**\n * Clear all push notification data\n */\nexport function clearAllPushData(): void {\n if (typeof window === 'undefined') return;\n\n try {\n localStorage.removeItem(STORAGE_KEYS.PUSH_DISMISSED);\n } catch {\n // Fail silently\n }\n}\n","'use client';\n\n/**\n * Push Notification Prompt\n *\n * Shows after PWA is installed to request push notification permission\n * Auto-dismisses after user action or timeout\n */\n\nimport { Bell, X } from 'lucide-react';\nimport React, { useEffect, useState } from 'react';\n\nimport { useAuth } from '@djangocfg/api/auth';\nimport { Button } from '@djangocfg/ui-nextjs';\n\nimport { usePushNotifications } from '../hooks/usePushNotifications';\nimport { isPushDismissedRecently, markPushDismissed } from '../utils/localStorage';\nimport { pwaLogger } from '../utils/logger';\nimport { isStandalone } from '../utils/platform';\n\nimport type { PushNotificationOptions } from '../types';\n\nconst DEFAULT_RESET_DAYS = 7;\n\ninterface PushPromptProps extends PushNotificationOptions {\n /**\n * Only show if PWA is installed\n * @default true\n */\n requirePWA?: boolean;\n\n /**\n * Delay before showing prompt (ms)\n * @default 5000\n */\n delayMs?: number;\n\n /**\n * Number of days before re-showing dismissed prompt\n * @default 7\n */\n resetAfterDays?: number;\n\n /**\n * Callback when push is enabled\n */\n onEnabled?: () => void;\n\n /**\n * Callback when push is dismissed\n */\n onDismissed?: () => void;\n}\n\nexport function PushPrompt({\n vapidPublicKey,\n subscribeEndpoint = '/api/push/subscribe',\n requirePWA = true,\n delayMs = 5000,\n resetAfterDays = DEFAULT_RESET_DAYS,\n onEnabled,\n onDismissed,\n}: PushPromptProps) {\n const { isAuthenticated, isLoading: isAuthLoading } = useAuth();\n const { isSupported, permission, isSubscribed, subscribe } = usePushNotifications({\n vapidPublicKey,\n subscribeEndpoint,\n });\n\n const [show, setShow] = useState(false);\n const [enabling, setEnabling] = useState(false);\n\n // Check if should show\n useEffect(() => {\n // Wait for auth to complete, don't show for unauthenticated users\n if (isAuthLoading || !isAuthenticated) {\n return;\n }\n\n if (!isSupported || isSubscribed || permission === 'denied') {\n return;\n }\n\n // Check if PWA is installed (standalone mode)\n if (requirePWA && !isStandalone()) {\n return;\n }\n\n // Check if previously dismissed\n if (typeof window !== 'undefined') {\n if (isPushDismissedRecently(resetAfterDays)) {\n return; // Still within reset period\n }\n }\n\n // Show after delay\n const timer = setTimeout(() => setShow(true), delayMs);\n return () => clearTimeout(timer);\n }, [isAuthLoading, isAuthenticated, isSupported, isSubscribed, permission, requirePWA, resetAfterDays, delayMs]);\n\n const handleEnable = async () => {\n setEnabling(true);\n try {\n const success = await subscribe();\n if (success) {\n setShow(false);\n onEnabled?.();\n }\n } catch (error) {\n pwaLogger.error('[PushPrompt] Enable failed:', error);\n } finally {\n setEnabling(false);\n }\n };\n\n const handleDismiss = () => {\n setShow(false);\n markPushDismissed();\n onDismissed?.();\n };\n\n if (!show) return null;\n\n return (\n <div className=\"fixed bottom-4 left-4 right-4 z-50 animate-in slide-in-from-bottom-4 duration-300\">\n <div className=\"bg-zinc-900 border border-zinc-700 rounded-lg p-4 shadow-lg\">\n <div className=\"flex items-start gap-3\">\n {/* Icon */}\n <div className=\"flex-shrink-0\">\n <Bell className=\"w-5 h-5 text-blue-400\" />\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-white mb-1\">Enable notifications</p>\n <p className=\"text-xs text-zinc-400 mb-3\">\n Stay updated with important updates and alerts\n </p>\n\n {/* Actions */}\n <div className=\"flex gap-2\">\n <Button\n onClick={handleEnable}\n loading={enabling}\n size=\"sm\"\n variant=\"default\"\n >\n Enable\n </Button>\n <Button\n onClick={handleDismiss}\n size=\"sm\"\n variant=\"ghost\"\n >\n Not now\n </Button>\n </div>\n </div>\n\n {/* Close button */}\n <Button\n onClick={handleDismiss}\n size=\"sm\"\n variant=\"ghost\"\n className=\"flex-shrink-0 p-1\"\n aria-label=\"Dismiss\"\n >\n <X className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * Push Notifications Configuration\n *\n * Centralized constants for push notifications functionality.\n *\n * SECURITY NOTE:\n * - VAPID_PRIVATE_KEY should NEVER be in frontend code\n * - Private keys must only exist in backend/API routes\n * - Frontend only needs the public key (NEXT_PUBLIC_* env vars)\n * - VAPID_MAILTO should also remain on backend only\n */\n\n// Default VAPID public key (safe to expose in frontend)\nexport const DEFAULT_VAPID_PUBLIC_KEY = process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY || '';\n\n// NOTE: VAPID private key and mailto should only exist in:\n// - Backend environment variables (not NEXT_PUBLIC_*)\n// - API route handlers (app/api/push/*)\n// - Service worker generation scripts\n// NEVER import or use private keys in frontend code\n","/**\n * LocalStorage utilities for PWA install state persistence\n */\n\nimport type { IOSGuideState } from '../types';\n\n/**\n * Storage keys\n */\nexport const STORAGE_KEYS = {\n IOS_GUIDE_DISMISSED: 'pwa_ios_guide_dismissed_at',\n APP_INSTALLED: 'pwa_app_installed',\n A2HS_DISMISSED: 'pwa_a2hs_dismissed_at',\n} as const;\n\n/**\n * Check if iOS guide was dismissed recently\n * @param resetDays Number of days before re-showing (default: 7)\n */\nexport function isDismissedRecently(resetDays: number = 7): boolean {\n if (typeof window === 'undefined') return false;\n\n try {\n const dismissed = localStorage.getItem(STORAGE_KEYS.IOS_GUIDE_DISMISSED);\n if (!dismissed) return false;\n\n const dismissedAt = parseInt(dismissed, 10);\n const now = Date.now();\n const daysSinceDismissed = (now - dismissedAt) / (1000 * 60 * 60 * 24);\n\n return daysSinceDismissed < resetDays;\n } catch {\n return false;\n }\n}\n\n/**\n * Mark iOS guide as dismissed\n */\nexport function markIOSGuideDismissed(): void {\n if (typeof window === 'undefined') return;\n\n try {\n localStorage.setItem(STORAGE_KEYS.IOS_GUIDE_DISMISSED, Date.now().toString());\n } catch {\n // Fail silently if localStorage is not available\n }\n}\n\n/**\n * Clear iOS guide dismissal\n */\nexport function clearIOSGuideDismissal(): void {\n if (typeof window === 'undefined') return;\n\n try {\n localStorage.removeItem(STORAGE_KEYS.IOS_GUIDE_DISMISSED);\n } catch {\n // Fail silently\n }\n}\n\n/**\n * Get iOS guide state\n */\nexport function getIOSGuideState(resetDays: number = 7): IOSGuideState {\n if (typeof window === 'undefined') {\n return {\n dismissed: false,\n dismissedAt: null,\n shouldShow: false,\n };\n }\n\n try {\n const dismissed = localStorage.getItem(STORAGE_KEYS.IOS_GUIDE_DISMISSED);\n if (!dismissed) {\n return {\n dismissed: false,\n dismissedAt: null,\n shouldShow: true,\n };\n }\n\n const dismissedAt = parseInt(dismissed, 10);\n const now = Date.now();\n const daysSinceDismissed = (now - dismissedAt) / (1000 * 60 * 60 * 24);\n\n return {\n dismissed: true,\n dismissedAt,\n shouldShow: daysSinceDismissed >= resetDays,\n };\n } catch {\n return {\n dismissed: false,\n dismissedAt: null,\n shouldShow: false,\n };\n }\n}\n\n/**\n * Mark app as installed\n */\nexport function markAppInstalled(): void {\n if (typeof window === 'undefined') return;\n\n try {\n localStorage.setItem(STORAGE_KEYS.APP_INSTALLED, 'true');\n // Clear dismissal state when app is installed\n clearIOSGuideDismissal();\n } catch {\n // Fail silently\n }\n}\n\n/**\n * Check if app is marked as installed\n */\nexport function isAppInstalled(): boolean {\n if (typeof window === 'undefined') return false;\n\n try {\n return localStorage.getItem(STORAGE_KEYS.APP_INSTALLED) === 'true';\n } catch {\n return false;\n }\n}\n\n/**\n * Check if A2HS hint was dismissed recently\n * @param resetDays Number of days before re-showing (default: 3)\n */\nexport function isA2HSDismissedRecently(resetDays: number = 3): boolean {\n return isDismissedRecentlyHelper(resetDays, STORAGE_KEYS.A2HS_DISMISSED);\n}\n\n/**\n * Mark A2HS hint as dismissed\n */\nexport function markA2HSDismissed(): void {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(STORAGE_KEYS.A2HS_DISMISSED, Date.now().toString());\n } catch {\n // Fail silently\n }\n}\n\n/**\n * Helper: Check if a key was dismissed recently\n * @internal\n */\nfunction isDismissedRecentlyHelper(resetDays: number, key: string): boolean {\n if (typeof window === 'undefined') return false;\n try {\n const dismissed = localStorage.getItem(key);\n if (!dismissed) return false;\n const dismissedAt = parseInt(dismissed, 10);\n const daysSince = (Date.now() - dismissedAt) / (1000 * 60 * 60 * 24);\n return daysSince < resetDays;\n } catch {\n return false;\n }\n}\n\n/**\n * Clear all PWA install data\n */\nexport function clearAllPWAInstallData(): void {\n if (typeof window === 'undefined') return;\n\n try {\n localStorage.removeItem(STORAGE_KEYS.IOS_GUIDE_DISMISSED);\n localStorage.removeItem(STORAGE_KEYS.APP_INSTALLED);\n localStorage.removeItem(STORAGE_KEYS.A2HS_DISMISSED);\n } catch {\n // Fail silently\n }\n}\n","/**\n * PWA Logger with Conditional Logging\n *\n * Provides logging utilities that respect environment and debug settings:\n * - In production: Only errors are logged\n * - In development: All levels are logged\n * - Debug mode: Can be enabled in production via localStorage\n *\n * @example\n * ```typescript\n * import { pwaLogger } from '../utils/logger';\n *\n * pwaLogger.info('Info message'); // Only in dev\n * pwaLogger.warn('Warning message'); // Only in dev\n * pwaLogger.error('Error message'); // Always logged\n * pwaLogger.debug('Debug message'); // Only when debug enabled\n * ```\n *\n * Enable debug mode in production:\n * ```typescript\n * import { enablePWADebug } from '../utils/logger';\n * enablePWADebug();\n * // or in console:\n * localStorage.setItem('pwa_debug', 'true');\n * ```\n */\n\nimport { consola } from 'consola';\n\nconst isDevelopment = process.env.NODE_ENV === 'development';\n\n/**\n * Check if debug mode is enabled via localStorage\n */\nfunction isDebugEnabled(): boolean {\n if (typeof window === 'undefined') return false;\n try {\n return localStorage.getItem('pwa_debug') === 'true';\n } catch {\n return false;\n }\n}\n\n/**\n * PWA Logger instance with conditional logging\n */\nexport const pwaLogger = {\n /**\n * Info level logging\n * Only logs in development or when debug is enabled\n */\n info: (...args: Parameters<typeof consola.info>): void => {\n if (isDevelopment || isDebugEnabled()) {\n consola.info(...args);\n }\n },\n\n /**\n * Warning level logging\n * Only logs in development or when debug is enabled\n */\n warn: (...args: Parameters<typeof consola.warn>): void => {\n if (isDevelopment || isDebugEnabled()) {\n consola.warn(...args);\n }\n },\n\n /**\n * Error level logging\n * Always logs (production + development)\n */\n error: (...args: Parameters<typeof consola.error>): void => {\n consola.error(...args);\n },\n\n /**\n * Debug level logging\n * Only logs when debug is explicitly enabled\n */\n debug: (...args: Parameters<typeof consola.debug>): void => {\n if (isDebugEnabled()) {\n consola.debug(...args);\n }\n },\n\n /**\n * Success level logging\n * Only logs in development or when debug is enabled\n */\n success: (...args: Parameters<typeof consola.success>): void => {\n if (isDevelopment || isDebugEnabled()) {\n consola.success(...args);\n }\n },\n};\n\n/**\n * Enable debug mode\n *\n * This allows seeing debug logs in production.\n * Call this function or set localStorage manually:\n * `localStorage.setItem('pwa_debug', 'true')`\n *\n * @example\n * ```typescript\n * import { enablePWADebug } from '@djangocfg/layouts/snippets';\n * enablePWADebug();\n * // Reload page to see debug logs\n * ```\n */\nexport function enablePWADebug(): void {\n if (typeof window !== 'undefined') {\n try {\n localStorage.setItem('pwa_debug', 'true');\n consola.info('[PWA] Debug mode enabled. Reload page to see debug logs.');\n } catch (e) {\n consola.error('[PWA] Failed to enable debug mode:', e);\n }\n }\n}\n\n/**\n * Disable debug mode\n *\n * @example\n * ```typescript\n * import { disablePWADebug } from '@djangocfg/layouts/snippets';\n * disablePWADebug();\n * ```\n */\nexport function disablePWADebug(): void {\n if (typeof window !== 'undefined') {\n try {\n localStorage.removeItem('pwa_debug');\n consola.info('[PWA] Debug mode disabled.');\n } catch (e) {\n consola.error('[PWA] Failed to disable debug mode:', e);\n }\n }\n}\n\n/**\n * Check if debug mode is currently active\n *\n * @returns true if debug mode is enabled\n */\nexport function isPWADebugEnabled(): boolean {\n return isDebugEnabled();\n}\n","/**\n * Platform Detection Utilities\n *\n * Centralized utilities for detecting PWA state, platform, and capabilities.\n * Used by hooks to avoid code duplication.\n */\n\n/**\n * Check if running as PWA (standalone mode)\n *\n * Checks if the app is running in standalone mode (added to home screen).\n * This is the primary indicator that a PWA has been installed.\n *\n * @returns true if app is running in standalone mode\n *\n * @example\n * ```typescript\n * if (isStandalone()) {\n * console.log('Running as PWA');\n * }\n * ```\n */\nexport function isStandalone(): boolean {\n if (typeof window === 'undefined') return false;\n\n // Fallback for older browsers without matchMedia\n if (!window.matchMedia) {\n // Use legacy iOS check only\n const nav = navigator as Navigator & { standalone?: boolean };\n return nav.standalone === true;\n }\n\n // Check display-mode media query (modern approach)\n const isStandaloneDisplay = window.matchMedia('(display-mode: standalone)').matches;\n\n // Legacy iOS check (navigator.standalone)\n const nav = navigator as Navigator & { standalone?: boolean };\n const isStandaloneNavigator = nav.standalone === true;\n\n return isStandaloneDisplay || isStandaloneNavigator;\n}\n\n/**\n * Check if device is mobile\n *\n * @returns true if device is mobile (iOS, Android, etc.)\n */\nexport function isMobileDevice(): boolean {\n if (typeof window === 'undefined') return false;\n return /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);\n}\n\n/**\n * Check if web app manifest exists and is valid\n *\n * @returns true if manifest link exists in document head\n */\nexport function hasValidManifest(): boolean {\n if (typeof document === 'undefined') return false;\n const manifestLink = document.querySelector('link[rel=\"manifest\"]');\n return !!manifestLink;\n}\n\n/**\n * Reliable check for PWA mode with edge case handling\n *\n * This function provides additional validation for desktop browsers\n * to avoid false positives (e.g., Safari macOS \"Add to Dock\").\n *\n * For mobile devices, standard standalone check is sufficient.\n * For desktop, additionally validates that a manifest exists.\n *\n * @returns true if app is running as a genuine PWA\n *\n * @example\n * ```typescript\n * // Use this for more reliable detection\n * if (isStandaloneReliable()) {\n * console.log('Definitely running as PWA');\n * }\n * ```\n */\nexport function isStandaloneReliable(): boolean {\n const standalone = isStandalone();\n if (!standalone) return false;\n\n // For mobile devices, standalone check is sufficient\n if (isMobileDevice()) return true;\n\n // For desktop browsers, additionally check for valid manifest\n // This prevents false positives like Safari macOS \"Add to Dock\"\n return hasValidManifest();\n}\n\n/**\n * Get display mode from media query\n *\n * @returns Current display mode: 'standalone', 'fullscreen', 'minimal-ui', or 'browser'\n */\nexport function getDisplayMode(): 'standalone' | 'fullscreen' | 'minimal-ui' | 'browser' {\n if (typeof window === 'undefined') return 'browser';\n\n if (!window.matchMedia) return 'browser';\n\n const modes: Array<'standalone' | 'fullscreen' | 'minimal-ui'> = [\n 'fullscreen',\n 'standalone',\n 'minimal-ui',\n ];\n\n for (const mode of modes) {\n if (window.matchMedia(`(display-mode: ${mode})`).matches) {\n return mode;\n }\n }\n\n return 'browser';\n}\n\n/**\n * Create a media query listener for display-mode changes\n *\n * @param callback - Function to call when display mode changes\n * @returns Cleanup function to remove listener\n *\n * @example\n * ```typescript\n * const cleanup = onDisplayModeChange((isStandalone) => {\n * console.log('Display mode changed:', isStandalone);\n * });\n *\n * // Later: cleanup();\n * ```\n */\nexport function onDisplayModeChange(callback: (isStandalone: boolean) => void): () => void {\n if (typeof window === 'undefined' || !window.matchMedia) {\n return () => {}; // No-op cleanup\n }\n\n const mediaQuery = window.matchMedia('(display-mode: standalone)');\n\n const handleChange = (e: MediaQueryListEvent) => {\n callback(e.matches);\n };\n\n mediaQuery.addEventListener('change', handleChange);\n\n return () => {\n mediaQuery.removeEventListener('change', handleChange);\n };\n}\n","'use client';\n\n/**\n * PWA Install Prompt Hook\n *\n * Manages beforeinstallprompt event and installation state\n * Uses existing hooks from @djangocfg/ui-nextjs for platform detection\n */\n\nimport { useEffect, useState } from 'react';\n\nimport { useBrowserDetect, useDeviceDetect } from '@djangocfg/ui-nextjs';\n\nimport { markAppInstalled } from '../utils/localStorage';\nimport { pwaLogger } from '../utils/logger';\nimport { isStandalone, onDisplayModeChange } from '../utils/platform';\n\nimport type { BeforeInstallPromptEvent, InstallPromptState, InstallOutcome } from '../types';\nexport function useInstallPrompt() {\n const browser = useBrowserDetect();\n const device = useDeviceDetect();\n\n const [state, setState] = useState<InstallPromptState>(() => {\n if (typeof window === 'undefined') {\n return {\n isIOS: false,\n isAndroid: false,\n isSafari: false,\n isChrome: false,\n isInstalled: false,\n canPrompt: false,\n deferredPrompt: null,\n };\n }\n\n // Real Safari = Safari && NOT Chromium (avoid Arc, Brave on iOS)\n const isSafari = browser.isSafari && !browser.isChromium;\n\n return {\n isIOS: device.isIOS,\n isAndroid: device.isAndroid,\n isSafari,\n isChrome: browser.isChrome || browser.isChromium,\n isInstalled: isStandalone(),\n canPrompt: false,\n deferredPrompt: null,\n };\n });\n\n // Update state when platform info changes\n useEffect(() => {\n const isSafari = browser.isSafari && !browser.isChromium;\n\n setState((prev) => ({\n ...prev,\n isIOS: device.isIOS,\n isAndroid: device.isAndroid,\n isSafari,\n isChrome: browser.isChrome || browser.isChromium,\n isInstalled: isStandalone(),\n }));\n }, [browser, device]);\n\n // Listen for beforeinstallprompt event (Android Chrome only)\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const handleBeforeInstallPrompt = (e: Event) => {\n // Prevent the default browser install prompt\n e.preventDefault();\n\n const event = e as BeforeInstallPromptEvent;\n\n setState((prev) => ({\n ...prev,\n canPrompt: true,\n deferredPrompt: event,\n }));\n };\n\n window.addEventListener('beforeinstallprompt', handleBeforeInstallPrompt);\n\n return () => {\n window.removeEventListener('beforeinstallprompt', handleBeforeInstallPrompt);\n };\n }, []);\n\n // Listen for appinstalled event (Android Chrome)\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const handleAppInstalled = () => {\n setState((prev) => ({\n ...prev,\n canPrompt: false,\n deferredPrompt: null,\n isInstalled: true,\n }));\n\n // Mark as installed in localStorage\n markAppInstalled();\n };\n\n window.addEventListener('appinstalled', handleAppInstalled);\n\n return () => {\n window.removeEventListener('appinstalled', handleAppInstalled);\n };\n }, []);\n\n // Check for display-mode changes (user adds to home screen)\n useEffect(() => {\n const cleanup = onDisplayModeChange((isStandaloneMode) => {\n if (isStandaloneMode) {\n setState((prev) => ({\n ...prev,\n isInstalled: true,\n canPrompt: false,\n deferredPrompt: null,\n }));\n\n markAppInstalled();\n }\n });\n\n return cleanup;\n }, []);\n\n /**\n * Trigger Android native install prompt\n */\n const promptInstall = async (): Promise<InstallOutcome> => {\n if (!state.deferredPrompt) {\n pwaLogger.warn('[PWA Install] No deferred prompt available');\n return null;\n }\n\n try {\n // Show the native prompt\n await state.deferredPrompt.prompt();\n\n // Wait for user response\n const { outcome } = await state.deferredPrompt.userChoice;\n\n pwaLogger.info('[PWA Install] User choice:', outcome);\n\n // Clear the deferred prompt\n setState((prev) => ({\n ...prev,\n deferredPrompt: null,\n canPrompt: false,\n }));\n\n return outcome;\n } catch (error) {\n pwaLogger.error('[PWA Install] Error showing install prompt:', error);\n return null;\n }\n };\n\n return {\n ...state,\n promptInstall,\n // Expose full browser info\n browser,\n device,\n };\n}\n","'use client';\n\n/**\n * PWA Install Context\n *\n * Minimal global state for PWA installation\n * No tracking, no metrics, no engagement — just install state\n */\n\nimport React, { createContext, ReactNode, useContext } from 'react';\n\nimport { useInstallPrompt } from '../hooks/useInstallPrompt';\n\nimport type { InstallOutcome } from '../types';\nexport interface PwaContextValue {\n // Platform\n isIOS: boolean;\n isAndroid: boolean;\n isDesktop: boolean;\n\n // Browsers\n isSafari: boolean;\n isChrome: boolean;\n isFirefox: boolean;\n isEdge: boolean;\n isOpera: boolean;\n isBrave: boolean;\n isArc: boolean;\n isVivaldi: boolean;\n isYandex: boolean;\n isSamsungBrowser: boolean;\n isUCBrowser: boolean;\n isChromium: boolean; // Any Chromium-based browser\n browserName: string;\n\n // State\n isInstalled: boolean;\n canPrompt: boolean;\n\n // Actions\n install: () => Promise<InstallOutcome>;\n}\n\nconst PwaContext = createContext<PwaContextValue | undefined>(undefined);\n\nexport interface PwaConfig {\n enabled?: boolean;\n}\n\nexport function PwaProvider({ children, ...config }: PwaConfig & { children: ReactNode }) {\n // If not enabled, acts as a simple pass-through\n if (config.enabled === false) {\n return <>{children}</>;\n }\n\n const prompt = useInstallPrompt();\n\n const value: PwaContextValue = {\n // Platform\n isIOS: prompt.isIOS,\n isAndroid: prompt.isAndroid,\n isDesktop: !prompt.isIOS && !prompt.isAndroid,\n\n // Browsers (from useBrowserDetect)\n isSafari: prompt.browser.isSafari && !prompt.browser.isChromium, // Real Safari only\n isChrome: prompt.browser.isChrome,\n isFirefox: prompt.browser.isFirefox,\n isEdge: prompt.browser.isEdge,\n isOpera: prompt.browser.isOpera,\n isBrave: prompt.browser.isBrave,\n isArc: prompt.browser.isArc,\n isVivaldi: prompt.browser.isVivaldi,\n isYandex: prompt.browser.isYandex,\n isSamsungBrowser: prompt.browser.isSamsungBrowser,\n isUCBrowser: prompt.browser.isUCBrowser,\n isChromium: prompt.browser.isChromium,\n browserName: prompt.browser.browserName,\n\n // State\n isInstalled: prompt.isInstalled,\n canPrompt: prompt.canPrompt,\n\n // Actions\n install: prompt.promptInstall,\n };\n\n return <PwaContext.Provider value={value}>{children}</PwaContext.Provider>;\n}\n\n/**\n * Use install context\n * Must be used within <PwaProvider>\n */\nexport function useInstall(): PwaContextValue {\n const context = useContext(PwaContext);\n\n if (context === undefined) {\n throw new Error('useInstall must be used within <PwaProvider>');\n }\n\n return context;\n}\n","'use client';\n\n/**\n * Desktop Installation Guide Modal\n *\n * Visual step-by-step guide for installing PWA on desktop browsers\n * Uses platform detection from InstallContext\n * Supports: Chrome, Edge, Brave, Arc, Vivaldi, Opera, Yandex, Firefox, Safari\n */\n\nimport { ArrowDownToLine, Check, Menu, Monitor, Plus, Search } from 'lucide-react';\nimport React, { useMemo } from 'react';\n\nimport {\n Button, Card, CardContent, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader,\n DialogTitle\n} from '@djangocfg/ui-nextjs';\n\nimport { useInstall } from '../context/InstallContext';\n\nimport type { IOSGuideModalProps, InstallStep } from '../types';\ntype BrowserCategory = 'chromium' | 'firefox' | 'safari' | 'unknown';\n\nfunction getBrowserCategory(browser: {\n isChromium: boolean;\n isFirefox: boolean;\n isSafari: boolean;\n}): BrowserCategory {\n if (browser.isChromium) return 'chromium';\n if (browser.isFirefox) return 'firefox';\n if (browser.isSafari) return 'safari';\n return 'unknown';\n}\n\nfunction getBrowserSteps(category: BrowserCategory, browserName: string): InstallStep[] {\n switch (category) {\n case 'chromium':\n // Chrome, Edge, Brave, Arc, Vivaldi, Opera, Yandex, etc.\n return [\n {\n number: 1,\n title: 'Find Install Icon',\n icon: ArrowDownToLine,\n description: 'Look for install icon in address bar (right side)',\n },\n {\n number: 2,\n title: 'Click Install',\n icon: Plus,\n description: 'Click the icon and select \"Install\"',\n },\n {\n number: 3,\n title: 'Confirm',\n icon: Check,\n description: 'Click \"Install\" in the popup dialog',\n },\n ];\n\n case 'firefox':\n return [\n {\n number: 1,\n title: 'Open Menu',\n icon: Menu,\n description: 'Click the menu button (three lines)',\n },\n {\n number: 2,\n title: 'Find Install Option',\n icon: Search,\n description: 'Look for \"Install\" or \"Add to Home Screen\"',\n },\n {\n number: 3,\n title: 'Confirm',\n icon: Check,\n description: 'Follow the installation prompts',\n },\n ];\n\n case 'safari':\n return [\n {\n number: 1,\n title: 'Limited Support',\n icon: Monitor,\n description: 'Safari on macOS has limited PWA support',\n },\n {\n number: 2,\n title: 'Use Chromium Browser',\n icon: ArrowDownToLine,\n description: 'Consider using Chrome, Edge, or Brave for full PWA experience',\n },\n ];\n\n default:\n return [\n {\n number: 1,\n title: 'Check Address Bar',\n icon: ArrowDownToLine,\n description: 'Look for an install or download icon',\n },\n {\n number: 2,\n title: 'Or Use Menu',\n icon: Menu,\n description: 'Check browser menu for install option',\n },\n {\n number: 3,\n title: 'Confirm',\n icon: Check,\n description: 'Follow the installation prompts',\n },\n ];\n }\n}\n\nfunction StepCard({ step }: { step: InstallStep }) {\n return (\n <Card className=\"border border-border\">\n <CardContent className=\"p-4\">\n <div className=\"flex items-start gap-3\">\n <div\n className=\"flex items-center justify-center rounded-full bg-primary text-primary-foreground flex-shrink-0\"\n style={{ width: '32px', height: '32px' }}\n >\n <span className=\"text-sm font-semibold\">{step.number}</span>\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <step.icon className=\"w-5 h-5 text-primary\" />\n <h3 className=\"font-semibold text-foreground\">{step.title}</h3>\n </div>\n <p className=\"text-sm text-muted-foreground\">{step.description}</p>\n </div>\n </div>\n </CardContent>\n </Card>\n );\n}\n\nexport function DesktopGuide({ onDismiss, open = true }: IOSGuideModalProps) {\n const {\n browserName,\n isChromium,\n isFirefox,\n isSafari,\n isEdge,\n isBrave,\n isArc,\n isVivaldi,\n isOpera,\n isYandex,\n } = useInstall();\n\n const category = useMemo(\n () => getBrowserCategory({ isChromium, isFirefox, isSafari }),\n [isChromium, isFirefox, isSafari]\n );\n\n const steps = useMemo(() => getBrowserSteps(category, browserName), [category, browserName]);\n\n // Get specific browser display name with emoji\n const displayName = useMemo(() => {\n if (isEdge) return 'Edge';\n if (isBrave) return 'Brave';\n if (isArc) return 'Arc';\n if (isVivaldi) return 'Vivaldi';\n if (isOpera) return 'Opera';\n if (isYandex) return 'Yandex Browser';\n return browserName;\n }, [browserName, isEdge, isBrave, isArc, isVivaldi, isOpera, isYandex]);\n\n return (\n <Dialog open={open} onOpenChange={(isOpen) => !isOpen && onDismiss()}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader className=\"text-left\">\n <DialogTitle className=\"flex items-center gap-2\">\n <Monitor className=\"w-5 h-5 text-primary\" />\n Install App on Desktop\n </DialogTitle>\n <DialogDescription className=\"text-left\">\n {isSafari\n ? 'Safari on macOS has limited PWA support. For the best experience, use Chrome, Edge, or Brave.'\n : `Install this app on ${displayName} for quick access from your desktop`\n }\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-3 py-4\">\n {steps.map((step) => (\n <StepCard key={step.number} step={step} />\n ))}\n </div>\n\n {category === 'chromium' && (\n <div className=\"p-3 bg-muted/30 rounded-lg text-xs text-muted-foreground\">\n 💡 Tip: You can also right-click the page and look for \"Install\" option in {displayName}\n </div>\n )}\n\n {category === 'firefox' && (\n <div className=\"p-3 bg-amber-500/10 rounded-lg text-xs text-amber-700 dark:text-amber-400\">\n ℹ️ Note: Firefox has limited PWA support. Some features may not work as expected.\n </div>\n )}\n\n <DialogFooter>\n <Button onClick={onDismiss} variant=\"default\" className=\"w-full\">\n <Check className=\"w-4 h-4 mr-2\" />\n Got It\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","'use client';\n\n/**\n * iOS Installation Guide Drawer (Mobile-Optimized)\n *\n * Bottom drawer with swipe gestures for iOS installation guide\n * Better UX for mobile devices\n */\n\nimport { ArrowDown, ArrowUpRight, Check, CheckCircle, Share } from 'lucide-react';\nimport React from 'react';\n\nimport {\n Button, Card, CardContent, Drawer, DrawerContent, DrawerDescription, DrawerHeader, DrawerTitle\n} from '@djangocfg/ui-nextjs';\n\nimport type { IOSGuideModalProps, InstallStep } from '../types';\n\nconst steps: InstallStep[] = [\n {\n number: 1,\n title: 'Tap Share',\n icon: ArrowUpRight,\n description: 'At the bottom of Safari',\n },\n {\n number: 2,\n title: 'Scroll & Tap',\n icon: ArrowDown,\n description: '\"Add to Home Screen\"',\n },\n {\n number: 3,\n title: 'Confirm',\n icon: CheckCircle,\n description: 'Tap \"Add\" in top-right',\n },\n];\n\nfunction StepCard({ step }: { step: InstallStep }) {\n return (\n <Card className=\"border border-border\">\n <CardContent className=\"p-4\">\n <div className=\"flex items-start gap-3\">\n <div\n className=\"flex items-center justify-center rounded-full bg-primary text-primary-foreground flex-shrink-0\"\n style={{ width: '32px', height: '32px' }}\n >\n <span className=\"text-sm font-semibold\">{step.number}</span>\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <step.icon className=\"w-5 h-5 text-primary\" />\n <h3 className=\"font-semibold text-foreground\">{step.title}</h3>\n </div>\n <p className=\"text-sm text-muted-foreground\">{step.description}</p>\n </div>\n </div>\n </CardContent>\n </Card>\n );\n}\n\nexport function IOSGuideDrawer({ onDismiss, open = true }: IOSGuideModalProps) {\n return (\n <Drawer open={open} onOpenChange={(isOpen) => !isOpen && onDismiss()}>\n <DrawerContent>\n <DrawerHeader className=\"text-left\">\n <DrawerTitle className=\"flex items-center gap-2\">\n <Share className=\"w-5 h-5 text-primary\" />\n Add to Home Screen\n </DrawerTitle>\n <DrawerDescription className=\"text-left\">\n Install this app on your iPhone for quick access and a better experience\n </DrawerDescription>\n </DrawerHeader>\n\n <div className=\"space-y-3 p-4\">\n {steps.map((step) => (\n <StepCard key={step.number} step={step} />\n ))}\n </div>\n\n <div className=\"p-4 pt-0\">\n <Button onClick={onDismiss} variant=\"default\" className=\"w-full\">\n <Check className=\"w-4 h-4 mr-2\" />\n Got It\n </Button>\n </div>\n </DrawerContent>\n </Drawer>\n );\n}\n","'use client';\n\n/**\n * iOS Installation Guide Modal\n *\n * Visual step-by-step guide for adding PWA to home screen on iOS Safari\n */\n\nimport { ArrowDown, ArrowUpRight, Check, CheckCircle, Share } from 'lucide-react';\nimport React from 'react';\n\nimport {\n Button, Card, CardContent, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader,\n DialogTitle\n} from '@djangocfg/ui-nextjs';\n\nimport type { IOSGuideModalProps, InstallStep } from '../types';\n\nconst steps: InstallStep[] = [\n {\n number: 1,\n title: 'Tap Share',\n icon: ArrowUpRight,\n description: 'At the bottom of Safari',\n },\n {\n number: 2,\n title: 'Scroll & Tap',\n icon: ArrowDown,\n description: '\"Add to Home Screen\"',\n },\n {\n number: 3,\n title: 'Confirm',\n icon: CheckCircle,\n description: 'Tap \"Add\" in top-right',\n },\n];\n\nfunction StepCard({ step }: { step: InstallStep }) {\n return (\n <Card className=\"border border-border\">\n <CardContent className=\"p-4\">\n <div className=\"flex items-start gap-3\">\n <div\n className=\"flex items-center justify-center rounded-full bg-primary text-primary-foreground flex-shrink-0\"\n style={{ width: '32px', height: '32px' }}\n >\n <span className=\"text-sm font-semibold\">{step.number}</span>\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <step.icon className=\"w-5 h-5 text-primary\" />\n <h3 className=\"font-semibold text-foreground\">{step.title}</h3>\n </div>\n <p className=\"text-sm text-muted-foreground\">{step.description}</p>\n </div>\n </div>\n </CardContent>\n </Card>\n );\n}\n\nexport function IOSGuideModal({ onDismiss, open = true }: IOSGuideModalProps) {\n return (\n <Dialog open={open} onOpenChange={(isOpen) => !isOpen && onDismiss()}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader className=\"text-left\">\n <DialogTitle className=\"flex items-center gap-2\">\n <Share className=\"w-5 h-5 text-primary\" />\n Add to Home Screen\n </DialogTitle>\n <DialogDescription className=\"text-left\">\n Install this app on your iPhone for quick access and a better experience\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-3 py-4\">\n {steps.map((step) => (\n <StepCard key={step.number} step={step} />\n ))}\n </div>\n\n <DialogFooter>\n <Button onClick={onDismiss} variant=\"default\" className=\"w-full\">\n <Check className=\"w-4 h-4 mr-2\" />\n Got It\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","'use client';\n\n/**\n * iOS Installation Guide (Adaptive)\n *\n * Automatically uses:\n * - Drawer on mobile (better swipe UX)\n * - Dialog on desktop/tablet\n */\n\nimport React from 'react';\n\nimport { useIsMobile } from '@djangocfg/ui-nextjs/hooks';\n\nimport { IOSGuideDrawer } from './IOSGuideDrawer';\nimport { IOSGuideModal } from './IOSGuideModal';\n\nimport type { IOSGuideModalProps } from '../types';\n\nexport function IOSGuide(props: IOSGuideModalProps) {\n const isMobile = useIsMobile(); // Viewport < 768px\n\n // Use drawer on mobile, dialog on desktop\n if (isMobile) {\n return <IOSGuideDrawer {...props} />;\n }\n\n return <IOSGuideModal {...props} />;\n}\n","'use client';\n\n/**\n * PWA Install Hint (Unified for iOS & Android)\n *\n * Inline, non-blocking hint that shows at the bottom of the screen\n * - iOS Safari: Opens visual guide on click\n * - Android Chrome: Triggers native install prompt on click\n * - Unified UX: Same position, same style, same behavior\n *\n * Auto-resets after 3 days (configurable)\n */\n\nimport { ChevronRight, Download, Share, X } from 'lucide-react';\nimport React, { useEffect, useState } from 'react';\n\nimport { Button } from '@djangocfg/ui-nextjs';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useInstall } from '../context/InstallContext';\nimport { isA2HSDismissedRecently, markA2HSDismissed } from '../utils/localStorage';\nimport { pwaLogger } from '../utils/logger';\nimport { DesktopGuide } from './DesktopGuide';\nimport { IOSGuide } from './IOSGuide';\n\nconst DEFAULT_RESET_DAYS = 3;\n\ninterface A2HSHintProps {\n /**\n * Additional class names for the container\n */\n className?: string;\n\n /**\n * Number of days before re-showing dismissed hint\n * @default 3\n * Set to null to never reset (show once forever)\n */\n resetAfterDays?: number | null;\n\n /**\n * Delay before showing hint (ms)\n * @default 3000\n */\n delayMs?: number;\n\n /**\n * Demo mode - shows hint on all platforms with appropriate guides\n * Production: only iOS Safari & Android Chrome\n * Demo: shows on desktop too with desktop install guide\n * @default false\n */\n demo?: boolean;\n\n /**\n * App logo URL to display in hint\n * If not provided, uses Share icon\n */\n logo?: string;\n}\n\nexport function A2HSHint({\n className,\n resetAfterDays = DEFAULT_RESET_DAYS,\n delayMs = 3000,\n demo = false,\n logo,\n}: A2HSHintProps = {}) {\n const { isIOS, isDesktop, isInstalled, canPrompt, install } = useInstall();\n const [show, setShow] = useState(false);\n const [showGuide, setShowGuide] = useState(false);\n const [installing, setInstalling] = useState(false);\n\n // Determine if should show hint\n // Production: iOS (all browsers support PWA via Share) & Android Chrome with native prompt\n // Demo: show on all platforms (desktop, iOS, Android)\n const shouldShow = demo\n ? !isInstalled // Demo: show on all platforms if not installed\n : !isInstalled && (isIOS || canPrompt); // Production: iOS (all browsers) or Android with prompt\n\n useEffect(() => {\n if (!shouldShow) return;\n\n // Check if previously dismissed (skip localStorage check in demo mode)\n if (!demo && typeof window !== 'undefined') {\n // If resetAfterDays is null, never reset (check with very large number)\n if (resetAfterDays === null) {\n if (isA2HSDismissedRecently(Number.MAX_SAFE_INTEGER)) {\n return; // Dismissed forever\n }\n } else if (isA2HSDismissedRecently(resetAfterDays)) {\n return; // Still within reset period\n }\n }\n\n // Show after delay (user is already engaged)\n const timer = setTimeout(() => setShow(true), delayMs);\n return () => clearTimeout(timer);\n }, [shouldShow, resetAfterDays, delayMs, demo]);\n\n const handleDismiss = () => {\n setShow(false);\n // Don't save to localStorage if demo mode (dev testing)\n if (!demo) {\n markA2HSDismissed();\n }\n };\n\n const handleGuideDismiss = () => {\n setShowGuide(false);\n // In demo mode, keep hint visible after guide is dismissed\n // In production mode, dismiss both guide and hint\n if (!demo) {\n handleDismiss();\n }\n };\n\n const handleClick = async () => {\n // iOS (all browsers support PWA via Share menu)\n // iOS or Desktop: Open visual guide\n if (isIOS || isDesktop) {\n setShowGuide(true);\n } else if (canPrompt) {\n // Android: Trigger native install prompt\n setInstalling(true);\n try {\n await install();\n // If install succeeds, dismiss hint\n handleDismiss();\n } catch (error) {\n pwaLogger.error('[A2HSHint] Install error:', error);\n } finally {\n setInstalling(false);\n }\n }\n };\n\n if (!show) return null;\n\n // Determine which guide/action to show\n let title: string;\n let subtitle: React.ReactNode;\n\n if (isIOS) {\n title = 'Add to Home Screen';\n subtitle = <>Tap to learn how <ChevronRight className=\"w-3 h-3\" /></>;\n } else if (isDesktop) {\n title = 'Install App';\n subtitle = <>Click to see desktop guide <ChevronRight className=\"w-3 h-3\" /></>;\n } else {\n // Android or other mobile with native prompt\n title = 'Install App';\n subtitle = <>Tap to install <Download className=\"w-3 h-3\" /></>;\n }\n\n return (\n <>\n <div className={cn(\n \"fixed bottom-4 left-4 right-4 z-50 animate-in slide-in-from-bottom-4 duration-300\",\n demo && \"relative inset-auto z-auto\", // Demo mode: remove fixed positioning\n className\n )}>\n {/* Make entire card clickable */}\n <div\n role=\"button\"\n tabIndex={0}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleClick();\n }\n }}\n className={cn(\n \"w-full bg-zinc-900 border border-zinc-700 rounded-lg p-4 shadow-lg cursor-pointer hover:bg-zinc-800 transition-colors\",\n installing && \"opacity-70 cursor-not-allowed\"\n )}\n aria-disabled={installing}\n >\n <div className=\"flex items-center gap-3\">\n {/* App logo or icon */}\n <div className=\"flex-shrink-0\">\n {logo ? (\n <img src={logo} alt=\"App logo\" className=\"w-10 h-10 rounded-lg\" />\n ) : (\n <Share className=\"w-5 h-5 text-blue-400\" />\n )}\n </div>\n\n {/* Content - now just displays, clicking anywhere triggers action */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-white mb-1\">{title}</p>\n <p className=\"text-xs text-zinc-400 flex items-center gap-1\">\n {installing ? 'Installing...' : subtitle}\n </p>\n </div>\n\n {/* Close button - prevent event bubbling */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleDismiss();\n }}\n className=\"flex-shrink-0 p-1 hover:bg-zinc-700 rounded transition-colors\"\n aria-label=\"Dismiss\"\n >\n <X className=\"w-4 h-4 text-zinc-400\" />\n </button>\n </div>\n </div>\n </div>\n\n {/* Show appropriate guide based on platform */}\n {isIOS && (\n <IOSGuide open={showGuide} onDismiss={handleGuideDismiss} />\n )}\n\n {/* Desktop guide */}\n {isDesktop && (\n <DesktopGuide open={showGuide} onDismiss={handleGuideDismiss} />\n )}\n </>\n );\n}\n","'use client';\n\n/**\n * Hook to detect if app is running as PWA\n *\n * Checks if the app is running in standalone mode (added to home screen).\n * Results are cached in sessionStorage for fast initialization across page loads.\n *\n * @example\n * ```typescript\n * // Basic usage (standard check)\n * const isPWA = useIsPWA();\n *\n * // Reliable check (with manifest validation for desktop)\n * const isPWA = useIsPWA({ reliable: true });\n * ```\n */\n\nimport { useEffect, useState } from 'react';\n\nimport { isStandalone, isStandaloneReliable, onDisplayModeChange } from '../utils/platform';\n\nconst CACHE_KEY = 'pwa_is_standalone';\n\n/**\n * Options for useIsPWA hook\n */\nexport interface UseIsPWAOptions {\n /**\n * Use reliable check with additional validation for desktop browsers\n * This prevents false positives on Safari macOS \"Add to Dock\"\n * @default false\n */\n reliable?: boolean;\n}\n\n/**\n * Hook to detect if app is running as PWA (standalone mode)\n *\n * @param options - Configuration options\n * @returns true if app is running as PWA\n */\nexport function useIsPWA(options?: UseIsPWAOptions): boolean {\n const checkFunction = options?.reliable ? isStandaloneReliable : isStandalone;\n\n const [isPWA, setIsPWA] = useState<boolean>(() => {\n // Try to restore from cache for fast initialization\n if (typeof window !== 'undefined') {\n try {\n const cached = sessionStorage.getItem(CACHE_KEY);\n if (cached !== null) {\n return cached === 'true';\n }\n } catch {\n // Ignore sessionStorage errors (e.g., in incognito mode)\n }\n }\n\n // Initial check\n return checkFunction();\n });\n\n useEffect(() => {\n // Check after mount (may differ from SSR)\n const isStandaloneMode = checkFunction();\n setIsPWA(isStandaloneMode);\n\n // Update cache\n if (typeof window !== 'undefined') {\n try {\n sessionStorage.setItem(CACHE_KEY, String(isStandaloneMode));\n } catch {\n // Ignore sessionStorage errors\n }\n }\n\n // Listen for display-mode changes\n const cleanup = onDisplayModeChange((newValue) => {\n setIsPWA(newValue);\n\n // Update cache\n if (typeof window !== 'undefined') {\n try {\n sessionStorage.setItem(CACHE_KEY, String(newValue));\n } catch {\n // Ignore sessionStorage errors\n }\n }\n });\n\n return cleanup;\n }, [checkFunction]);\n\n return isPWA;\n}\n\n/**\n * Clear isPWA cache\n *\n * Useful for testing or when you want to force a re-check\n *\n * @example\n * ```typescript\n * import { clearIsPWACache } from '@djangocfg/layouts/snippets';\n * clearIsPWACache();\n * window.location.reload();\n * ```\n */\nexport function clearIsPWACache(): void {\n if (typeof window === 'undefined') return;\n try {\n sessionStorage.removeItem(CACHE_KEY);\n } catch {\n // Ignore sessionStorage errors\n }\n}\n","'use client';\n\n/**\n * Hook to resume last page when opening PWA\n *\n * Saves current pathname on navigation and restores it when PWA is launched.\n * Uses TTL-enabled localStorage to auto-expire saved page after 24 hours.\n *\n * @example\n * ```typescript\n * // In a component that wraps your app\n * usePWAPageResume({ enabled: true });\n * ```\n */\n\nimport { useEffect, useRef } from 'react';\nimport { usePathname, useRouter } from 'next/navigation';\n\nimport { useIsPWA } from './useIsPWA';\n\nconst STORAGE_KEY = 'pwa_last_page';\nconst TTL_24_HOURS = 24 * 60 * 60 * 1000;\n\n/**\n * Default paths to exclude from saving\n * These paths are typically transient or sensitive\n */\nconst DEFAULT_EXCLUDE_PATTERNS = [\n '/auth',\n '/login',\n '/register',\n '/error',\n '/404',\n '/500',\n '/oauth',\n '/callback',\n];\n\n/**\n * Storage wrapper format with metadata (for TTL support)\n */\ninterface StorageWrapper {\n _meta: {\n createdAt: number;\n ttl: number;\n };\n _value: string;\n}\n\n/**\n * Check if path should be excluded from saving\n */\nfunction isExcludedPath(pathname: string): boolean {\n return DEFAULT_EXCLUDE_PATTERNS.some(pattern =>\n pathname === pattern || pathname.startsWith(`${pattern}/`)\n );\n}\n\n/**\n * Read last page from localStorage with TTL check\n */\nfunction readLastPage(): string | null {\n if (typeof window === 'undefined') return null;\n\n try {\n const item = localStorage.getItem(STORAGE_KEY);\n if (!item) return null;\n\n const parsed = JSON.parse(item) as StorageWrapper;\n\n // Check if it's the wrapped format with _meta\n if (parsed && typeof parsed === 'object' && '_meta' in parsed && '_value' in parsed) {\n // Check TTL expiration\n const age = Date.now() - parsed._meta.createdAt;\n if (age > parsed._meta.ttl) {\n // Expired! Clean up\n localStorage.removeItem(STORAGE_KEY);\n return null;\n }\n return parsed._value;\n }\n\n // Old format (backwards compatible) - treat as string\n return item;\n } catch {\n return null;\n }\n}\n\n/**\n * Save page to localStorage with TTL\n */\nfunction saveLastPage(pathname: string): void {\n if (typeof window === 'undefined') return;\n\n try {\n const wrapped: StorageWrapper = {\n _meta: {\n createdAt: Date.now(),\n ttl: TTL_24_HOURS,\n },\n _value: pathname,\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(wrapped));\n } catch {\n // Ignore localStorage errors\n }\n}\n\nexport interface UsePWAPageResumeOptions {\n /**\n * Enable page resume feature\n * @default true\n */\n enabled?: boolean;\n}\n\nexport interface UsePWAPageResumeReturn {\n /** Whether app is running as PWA */\n isPWA: boolean;\n}\n\n/**\n * Hook to resume last page when opening PWA\n *\n * - Saves current pathname on every navigation (always, not just in PWA mode)\n * - Restores last page on PWA launch (only once per session)\n * - Auto-excludes auth, error, and callback pages\n * - Uses TTL (24 hours) to auto-expire saved page\n *\n * @param options - Configuration options\n * @returns Object with isPWA state\n */\nexport function usePWAPageResume(options: UsePWAPageResumeOptions = {}): UsePWAPageResumeReturn {\n const { enabled = true } = options;\n const pathname = usePathname();\n const router = useRouter();\n const isPWA = useIsPWA();\n const hasResumed = useRef(false);\n\n // Resume on PWA launch (only once)\n useEffect(() => {\n if (!enabled || !isPWA || hasResumed.current) return;\n\n hasResumed.current = true;\n\n const lastPage = readLastPage();\n if (lastPage && lastPage !== pathname && !isExcludedPath(lastPage)) {\n router.replace(lastPage);\n }\n }, [isPWA, enabled]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Save current page on navigation\n // Save ALWAYS (not just in PWA mode) because user might install PWA after browsing\n useEffect(() => {\n if (!enabled) return;\n if (isExcludedPath(pathname)) return;\n\n saveLastPage(pathname);\n }, [pathname, enabled]);\n\n return { isPWA };\n}\n","'use client';\n\n/**\n * PWA Page Resume Manager\n *\n * Invisible component that manages page resume functionality for PWA.\n * Add this component to your app layout to enable page resume on PWA launch.\n *\n * @example\n * ```tsx\n * // In your layout\n * <PWAPageResumeManager enabled={true} />\n * ```\n */\n\nimport { usePWAPageResume } from '../hooks/usePWAPageResume';\n\ninterface PWAPageResumeManagerProps {\n /**\n * Enable page resume feature\n * @default true\n */\n enabled?: boolean;\n}\n\n/**\n * Component that manages PWA page resume functionality\n * Renders nothing, just manages state and navigation\n */\nexport function PWAPageResumeManager({ enabled = true }: PWAPageResumeManagerProps) {\n usePWAPageResume({ enabled });\n return null; // Renders nothing, just manages state\n}\n","/**\n * BaseApp - Core Providers Wrapper\n *\n * Provides essential app-wide providers:\n * - ThemeProvider (light/dark/system theme)\n * - TooltipProvider (tooltip positioning)\n * - SWRConfig (data fetching)\n * - AuthProvider (authentication context)\n * - AuthDialog (global auth prompt dialog)\n * - AnalyticsProvider (Google Analytics, optional)\n * - CentrifugoProvider (WebSocket real-time, optional)\n * - PwaProvider (PWA installation, optional)\n * - DjangoPushProvider (Django web push integration, optional)\n * - ErrorTrackingProvider (error handling)\n * - ErrorBoundary (React error boundary, enabled by default)\n * - MCP Chat Widget (optional, lazy loaded)\n *\n * @example\n * ```tsx\n * import { BaseApp } from '@djangocfg/layouts';\n *\n * // With PWA Install and Push Notifications\n * <BaseApp\n * theme={{ defaultTheme: 'system' }}\n * auth={{ loginPath: '/auth/login' }}\n * analytics={{ googleTrackingId: 'G-XXXXXXXXXX' }}\n * pwaInstall={{ enabled: true, logo: '/logo192.png' }}\n * pushNotifications={{\n * enabled: true,\n * vapidPublicKey: process.env.NEXT_PUBLIC_VAPID_KEY,\n * requirePWA: true\n * }}\n * mcpChat={{ enabled: true, autoDetectEnvironment: true }}\n * >\n * {children}\n * </BaseApp>\n *\n * // To disable ErrorBoundary:\n * <BaseApp errorBoundary={{ enabled: false }}>\n * {children}\n * </BaseApp>\n * ```\n */\n\n'use client';\n\nimport dynamic from 'next/dynamic';\nimport NextTopLoader from 'nextjs-toploader';\nimport { ReactNode } from 'react';\nimport { SWRConfig } from 'swr';\n\nimport { getCentrifugoAuthTokenRetrieve } from '@djangocfg/api';\nimport { AuthProvider } from '@djangocfg/api/auth';\nimport { CentrifugoProvider } from '@djangocfg/centrifugo';\nimport { Toaster, TooltipProvider } from '@djangocfg/ui-core/components';\nimport { ThemeProvider } from '@djangocfg/ui-nextjs/theme';\nimport { ErrorBoundary } from '../../components/errors/ErrorBoundary';\nimport { ErrorTrackingProvider } from '../../components/errors/ErrorsTracker';\nimport { AnalyticsProvider } from '../../snippets/Analytics';\nimport { AuthDialog } from '../../snippets/AuthDialog';\nimport { DjangoPushProvider, PushPrompt } from '../../snippets/PushNotifications';\nimport { A2HSHint, PWAPageResumeManager, PwaProvider } from '../../snippets/PWAInstall';\n\nimport type { BaseLayoutProps } from '../types/layout.types';\n\n// Lazy load MCP Chat Widget with dynamic import\nconst AIChatWidget = dynamic(\n () => import('../../snippets/McpChat/components/AIChatWidget').then(mod => ({ default: mod.AIChatWidget })),\n { ssr: false }\n);\n\n// For backwards compatibility, re-export as BaseAppProps\nexport type BaseAppProps = BaseLayoutProps;\n\n/**\n * BaseApp - Core providers wrapper for any React/Next.js app\n *\n * Includes: ThemeProvider, TooltipProvider, SWRConfig, AuthProvider, AnalyticsProvider,\n * CentrifugoProvider, PwaProvider, PushProvider, ErrorTrackingProvider,\n * ErrorBoundary (optional), MCP Chat (optional)\n * Also renders global Toaster and PageProgress components\n */\nexport function BaseApp({\n children,\n theme,\n auth,\n analytics,\n centrifugo,\n errorTracking,\n errorBoundary,\n swr,\n mcpChat,\n pwaInstall,\n pushNotifications,\n}: BaseAppProps) {\n // ErrorBoundary is enabled by default\n const enableErrorBoundary = errorBoundary?.enabled !== false;\n\n // Check if PWA Install is enabled\n const pwaInstallEnabled = pwaInstall?.enabled !== false;\n const showInstallHint = pwaInstallEnabled && pwaInstall?.showInstallHint !== false;\n\n // Check if Push Notifications is enabled\n const pushEnabled = pushNotifications?.enabled !== false && !!pushNotifications?.vapidPublicKey;\n\n // Centrifugo configuration\n const centrifugoUrl = centrifugo?.url || process.env.NEXT_PUBLIC_CENTRIFUGO_URL;\n const centrifugoEnabled = centrifugo?.enabled !== false;\n\n const content = (\n <ThemeProvider\n defaultTheme={theme?.defaultTheme || 'system'}\n storageKey={theme?.storageKey}\n >\n <TooltipProvider>\n <SWRConfig\n value={{\n revalidateOnFocus: swr?.revalidateOnFocus ?? true,\n revalidateOnReconnect: swr?.revalidateOnReconnect ?? true,\n dedupingInterval: swr?.dedupingInterval ?? 2000,\n }}\n >\n <AuthProvider config={auth}>\n <AnalyticsProvider trackingId={analytics?.googleTrackingId}>\n <CentrifugoProvider\n enabled={centrifugoEnabled}\n autoConnect={centrifugoEnabled && centrifugo?.autoConnect}\n url={centrifugoUrl}\n onTokenRefresh={async () => {\n const response = await getCentrifugoAuthTokenRetrieve();\n return response.token;\n }}\n >\n <PwaProvider enabled={pwaInstallEnabled}>\n <DjangoPushProvider\n vapidPublicKey={pushNotifications?.vapidPublicKey || ''}\n autoSubscribe={pushNotifications?.autoSubscribe}\n >\n <ErrorTrackingProvider\n validation={errorTracking?.validation}\n cors={errorTracking?.cors}\n network={errorTracking?.network}\n onError={errorTracking?.onError}\n >\n {children}\n <NextTopLoader\n color=\"hsl(var(--primary))\"\n height={3}\n showSpinner={false}\n shadow=\"0 0 10px hsl(var(--primary)), 0 0 5px hsl(var(--primary))\"\n />\n <Toaster />\n\n {/* PWA Install Hint */}\n {showInstallHint && (\n <A2HSHint\n resetAfterDays={pwaInstall?.resetAfterDays}\n delayMs={pwaInstall?.delayMs}\n logo={pwaInstall?.logo}\n />\n )}\n\n {/* PWA Page Resume Manager */}\n {pwaInstallEnabled && pwaInstall?.resumeLastPage && (\n <PWAPageResumeManager enabled={true} />\n )}\n\n {/* Push Notifications Prompt */}\n {pushEnabled && (\n <PushPrompt\n vapidPublicKey={pushNotifications!.vapidPublicKey}\n subscribeEndpoint={pushNotifications?.subscribeEndpoint}\n requirePWA={pushNotifications?.requirePWA ?? true}\n delayMs={pushNotifications?.delayMs}\n resetAfterDays={pushNotifications?.resetAfterDays}\n />\n )}\n\n {/* MCP Chat Widget - lazy loaded */}\n {mcpChat?.enabled && (\n <AIChatWidget\n apiEndpoint={mcpChat.apiEndpoint}\n title={mcpChat.title}\n placeholder={mcpChat.placeholder}\n greeting={mcpChat.greeting}\n position={mcpChat.position}\n variant={mcpChat.variant}\n enableStreaming={mcpChat.enableStreaming}\n autoDetectEnvironment={mcpChat.autoDetectEnvironment}\n className={mcpChat.className}\n />\n )}\n\n {/* Auth Dialog - global auth prompt */}\n <AuthDialog authPath={auth?.routes?.auth} />\n </ErrorTrackingProvider>\n </DjangoPushProvider>\n </PwaProvider>\n </CentrifugoProvider>\n </AnalyticsProvider>\n </AuthProvider>\n </SWRConfig>\n </TooltipProvider>\n </ThemeProvider>\n );\n\n // Wrap with ErrorBoundary only if explicitly enabled\n if (enableErrorBoundary) {\n return (\n <ErrorBoundary\n supportEmail={errorBoundary?.supportEmail}\n onError={errorBoundary?.onError}\n >\n {content}\n </ErrorBoundary>\n );\n }\n\n return content;\n}\n","/**\n * AppLayout - Smart Layout Router with All Providers\n *\n * Automatically detects route type and applies the correct layout\n * Includes all necessary providers: Theme, Auth, Analytics, Centrifugo, Error Tracking\n * Simple props-based configuration - no complex configs needed!\n *\n * @example\n * ```tsx\n * import { AppLayout } from '@djangocfg/layouts';\n *\n * <AppLayout\n * publicLayout={{\n * component: PublicLayout,\n * enabledPath: ['/', '/about', '/contact']\n * }}\n * privateLayout={{\n * component: DashboardLayout,\n * enabledPath: '/dashboard'\n * }}\n * adminLayout={{\n * component: AdminLayout,\n * enabledPath: '/admin'\n * }}\n * // Paths that render without any layout wrapper (fullscreen pages)\n * noLayoutPaths={['/private/terminal', '/embed']}\n * >\n * {children}\n * </AppLayout>\n * ```\n */\n\n'use client';\n\nimport { usePathname } from 'next/navigation';\nimport React, { ReactNode, useMemo } from 'react';\n\nimport { ClientOnly, Suspense } from '../../components/core';\nimport { BaseApp } from './BaseApp';\n\nimport type {\n ThemeConfig,\n AnalyticsConfig,\n CentrifugoConfig,\n ErrorTrackingConfig,\n ErrorBoundaryConfig,\n SWRConfigOptions,\n McpChatConfig,\n PwaInstallConfig,\n PushNotificationsConfig,\n} from '../types';\nimport type { AuthConfig } from '@djangocfg/api/auth';\n\nexport type LayoutMode = 'public' | 'private' | 'admin';\n\n/**\n * Check if pathname matches enabledPath\n */\nfunction matchesPath(pathname: string, enabledPath?: string | string[]): boolean {\n if (!enabledPath) return false;\n \n if (typeof enabledPath === 'string') {\n return pathname === enabledPath || pathname.startsWith(enabledPath + '/');\n }\n \n // Array of paths\n return enabledPath.some(path => pathname === path || pathname.startsWith(path + '/'));\n}\n\n/**\n * Determine layout mode from pathname and enabledPath props\n */\nfunction determineLayoutMode(\n pathname: string,\n adminLayout?: { component: any; enabledPath?: string | string[] },\n privateLayout?: { component: any; enabledPath?: string | string[] },\n publicLayout?: { component: any; enabledPath?: string | string[] }\n): LayoutMode {\n // Check in order: admin -> private -> public\n if (adminLayout && matchesPath(pathname, adminLayout.enabledPath)) return 'admin';\n if (privateLayout && matchesPath(pathname, privateLayout.enabledPath)) return 'private';\n if (publicLayout && matchesPath(pathname, publicLayout.enabledPath)) return 'public';\n \n // Default: if no enabledPath specified, use public as fallback\n return 'public';\n}\n\nexport interface AppLayoutProps {\n children: ReactNode;\n\n /** Public layout component with enabled paths */\n publicLayout?: {\n component: React.ComponentType<{ children: ReactNode }>;\n enabledPath?: string | string[];\n };\n\n /** Private layout component with enabled paths */\n privateLayout?: {\n component: React.ComponentType<{ children: ReactNode }>;\n enabledPath?: string | string[];\n };\n\n /** Admin layout component with enabled paths */\n adminLayout?: {\n component: React.ComponentType<{ children: ReactNode }>;\n enabledPath?: string | string[];\n };\n\n /**\n * Paths that render without any layout wrapper (fullscreen pages)\n * Providers (auth, theme, etc.) are still applied, only layout is skipped\n * Useful for: fullscreen terminal, embed pages, print views\n */\n noLayoutPaths?: string | string[];\n\n /** Theme configuration */\n theme?: ThemeConfig;\n\n /** Auth configuration */\n auth?: AuthConfig;\n\n /** Analytics configuration */\n analytics?: AnalyticsConfig;\n\n /** Centrifugo configuration */\n centrifugo?: CentrifugoConfig;\n\n /** Error tracking configuration */\n errorTracking?: ErrorTrackingConfig;\n\n /** SWR configuration */\n swr?: SWRConfigOptions;\n\n /** Error boundary configuration */\n errorBoundary?: ErrorBoundaryConfig;\n\n /** MCP Chat configuration */\n mcpChat?: McpChatConfig;\n\n /** PWA Install configuration */\n pwaInstall?: PwaInstallConfig;\n\n /** Push Notifications configuration */\n pushNotifications?: PushNotificationsConfig;\n}\n\n/**\n * AppLayout Content - Renders layout with all providers\n *\n * SSR is only enabled for publicLayout.\n * Private and admin layouts are wrapped in ClientOnly to avoid hydration mismatch.\n */\nfunction AppLayoutContent({\n children,\n publicLayout,\n privateLayout,\n adminLayout,\n noLayoutPaths,\n}: AppLayoutProps) {\n const pathname = usePathname();\n\n // Check if current path should skip layout\n const shouldSkipLayout = useMemo(\n () => matchesPath(pathname, noLayoutPaths),\n [pathname, noLayoutPaths]\n );\n\n const layoutMode = useMemo(\n () => determineLayoutMode(\n pathname,\n adminLayout,\n privateLayout,\n publicLayout\n ),\n [pathname, adminLayout, privateLayout, publicLayout]\n );\n\n // Render appropriate layout based on mode\n const renderLayout = () => {\n // Skip layout for noLayoutPaths (fullscreen pages)\n if (shouldSkipLayout) {\n return children;\n }\n\n switch (layoutMode) {\n case 'admin':\n if (!adminLayout && privateLayout) {\n return (\n <ClientOnly>\n <Suspense>\n <privateLayout.component>{children}</privateLayout.component>\n </Suspense>\n </ClientOnly>\n );\n }\n if (!adminLayout) {\n return children;\n }\n return (\n <ClientOnly>\n <Suspense>\n <adminLayout.component>{children}</adminLayout.component>\n </Suspense>\n </ClientOnly>\n );\n\n case 'private':\n if (!privateLayout) {\n if (publicLayout) {\n return <publicLayout.component>{children}</publicLayout.component>;\n }\n return children;\n }\n return (\n <ClientOnly>\n <Suspense>\n <privateLayout.component>{children}</privateLayout.component>\n </Suspense>\n </ClientOnly>\n );\n\n case 'public':\n default:\n // Public layout renders with SSR (no ClientOnly wrapper)\n if (!publicLayout) {\n return children;\n }\n return <publicLayout.component>{children}</publicLayout.component>;\n }\n };\n \n // No providers here - all providers now in BaseApp\n return renderLayout();\n}\n\n/**\n * AppLayout - Main Component with All Providers\n */\nexport function AppLayout(props: AppLayoutProps) {\n const {\n theme,\n auth,\n analytics,\n centrifugo,\n errorTracking,\n errorBoundary,\n swr,\n mcpChat,\n pwaInstall,\n pushNotifications,\n } = props;\n\n return (\n <BaseApp\n theme={theme}\n auth={auth}\n analytics={analytics}\n centrifugo={centrifugo}\n errorTracking={errorTracking}\n errorBoundary={errorBoundary}\n swr={swr}\n mcpChat={mcpChat}\n pwaInstall={pwaInstall}\n pushNotifications={pushNotifications}\n >\n <AppLayoutContent {...props} />\n </BaseApp>\n );\n}\n","/**\n * Public Layout Navigation\n *\n * Navigation component for PublicLayout with mobile drawer support\n */\n\n'use client';\n\nimport { Menu } from 'lucide-react';\nimport Link from 'next/link';\nimport React from 'react';\n\nimport { useAuth } from '@djangocfg/api/auth';\nimport { Button } from '@djangocfg/ui-nextjs/components';\nimport { useIsMobile } from '@djangocfg/ui-nextjs/hooks';\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { ThemeToggle } from '@djangocfg/ui-nextjs/theme';\n\nimport { UserMenu } from '../../_components/UserMenu';\n\nimport type { NavigationItem, UserMenuConfig } from '../../types';\n\ninterface PublicNavigationProps {\n logo?: string;\n siteName: string;\n navigation: NavigationItem[];\n userMenu?: UserMenuConfig;\n onMobileMenuClick: () => void;\n}\n\nexport function PublicNavigation({\n logo,\n siteName,\n navigation,\n userMenu,\n onMobileMenuClick,\n}: PublicNavigationProps) {\n const { isAuthenticated } = useAuth();\n const isMobile = useIsMobile();\n\n // Nav class (background blur with opacity 0.8)\n // bg-background/80 - doesnt work in tailwind4\n const navClass = 'sticky top-0 w-full z-50 border-b bg-background';\n\n return (\n <nav className={navClass} style={{ backgroundColor: 'hsl(var(--background) / 0.6)', backdropFilter: 'blur(10px)' }}>\n <div className=\"w-full px-4 sm:px-6 lg:px-8\">\n <div className=\"flex items-center justify-between py-4\">\n {/* Logo */}\n <Link href=\"/\" className=\"flex items-center gap-2\">\n {logo && (\n <img src={logo} alt={siteName} className=\"h-6 w-auto object-contain\" />\n )}\n <span className=\"font-bold text-lg\">{siteName}</span>\n </Link>\n\n {/* Desktop Navigation */}\n <div className=\"hidden md:flex items-center gap-6\">\n {navigation.map((item) => (\n <Link\n key={item.href}\n href={item.href}\n className=\"text-sm font-medium hover:text-primary transition-colors\"\n >\n {item.label}\n </Link>\n ))}\n </div>\n\n {/* User Menu / Actions */}\n <div className=\"flex items-center gap-4\">\n {!isMobile && (\n <>\n {/* Theme Toggle */}\n <ThemeToggle />\n\n {/* User Menu */}\n <UserMenu\n variant=\"desktop\"\n groups={userMenu?.groups}\n authPath={userMenu?.authPath}\n />\n </>\n )}\n\n {/* Mobile Menu Button */}\n {isMobile && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onMobileMenuClick}\n aria-label=\"Toggle mobile menu\"\n >\n <Menu className=\"h-5 w-5\" />\n </Button>\n )}\n </div>\n </div>\n </div>\n </nav>\n );\n}\n\n","/**\n * Public Layout Mobile Drawer\n *\n * Mobile drawer component for PublicLayout navigation\n */\n\n'use client';\n\nimport { X } from 'lucide-react';\nimport Link from 'next/link';\nimport React from 'react';\n\nimport { useAuth } from '@djangocfg/api/auth';\nimport {\n Button, Drawer, DrawerClose, DrawerContent, DrawerHeader, DrawerTitle\n} from '@djangocfg/ui-nextjs/components';\nimport { ThemeToggle } from '@djangocfg/ui-nextjs/theme';\n\nimport { UserMenu } from '../../_components/UserMenu';\n\nimport type { NavigationItem, UserMenuConfig } from '../../types';\n\ninterface PublicMobileDrawerProps {\n isOpen: boolean;\n onClose: () => void;\n logo?: string;\n siteName: string;\n navigation: NavigationItem[];\n userMenu?: UserMenuConfig;\n}\n\nexport function PublicMobileDrawer({\n isOpen,\n onClose,\n logo,\n siteName,\n navigation,\n userMenu,\n}: PublicMobileDrawerProps) {\n const { isAuthenticated } = useAuth();\n\n return (\n <Drawer open={isOpen} onOpenChange={(open) => !open && onClose()} direction=\"right\">\n <DrawerContent direction=\"right\" className=\"w-80 lg:hidden\">\n {/* Header */}\n <DrawerHeader className=\"flex flex-row items-center justify-between p-4 border-b border-border/30\">\n <div className=\"flex items-center gap-3\">\n {logo && (\n <img\n src={logo}\n alt={`${siteName} Logo`}\n className=\"h-6 w-auto object-contain\"\n />\n )}\n <DrawerTitle className=\"text-lg font-bold text-foreground\">\n {siteName}\n </DrawerTitle>\n </div>\n <DrawerClose className=\"p-2 rounded-sm transition-colors hover:bg-accent/50\">\n <X className=\"size-5\" />\n <span className=\"sr-only\">Close menu</span>\n </DrawerClose>\n </DrawerHeader>\n\n {/* Scrollable Content */}\n <div className=\"flex-1 overflow-y-auto p-4 space-y-6\">\n {/* User Menu */}\n <UserMenu\n variant=\"mobile\"\n groups={userMenu?.groups}\n authPath={userMenu?.authPath}\n />\n\n {/* Navigation Items */}\n <div className=\"space-y-1\">\n <div className=\"px-4 py-2\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Menu\n </h3>\n </div>\n <div className=\"space-y-1\">\n {navigation.map((item) => (\n <Link\n key={item.href}\n href={item.href}\n className=\"block px-4 py-3 rounded-sm text-sm font-medium transition-colors text-foreground hover:bg-accent hover:text-accent-foreground\"\n >\n {item.label}\n </Link>\n ))}\n </div>\n </div>\n </div>\n\n {/* Theme Toggle - Fixed at bottom */}\n <div className=\"border-t border-border/30 p-4\">\n <div className=\"flex items-center justify-between px-4 py-3\">\n <span className=\"text-sm font-medium text-foreground\">Theme</span>\n <ThemeToggle />\n </div>\n </div>\n </DrawerContent>\n </Drawer>\n );\n}\n\n","/**\n * DjangoCFG Logo Component\n *\n * Default SVG logo for DjangoCFG\n */\n\n'use client';\n\nimport React from 'react';\n\nexport interface DjangoCFGLogoProps {\n className?: string;\n size?: number;\n}\n\nexport function DjangoCFGLogo({ className, size }: DjangoCFGLogoProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 541 536\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M159.958 408.555C129.071 408.555 102.501 403.407 80.2482 393.111C57.9958 382.483 40.8913 366.707 28.9348 345.783C16.9783 324.527 11 297.791 11 265.575C11 236.348 16.9783 211.272 28.9348 190.348C40.8913 169.092 57.6637 152.818 79.2519 141.526C100.84 130.233 126.248 124.421 155.475 124.089C167.431 124.089 177.893 125.085 186.861 127.078C196.16 128.739 202.969 130.566 207.286 132.558L206.29 185.864C201.972 184.204 196.492 182.543 189.85 180.883C183.207 179.222 174.904 178.392 164.94 178.392C137.374 178.392 116.616 186.031 102.667 201.308C89.0496 216.586 82.241 238.008 82.241 265.575C82.241 284.506 85.0641 300.614 90.7102 313.899C96.6885 327.184 105.656 337.314 117.612 344.289C129.569 350.931 144.847 354.252 163.446 354.252C173.41 354.252 182.045 353.422 189.352 351.761C196.991 350.101 203.633 348.108 209.279 345.783L202.803 364.216C200.146 358.57 198.485 351.761 197.821 343.79C197.157 335.819 196.824 327.184 196.824 317.885V113.627C196.824 105.656 196.658 96.0244 196.326 84.7322C195.994 73.4399 195.496 62.4797 194.832 51.8517C194.167 41.2237 193.171 33.2526 191.843 27.9386L193.337 23.9531H266.571V304.433C266.571 311.076 266.571 319.711 266.571 330.339C266.903 340.635 267.235 350.765 267.567 360.729C268.231 370.693 269.228 378.664 270.556 384.642L269.062 388.627C255.112 394.273 239.004 398.923 220.737 402.577C202.803 406.562 182.543 408.555 159.958 408.555Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M193.337 23.9531L191.843 27.9385C193.171 33.2525 194.168 41.2236 194.832 51.8516C195.496 62.4796 195.994 73.4401 196.326 84.7324C196.658 96.0245 196.824 105.656 196.824 113.627V129.152C193.901 128.435 190.58 127.742 186.86 127.078C177.893 125.085 167.431 124.089 155.475 124.089C126.248 124.421 100.84 130.233 79.252 141.525L78.2432 142.059C57.1405 153.328 40.7042 169.425 28.9346 190.349C16.9782 211.272 11 236.348 11 265.575L11.0039 267.081C11.1878 298.625 17.1649 324.859 28.9346 345.783C40.8911 366.707 57.9956 382.483 80.248 393.111C102.5 403.407 129.07 408.555 159.958 408.555C182.543 408.555 202.803 406.562 220.737 402.576C239.004 398.923 255.112 394.273 269.062 388.627L270.557 384.642C269.228 378.663 268.232 370.692 267.567 360.729C267.235 350.765 266.903 340.635 266.571 330.339V23.9531H193.337ZM82.2412 265.575C82.2412 238.009 89.0498 216.586 102.667 201.309C116.616 186.031 137.374 178.392 164.94 178.392L166.789 178.401C175.935 178.499 183.622 179.326 189.85 180.883C192.337 181.505 194.663 182.126 196.824 182.748V317.885L196.828 319.62C196.867 328.261 197.199 336.317 197.821 343.79C197.985 345.757 198.21 347.653 198.495 349.478C195.625 350.297 192.577 351.06 189.352 351.762C182.045 353.422 173.409 354.252 163.445 354.252V343.252C172.677 343.252 180.348 342.49 186.584 341.106C186.076 333.821 185.824 326.078 185.824 317.885V191.237C180.514 190.065 173.614 189.392 164.94 189.392C139.406 189.392 122.05 196.41 110.814 208.698C99.5767 221.349 93.2412 239.809 93.2412 265.575C93.2413 283.41 95.8996 297.933 100.788 309.487C105.861 320.71 113.267 328.992 123.06 334.729C132.888 340.16 146.134 343.252 163.445 343.252V354.252C144.846 354.252 129.569 350.931 117.612 344.288C105.656 337.313 96.6882 327.184 90.71 313.899C85.2402 301.029 82.4199 285.51 82.249 267.341L82.2412 265.575ZM277.571 330.152C277.899 340.322 278.227 350.329 278.555 360.174C279.202 369.794 280.145 377.085 281.294 382.256L282.003 385.445L277.666 397.012L273.188 398.824C258.493 404.772 241.727 409.592 222.969 413.348C204.136 417.518 183.107 419.555 159.958 419.555C127.877 419.555 99.6539 414.211 75.6289 403.095L75.5684 403.066L75.5078 403.037C51.2848 391.468 32.4787 374.156 19.3838 351.24L19.3652 351.208L19.3477 351.176C6.21456 327.828 6.03515e-05 299.093 0 265.575C0 234.84 6.29459 207.797 19.3838 184.891C32.3805 161.813 50.6989 144.047 74.1533 131.778C97.5551 119.537 124.732 113.438 155.35 113.09L155.412 113.089H155.475C166.591 113.089 176.734 113.908 185.824 115.636V113.627C185.824 105.798 185.661 96.2805 185.331 85.0557C185.002 73.8772 184.51 63.0382 183.854 52.5381C183.2 42.0782 182.249 34.9186 181.171 30.6064L180.34 27.2832L185.714 12.9531H277.571V330.152Z\"\n fill=\"currentColor\"\n opacity=\"0.2\"\n />\n <path\n d=\"M326.086 273.578L489.086 2.57812L415.586 204.578H532.086L333.586 533.078L415.586 273.578H326.086Z\"\n fill=\"#FFEF0B\"\n />\n <path\n d=\"M493.784 4.28711L422.726 199.577H540.949L337.865 535.663L328.818 531.57L408.763 278.577H317.244L484.801 0L493.784 4.28711ZM334.929 268.577H422.409L350.98 494.621L523.223 209.577H408.446L466.683 49.5254L334.929 268.577Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","/**\n * Footer Bottom Section Component\n */\n\n'use client';\n\nimport Link from 'next/link';\nimport React from 'react';\n\nimport { DjangoCFGLogo } from './DjangoCFGLogo';\n\nimport type { FooterLink } from './types';\n\nexport interface FooterBottomProps {\n copyright: string;\n credits?: {\n text: string;\n url?: string;\n };\n links?: FooterLink[];\n variant?: 'mobile' | 'desktop';\n}\n\nexport function FooterBottom({\n copyright,\n credits,\n links = [],\n variant = 'desktop',\n}: FooterBottomProps) {\n const isMobile = variant === 'mobile';\n\n if (isMobile) {\n return (\n <div className=\"border-t border-border pt-4\">\n <div className=\"text-center space-y-2\">\n <div className=\"text-xs text-muted-foreground\">{copyright}</div>\n {credits && (\n <div className=\"text-xs text-muted-foreground flex items-center justify-center gap-1.5\">\n {credits.url ? (\n <a\n href={credits.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hover:text-primary transition-colors flex items-center gap-1.5\"\n >\n <DjangoCFGLogo size={12} className=\"text-foreground\" />\n {credits.text}\n </a>\n ) : (\n <>\n <DjangoCFGLogo size={12} className=\"text-foreground\" />\n {credits.text}\n </>\n )}\n </div>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"border-t border-border mt-8 pt-6\">\n <div className=\"flex flex-col md:flex-row justify-between items-center space-y-3 md:space-y-0 gap-4\">\n <div className=\"text-xs text-muted-foreground\">{copyright}</div>\n\n {credits && (\n <div className=\"text-xs text-muted-foreground flex items-center gap-1.5\">\n {credits.url ? (\n <a\n href={credits.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hover:text-primary transition-colors flex items-center gap-1.5\"\n >\n <DjangoCFGLogo size={14} className=\"text-foreground\" />\n {credits.text}\n </a>\n ) : (\n <>\n <DjangoCFGLogo size={14} className=\"text-foreground\" />\n {credits.text}\n </>\n )}\n </div>\n )}\n\n {links.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-3 md:gap-4 justify-center md:justify-end\">\n {links.map((link) =>\n link.external ? (\n <a\n key={link.path}\n href={link.path}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-xs text-muted-foreground hover:text-primary transition-colors\"\n >\n {link.label}\n </a>\n ) : (\n <Link\n key={link.path}\n href={link.path}\n className=\"text-xs text-muted-foreground hover:text-primary transition-colors\"\n >\n {link.label}\n </Link>\n )\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n","/**\n * Footer Menu Sections Component\n */\n\n'use client';\n\nimport Link from 'next/link';\nimport React from 'react';\n\nimport type { FooterMenuSection } from './types';\n\nexport interface FooterMenuSectionsProps {\n menuSections: FooterMenuSection[];\n}\n\nexport function FooterMenuSections({ menuSections }: FooterMenuSectionsProps) {\n if (menuSections.length === 0) return null;\n\n // Gap in pixels (lg:gap-x-12 = 3rem = 48px)\n const gapPx = 48;\n const sectionCount = menuSections.length;\n const totalGap = (sectionCount - 1) * gapPx;\n\n // Each section = 25% of full width, minus proportional part of gap\n const sectionWidth = `calc(25% - ${totalGap / sectionCount}px)`;\n\n return (\n <div className=\"flex flex-1 gap-8 lg:gap-x-12 justify-end\">\n {menuSections.map((section) => (\n <div\n key={section.title}\n className=\"flex-shrink-0 min-w-0\"\n style={{ width: sectionWidth }}\n >\n <h3 className=\"text-base font-semibold text-foreground mb-3\">\n {section.title}\n </h3>\n <ul className=\"space-y-2\">\n {section.items.map((item) => (\n <li key={item.path}>\n <Link\n href={item.path}\n className=\"text-muted-foreground hover:text-primary text-sm transition-colors\"\n >\n {item.label}\n </Link>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n );\n}\n","/**\n * Footer Social Links Component\n */\n\n'use client';\n\nimport {\n Facebook, Github, Instagram, Linkedin, Mail, MessageCircle, MessageSquare, Twitter, Youtube\n} from 'lucide-react';\nimport React from 'react';\n\nimport type { FooterSocialLinks } from './types';\n\nexport interface FooterSocialLinksProps {\n socialLinks?: FooterSocialLinks;\n className?: string;\n iconClassName?: string;\n}\n\nconst socialIconsMap = {\n github: { icon: Github, title: 'GitHub' },\n linkedin: { icon: Linkedin, title: 'LinkedIn' },\n twitter: { icon: Twitter, title: 'Twitter' },\n telegram: { icon: MessageCircle, title: 'Telegram' },\n youtube: { icon: Youtube, title: 'YouTube' },\n facebook: { icon: Facebook, title: 'Facebook' },\n instagram: { icon: Instagram, title: 'Instagram' },\n whatsapp: { icon: MessageSquare, title: 'WhatsApp' },\n email: { icon: Mail, title: 'Email' },\n} as const;\n\nexport function FooterSocialLinksComponent({\n socialLinks,\n className = 'flex space-x-4',\n iconClassName = 'w-5 h-5',\n}: FooterSocialLinksProps) {\n // Prepare social links data BEFORE render\n const socialLinksData = socialLinks\n ? Object.entries(socialLinks)\n .filter(([_, url]) => url)\n .map(([platform, url]) => {\n const social = socialIconsMap[platform as keyof typeof socialIconsMap];\n if (!social) return null;\n return {\n platform,\n url: url!,\n icon: social.icon,\n title: social.title,\n };\n })\n .filter((item): item is NonNullable<typeof item> => item !== null)\n : [];\n\n if (socialLinksData.length === 0) return null;\n\n return (\n <div className={className}>\n {socialLinksData.map((social) => {\n const Icon = social.icon;\n return (\n <a\n key={social.platform}\n href={social.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-muted-foreground hover:text-primary transition-colors\"\n title={social.title}\n >\n <Icon className={iconClassName} />\n </a>\n );\n })}\n </div>\n );\n}\n","/**\n * Footer Project Info Component\n */\n\n'use client';\n\nimport React from 'react';\n\nimport { DjangoCFGLogo } from './DjangoCFGLogo';\nimport { FooterSocialLinksComponent } from './FooterSocialLinks';\n\nimport type { LucideIcon } from 'lucide-react';\nimport type { FooterSocialLinks } from './types';\n\nexport interface FooterProjectInfoProps {\n siteName: string;\n description?: string;\n logo?: string;\n badge?: {\n icon: LucideIcon;\n text: string;\n };\n socialLinks?: FooterSocialLinks;\n variant?: 'mobile' | 'desktop';\n}\n\nexport function FooterProjectInfo({\n siteName,\n description,\n logo,\n badge,\n socialLinks,\n variant = 'desktop',\n}: FooterProjectInfoProps) {\n const isMobile = variant === 'mobile';\n\n return (\n <div className={isMobile ? 'text-center space-y-4 mb-6' : 'space-y-4 lg:flex-shrink-0 lg:w-80'}>\n <div className={isMobile ? 'flex items-center justify-center gap-2' : 'flex items-center gap-2'}>\n {logo ? (\n <div className={isMobile ? 'w-6 h-6 flex items-center justify-center' : 'w-8 h-8 flex items-center justify-center'}>\n <img\n src={logo}\n alt={`${siteName} Logo`}\n className=\"w-full h-full object-contain\"\n />\n </div>\n ) : (\n <DjangoCFGLogo size={isMobile ? 24 : 32} className=\"text-foreground\" />\n )}\n <span className={isMobile ? 'text-lg font-bold text-foreground' : 'text-xl font-bold text-foreground'}>\n {siteName}\n </span>\n </div>\n\n {description && (\n <p className={isMobile ? 'text-muted-foreground text-sm leading-relaxed max-w-md mx-auto' : 'text-muted-foreground text-sm leading-relaxed'}>\n {description}\n </p>\n )}\n\n {badge && !isMobile && (\n <div className=\"pt-2\">\n <span className=\"inline-flex items-center gap-2 px-3 py-1 rounded-full bg-gradient-to-r from-primary/80 to-secondary/60 border border-primary/30 shadow-brand text-xs font-semibold text-primary-foreground\">\n <badge.icon className=\"w-4 h-4\" />\n {badge.text}\n </span>\n </div>\n )}\n\n {socialLinks && (\n <FooterSocialLinksComponent\n socialLinks={socialLinks}\n className={isMobile ? 'flex justify-center space-x-6' : 'flex space-x-4 pt-4'}\n />\n )}\n </div>\n );\n}\n","/**\n * Public Layout Footer\n *\n * Professional, flexible footer component for PublicLayout\n * Supports desktop/mobile responsive layouts, social links, menu sections\n */\n\n'use client';\n\nimport Link from 'next/link';\nimport React from 'react';\n\nimport { useIsMobile } from '@djangocfg/ui-nextjs/hooks';\n\nimport { FooterBottom } from './FooterBottom';\nimport { FooterMenuSections } from './FooterMenuSections';\nimport { FooterProjectInfo } from './FooterProjectInfo';\n\nimport type { PublicFooterProps } from './types';\n\nexport function PublicFooter({\n siteName,\n description,\n logo,\n badge,\n socialLinks,\n links = [],\n menuSections = [],\n copyright: copyrightProp,\n credits: creditsProp,\n variant = 'full',\n}: PublicFooterProps) {\n const isMobile = useIsMobile();\n\n // Prepare data BEFORE render\n const currentYear = new Date().getFullYear();\n const copyright = copyrightProp || `© ${currentYear} ${siteName}. All rights reserved.`;\n const credits = creditsProp || {\n text: 'Built with DjangoCFG',\n url: 'https://djangocfg.com',\n };\n\n // Simple variant - minimal footer\n if (variant === 'simple') {\n return (\n <footer className=\"bg-background border-t border-border mt-auto\">\n <div className=\"w-full px-4 py-4\">\n <div className=\"text-center\">\n <div className=\"text-sm text-muted-foreground\">{copyright}</div>\n </div>\n </div>\n </footer>\n );\n }\n\n // Mobile Footer\n if (isMobile) {\n return (\n <footer className=\"lg:hidden bg-background border-t border-border mt-auto\">\n <div className=\"w-full px-4 py-8\">\n <FooterProjectInfo\n siteName={siteName}\n description={description}\n logo={logo}\n socialLinks={socialLinks}\n variant=\"mobile\"\n />\n\n {/* Quick Links */}\n {links.length > 0 && (\n <div className=\"flex flex-wrap justify-center gap-3 mb-6\">\n {links.map((link) =>\n link.external ? (\n <a\n key={link.path}\n href={link.path}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-xs text-muted-foreground hover:text-primary transition-colors\"\n >\n {link.label}\n </a>\n ) : (\n <Link\n key={link.path}\n href={link.path}\n className=\"text-xs text-muted-foreground hover:text-primary transition-colors\"\n >\n {link.label}\n </Link>\n )\n )}\n </div>\n )}\n\n <FooterBottom\n copyright={copyright}\n credits={credits}\n variant=\"mobile\"\n />\n </div>\n </footer>\n );\n }\n\n // Desktop Footer\n return (\n <footer className=\"max-lg:hidden bg-background border-t border-border mt-auto\">\n <div className=\"w-full px-4 sm:px-6 lg:px-8 py-12\">\n <div className=\"flex flex-col lg:flex-row gap-8 lg:gap-12\">\n <FooterProjectInfo\n siteName={siteName}\n description={description}\n logo={logo}\n badge={badge}\n socialLinks={socialLinks}\n variant=\"desktop\"\n />\n\n <FooterMenuSections menuSections={menuSections} />\n </div>\n\n <FooterBottom\n copyright={copyright}\n credits={credits}\n links={links}\n variant=\"desktop\"\n />\n </div>\n </footer>\n );\n}\n","/**\n * Public Layout\n *\n * Simple layout for public pages (home, docs, contact, legal pages)\n * Import and use directly with props - no complex configs needed!\n *\n * Features:\n * - Responsive navigation with mobile drawer\n * - User menu integration\n * - No footer (add your own custom footer component)\n *\n * @example\n * ```tsx\n * import { PublicLayout } from '@djangocfg/layouts';\n *\n * <PublicLayout\n * logo=\"/logo.svg\"\n * siteName=\"My App\"\n * navigation={[\n * { label: 'Home', href: '/' },\n * { label: 'Docs', href: '/docs' }\n * ]}\n * >\n * {children}\n * </PublicLayout>\n * ```\n */\n\n'use client';\n\nimport { usePathname } from 'next/navigation';\nimport { ReactNode, useEffect, useState } from 'react';\n\nimport { PublicMobileDrawer, PublicNavigation } from './components';\n\nimport type { NavigationItem, UserMenuConfig } from '../types';\nexport interface PublicLayoutProps {\n children: ReactNode;\n /** Logo path or URL */\n logo?: string;\n /** Site name */\n siteName?: string;\n /** Navigation items */\n navigation?: NavigationItem[];\n /** User menu configuration (optional, uses useAuth() for authentication state) */\n userMenu?: UserMenuConfig;\n}\n\nexport function PublicLayout({\n children,\n logo,\n siteName = 'App',\n navigation = [],\n userMenu,\n}: PublicLayoutProps) {\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false);\n const pathname = usePathname();\n\n // Close mobile menu on route change\n useEffect(() => {\n setMobileMenuOpen(false);\n }, [pathname]);\n\n return (\n <div className=\"min-h-screen flex flex-col\">\n {/* Navigation */}\n <PublicNavigation\n logo={logo}\n siteName={siteName}\n navigation={navigation}\n userMenu={userMenu}\n onMobileMenuClick={() => setMobileMenuOpen(true)}\n />\n\n {/* Mobile Drawer */}\n <PublicMobileDrawer\n isOpen={mobileMenuOpen}\n onClose={() => setMobileMenuOpen(false)}\n logo={logo}\n siteName={siteName}\n navigation={navigation}\n userMenu={userMenu}\n />\n\n {/* Main Content */}\n <main className=\"flex-1\">{children}</main>\n\n {/* Footer - Add your own custom footer component here if needed */}\n </div>\n );\n}\n\n","/**\n * Private Layout Sidebar\n *\n * Sidebar navigation component for PrivateLayout\n */\n\n'use client';\n\nimport Link from 'next/link';\nimport { usePathname } from 'next/navigation';\nimport React from 'react';\n\nimport {\n Sidebar, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarHeader,\n SidebarMenu, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, useSidebar\n} from '@djangocfg/ui-nextjs/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { LucideIcon } from '../../../components';\n\nimport type { SidebarItem, SidebarConfig } from '../PrivateLayout';\n\ninterface PrivateSidebarProps {\n sidebar: SidebarConfig;\n}\n\nexport function PrivateSidebar({ sidebar }: PrivateSidebarProps) {\n const pathname = usePathname();\n const { state, isMobile } = useSidebar();\n const homeHref = sidebar.homeHref || '/';\n\n const isActive = (href: string) => {\n const matches = pathname === href || pathname.startsWith(href + '/');\n if (!matches) return false;\n\n // Check if there's a more specific (longer) path that also matches\n return !sidebar.items.some(otherItem =>\n otherItem.href !== href &&\n otherItem.href.startsWith(href + '/') &&\n (pathname === otherItem.href || pathname.startsWith(otherItem.href + '/'))\n );\n };\n\n return (\n <Sidebar collapsible=\"icon\">\n <SidebarHeader>\n <div\n className=\"flex items-center gap-3\"\n style={\n state === 'collapsed'\n ? {\n paddingLeft: '7px',\n paddingTop: '0.5rem',\n paddingBottom: '0.5rem',\n transition: 'padding 200ms ease-in-out',\n }\n : {\n padding: '0.5rem',\n transition: 'padding 200ms ease-in-out',\n }\n }\n >\n <Link href={homeHref}>\n <div className=\"flex items-center gap-3\">\n <div\n className={cn(\n 'bg-primary rounded-sm flex items-center justify-center flex-shrink-0',\n isMobile ? 'h-10 w-10' : 'h-8 w-8'\n )}\n >\n <span className=\"text-primary-foreground font-bold text-sm\">\n D\n </span>\n </div>\n {state !== 'collapsed' && (\n <span\n className={cn(\n 'font-semibold text-foreground truncate',\n isMobile && 'text-base'\n )}\n style={{ whiteSpace: 'nowrap' }}\n >\n Dashboard\n </span>\n )}\n </div>\n </Link>\n </div>\n </SidebarHeader>\n\n <SidebarContent>\n <SidebarGroup>\n <SidebarGroupContent>\n <SidebarMenu>\n {sidebar.items.map((item) => {\n const active = isActive(item.href);\n\n return (\n <SidebarMenuItem key={item.href}>\n <SidebarMenuButton\n asChild\n isActive={active}\n tooltip={item.label}\n size={isMobile ? 'lg' : 'default'}\n >\n <Link href={item.href}>\n {item.icon && (\n <LucideIcon\n icon={\n typeof item.icon === 'string'\n ? item.icon\n : item.icon\n }\n className={isMobile ? 'h-5 w-5' : 'h-4 w-4'}\n />\n )}\n <span className={isMobile ? 'text-base' : ''}>\n {item.label}\n </span>\n {item.badge && (\n <SidebarMenuBadge>{item.badge}</SidebarMenuBadge>\n )}\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n );\n })}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n </SidebarContent>\n </Sidebar>\n );\n}\n\n","/**\n * Private Layout Header\n *\n * Header component for PrivateLayout with sidebar trigger\n */\n\n'use client';\n\nimport Link from 'next/link';\nimport React from 'react';\n\nimport { useAuth } from '@djangocfg/api/auth';\nimport { Button, Separator, SidebarTrigger } from '@djangocfg/ui-nextjs/components';\nimport { ThemeToggle } from '@djangocfg/ui-nextjs/theme';\n\nimport { UserMenu } from '../../_components/UserMenu';\n\nimport type { HeaderConfig } from '../PrivateLayout';\n\ninterface PrivateHeaderProps {\n header?: HeaderConfig;\n}\n\nexport function PrivateHeader({ header }: PrivateHeaderProps) {\n const { user, logout } = useAuth();\n\n return (\n <header\n className=\"sticky top-0 z-10 flex items-center justify-between px-4 shrink-0 bg-background border-b border-border\"\n style={{ height: '64px', minHeight: '64px' }}\n >\n {/* Left side */}\n <div className=\"flex items-center gap-4\">\n <SidebarTrigger className=\"-ml-1\" />\n <Separator orientation=\"vertical\" className=\"mr-2 h-4\" />\n\n {header?.title && (\n <h1 className=\"text-lg font-semibold text-foreground\">\n {header.title}\n </h1>\n )}\n </div>\n\n {/* Right side */}\n <div className=\"flex items-center gap-3\">\n {/* Theme Toggle */}\n <ThemeToggle />\n\n {/* User Menu */}\n <UserMenu\n variant=\"desktop\"\n groups={header?.groups}\n authPath={header?.authPath}\n />\n </div>\n </header>\n );\n}\n\n","/**\n * Private Layout Content\n *\n * Main content wrapper for PrivateLayout\n */\n\n'use client';\n\nimport React, { ReactNode } from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\ninterface PrivateContentProps {\n children: ReactNode;\n padding?: 'none' | 'default';\n}\n\nexport function PrivateContent({\n children,\n padding = 'default',\n}: PrivateContentProps) {\n return (\n <main\n className={cn(\n 'flex-1 overflow-y-auto',\n padding === 'default' && 'p-4 sm:p-6 lg:p-8'\n )}\n >\n {children}\n </main>\n );\n}\n\n","/**\n * Private Layout\n *\n * Layout for authenticated user pages (dashboard, profile, etc.)\n * Import and use directly with props - no complex configs needed!\n *\n * Features:\n * - Responsive sidebar with mobile burger menu\n * - Keyboard shortcut (Ctrl/Cmd + B) to toggle sidebar\n * - Header with sidebar trigger and user menu\n * - Configurable content padding\n * - NO SSR - renders only on client to avoid hydration mismatch\n *\n * @example\n * ```tsx\n * import { PrivateLayout } from '@djangocfg/layouts';\n *\n * <PrivateLayout\n * sidebar={{\n * items: [\n * { label: 'Dashboard', href: '/dashboard', icon: 'LayoutDashboard' },\n * { label: 'Profile', href: '/profile', icon: 'User' }\n * ]\n * }}\n * header={{\n * title: 'Dashboard',\n * groups: [\n * {\n * title: 'Account',\n * items: [\n * { label: 'Profile', href: '/profile' },\n * { label: 'Settings', href: '/settings' }\n * ]\n * }\n * ],\n * authPath: '/auth'\n * }}\n * >\n * {children}\n * </PrivateLayout>\n *\n * Note: User data (name, email, avatar) is automatically loaded from useAuth() context\n * Keyboard shortcut: Ctrl/Cmd + B to toggle sidebar\n * ```\n */\n\n'use client';\n\nimport React, { ReactNode, useEffect, useState } from 'react';\nimport { useRouter } from 'next/navigation';\n\nimport { useAuth } from '@djangocfg/api/auth';\nimport {\n Preloader, SidebarInset, SidebarProvider\n} from '@djangocfg/ui-nextjs/components';\n\nimport { UserMenuConfig } from '../types';\nimport { PrivateContent, PrivateHeader, PrivateSidebar } from './components';\n\nimport type { LucideIcon as LucideIconType } from 'lucide-react';\nexport interface SidebarItem {\n label: string;\n href: string;\n icon?: string | LucideIconType;\n badge?: string | number;\n}\n\nexport interface SidebarConfig {\n items: SidebarItem[];\n homeHref?: string;\n}\n\nexport interface HeaderConfig {\n title?: string;\n /** User menu groups */\n groups?: UserMenuConfig['groups'];\n /** Auth page path (for sign in button) */\n authPath?: string;\n}\n\nexport interface PrivateLayoutProps {\n children: ReactNode;\n /** Sidebar configuration */\n sidebar?: SidebarConfig;\n /** Header configuration */\n header?: HeaderConfig;\n /** Content padding */\n contentPadding?: 'none' | 'default';\n}\n\nexport function PrivateLayout({\n children,\n sidebar,\n header,\n contentPadding = 'default',\n}: PrivateLayoutProps) {\n const { isAuthenticated, isLoading, saveRedirectUrl } = useAuth();\n const router = useRouter();\n const [isRedirecting, setIsRedirecting] = useState(false);\n\n useEffect(() => {\n if (!isLoading && !isAuthenticated && !isRedirecting) {\n // Save current URL (including query params) before redirecting to auth\n const currentUrl = window.location.pathname + window.location.search;\n saveRedirectUrl(currentUrl);\n\n // Set redirecting state to prevent flicker\n setIsRedirecting(true);\n router.push(header?.authPath || '/auth');\n }\n }, [isAuthenticated, isLoading, isRedirecting, router, saveRedirectUrl, header?.authPath]);\n\n // Show loading state while auth is being checked or redirecting\n // Note: SSR hydration is handled by ClientOnly wrapper in AppLayout\n if (isLoading || isRedirecting || !isAuthenticated) {\n return (\n <Preloader\n variant=\"fullscreen\"\n text={isRedirecting ? \"Redirecting to login...\" : \"Authenticating...\"}\n size=\"lg\"\n backdrop={true}\n backdropOpacity={80}\n />\n );\n }\n\n return (\n <SidebarProvider defaultOpen={true}>\n {/* Sidebar */}\n {sidebar && <PrivateSidebar sidebar={sidebar} />}\n\n {/* Main content area */}\n <SidebarInset className=\"flex flex-col\">\n {/* Header with sidebar trigger */}\n {(header || isAuthenticated) && <PrivateHeader header={header} />}\n\n {/* Page content */}\n <PrivateContent padding={contentPadding}>{children}</PrivateContent>\n </SidebarInset>\n </SidebarProvider>\n );\n}\n\n","'use client';\n\nimport React, { createContext, useContext } from 'react';\n\nimport { useAuthForm } from '@djangocfg/api/auth';\n\nimport type { AuthFormContextType, AuthLayoutProps } from './types';\n\nconst AuthFormContext = createContext<AuthFormContextType | undefined>(undefined);\n\nexport const AuthFormProvider: React.FC<AuthLayoutProps> = ({\n children,\n sourceUrl: sourceUrlProp,\n supportUrl,\n termsUrl,\n privacyUrl,\n enablePhoneAuth = false,\n enableGithubAuth = false,\n enable2FASetup = true,\n logoUrl,\n redirectUrl,\n onIdentifierSuccess,\n onOTPSuccess,\n onError,\n}) => {\n const sourceUrl = sourceUrlProp || (typeof window !== 'undefined' ? window.location.origin : '');\n\n // Require terms acceptance only if terms or privacy URL is provided\n const requireTermsAcceptance = Boolean(termsUrl || privacyUrl);\n\n // Use the auth form hook\n const authForm = useAuthForm({\n onIdentifierSuccess,\n onOTPSuccess,\n onError,\n sourceUrl,\n redirectUrl,\n requireTermsAcceptance,\n enable2FASetup,\n });\n\n const value: AuthFormContextType = {\n ...authForm,\n // UI-specific configuration\n sourceUrl,\n supportUrl,\n termsUrl,\n privacyUrl,\n enablePhoneAuth,\n enableGithubAuth,\n enable2FASetup,\n logoUrl,\n redirectUrl,\n };\n\n return <AuthFormContext.Provider value={value}>{children}</AuthFormContext.Provider>;\n};\n\nexport const useAuthFormContext = (): AuthFormContextType => {\n const context = useContext(AuthFormContext);\n if (context === undefined) {\n throw new Error('useAuthFormContext must be used within an AuthFormProvider');\n }\n return context;\n};\n","import { HelpCircle, Mail, MessageCircle } from 'lucide-react';\nimport React from 'react';\n\nimport { Button } from '@djangocfg/ui-nextjs/components';\n\nimport { useAuthFormContext } from '../context';\n\nimport type { AuthHelpProps } from '../types';\n\nexport const AuthHelp: React.FC<AuthHelpProps> = ({\n className = '',\n variant = 'default',\n}) => {\n const { supportUrl, channel } = useAuthFormContext();\n\n const getChannelIcon = () => {\n return channel === 'phone' ? (\n <MessageCircle className=\"w-4 h-4 text-muted-foreground\" />\n ) : (\n <Mail className=\"w-4 h-4 text-muted-foreground\" />\n );\n };\n\n const getHelpText = () => {\n return channel === 'phone' ? 'Check WhatsApp/SMS' : 'Check spam folder';\n };\n\n const getDetailedHelp = () => {\n if (channel === 'phone') {\n return {\n title: \"Didn't receive the code?\",\n tips: [\n '• Check your WhatsApp messages',\n '• Look for SMS messages',\n '• Ensure you have signal/internet',\n '• Wait a few minutes for delivery',\n ],\n };\n } else {\n return {\n title: \"Didn't receive the email?\",\n tips: [\n '• Check your spam or junk folder',\n '• Make sure you entered the correct email address',\n '• Wait a few minutes for the email to arrive',\n ],\n };\n }\n };\n\n if (variant === 'compact') {\n return (\n <div\n className={`flex items-center justify-between p-3 bg-muted/30 rounded-sm border border-border ${className}`}\n >\n <div className=\"flex items-center gap-2\">\n {getChannelIcon()}\n <span className=\"text-sm text-muted-foreground\">{getHelpText()}</span>\n </div>\n {supportUrl && (\n <Button\n asChild\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs\"\n >\n <a href={supportUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"flex items-center gap-1\">\n <HelpCircle className=\"w-3 h-3\" />\n Need help?\n </a>\n </Button>\n )}\n </div>\n );\n }\n\n const helpData = getDetailedHelp();\n\n return (\n <div\n className={`flex flex-col gap-3 p-3 bg-muted/30 rounded-sm border border-border ${className}`}\n >\n <div className=\"flex items-start gap-3\">\n {getChannelIcon()}\n <div className=\"flex flex-col gap-1\">\n <h4 className=\"text-sm font-medium text-foreground\">{helpData.title}</h4>\n <div className=\"flex flex-col gap-0.5 text-xs text-muted-foreground\">\n {helpData.tips.map((tip, index) => (\n <p key={index}>{tip}</p>\n ))}\n </div>\n </div>\n </div>\n\n {supportUrl && (\n <div className=\"flex items-center justify-between pt-2 border-t border-border\">\n <span className=\"text-xs text-muted-foreground\">Still having trouble?</span>\n <Button\n asChild\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs h-7 px-2\"\n >\n <a href={supportUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"flex items-center gap-1\">\n <HelpCircle className=\"w-3 h-3\" />\n Get Help\n </a>\n </Button>\n </div>\n )}\n </div>\n );\n};\n\n","'use client';\n\nimport { Github } from 'lucide-react';\nimport React from 'react';\n\nimport { useGithubAuth } from '@djangocfg/api/auth';\nimport { Button } from '@djangocfg/ui-nextjs/components';\n\nimport { useAuthFormContext } from '../../context';\n\n/**\n * OAuth Providers Component\n *\n * Shows OAuth login buttons (GitHub, etc.) when enabled.\n */\nexport const OAuthProviders: React.FC = () => {\n const { enableGithubAuth, sourceUrl, setError } = useAuthFormContext();\n\n const { isLoading, startGithubAuth } = useGithubAuth({\n sourceUrl,\n onError: setError,\n });\n\n if (!enableGithubAuth) {\n return null;\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Divider */}\n <div className=\"relative\">\n <div className=\"absolute inset-0 flex items-center\">\n <div className=\"w-full border-t border-border\" />\n </div>\n <div className=\"relative flex justify-center text-xs uppercase\">\n <span className=\"bg-card px-2 text-muted-foreground\">\n Or continue with\n </span>\n </div>\n </div>\n\n {/* OAuth Buttons */}\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"lg\"\n className=\"w-full\"\n onClick={startGithubAuth}\n loading={isLoading}\n >\n <Github className=\"w-5 h-5\" />\n Continue with GitHub\n </Button>\n </div>\n );\n};\n","'use client';\n\nimport { AlertCircle, Loader2 } from 'lucide-react';\nimport { useSearchParams } from 'next/navigation';\nimport React, { useEffect, useState } from 'react';\n\nimport { useGithubAuth } from '@djangocfg/api/auth';\nimport {\n Card, CardContent, CardDescription, CardHeader, CardTitle\n} from '@djangocfg/ui-nextjs/components';\n\nimport { useAuthFormContext } from '../../context';\n\nexport interface OAuthCallbackProps {\n onSuccess?: (user: any, isNewUser: boolean, provider: string) => void;\n onError?: (error: string) => void;\n redirectUrl?: string;\n}\n\ntype CallbackStatus = 'processing' | 'error';\n\n/**\n * OAuth Callback Handler Component\n *\n * Processes OAuth callback from providers (GitHub, etc.).\n * Reads code, state, and provider from URL params and exchanges for tokens.\n *\n * Usage:\n * Place this component on your /auth page to handle OAuth callbacks.\n *\n * @example\n * ```tsx\n * // app/auth/page.tsx\n * import { OAuthCallback, AuthLayout } from '@djangocfg/layouts';\n *\n * export default function AuthPage() {\n * return (\n * <>\n * <OAuthCallback\n * onSuccess={(user) => console.log('OAuth success:', user)}\n * onError={(error) => console.error('OAuth error:', error)}\n * />\n * <AuthLayout enableGithubAuth>\n * {/* Your auth content *\\/}\n * </AuthLayout>\n * </>\n * );\n * }\n * ```\n */\nexport const OAuthCallback: React.FC<OAuthCallbackProps> = ({\n onSuccess,\n onError,\n redirectUrl,\n}) => {\n const searchParams = useSearchParams();\n const { setStep, setTwoFactorSessionId, setShouldPrompt2FA } = useAuthFormContext();\n const [status, setStatus] = useState<CallbackStatus | null>(null);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n\n const provider = searchParams.get('provider');\n const code = searchParams.get('code');\n const state = searchParams.get('state');\n const error = searchParams.get('error');\n const errorDescription = searchParams.get('error_description');\n\n const {\n handleGithubCallback,\n isLoading,\n error: githubError,\n } = useGithubAuth({\n onSuccess: (user, isNewUser) => {\n // Show success screen with logo instead of redirecting\n setStep('success');\n onSuccess?.(user, isNewUser, 'github');\n },\n onError: (err) => {\n setStatus('error');\n setErrorMessage(err);\n onError?.(err);\n },\n onRequires2FA: (sessionId, shouldPrompt) => {\n // Handle 2FA requirement\n setTwoFactorSessionId(sessionId);\n setShouldPrompt2FA(shouldPrompt);\n setStep('2fa');\n },\n redirectUrl,\n skipRedirect: true, // We handle navigation via success screen\n });\n\n // Process OAuth callback on mount\n useEffect(() => {\n // Check if this is an OAuth callback\n if (!provider || !code || !state) {\n // Not an OAuth callback, don't show anything\n return;\n }\n\n // Check for error from provider\n if (error) {\n setStatus('error');\n setErrorMessage(errorDescription || error);\n onError?.(errorDescription || error);\n return;\n }\n\n // Process based on provider\n const processCallback = async () => {\n setStatus('processing');\n\n if (provider === 'github') {\n await handleGithubCallback(code, state);\n } else {\n setStatus('error');\n setErrorMessage(`Unsupported OAuth provider: ${provider}`);\n onError?.(`Unsupported OAuth provider: ${provider}`);\n }\n };\n\n processCallback();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [provider, code, state, error]);\n\n // Don't render if not an OAuth callback\n if (!provider || (!code && !error)) {\n return null;\n }\n\n // Only show UI for processing or error states\n // Success state is handled by AuthSuccess component via setStep('success')\n return (\n <div className=\"fixed inset-0 bg-background/80 backdrop-blur-sm z-50 flex items-center justify-center\">\n <Card className=\"w-full max-w-md mx-4 shadow-lg\">\n <CardHeader className=\"text-center\">\n {status === 'processing' && (\n <>\n <div className=\"mx-auto w-12 h-12 bg-primary/10 rounded-full flex items-center justify-center mb-4\">\n <Loader2 className=\"w-6 h-6 text-primary animate-spin\" />\n </div>\n <CardTitle>Signing you in...</CardTitle>\n <CardDescription>\n Please wait while we complete your {provider} authentication.\n </CardDescription>\n </>\n )}\n\n {status === 'error' && (\n <>\n <div className=\"mx-auto w-12 h-12 bg-destructive/10 rounded-full flex items-center justify-center mb-4\">\n <AlertCircle className=\"w-6 h-6 text-destructive\" />\n </div>\n <CardTitle>Authentication Failed</CardTitle>\n <CardDescription className=\"text-destructive\">\n {errorMessage || githubError || 'An error occurred during authentication.'}\n </CardDescription>\n </>\n )}\n </CardHeader>\n\n {status === 'error' && (\n <CardContent className=\"text-center\">\n <a\n href=\"/auth\"\n className=\"text-primary hover:underline text-sm\"\n >\n Try again\n </a>\n </CardContent>\n )}\n </Card>\n </div>\n );\n};\n","'use client';\n\nimport { Mail, Phone, Send, User } from 'lucide-react';\nimport React, { useEffect, useState } from 'react';\n\nimport {\n Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Checkbox, Input, Label,\n PhoneInput, Tabs, TabsContent, TabsList, TabsTrigger\n} from '@djangocfg/ui-nextjs/components';\n\nimport { useAuthFormContext } from '../context';\nimport { AuthHelp } from './AuthHelp';\nimport { OAuthProviders } from './oauth';\n\nexport const IdentifierForm: React.FC = () => {\n const {\n identifier,\n channel,\n isLoading,\n acceptedTerms,\n termsUrl,\n privacyUrl,\n enablePhoneAuth,\n setIdentifier,\n setChannel,\n setAcceptedTerms,\n handleIdentifierSubmit,\n detectChannelFromIdentifier,\n validateIdentifier,\n error,\n } = useAuthFormContext();\n\n const [localChannel, setLocalChannel] = useState<'email' | 'phone'>(channel);\n\n // Sync localChannel with channel from context (for localStorage updates)\n useEffect(() => {\n setLocalChannel(channel);\n }, [channel]);\n\n // Force email channel if phone auth is disabled\n useEffect(() => {\n if (!enablePhoneAuth && localChannel === 'phone') {\n setLocalChannel('email');\n setChannel('email');\n // Clear identifier if it's a phone number\n if (identifier && detectChannelFromIdentifier(identifier) === 'phone') {\n setIdentifier('');\n }\n }\n }, [\n enablePhoneAuth,\n localChannel,\n identifier,\n setChannel,\n setIdentifier,\n detectChannelFromIdentifier,\n ]);\n\n // Handle identifier change with auto-detection\n const handleIdentifierChange = (value: string) => {\n setIdentifier(value);\n\n // Auto-detect channel if user is typing (only if phone auth is enabled)\n const detectedChannel = detectChannelFromIdentifier(value);\n if (detectedChannel && detectedChannel !== localChannel) {\n // Only switch to phone if phone auth is enabled\n if (detectedChannel === 'phone' && !enablePhoneAuth) {\n return; // Don't switch to phone channel if disabled\n }\n setLocalChannel(detectedChannel);\n setChannel(detectedChannel);\n }\n };\n\n // Handle manual channel switch\n const handleChannelChange = (newChannel: 'email' | 'phone') => {\n // Prevent switching to phone if phone auth is disabled\n if (newChannel === 'phone' && !enablePhoneAuth) {\n return;\n }\n\n setLocalChannel(newChannel);\n setChannel(newChannel);\n // Clear identifier when switching channels\n if (identifier && !validateIdentifier(identifier, newChannel)) {\n setIdentifier('');\n }\n };\n\n const getChannelDescription = () => {\n return localChannel === 'phone'\n ? 'Enter your phone number to receive a verification code via SMS'\n : 'Enter your email address to receive a verification code';\n };\n\n // Check if we have any links for terms/privacy - if not, we don't show the checkbox\n const hasAnyLinks = Boolean(termsUrl || privacyUrl);\n\n return (\n <Card className=\"w-full max-w-md mx-auto shadow-lg border border-border bg-card/50 backdrop-blur-sm\">\n <CardHeader className=\"text-center pb-6\">\n <div className=\"mx-auto w-12 h-12 bg-primary/10 rounded-full flex items-center justify-center mb-4\">\n <User className=\"w-6 h-6 text-primary\" />\n </div>\n <CardTitle className=\"text-xl font-semibold\">Sign In</CardTitle>\n <CardDescription className=\"text-muted-foreground\">\n {getChannelDescription()}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n {enablePhoneAuth ? (\n <Tabs\n value={localChannel}\n onValueChange={(value) => handleChannelChange(value as 'email' | 'phone')}\n >\n {/* Channel Selection Tabs */}\n <TabsList className=\"grid w-full grid-cols-2\">\n <TabsTrigger value=\"email\" className=\"flex items-center gap-2\">\n <Mail className=\"w-4 h-4\" />\n Email\n </TabsTrigger>\n <TabsTrigger value=\"phone\" className=\"flex items-center gap-2\">\n <Phone className=\"w-4 h-4\" />\n Phone\n </TabsTrigger>\n </TabsList>\n\n <form onSubmit={handleIdentifierSubmit} className=\"space-y-6 mt-6\">\n <TabsContent value=\"email\" className=\"space-y-3 mt-0\">\n <Label\n htmlFor=\"identifier\"\n className=\"text-sm font-medium text-foreground flex items-center gap-2\"\n >\n <Mail className=\"w-4 h-4\" />\n Email Address\n </Label>\n <Input\n id=\"identifier\"\n type=\"email\"\n placeholder=\"Enter your email address\"\n value={identifier}\n onChange={(e) => handleIdentifierChange(e.target.value)}\n disabled={isLoading}\n required\n className=\"h-11 text-base\"\n />\n </TabsContent>\n\n <TabsContent value=\"phone\" className=\"space-y-3 mt-0\">\n <Label\n htmlFor=\"phone-identifier\"\n className=\"text-sm font-medium text-foreground flex items-center gap-2\"\n >\n <Phone className=\"w-4 h-4\" />\n Phone Number\n </Label>\n <PhoneInput\n value={identifier}\n onChange={(value) => handleIdentifierChange(value || '')}\n disabled={isLoading}\n placeholder=\"Enter your phone number\"\n defaultCountry=\"US\"\n className=\"h-11 text-base\"\n />\n </TabsContent>\n\n {/* Terms and Conditions - only show if we have links */}\n {hasAnyLinks && (\n <div className=\"flex items-start gap-3\">\n <Checkbox\n id=\"terms\"\n checked={acceptedTerms}\n onCheckedChange={setAcceptedTerms}\n disabled={isLoading}\n className=\"mt-1\"\n />\n <div className=\"text-sm text-muted-foreground leading-5\">\n <Label htmlFor=\"terms\" className=\"cursor-pointer\">\n I agree to the{' '}\n {termsUrl && (\n <>\n <a\n href={termsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline font-medium\"\n >\n Terms of Service\n </a>\n {privacyUrl && <>{' '}and{' '}</>}\n </>\n )}\n {privacyUrl && (\n <a\n href={privacyUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline font-medium\"\n >\n Privacy Policy\n </a>\n )}\n </Label>\n </div>\n </div>\n )}\n\n {/* Error Message */}\n {error && (\n <div className=\"text-sm text-destructive bg-destructive/10 p-3 rounded-md border border-destructive/20\">\n {error}\n </div>\n )}\n\n {/* Submit Button */}\n <Button\n type=\"submit\"\n size=\"lg\"\n className=\"w-full\"\n disabled={!identifier || (hasAnyLinks && !acceptedTerms)}\n loading={isLoading}\n >\n <Send className=\"w-4 h-4\" />\n Send verification code\n </Button>\n </form>\n </Tabs>\n ) : (\n <form onSubmit={handleIdentifierSubmit} className=\"space-y-6 mt-6\">\n {/* Email-only input when phone auth is disabled */}\n <div className=\"space-y-3\">\n <Label\n htmlFor=\"email-only\"\n className=\"text-sm font-medium text-foreground flex items-center gap-2\"\n >\n <Mail className=\"w-4 h-4\" />\n Email Address\n </Label>\n <Input\n id=\"email-only\"\n type=\"email\"\n placeholder=\"Enter your email address\"\n value={identifier}\n onChange={(e) => handleIdentifierChange(e.target.value)}\n disabled={isLoading}\n required\n className=\"h-11 text-base\"\n />\n </div>\n\n {/* Terms and Conditions - only show if we have links */}\n {hasAnyLinks && (\n <div className=\"flex items-start gap-3\">\n <Checkbox\n id=\"terms-email\"\n checked={acceptedTerms}\n onCheckedChange={setAcceptedTerms}\n disabled={isLoading}\n className=\"mt-1\"\n />\n <div className=\"text-sm text-muted-foreground leading-5\">\n <Label htmlFor=\"terms-email\" className=\"cursor-pointer\">\n I agree to the{' '}\n {termsUrl && (\n <>\n <a\n href={termsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline font-medium\"\n >\n Terms of Service\n </a>\n {privacyUrl && <>{' '}and{' '}</>}\n </>\n )}\n {privacyUrl && (\n <a\n href={privacyUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline font-medium\"\n >\n Privacy Policy\n </a>\n )}\n </Label>\n </div>\n </div>\n )}\n\n {/* Error Message */}\n {error && (\n <div className=\"text-sm text-destructive bg-destructive/10 p-3 rounded-md border border-destructive/20\">\n {error}\n </div>\n )}\n\n {/* Submit Button */}\n <Button\n type=\"submit\"\n size=\"lg\"\n className=\"w-full\"\n disabled={!identifier || (hasAnyLinks && !acceptedTerms)}\n loading={isLoading}\n >\n <Send className=\"w-4 h-4\" />\n Send verification code\n </Button>\n </form>\n )}\n\n {/* OAuth Providers (GitHub, etc.) */}\n <OAuthProviders />\n\n {/* Help Section */}\n <AuthHelp />\n </CardContent>\n </Card>\n );\n};\n\n","import { createConsola } from 'consola';\n\n/**\n * Universal logger for @djangocfg/layouts\n * Uses consola for beautiful console logging\n *\n * Log levels:\n * - 0: silent\n * - 1: fatal, error\n * - 2: warn\n * - 3: log, info\n * - 4: debug\n * - 5: trace, verbose\n */\nconst isDevelopment = process.env.NODE_ENV === 'development';\nconst isStaticBuild = process.env.NEXT_PUBLIC_STATIC_BUILD === 'true';\nconst showLogs = isDevelopment || isStaticBuild;\n\nexport const logger = createConsola({\n level: showLogs ? 4 : 1, // dev: debug, production: errors only\n}).withTag('layouts');\n\n// ─────────────────────────────────────────────────────────────────────────\n// Module-specific loggers\n// ─────────────────────────────────────────────────────────────────────────\n\n/**\n * Auth-specific logger\n */\nexport const authLogger = logger.withTag('auth');\n\n/**\n * Chat-specific logger\n */\nexport const chatLogger = logger.withTag('chat');\n\n/**\n * Support-specific logger\n */\nexport const supportLogger = logger.withTag('support');\n\n/**\n * Payments-specific logger\n */\nexport const paymentsLogger = logger.withTag('payments');\n\n/**\n * Profile-specific logger\n */\nexport const profileLogger = logger.withTag('profile');\n\n/**\n * Dashboard-specific logger\n */\nexport const dashboardLogger = logger.withTag('dashboard');\n\n// ─────────────────────────────────────────────────────────────────────────\n// Export default\n// ─────────────────────────────────────────────────────────────────────────\n\nexport default logger;\n","'use client';\n\nimport { ArrowLeft, Mail, MessageCircle, RotateCw, ShieldCheck } from 'lucide-react';\nimport React, { useCallback, useRef } from 'react';\n\nimport {\n Button, Card, CardContent, CardDescription, CardHeader, CardTitle, OTPInput\n} from '@djangocfg/ui-nextjs/components';\n\nimport { config } from '../../../utils';\nimport { useAuthFormContext } from '../context';\nimport { AuthHelp } from './AuthHelp';\n\nexport const OTPForm: React.FC = () => {\n const {\n identifier,\n channel,\n otp,\n isLoading,\n error,\n supportUrl,\n setOtp,\n handleOTPSubmit,\n handleResendOTP,\n handleBackToIdentifier,\n isAutoSubmittingFromUrl,\n } = useAuthFormContext();\n\n // Ref to track if auto-submit is in progress to prevent duplicate submissions\n const isAutoSubmittingRef = useRef(false);\n\n // Handle auto-submit when OTP is complete (after paste or last digit entry)\n // Note: useAutoAuth already handles auto-submit from URL, this handles manual input/paste\n const handleOTPComplete = useCallback((completedValue: string) => {\n // Prevent duplicate submissions - check local ref, isLoading, and URL auto-submit ref\n if (isAutoSubmittingRef.current || isLoading || isAutoSubmittingFromUrl.current) return;\n\n if (completedValue.length === 6) {\n isAutoSubmittingRef.current = true;\n\n // Create a fake form event for handleOTPSubmit\n const fakeEvent = {\n preventDefault: () => {},\n } as React.FormEvent;\n\n // Small delay to ensure state is updated, then submit\n // Reset ref after submit completes (isLoading will handle preventing re-submits)\n setTimeout(async () => {\n try {\n await handleOTPSubmit(fakeEvent);\n } finally {\n isAutoSubmittingRef.current = false;\n }\n }, 100);\n }\n }, [handleOTPSubmit, isLoading, isAutoSubmittingFromUrl]);\n\n const getChannelIcon = () => {\n return channel === 'phone' ? (\n <div className=\"flex items-center justify-center\">\n <MessageCircle className=\"w-5 h-5 text-primary\" />\n </div>\n ) : (\n <Mail className=\"w-5 h-5 text-primary\" />\n );\n };\n\n const getChannelTitle = () => {\n return channel === 'phone' ? 'Verify Your Phone' : 'Verify Your Email';\n };\n\n const getChannelDescription = () => {\n const channelName = channel === 'phone' ? 'phone number' : 'email address';\n const method = channel === 'phone' ? 'WhatsApp/SMS' : 'email';\n return `We've sent a 6-digit verification code to your ${channelName} via ${method}`;\n };\n\n return (\n <Card className=\"w-full max-w-md mx-auto shadow-lg border border-border bg-card/50 backdrop-blur-sm\">\n <CardHeader className=\"text-center pb-6\">\n <div className=\"mx-auto w-12 h-12 bg-primary/10 rounded-full flex items-center justify-center mb-4\">\n {getChannelIcon()}\n </div>\n <CardTitle className=\"text-xl font-semibold\">{getChannelTitle()}</CardTitle>\n <CardDescription className=\"text-muted-foreground\">\n {getChannelDescription()}\n <br />\n <span className=\"font-medium text-foreground\">{identifier}</span>\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <form onSubmit={handleOTPSubmit} className=\"space-y-6\">\n <div className=\"space-y-3\">\n <label className=\"text-sm font-medium text-foreground text-center block\">\n Enter verification code\n </label>\n <div className=\"flex justify-center\">\n <OTPInput\n length={6}\n validationMode=\"numeric\"\n pasteBehavior=\"clean\"\n value={otp}\n onChange={setOtp}\n onComplete={handleOTPComplete}\n disabled={isLoading}\n autoFocus={true}\n autoSubmit={false}\n size=\"lg\"\n />\n </div>\n\n {/* Development Mode Notice */}\n {config.isDevelopment && (\n <div className=\"text-xs text-amber-600 dark:text-amber-400 bg-amber-50 dark:bg-amber-950/30 p-2 rounded-md border border-amber-200 dark:border-amber-800 text-center\">\n 🔧 Dev Mode: Any OTP code works\n </div>\n )}\n </div>\n\n <div className=\"space-y-4\">\n <Button\n type=\"submit\"\n size=\"lg\"\n className=\"w-full\"\n disabled={otp.length < 6}\n loading={isLoading}\n >\n <ShieldCheck className=\"w-5 h-5\" />\n Verify Code\n </Button>\n\n <div className=\"flex gap-3\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleBackToIdentifier}\n disabled={isLoading}\n className=\"flex-1\"\n >\n <ArrowLeft className=\"w-4 h-4\" />\n Back\n </Button>\n\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleResendOTP}\n disabled={isLoading}\n className=\"flex-1\"\n >\n <RotateCw className=\"w-4 h-4\" />\n Resend\n </Button>\n </div>\n </div>\n </form>\n\n {/* Error Message */}\n {error && (\n <div className=\"text-sm text-destructive bg-destructive/10 p-3 rounded-md border border-destructive/20\">\n {error}\n </div>\n )}\n\n {supportUrl && (\n <div className=\"mt-4\">\n <AuthHelp />\n </div>\n )}\n </CardContent>\n </Card>\n );\n};\n\n","'use client';\n\nimport { KeyRound, Loader2, ShieldCheck } from 'lucide-react';\nimport React from 'react';\n\nimport {\n Alert,\n AlertDescription,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n OTPInput,\n Input,\n} from '@djangocfg/ui-nextjs/components';\n\nimport { useAuthFormContext } from '../context';\n\n/**\n * Two-Factor Authentication Form\n *\n * Displays TOTP code input or backup code input based on user selection.\n * Used after OTP/OAuth verification when user has 2FA enabled.\n */\nexport const TwoFactorForm: React.FC = () => {\n const {\n twoFactorCode,\n useBackupCode,\n error,\n is2FALoading,\n twoFactorWarning,\n setTwoFactorCode,\n handle2FASubmit,\n handleUseBackupCode,\n handleUseTOTP,\n } = useAuthFormContext();\n\n return (\n <Card className=\"w-full\">\n <CardHeader className=\"space-y-1 text-center\">\n <div className=\"mx-auto w-12 h-12 bg-primary/10 rounded-full flex items-center justify-center mb-2\">\n <ShieldCheck className=\"w-6 h-6 text-primary\" />\n </div>\n <CardTitle className=\"text-2xl\">Two-Factor Authentication</CardTitle>\n <CardDescription>\n {useBackupCode\n ? 'Enter one of your backup recovery codes'\n : 'Enter the 6-digit code from your authenticator app'}\n </CardDescription>\n </CardHeader>\n\n <form onSubmit={handle2FASubmit}>\n <CardContent className=\"space-y-4\">\n {/* Error Alert */}\n {error && (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n\n {/* Warning Alert (e.g., low backup codes) */}\n {twoFactorWarning && (\n <Alert>\n <AlertDescription>{twoFactorWarning}</AlertDescription>\n </Alert>\n )}\n\n {/* TOTP Code Input */}\n {!useBackupCode && (\n <div className=\"flex justify-center\">\n <OTPInput\n length={6}\n validationMode=\"numeric\"\n pasteBehavior=\"clean\"\n value={twoFactorCode}\n onChange={setTwoFactorCode}\n disabled={is2FALoading}\n autoFocus={true}\n size=\"lg\"\n />\n </div>\n )}\n\n {/* Backup Code Input */}\n {useBackupCode && (\n <div className=\"space-y-2\">\n <Input\n type=\"text\"\n placeholder=\"Enter backup code\"\n value={twoFactorCode}\n onChange={(e) => setTwoFactorCode(e.target.value.toUpperCase())}\n disabled={is2FALoading}\n className=\"text-center font-mono text-lg tracking-widest\"\n maxLength={12}\n autoComplete=\"off\"\n />\n <p className=\"text-xs text-muted-foreground text-center\">\n Backup codes are 8 characters, letters and numbers\n </p>\n </div>\n )}\n </CardContent>\n\n <CardFooter className=\"flex flex-col space-y-3\">\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={is2FALoading || (!useBackupCode && twoFactorCode.length !== 6)}\n >\n {is2FALoading ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Verifying...\n </>\n ) : (\n 'Verify'\n )}\n </Button>\n\n {/* Toggle between TOTP and Backup Code */}\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"w-full text-sm\"\n onClick={useBackupCode ? handleUseTOTP : handleUseBackupCode}\n disabled={is2FALoading}\n >\n <KeyRound className=\"mr-2 h-4 w-4\" />\n {useBackupCode\n ? 'Use authenticator app instead'\n : \"Can't access your authenticator? Use a backup code\"}\n </Button>\n </CardFooter>\n </form>\n </Card>\n );\n};\n","'use client';\n\nimport { CheckCircle, Copy, Eye, EyeOff, Loader2, ShieldCheck } from 'lucide-react';\nimport React, { useState } from 'react';\nimport { QRCodeSVG } from 'qrcode.react';\n\nimport { useTwoFactorSetup } from '@djangocfg/api/auth';\nimport {\n Alert,\n AlertDescription,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n OTPInput,\n} from '@djangocfg/ui-nextjs/components';\n\nexport interface TwoFactorSetupProps {\n /** Callback when setup is complete */\n onComplete?: (backupCodes: string[]) => void;\n /** Callback to skip setup */\n onSkip?: () => void;\n /** Callback on error */\n onError?: (error: string) => void;\n /** Device name for the authenticator */\n deviceName?: string;\n}\n\n/**\n * Two-Factor Authentication Setup Component\n *\n * Guides user through enabling 2FA:\n * 1. Shows QR code to scan with authenticator app\n * 2. User enters code to confirm\n * 3. Shows backup codes to save\n */\nexport const TwoFactorSetup: React.FC<TwoFactorSetupProps> = ({\n onComplete,\n onSkip,\n onError,\n deviceName,\n}) => {\n const [confirmCode, setConfirmCode] = useState('');\n const [showSecret, setShowSecret] = useState(false);\n const [copiedSecret, setCopiedSecret] = useState(false);\n const [copiedBackupCodes, setCopiedBackupCodes] = useState(false);\n\n const {\n isLoading,\n error,\n setupData,\n backupCodes,\n backupCodesWarning,\n setupStep,\n startSetup,\n confirmSetup,\n resetSetup,\n } = useTwoFactorSetup({\n onComplete,\n onError,\n });\n\n // Start setup on mount if not already started\n React.useEffect(() => {\n if (setupStep === 'idle') {\n startSetup(deviceName);\n }\n }, [setupStep, startSetup, deviceName]);\n\n const handleConfirm = async (e: React.FormEvent) => {\n e.preventDefault();\n await confirmSetup(confirmCode);\n };\n\n const copySecret = async () => {\n if (setupData?.secret) {\n await navigator.clipboard.writeText(setupData.secret);\n setCopiedSecret(true);\n setTimeout(() => setCopiedSecret(false), 2000);\n }\n };\n\n const copyBackupCodes = async () => {\n if (backupCodes) {\n await navigator.clipboard.writeText(backupCodes.join('\\n'));\n setCopiedBackupCodes(true);\n setTimeout(() => setCopiedBackupCodes(false), 2000);\n }\n };\n\n // Loading state\n if (isLoading && !setupData) {\n return (\n <Card className=\"w-full max-w-md mx-auto\">\n <CardContent className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"w-8 h-8 animate-spin text-primary\" />\n </CardContent>\n </Card>\n );\n }\n\n // Complete - show backup codes\n if (setupStep === 'complete' && backupCodes) {\n return (\n <Card className=\"w-full max-w-md mx-auto\">\n <CardHeader className=\"space-y-1 text-center\">\n <div className=\"mx-auto w-12 h-12 bg-green-100 dark:bg-green-900/20 rounded-full flex items-center justify-center mb-2\">\n <CheckCircle className=\"w-6 h-6 text-green-600 dark:text-green-400\" />\n </div>\n <CardTitle className=\"text-2xl\">2FA Enabled!</CardTitle>\n <CardDescription>\n Save these backup codes in a secure place\n </CardDescription>\n </CardHeader>\n\n <CardContent className=\"space-y-4\">\n {backupCodesWarning && (\n <Alert>\n <AlertDescription>{backupCodesWarning}</AlertDescription>\n </Alert>\n )}\n\n <div className=\"bg-muted rounded-lg p-4\">\n <div className=\"grid grid-cols-2 gap-2 font-mono text-sm\">\n {backupCodes.map((code, index) => (\n <div key={index} className=\"text-center py-1\">\n {code}\n </div>\n ))}\n </div>\n </div>\n\n <p className=\"text-xs text-muted-foreground text-center\">\n Each code can only be used once. Store them securely.\n </p>\n </CardContent>\n\n <CardFooter className=\"flex flex-col space-y-3\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"w-full\"\n onClick={copyBackupCodes}\n >\n <Copy className=\"mr-2 h-4 w-4\" />\n {copiedBackupCodes ? 'Copied!' : 'Copy all codes'}\n </Button>\n\n <Button\n type=\"button\"\n className=\"w-full\"\n onClick={() => onComplete?.(backupCodes)}\n >\n I've saved my backup codes\n </Button>\n </CardFooter>\n </Card>\n );\n }\n\n // Scanning/Confirming - show QR code\n return (\n <Card className=\"w-full max-w-md mx-auto\">\n <CardHeader className=\"space-y-1 text-center\">\n <div className=\"mx-auto w-12 h-12 bg-primary/10 rounded-full flex items-center justify-center mb-2\">\n <ShieldCheck className=\"w-6 h-6 text-primary\" />\n </div>\n <CardTitle className=\"text-2xl\">Set Up 2FA</CardTitle>\n <CardDescription>\n Scan this QR code with your authenticator app\n </CardDescription>\n </CardHeader>\n\n <form onSubmit={handleConfirm}>\n <CardContent className=\"space-y-6\">\n {error && (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n\n {/* QR Code */}\n {setupData && (\n <div className=\"flex justify-center\">\n <div className=\"bg-white p-4 rounded-lg\">\n <QRCodeSVG\n value={setupData.provisioningUri}\n size={200}\n level=\"M\"\n marginSize={0}\n />\n </div>\n </div>\n )}\n\n {/* Manual entry option */}\n {setupData && (\n <div className=\"space-y-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"w-full text-xs\"\n onClick={() => setShowSecret(!showSecret)}\n >\n {showSecret ? (\n <EyeOff className=\"mr-2 h-3 w-3\" />\n ) : (\n <Eye className=\"mr-2 h-3 w-3\" />\n )}\n {showSecret ? 'Hide' : 'Show'} manual entry code\n </Button>\n\n {showSecret && (\n <div className=\"flex items-center gap-2 bg-muted rounded-lg p-3\">\n <code className=\"flex-1 text-xs font-mono break-all\">\n {setupData.secret}\n </code>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={copySecret}\n >\n <Copy className=\"h-4 w-4\" />\n </Button>\n </div>\n )}\n </div>\n )}\n\n {/* Confirm code input */}\n <div className=\"space-y-2\">\n <p className=\"text-sm text-center text-muted-foreground\">\n Enter the 6-digit code from your app to confirm\n </p>\n <div className=\"flex justify-center\">\n <OTPInput\n length={6}\n validationMode=\"numeric\"\n pasteBehavior=\"clean\"\n value={confirmCode}\n onChange={setConfirmCode}\n disabled={isLoading}\n autoFocus={true}\n size=\"lg\"\n />\n </div>\n </div>\n </CardContent>\n\n <CardFooter className=\"flex flex-col space-y-3\">\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={isLoading || confirmCode.length !== 6}\n >\n {isLoading ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Verifying...\n </>\n ) : (\n 'Confirm & Enable 2FA'\n )}\n </Button>\n\n {onSkip && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"w-full\"\n onClick={onSkip}\n disabled={isLoading}\n >\n Skip for now\n </Button>\n )}\n </CardFooter>\n </form>\n </Card>\n );\n};\n","/**\n * Auth Success Component\n *\n * Full-screen success layout shown after successful authentication.\n * Displays a centered logo with a subtle animation, then redirects.\n */\n\n'use client';\n\nimport React, { useEffect, useState } from 'react';\n\nimport { useCfgRouter } from '@djangocfg/ui-nextjs/hooks';\n\nimport { useAuthFormContext } from '../context';\n\nexport interface AuthSuccessProps {\n className?: string;\n /** Delay before redirect in ms (default: 1500) */\n redirectDelay?: number;\n}\n\nexport const AuthSuccess: React.FC<AuthSuccessProps> = ({ className, redirectDelay = 1500 }) => {\n const { logoUrl, redirectUrl } = useAuthFormContext();\n const router = useCfgRouter();\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n // Trigger animation after mount\n const animTimer = setTimeout(() => setIsVisible(true), 50);\n\n // Redirect after delay\n const redirectTimer = setTimeout(() => {\n const finalUrl = redirectUrl || '/dashboard';\n router.hardPush(finalUrl);\n }, redirectDelay);\n\n return () => {\n clearTimeout(animTimer);\n clearTimeout(redirectTimer);\n };\n }, [redirectUrl, redirectDelay, router]);\n\n if (!logoUrl) {\n // Fallback: simple checkmark if no logo provided\n return (\n <div className={`fixed inset-0 flex items-center justify-center bg-background z-50 ${className || ''}`}>\n <div\n className={`transition-all duration-700 ease-out ${\n isVisible ? 'opacity-100 scale-100' : 'opacity-0 scale-95'\n }`}\n >\n <div className=\"w-24 h-24 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center\">\n <svg\n className=\"w-12 h-12 text-green-600 dark:text-green-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className={`fixed inset-0 flex items-center justify-center bg-background z-50 ${className || ''}`}>\n <div\n className={`transition-all duration-700 ease-out ${\n isVisible ? 'opacity-100 scale-100' : 'opacity-0 scale-90'\n }`}\n >\n {/* Logo container with max size and animation */}\n <div className=\"relative\">\n {/* Subtle glow effect */}\n <div\n className={`absolute inset-0 blur-3xl transition-opacity duration-1000 ${\n isVisible ? 'opacity-20' : 'opacity-0'\n }`}\n style={{\n background: 'radial-gradient(circle, currentColor 0%, transparent 70%)',\n }}\n />\n\n {/* Logo image */}\n <img\n src={logoUrl}\n alt=\"Success\"\n className=\"relative w-32 h-32 sm:w-40 sm:h-40 md:w-48 md:h-48 object-contain\"\n />\n </div>\n </div>\n </div>\n );\n};\n","/**\n * Auth Layout\n *\n * Layout for authentication pages with OTP (email/phone), OAuth (GitHub), and 2FA support.\n * Supports multi-step authentication flow: identifier → OTP → 2FA (if enabled)\n */\n\n'use client';\n\nimport React from 'react';\n\nimport { Suspense } from '../../components';\nimport { AuthSuccess, IdentifierForm, OAuthCallback, OTPForm, TwoFactorForm, TwoFactorSetup } from './components';\nimport { AuthFormProvider, useAuthFormContext } from './context';\n\nimport type { AuthLayoutProps } from './types';\n\nexport type { AuthLayoutProps };\n\nexport const AuthLayout: React.FC<AuthLayoutProps> = (props) => {\n const { enableGithubAuth, redirectUrl = '/dashboard', onOAuthSuccess, onError, className } = props;\n\n return (\n <Suspense>\n <AuthFormProvider {...props}>\n {/* Full-screen success overlay */}\n <AuthSuccessOverlay />\n\n <div\n className={`min-h-screen flex flex-col items-center justify-center bg-background py-6 px-4 sm:py-12 sm:px-6 lg:px-8 ${className || ''}`}\n >\n {/* Handle OAuth callback when GitHub auth is enabled */}\n {enableGithubAuth && (\n <Suspense fallback={null}>\n <OAuthCallback\n redirectUrl={redirectUrl}\n onSuccess={onOAuthSuccess ? (user, isNewUser) => onOAuthSuccess(user, isNewUser, 'github') : undefined}\n onError={onError}\n />\n </Suspense>\n )}\n\n <div className=\"w-full sm:max-w-md space-y-8\">\n {props.children}\n <AuthContent />\n </div>\n </div>\n </AuthFormProvider>\n </Suspense>\n );\n};\n\nconst AuthContent: React.FC = () => {\n const { step, setStep } = useAuthFormContext();\n\n switch (step) {\n case 'identifier':\n return <IdentifierForm />;\n case 'otp':\n return <OTPForm />;\n case '2fa':\n return <TwoFactorForm />;\n case '2fa-setup':\n return (\n <TwoFactorSetup\n onComplete={() => setStep('success')}\n onSkip={() => setStep('success')}\n />\n );\n case 'success':\n // Success is rendered as full-screen overlay, return null here\n return null;\n default:\n return <IdentifierForm />;\n }\n};\n\nconst AuthSuccessOverlay: React.FC = () => {\n const { step } = useAuthFormContext();\n\n if (step !== 'success') {\n return null;\n }\n\n return <AuthSuccess />;\n};\n","/**\n * Admin Layout\n * \n * Layout for admin dashboard pages\n * Import and use directly with props - no complex configs needed!\n * \n * @example\n * ```tsx\n * import { AdminLayout } from '@djangocfg/layouts';\n * \n * <AdminLayout\n * sidebar={{\n * items: [\n * { label: 'Overview', href: '/admin', icon: 'LayoutDashboard' },\n * { label: 'Users', href: '/admin/users', icon: 'Users' }\n * ]\n * }}\n * header={{\n * title: 'Admin Dashboard',\n * groups: [\n * {\n * title: 'Admin',\n * items: [\n * { label: 'Profile', href: '/profile' },\n * { label: 'Settings', href: '/settings' }\n * ]\n * }\n * ],\n * authPath: '/auth'\n * }}\n * >\n * {children}\n * </AdminLayout>\n * ```\n */\n\n'use client';\n\nimport { ReactNode } from 'react';\n\nimport { PrivateLayout, PrivateLayoutProps} from '../PrivateLayout/PrivateLayout';\n\nexport interface AdminLayoutProps extends PrivateLayoutProps {\n children: ReactNode;\n}\n\n/**\n * Admin Layout Component\n * \n * Wrapper around PrivateLayout with admin-specific defaults\n * Same API as PrivateLayout - just a convenience export\n */\nexport function AdminLayout(props: AdminLayoutProps) {\n return <PrivateLayout {...props} />;\n}\n\n","'use client';\n\nimport { Camera, ChevronRight, LogOut, Mail, Phone, Shield, ShieldCheck, Trash2, User, Building2, Briefcase } from 'lucide-react';\nimport moment from 'moment';\nimport React, { useEffect, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { toast } from '@djangocfg/ui-core/hooks';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport {\n PatchedUserProfileUpdateRequest,\n PatchedUserProfileUpdateRequestSchema,\n useAuth,\n useTwoFactorStatus,\n} from '@djangocfg/api/auth';\nimport {\n Avatar,\n AvatarFallback,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Button,\n Input,\n Preloader,\n} from '@djangocfg/ui-nextjs/components';\nimport { zodResolver } from '@hookform/resolvers/zod';\n\nimport { TwoFactorSetup } from '../AuthLayout/components/TwoFactorSetup';\nimport { profileLogger } from '../../utils/logger';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface ProfileLayoutProps {\n onUnauthenticated?: () => void;\n title?: string;\n enable2FA?: boolean;\n enableDeleteAccount?: boolean;\n}\n\ntype EditingField = 'first_name' | 'last_name' | 'company' | 'position' | 'phone' | null;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Reusable Components\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Apple-style settings group container */\nconst SettingsGroup = ({ children, className }: { children: React.ReactNode; className?: string }) => (\n <div className={cn('bg-card rounded-xl overflow-hidden divide-y divide-border', className)}>\n {children}\n </div>\n);\n\n/** Apple-style settings group header */\nconst SettingsGroupHeader = ({ children }: { children: React.ReactNode }) => (\n <div className=\"px-4 py-2 text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n {children}\n </div>\n);\n\n/** Apple-style settings row */\ninterface SettingsRowProps {\n icon?: React.ReactNode;\n label: string;\n value?: string | React.ReactNode;\n onClick?: () => void;\n destructive?: boolean;\n disabled?: boolean;\n showChevron?: boolean;\n className?: string;\n}\n\nconst SettingsRow = ({\n icon,\n label,\n value,\n onClick,\n destructive,\n disabled,\n showChevron = !!onClick,\n className,\n}: SettingsRowProps) => {\n const Wrapper = onClick ? 'button' : 'div';\n\n return (\n <Wrapper\n onClick={disabled ? undefined : onClick}\n disabled={disabled}\n className={cn(\n 'w-full flex items-center gap-3 px-4 py-3 text-left transition-colors',\n onClick && !disabled && 'hover:bg-muted/50 active:bg-muted cursor-pointer',\n disabled && 'opacity-50 cursor-not-allowed',\n destructive && 'text-destructive',\n className\n )}\n >\n {icon && (\n <span className={cn('shrink-0', destructive ? 'text-destructive' : 'text-muted-foreground')}>\n {icon}\n </span>\n )}\n <span className=\"flex-1 font-medium\">{label}</span>\n {value && (\n <span className=\"text-muted-foreground text-sm truncate max-w-[180px]\">\n {value}\n </span>\n )}\n {showChevron && (\n <ChevronRight className=\"w-4 h-4 text-muted-foreground/50 shrink-0\" />\n )}\n </Wrapper>\n );\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Edit Field Dialog\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface EditFieldDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n field: EditingField;\n currentValue: string;\n onSave: (field: string, value: string) => Promise<void>;\n isSaving: boolean;\n}\n\nconst fieldLabels: Record<string, string> = {\n first_name: 'First Name',\n last_name: 'Last Name',\n company: 'Company',\n position: 'Position',\n phone: 'Phone',\n};\n\nconst EditFieldDialog = ({ open, onOpenChange, field, currentValue, onSave, isSaving }: EditFieldDialogProps) => {\n const [value, setValue] = useState(currentValue);\n\n useEffect(() => {\n setValue(currentValue);\n }, [currentValue, open]);\n\n const handleSave = async () => {\n if (field) {\n await onSave(field, value);\n }\n };\n\n if (!field) return null;\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>{fieldLabels[field]}</DialogTitle>\n </DialogHeader>\n <div className=\"py-4\">\n <Input\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={`Enter ${fieldLabels[field].toLowerCase()}`}\n autoFocus\n onKeyDown={(e) => e.key === 'Enter' && handleSave()}\n />\n </div>\n <DialogFooter>\n <Button variant=\"ghost\" onClick={() => onOpenChange(false)} disabled={isSaving}>\n Cancel\n </Button>\n <Button onClick={handleSave} disabled={isSaving}>\n {isSaving ? 'Saving...' : 'Save'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Main Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst ProfileContent = ({\n onUnauthenticated,\n title = 'Profile',\n enable2FA = false,\n enableDeleteAccount = true,\n}: ProfileLayoutProps) => {\n const { user, isLoading, logout, uploadAvatar, updateProfile } = useAuth();\n const [editingField, setEditingField] = useState<EditingField>(null);\n const [isSaving, setIsSaving] = useState(false);\n const [isUploading, setIsUploading] = useState(false);\n\n // 2FA state\n const [show2FASetup, setShow2FASetup] = useState(false);\n const { has2FAEnabled, fetchStatus: fetch2FAStatus } = useTwoFactorStatus();\n\n // Delete account state\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n\n const form = useForm<PatchedUserProfileUpdateRequest>({\n resolver: zodResolver(PatchedUserProfileUpdateRequestSchema),\n defaultValues: {\n first_name: '',\n last_name: '',\n company: '',\n position: '',\n phone: '',\n },\n });\n\n useEffect(() => {\n if (user) {\n form.reset({\n first_name: user.first_name || '',\n last_name: user.last_name || '',\n company: user.company || '',\n position: user.position || '',\n phone: user.phone || '',\n });\n }\n }, [user, form]);\n\n useEffect(() => {\n if (enable2FA) {\n fetch2FAStatus();\n }\n }, [enable2FA, fetch2FAStatus]);\n\n useEffect(() => {\n if (onUnauthenticated && !user && !isLoading) {\n onUnauthenticated();\n }\n }, [onUnauthenticated, user, isLoading]);\n\n const getInitials = (name: string) => {\n if (!name) return 'U';\n return name.split(' ').map((w) => w[0]).join('').toUpperCase().slice(0, 2);\n };\n\n const handleAvatarChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (!file) return;\n\n if (!file.type.startsWith('image/')) {\n toast.error('Please select an image file');\n return;\n }\n if (file.size > 5 * 1024 * 1024) {\n toast.error('File size must be less than 5MB');\n return;\n }\n\n setIsUploading(true);\n try {\n await uploadAvatar(file);\n toast.success('Avatar updated');\n } catch (error) {\n toast.error('Failed to upload avatar');\n profileLogger.error('Avatar upload error:', error);\n } finally {\n setIsUploading(false);\n }\n };\n\n const handleFieldSave = async (field: string, value: string) => {\n setIsSaving(true);\n try {\n await updateProfile({ [field]: value });\n toast.success('Profile updated');\n setEditingField(null);\n } catch (error: any) {\n profileLogger.error('Profile update error:', error);\n toast.error(error?.response?.data?.[field]?.[0] || 'Failed to update');\n } finally {\n setIsSaving(false);\n }\n };\n\n const handleLogout = () => {\n logout();\n };\n\n // Loading state\n if (isLoading) {\n return (\n <Preloader\n variant=\"fullscreen\"\n text=\"Loading...\"\n size=\"lg\"\n backdrop={true}\n backdropOpacity={80}\n />\n );\n }\n\n // Not authenticated\n if (!user) {\n return (\n <div className=\"flex items-center justify-center min-h-screen\">\n <div className=\"text-center\">\n <h1 className=\"text-2xl font-bold mb-4\">Not Authenticated</h1>\n <p className=\"text-muted-foreground\">Please log in to view your profile.</p>\n </div>\n </div>\n );\n }\n\n // 2FA Setup view\n if (show2FASetup) {\n return (\n <div className=\"container mx-auto px-4 py-8 max-w-lg\">\n <TwoFactorSetup\n onComplete={() => {\n setShow2FASetup(false);\n fetch2FAStatus();\n }}\n onSkip={() => setShow2FASetup(false)}\n />\n </div>\n );\n }\n\n return (\n <div className=\"container mx-auto px-4 py-8 max-w-lg\">\n {/* Header */}\n <h1 className=\"text-2xl font-bold text-center mb-8\">{title}</h1>\n\n {/* Avatar & Name */}\n <div className=\"flex flex-col items-center mb-8\">\n <div className=\"relative group mb-3\">\n <Avatar className=\"w-24 h-24 text-3xl\">\n {user.avatar ? (\n <img src={user.avatar} alt=\"Avatar\" className=\"w-full h-full object-cover\" />\n ) : (\n <AvatarFallback className=\"bg-primary text-primary-foreground\">\n {getInitials(user.display_username || user.email || '')}\n </AvatarFallback>\n )}\n </Avatar>\n <label className=\"absolute inset-0 rounded-full bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center cursor-pointer\">\n {isUploading ? (\n <div className=\"w-6 h-6 border-2 border-white border-t-transparent rounded-full animate-spin\" />\n ) : (\n <Camera className=\"w-6 h-6 text-white\" />\n )}\n <input\n type=\"file\"\n accept=\"image/*\"\n onChange={handleAvatarChange}\n className=\"hidden\"\n disabled={isUploading}\n />\n </label>\n </div>\n <h2 className=\"text-xl font-semibold\">{user.display_username || user.email}</h2>\n {user.date_joined && (\n <p className=\"text-sm text-muted-foreground\">\n Member since {moment.utc(user.date_joined).local().format('MMMM YYYY')}\n </p>\n )}\n </div>\n\n <div className=\"space-y-6\">\n {/* Account Info */}\n <div>\n <SettingsGroupHeader>Account</SettingsGroupHeader>\n <SettingsGroup>\n <SettingsRow\n icon={<Mail className=\"w-5 h-5\" />}\n label=\"Email\"\n value={user.email}\n showChevron={false}\n />\n </SettingsGroup>\n </div>\n\n {/* Personal Info */}\n <div>\n <SettingsGroupHeader>Personal Information</SettingsGroupHeader>\n <SettingsGroup>\n <SettingsRow\n icon={<User className=\"w-5 h-5\" />}\n label=\"First Name\"\n value={user.first_name || 'Not set'}\n onClick={() => setEditingField('first_name')}\n />\n <SettingsRow\n icon={<User className=\"w-5 h-5\" />}\n label=\"Last Name\"\n value={user.last_name || 'Not set'}\n onClick={() => setEditingField('last_name')}\n />\n <SettingsRow\n icon={<Phone className=\"w-5 h-5\" />}\n label=\"Phone\"\n value={user.phone || 'Not set'}\n onClick={() => setEditingField('phone')}\n />\n </SettingsGroup>\n </div>\n\n {/* Work Info */}\n <div>\n <SettingsGroupHeader>Work</SettingsGroupHeader>\n <SettingsGroup>\n <SettingsRow\n icon={<Building2 className=\"w-5 h-5\" />}\n label=\"Company\"\n value={user.company || 'Not set'}\n onClick={() => setEditingField('company')}\n />\n <SettingsRow\n icon={<Briefcase className=\"w-5 h-5\" />}\n label=\"Position\"\n value={user.position || 'Not set'}\n onClick={() => setEditingField('position')}\n />\n </SettingsGroup>\n </div>\n\n {/* Security */}\n {enable2FA && (\n <div>\n <SettingsGroupHeader>Security</SettingsGroupHeader>\n <SettingsGroup>\n <SettingsRow\n icon={has2FAEnabled ? <ShieldCheck className=\"w-5 h-5 text-green-500\" /> : <Shield className=\"w-5 h-5\" />}\n label=\"Two-Factor Authentication\"\n value={has2FAEnabled ? 'On' : 'Off'}\n onClick={() => !has2FAEnabled && setShow2FASetup(true)}\n showChevron={!has2FAEnabled}\n />\n </SettingsGroup>\n </div>\n )}\n\n {/* Actions */}\n <div>\n <SettingsGroupHeader>Actions</SettingsGroupHeader>\n <SettingsGroup>\n <SettingsRow\n icon={<LogOut className=\"w-5 h-5\" />}\n label=\"Sign Out\"\n onClick={handleLogout}\n />\n {enableDeleteAccount && (\n <SettingsRow\n icon={<Trash2 className=\"w-5 h-5\" />}\n label=\"Delete Account\"\n onClick={() => setShowDeleteConfirm(true)}\n destructive\n />\n )}\n </SettingsGroup>\n </div>\n </div>\n\n {/* Edit Field Dialog */}\n <EditFieldDialog\n open={editingField !== null}\n onOpenChange={(open) => !open && setEditingField(null)}\n field={editingField}\n currentValue={editingField ? (user[editingField] || '') : ''}\n onSave={handleFieldSave}\n isSaving={isSaving}\n />\n\n {/* Delete Account Dialog */}\n <DeleteAccountDialog\n open={showDeleteConfirm}\n onOpenChange={setShowDeleteConfirm}\n />\n </div>\n );\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Delete Account Dialog\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport { useDeleteAccount } from '@djangocfg/api/auth';\n\nconst CONFIRMATION_TEXT = 'DELETE';\n\nconst DeleteAccountDialog = ({ open, onOpenChange }: { open: boolean; onOpenChange: (open: boolean) => void }) => {\n const [confirmationInput, setConfirmationInput] = useState('');\n const { logout } = useAuth();\n const { isLoading, error, deleteAccount, clearError } = useDeleteAccount();\n\n useEffect(() => {\n if (open) {\n setConfirmationInput('');\n clearError();\n }\n }, [open, clearError]);\n\n const handleDelete = async () => {\n const result = await deleteAccount();\n if (result.success) {\n onOpenChange(false);\n await logout({ skipConfirm: true });\n }\n };\n\n const isValid = confirmationInput.toUpperCase() === CONFIRMATION_TEXT;\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle className=\"text-destructive\">Delete Account</DialogTitle>\n <DialogDescription>\n This action cannot be undone. Your account will be permanently deleted.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"py-4 space-y-4\">\n {error && (\n <p className=\"text-sm text-destructive\">{error}</p>\n )}\n <div className=\"space-y-2\">\n <p className=\"text-sm text-muted-foreground\">\n Type <span className=\"font-mono font-bold\">{CONFIRMATION_TEXT}</span> to confirm:\n </p>\n <Input\n value={confirmationInput}\n onChange={(e) => setConfirmationInput(e.target.value)}\n placeholder={CONFIRMATION_TEXT}\n disabled={isLoading}\n autoComplete=\"off\"\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button variant=\"ghost\" onClick={() => onOpenChange(false)} disabled={isLoading}>\n Cancel\n </Button>\n <Button variant=\"destructive\" onClick={handleDelete} disabled={isLoading || !isValid}>\n {isLoading ? 'Deleting...' : 'Delete Account'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Export\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const ProfileLayout: React.FC<ProfileLayoutProps> = (props) => {\n return <ProfileContent {...props} />;\n};\n"]}