@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/snippets/McpChat/config.ts","../src/snippets/McpChat/types.ts","../src/snippets/McpChat/hooks/useAIChat.ts","../src/snippets/McpChat/context/AIChatContext.tsx","../src/snippets/McpChat/hooks/useChatLayout.ts","../src/snippets/McpChat/components/MessageBubble.tsx","../src/snippets/McpChat/components/ChatMessages.tsx","../src/snippets/McpChat/components/MessageInput.tsx","../src/snippets/McpChat/components/ChatPanel.tsx","../src/snippets/McpChat/components/ChatSidebar.tsx","../src/snippets/McpChat/components/AIChatWidget.tsx","../src/layouts/_components/UserMenu.tsx","../src/components/core/ClientOnly.tsx","../src/components/core/JsonLd.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/Analytics/events.ts","../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/components/errors/errorConfig.ts","../src/components/errors/ErrorLayout.tsx","../src/components/RedirectPage/RedirectPage.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/config.ts","../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","../src/snippets/Breadcrumbs.tsx","../src/snippets/McpChat/context/ChatContext.tsx","../src/snippets/McpChat/context/index.ts","../src/snippets/McpChat/components/ChatWidget.tsx","../src/snippets/McpChat/components/index.ts","../src/snippets/McpChat/hooks/useMcpChat.ts","../src/snippets/McpChat/components/AskAIButton.tsx","../src/snippets/McpChat/hooks/index.ts","../src/pages/legal/LegalPage.tsx","../src/pages/legal/configs.ts","../src/pages/legal/pages.tsx"],"names":["STORAGE_KEY","useState","useRef","useEffect","useCallback","error","useLocalStorage","useIsMobile","useMemo","config","jsx","useContext","createContext","MessageBubble","React","useAuth","jsxs","Avatar","AvatarImage","AvatarFallback","User","Bot","Card","CardContent","MarkdownMessage","Loader2","Badge","ExternalLink","forwardRef","useImperativeHandle","MessageSquare","Button","StopCircle","AIMessageInput","Send","ChatPanel","CardHeader","RotateCcw","PanelRight","X","CardFooter","GripVertical","PanelRightClose","AIChatWidget","Portal","Zap","LogOut","Link","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuGroup","DropdownMenuItem","Preloader","Fragment","LucideIcons","cn","defaultFallback","ReactSuspense","Component","consola","useCopy","Copy","Terminal","toast","ReactGA","usePathname","useCfgRouter","useEventListener","Dialog","DialogContent","DialogHeader","DialogTitle","LogIn","events","nav","apiWebPush","Bell","STORAGE_KEYS","isDismissedRecentlyHelper","isDebugEnabled","pwaLogger","isStandalone","isMobileDevice","isStandaloneReliable","getDisplayMode","useBrowserDetect","useDeviceDetect","ArrowDownToLine","Plus","Check","Menu","Search","Monitor","steps","DialogDescription","DialogFooter","ArrowUpRight","ArrowDown","CheckCircle","StepCard","Drawer","DrawerContent","DrawerHeader","DrawerTitle","Share","DrawerDescription","DEFAULT_RESET_DAYS","ChevronRight","Download","useRouter","dynamic","theme","auth","centrifugo","swr","ThemeProvider","TooltipProvider","SWRConfig","AuthProvider","CentrifugoProvider","getCentrifugoAuthTokenRetrieve","NextTopLoader","Toaster","ThemeToggle","DrawerClose","Github","Linkedin","Twitter","MessageCircle","Youtube","Facebook","Instagram","Mail","navigation","useSidebar","Sidebar","SidebarHeader","SidebarContent","SidebarGroup","SidebarGroupContent","SidebarMenu","SidebarMenuItem","SidebarMenuButton","SidebarMenuBadge","SidebarTrigger","Separator","SidebarProvider","SidebarInset","useAuthForm","HelpCircle","useGithubAuth","useSearchParams","CardTitle","CardDescription","AlertCircle","Tabs","TabsList","TabsTrigger","Phone","TabsContent","Label","Input","PhoneInput","Checkbox","createConsola","OTPInput","ShieldCheck","ArrowLeft","RotateCw","Alert","AlertDescription","KeyRound","useTwoFactorSetup","QRCodeSVG","EyeOff","Eye","useTwoFactorStatus","useForm","zodResolver","PatchedUserProfileUpdateRequestSchema","Camera","moment","Building2","Briefcase","Shield","Trash2","useDeleteAccount","uuidv4"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * McpChat configuration\n * Environment-aware configuration for MCP server endpoints\n */\n\n// Hosts\nconst PROD_HOST = 'https://mcp.djangocfg.com';\nconst DEV_HOST = 'http://localhost:3002';\n\n/**\n * Get host based on auto-detect flag\n * @param autoDetect - If true, auto-detect based on NODE_ENV. If false, always use PROD_HOST\n */\nfunction getHost(autoDetect: boolean = false): string {\n if (autoDetect && process.env.NODE_ENV === 'development') {\n return DEV_HOST;\n }\n return PROD_HOST;\n}\n\n/**\n * Get MCP Server endpoints\n * @param autoDetect - If true, auto-detect environment. If false (default), always use production\n */\nexport function getMcpEndpoints(autoDetect: boolean = false) {\n const HOST = getHost(autoDetect);\n return {\n /** Base URL */\n baseUrl: HOST,\n /** Chat API endpoint */\n chat: `${HOST}/api/chat`,\n /** Search API endpoint */\n search: `${HOST}/api/search`,\n /** Conversations API endpoint */\n conversations: `${HOST}/api/conversations`,\n /** Health check endpoint */\n health: `${HOST}/health`,\n /** MCP protocol endpoint (Streamable HTTP) */\n mcp: `${HOST}/mcp`,\n /** SSE endpoint for legacy clients */\n sse: `${HOST}/mcp/sse`,\n };\n}\n\n/**\n * MCP Server endpoints (always production by default)\n */\nexport const mcpEndpoints = getMcpEndpoints(false);\n\n// Export defaults for backwards compatibility\nexport const DEFAULT_CHAT_API_ENDPOINT = PROD_HOST + '/api/chat';\nexport const DEFAULT_MCP_BASE_URL = PROD_HOST;\n\n/**\n * Chat sidebar layout configuration\n */\nexport const sidebarConfig = {\n /** Minimum sidebar width in pixels */\n minWidth: 320,\n /** Maximum sidebar width in pixels */\n maxWidth: 600,\n /** Default sidebar width in pixels */\n defaultWidth: 400,\n /** Z-index for chat elements */\n zIndex: 300,\n /** Animation duration in milliseconds */\n animationDuration: 200,\n};\n\n/**\n * Chat FAB (Floating Action Button) configuration\n */\nexport const fabConfig = {\n /** Bottom offset in pixels */\n bottom: 24,\n /** Right offset in pixels */\n right: 24,\n /** Size of FAB button in pixels */\n size: 56,\n};\n\n/**\n * LocalStorage keys for chat state persistence\n */\nexport const storageKeys = {\n /** Display mode (closed, floating, sidebar) */\n mode: 'djangocfg-chat-mode',\n /** User ID for conversation tracking */\n userId: 'djangocfg-chat-user-id',\n /** Chat messages history */\n messages: 'djangocfg-chat-messages',\n /** Sidebar width */\n sidebarWidth: 'djangocfg-chat-sidebar-width',\n};\n","/**\n * Types for @djangocfg/mcp-chat\n */\n\n// Re-export config constants for backwards compatibility\nexport { DEFAULT_CHAT_API_ENDPOINT, mcpEndpoints, getMcpEndpoints } from './config';\n\n/**\n * AI Chat message role\n */\nexport type AIMessageRole = 'user' | 'assistant' | 'system';\n\n/**\n * AI Chat message\n */\nexport interface AIChatMessage {\n id: string;\n role: AIMessageRole;\n content: string;\n timestamp: Date;\n /** Related documentation links */\n sources?: AIChatSource[];\n /** Is message still being generated */\n isStreaming?: boolean;\n}\n\n/**\n * AI Documentation source reference\n */\nexport interface AIChatSource {\n title: string;\n path: string;\n url?: string;\n section?: string;\n score?: number;\n}\n\n/**\n * Chat API response\n */\nexport interface ChatApiResponse {\n success: boolean;\n results?: Array<{\n chunk: {\n id: string;\n path: string;\n title: string;\n section?: string;\n content: string;\n url?: string;\n };\n score: number;\n }>;\n answer?: string;\n error?: string;\n}\n\n/**\n * Chat display mode\n * - closed: Only FAB button visible\n * - floating: Floating panel (default)\n * - sidebar: Full-height sidebar on the right (desktop only)\n */\nexport type ChatDisplayMode = 'closed' | 'floating' | 'sidebar';\n\n/**\n * Chat widget configuration\n */\nexport interface ChatWidgetConfig {\n /** API endpoint for chat (default: /api/chat) */\n apiEndpoint?: string;\n /** Widget title */\n title?: string;\n /** Placeholder text for input */\n placeholder?: string;\n /** Initial greeting message */\n greeting?: string;\n /** Position on screen */\n position?: 'bottom-right' | 'bottom-left';\n /** Theme variant */\n variant?: 'default' | 'minimal';\n /** Auto-detect environment (dev/prod) for API endpoint. If false (default), always uses production */\n autoDetectEnvironment?: boolean;\n}\n\n// =============================================================================\n// AI Chat Types\n// =============================================================================\n\n/**\n * AI Chat API response\n */\nexport interface AIChatApiResponse {\n success: boolean;\n content?: string;\n sources?: Array<{\n id?: string;\n title: string;\n path: string;\n url?: string;\n section?: string;\n score?: number;\n }>;\n threadId?: string;\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n error?: string;\n}\n\n/**\n * useAIChat hook options\n */\nexport interface UseAIChatOptions {\n /** API endpoint (default: /api/ai/chat) */\n apiEndpoint?: string;\n /** Initial messages */\n initialMessages?: AIChatMessage[];\n /** Callback on error */\n onError?: (error: Error) => void;\n /** Enable streaming responses (default: true) */\n enableStreaming?: boolean;\n /** Thread ID for conversation (generated if not provided) */\n threadId?: string;\n /** User ID for conversation (generated if not provided) */\n userId?: string;\n}\n\n/**\n * useAIChat hook return type\n */\nexport interface UseAIChatReturn {\n messages: AIChatMessage[];\n isLoading: boolean;\n error: Error | null;\n threadId: string;\n userId: string;\n sendMessage: (content: string) => Promise<void>;\n clearMessages: () => void;\n stopStreaming: () => void;\n}\n\n// =============================================================================\n// MCP Chat Events (Global Chat Trigger)\n// =============================================================================\n\n/**\n * Context type for chat messages triggered from different parts of the app\n */\nexport type McpChatContextType =\n | 'error' // Error explanation\n | 'question' // General question\n | 'explain' // Explain something\n | 'advice' // Get advice\n | 'help' // Help request\n | 'custom'; // Custom context\n\n/**\n * Event detail for mcp:chat:send custom event\n */\nexport interface McpChatEventDetail {\n /** Message to send to chat */\n message: string;\n /** Optional context about the message */\n context?: {\n /** Type of context */\n type?: McpChatContextType;\n /** Additional data (error object, selected element, etc.) */\n data?: Record<string, any>;\n /** Source component/page that triggered the event */\n source?: string;\n };\n /** Auto-send message after opening chat (default: true) */\n autoSend?: boolean;\n /** Open chat in specific mode (default: 'floating') */\n displayMode?: ChatDisplayMode;\n}\n\n/**\n * useMcpChat hook return type\n */\nexport interface UseMcpChatReturn {\n /** Send message to chat from anywhere in the app */\n sendToChat: (detail: McpChatEventDetail) => void;\n /** Check if chat is available */\n isChatAvailable: () => boolean;\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport {\n type AIChatMessage, type AIChatSource, mcpEndpoints, type UseAIChatOptions, type UseAIChatReturn\n} from '../types';\n\nfunction generateId(): string {\n return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\nfunction generateThreadId(): string {\n return `thread_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\nfunction generateUserId(): string {\n return `user_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\nconst STORAGE_KEY = 'djangocfg_chat';\n\n/**\n * Get or create persistent chat IDs from localStorage\n */\nfunction getPersistedIds(): { threadId: string; userId: string } {\n if (typeof window === 'undefined') {\n return { threadId: generateThreadId(), userId: generateUserId() };\n }\n\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n const data = JSON.parse(stored);\n if (data.threadId && data.userId) {\n return data;\n }\n }\n } catch {\n // Ignore parse errors\n }\n\n // Generate new IDs and persist\n const ids = { threadId: generateThreadId(), userId: generateUserId() };\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(ids));\n } catch {\n // Ignore storage errors\n }\n return ids;\n}\n\n/**\n * Update persisted thread ID (after clear)\n */\nfunction persistThreadId(threadId: string, userId: string): void {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify({ threadId, userId }));\n } catch {\n // Ignore storage errors\n }\n}\n\n/**\n * Save message to server\n */\nasync function saveMessageToServer(threadId: string, userId: string, message: AIChatMessage): Promise<void> {\n try {\n await fetch(`${mcpEndpoints.conversations}/${threadId}/messages`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n userId,\n message: {\n id: message.id,\n role: message.role,\n content: message.content,\n timestamp: message.timestamp.getTime(),\n sources: message.sources,\n },\n }),\n });\n } catch (error) {\n console.warn('[Chat] Failed to save message to server:', error);\n }\n}\n\n/**\n * Load conversation from server\n */\nasync function loadConversationFromServer(threadId: string): Promise<AIChatMessage[] | null> {\n try {\n const response = await fetch(`${mcpEndpoints.conversations}/${threadId}`);\n \n // If conversation not found (404), return null to signal reset needed\n if (response.status === 404) return null;\n \n if (!response.ok) return [];\n\n const data = await response.json();\n if (!data.messages || !Array.isArray(data.messages)) return [];\n\n return data.messages.map((m: {\n id: string;\n role: 'user' | 'assistant';\n content: string;\n timestamp: number;\n sources?: AIChatSource[];\n }) => ({\n id: m.id,\n role: m.role,\n content: m.content,\n timestamp: new Date(m.timestamp),\n sources: m.sources,\n }));\n } catch (error) {\n console.warn('[Chat] Failed to load conversation from server:', error);\n return [];\n }\n}\n\n/**\n * Delete conversation from server\n */\nasync function deleteConversationFromServer(threadId: string): Promise<void> {\n try {\n await fetch(`${mcpEndpoints.conversations}/${threadId}`, {\n method: 'DELETE',\n });\n } catch (error) {\n console.warn('[Chat] Failed to delete conversation from server:', error);\n }\n}\n\n/**\n * AI Chat hook with streaming support and server-side history\n * All persistence is handled through API endpoints - no localStorage\n */\nexport function useAIChat(options: UseAIChatOptions): UseAIChatReturn {\n const {\n apiEndpoint = mcpEndpoints.chat,\n initialMessages = [],\n onError,\n enableStreaming = true,\n threadId: initialThreadId,\n userId: initialUserId,\n } = options;\n\n const [messages, setMessages] = useState<AIChatMessage[]>(initialMessages);\n const [isLoadingHistory, setIsLoadingHistory] = useState(true);\n\n // Get persisted IDs from localStorage (or generate new ones)\n const persistedIds = useRef<{ threadId: string; userId: string } | null>(null);\n if (persistedIds.current === null && typeof window !== 'undefined') {\n persistedIds.current = getPersistedIds();\n }\n\n const [threadId, setThreadId] = useState<string>(() =>\n initialThreadId || persistedIds.current?.threadId || generateThreadId()\n );\n const [userId] = useState<string>(() =>\n initialUserId || persistedIds.current?.userId || generateUserId()\n );\n\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // Load conversation from server on mount (always try to restore from persisted threadId)\n useEffect(() => {\n if (typeof window === 'undefined') {\n setIsLoadingHistory(false);\n return;\n }\n\n const loadHistory = async () => {\n const serverMessages = await loadConversationFromServer(threadId);\n \n // If server returned null (404), session is expired/invalid\n if (serverMessages === null) {\n console.log('[Chat] Session expired or invalid, starting new session');\n const newThreadId = generateThreadId();\n setThreadId(newThreadId);\n persistThreadId(newThreadId, userId);\n setMessages([]); // Ensure empty state\n } else if (serverMessages.length > 0) {\n setMessages(serverMessages);\n }\n \n setIsLoadingHistory(false);\n };\n loadHistory();\n }, [threadId, userId]);\n\n /**\n * Send message with streaming support\n */\n const sendMessage = useCallback(\n async (content: string) => {\n if (!content.trim() || isLoading) return;\n\n // Abort any previous request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current = new AbortController();\n\n // Add user message\n const userMessage: AIChatMessage = {\n id: generateId(),\n role: 'user',\n content: content.trim(),\n timestamp: new Date(),\n };\n\n // Add placeholder for assistant message\n const assistantMessageId = generateId();\n const assistantMessage: AIChatMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n isStreaming: true,\n };\n\n setMessages((prev) => [...prev, userMessage, assistantMessage]);\n setIsLoading(true);\n setError(null);\n\n // Save user message to server\n saveMessageToServer(threadId, userId, userMessage);\n\n try {\n // Build messages array from history + current message (for OpenAI format)\n const chatMessages = [\n ...messages\n .filter((m) => m.role !== 'system')\n .slice(-10) // Keep last 10 messages for context\n .map((m) => ({\n role: m.role as 'user' | 'assistant',\n content: m.content,\n })),\n { role: 'user' as const, content },\n ];\n\n const response = await fetch(apiEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n messages: chatMessages,\n stream: enableStreaming,\n }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n if (enableStreaming && response.headers.get('content-type')?.includes('text/event-stream')) {\n // Handle streaming response\n await handleStreamingResponse(response, assistantMessageId);\n } else {\n // Handle non-streaming response\n const data = await response.json();\n\n if (!data.success) {\n throw new Error(data.error || 'Failed to get response');\n }\n\n // Update thread ID if returned\n if (data.threadId && data.threadId !== threadId) {\n setThreadId(data.threadId);\n }\n\n // Extract sources\n const sources: AIChatSource[] =\n data.sources?.map((s: { title: string; path: string; url?: string; section?: string; score?: number }) => ({\n title: s.title,\n path: s.path,\n url: s.url,\n section: s.section,\n score: s.score,\n })) || [];\n\n const finalContent = data.content || 'I found some relevant documentation.';\n\n // Update assistant message\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? {\n ...m,\n content: finalContent,\n sources,\n isStreaming: false,\n }\n : m\n )\n );\n\n // Save assistant message to server\n saveMessageToServer(threadId, userId, {\n id: assistantMessageId,\n role: 'assistant',\n content: finalContent,\n timestamp: new Date(),\n sources,\n });\n }\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n // Request was aborted, remove the assistant message\n setMessages((prev) => prev.filter((m) => m.id !== assistantMessageId));\n return;\n }\n\n const error = err instanceof Error ? err : new Error('Unknown error');\n setError(error);\n onError?.(error);\n\n // Update assistant message with error\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMessageId\n ? {\n ...m,\n content: `Sorry, I encountered an error: ${error.message}. Please try again.`,\n isStreaming: false,\n }\n : m\n )\n );\n } finally {\n setIsLoading(false);\n abortControllerRef.current = null;\n }\n },\n [apiEndpoint, isLoading, messages, threadId, userId, enableStreaming, onError]\n );\n\n /**\n * Handle streaming SSE response\n */\n const handleStreamingResponse = async (response: Response, messageId: string) => {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n let fullContent = '';\n const sources: AIChatSource[] = [];\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete events\n const lines = buffer.split('\\n');\n buffer = lines.pop() || ''; // Keep incomplete line in buffer\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n\n if (data === '[DONE]') {\n // Stream complete\n setMessages((prev) =>\n prev.map((m) =>\n m.id === messageId\n ? {\n ...m,\n content: fullContent,\n sources,\n isStreaming: false,\n }\n : m\n )\n );\n\n // Save final assistant message to server\n saveMessageToServer(threadId, userId, {\n id: messageId,\n role: 'assistant',\n content: fullContent,\n timestamp: new Date(),\n sources,\n });\n return;\n }\n\n try {\n const parsed = JSON.parse(data);\n\n if (parsed.type === 'text' && parsed.content) {\n fullContent += parsed.content;\n // Update message with current content\n setMessages((prev) =>\n prev.map((m) =>\n m.id === messageId\n ? {\n ...m,\n content: fullContent,\n isStreaming: true,\n }\n : m\n )\n );\n } else if (parsed.type === 'source' && parsed.source) {\n sources.push({\n title: parsed.source.title,\n path: parsed.source.path,\n url: parsed.source.url,\n section: parsed.source.section,\n score: parsed.source.score,\n });\n } else if (parsed.type === 'done') {\n // Update with final usage info if needed\n setMessages((prev) =>\n prev.map((m) =>\n m.id === messageId\n ? {\n ...m,\n content: fullContent,\n sources,\n isStreaming: false,\n }\n : m\n )\n );\n\n // Save final assistant message to server\n saveMessageToServer(threadId, userId, {\n id: messageId,\n role: 'assistant',\n content: fullContent,\n timestamp: new Date(),\n sources,\n });\n } else if (parsed.type === 'error') {\n throw new Error(parsed.error || 'Stream error');\n }\n } catch {\n // Ignore parse errors for individual events\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n };\n\n /**\n * Clear all messages and start new conversation\n */\n const clearMessages = useCallback(async () => {\n // Abort any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n // Delete conversation from server\n await deleteConversationFromServer(threadId);\n\n setMessages([]);\n setError(null);\n\n // Generate new thread ID for fresh conversation and persist it\n const newThreadId = generateThreadId();\n setThreadId(newThreadId);\n persistThreadId(newThreadId, userId);\n }, [threadId, userId]);\n\n /**\n * Stop current streaming response\n */\n const stopStreaming = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n }, []);\n\n return {\n messages,\n isLoading: isLoading || isLoadingHistory,\n error,\n threadId,\n userId,\n sendMessage,\n clearMessages,\n stopStreaming,\n };\n}\n","'use client';\n\nimport {\n createContext, ReactNode, useCallback, useContext, useEffect, useMemo, useRef, useState\n} from 'react';\n\nimport { useIsMobile, useLocalStorage } from '@djangocfg/ui-nextjs/hooks';\n\nimport { useAIChat } from '../hooks/useAIChat';\nimport { AIChatMessage, ChatDisplayMode, ChatWidgetConfig, mcpEndpoints} from '../types';\n\nconst STORAGE_KEY_MODE = 'djangocfg-ai-chat-mode';\n\n/**\n * AI Chat context state\n */\nexport interface AIChatContextState {\n /** All chat messages */\n messages: AIChatMessage[];\n /** Whether a request is in progress */\n isLoading: boolean;\n /** Last error if any */\n error: Error | null;\n /** Whether chat panel is open */\n isOpen: boolean;\n /** Whether chat is minimized */\n isMinimized: boolean;\n /** Configuration */\n config: ChatWidgetConfig;\n /** Current display mode */\n displayMode: ChatDisplayMode;\n /** Is on mobile device */\n isMobile: boolean;\n /** Thread ID for conversation */\n threadId: string;\n /** User ID for conversation */\n userId: string;\n}\n\n/**\n * AI Chat context actions\n */\nexport interface AIChatContextActions {\n /** Send a message */\n sendMessage: (content: string) => Promise<void>;\n /** Clear all messages */\n clearMessages: () => void;\n /** Open chat panel */\n openChat: () => void;\n /** Close chat panel */\n closeChat: () => void;\n /** Toggle chat panel */\n toggleChat: () => void;\n /** Minimize/restore chat */\n toggleMinimize: () => void;\n /** Set display mode */\n setDisplayMode: (mode: ChatDisplayMode) => void;\n /** Stop streaming response */\n stopStreaming: () => void;\n}\n\nexport type AIChatContextValue = AIChatContextState & AIChatContextActions;\n\nconst AIChatContext = createContext<AIChatContextValue | null>(null);\n\n/**\n * AI Chat provider props\n */\nexport interface AIChatProviderProps {\n children: ReactNode;\n /** API endpoint for AI chat (default: /api/ai/chat) */\n apiEndpoint?: string;\n /** Widget configuration */\n config?: Partial<ChatWidgetConfig>;\n /** Callback on error */\n onError?: (error: Error) => void;\n /** Enable streaming (default: true) */\n enableStreaming?: boolean;\n}\n\n/**\n * AI Chat provider component\n * Uses useAIChat hook with server-side persistence\n */\nexport function AIChatProvider({\n children,\n apiEndpoint = mcpEndpoints.chat,\n config: userConfig = {},\n onError,\n enableStreaming = true,\n}: AIChatProviderProps) {\n // Use AI chat hook\n const {\n messages,\n isLoading,\n error,\n threadId,\n userId,\n sendMessage: sendAIMessage,\n clearMessages: clearAIMessages,\n stopStreaming,\n } = useAIChat({\n apiEndpoint,\n onError,\n enableStreaming,\n });\n\n const [isMinimized, setIsMinimized] = useState(false);\n\n // Display mode with localStorage persistence\n const [storedMode, setStoredMode] = useLocalStorage<ChatDisplayMode>(STORAGE_KEY_MODE, 'closed');\n\n const isMobile = useIsMobile();\n\n // On mobile, sidebar mode is not available - fallback to floating\n const displayMode: ChatDisplayMode = useMemo(() => {\n if (isMobile && storedMode === 'sidebar') {\n return 'floating';\n }\n return storedMode;\n }, [isMobile, storedMode]);\n\n // Derived state: isOpen is true when not in 'closed' mode\n const isOpen = displayMode !== 'closed';\n\n // Track isOpen in a ref for event handler\n const isOpenRef = useRef(isOpen);\n useEffect(() => {\n isOpenRef.current = isOpen;\n }, [isOpen]);\n\n // Track last active mode (non-closed) to restore when reopening\n const lastActiveModeRef = useRef<Exclude<ChatDisplayMode, 'closed'>>('floating');\n useEffect(() => {\n if (displayMode !== 'closed') {\n lastActiveModeRef.current = displayMode;\n }\n }, [displayMode]);\n\n const config: ChatWidgetConfig = useMemo(\n () => ({\n apiEndpoint,\n title: 'DjangoCFG AI',\n placeholder: 'Ask about DjangoCFG...',\n greeting:\n \"Hi! I'm your DjangoCFG AI assistant powered by GPT. Ask me anything about configuration, features, or how to use the library.\",\n position: 'bottom-right',\n variant: 'default',\n ...userConfig,\n }),\n [apiEndpoint, userConfig]\n );\n\n const sendMessage = useCallback(\n async (content: string) => {\n await sendAIMessage(content);\n },\n [sendAIMessage]\n );\n\n const clearMessages = useCallback(() => {\n clearAIMessages();\n }, [clearAIMessages]);\n\n const openChat = useCallback(() => {\n // Restore last active mode instead of always opening in floating\n setStoredMode(lastActiveModeRef.current);\n setIsMinimized(false);\n }, [setStoredMode]);\n\n const closeChat = useCallback(() => {\n setStoredMode('closed');\n setIsMinimized(false);\n }, [setStoredMode]);\n\n const toggleChat = useCallback(() => {\n if (displayMode === 'closed') {\n setStoredMode('floating');\n setIsMinimized(false);\n } else {\n setStoredMode('closed');\n }\n }, [displayMode, setStoredMode]);\n\n const toggleMinimize = useCallback(() => {\n setIsMinimized((prev) => !prev);\n }, []);\n\n const setDisplayMode = useCallback(\n (mode: ChatDisplayMode) => {\n // On mobile, sidebar is not available\n if (isMobile && mode === 'sidebar') {\n setStoredMode('floating');\n } else {\n setStoredMode(mode);\n }\n setIsMinimized(false);\n },\n [isMobile, setStoredMode]\n );\n\n const value = useMemo<AIChatContextValue>(\n () => ({\n messages,\n isLoading,\n error,\n isOpen,\n isMinimized,\n config,\n displayMode,\n isMobile,\n threadId,\n userId,\n sendMessage,\n clearMessages,\n openChat,\n closeChat,\n toggleChat,\n toggleMinimize,\n setDisplayMode,\n stopStreaming,\n }),\n [\n messages,\n isLoading,\n error,\n isOpen,\n isMinimized,\n config,\n displayMode,\n isMobile,\n threadId,\n userId,\n sendMessage,\n clearMessages,\n openChat,\n closeChat,\n toggleChat,\n toggleMinimize,\n setDisplayMode,\n stopStreaming,\n ]\n );\n\n // =============================================================================\n // Global Chat Event Listener\n // =============================================================================\n\n /**\n * Listen for mcp:chat:send events from useMcpChat hook\n * This allows any component to trigger chat from anywhere in the app\n */\n useEffect(() => {\n // Register chat as available\n if (typeof window !== 'undefined') {\n (window as any).__MCP_CHAT_AVAILABLE__ = true;\n }\n\n const handleChatEvent = (event: Event) => {\n const customEvent = event as CustomEvent<import('../types').McpChatEventDetail>;\n const { message, context, autoSend = true, displayMode: requestedMode } = customEvent.detail;\n\n // Send confirmation that event was handled\n window.dispatchEvent(new CustomEvent('mcp:chat:handled'));\n\n // Format message with context if provided\n let fullMessage = message;\n if (context) {\n if (context.type) {\n fullMessage = `[${context.type.toUpperCase()}] ${message}`;\n }\n if (context.data) {\n fullMessage += `\\n\\n**Context:**\\n\\`\\`\\`json\\n${JSON.stringify(context.data, null, 2)}\\n\\`\\`\\``;\n }\n if (context.source) {\n fullMessage += `\\n\\n_Source: ${context.source}_`;\n }\n }\n\n // Open chat in requested mode, or keep current mode if already open\n if (requestedMode) {\n setDisplayMode(requestedMode);\n } else if (!isOpenRef.current) {\n // Only open if chat is currently closed\n openChat();\n }\n // If already open, keep current mode\n\n // Auto-send message if requested\n if (autoSend) {\n // Small delay to ensure chat is open and ready\n setTimeout(() => {\n sendMessage(fullMessage);\n }, 100);\n }\n };\n\n window.addEventListener('mcp:chat:send', handleChatEvent);\n\n return () => {\n window.removeEventListener('mcp:chat:send', handleChatEvent);\n if (typeof window !== 'undefined') {\n (window as any).__MCP_CHAT_AVAILABLE__ = false;\n }\n };\n }, [sendMessage, setDisplayMode, openChat]);\n\n return <AIChatContext.Provider value={value}>{children}</AIChatContext.Provider>;\n}\n\n/**\n * Hook to access AI chat context\n */\nexport function useAIChatContext(): AIChatContextValue {\n const context = useContext(AIChatContext);\n if (!context) {\n throw new Error('useAIChatContext must be used within an AIChatProvider');\n }\n return context;\n}\n\n/**\n * Hook to check if AI chat context is available\n */\nexport function useAIChatContextOptional(): AIChatContextValue | null {\n return useContext(AIChatContext);\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useLocalStorage } from '@djangocfg/ui-nextjs/hooks';\n\nimport { fabConfig, sidebarConfig, storageKeys } from '../config';\n\nimport type { ChatDisplayMode } from '../types';\n// Re-export for convenience\nexport const MIN_SIDEBAR_WIDTH = sidebarConfig.minWidth;\nexport const MAX_SIDEBAR_WIDTH = sidebarConfig.maxWidth;\nexport const DEFAULT_SIDEBAR_WIDTH = sidebarConfig.defaultWidth;\n\n/**\n * Configuration for chat layout management\n */\nexport interface ChatLayoutConfig {\n /** Initial width of sidebar in pixels */\n initialWidth?: number;\n /** Animation duration in ms */\n animationDuration?: number;\n /** Element to push (defaults to body) */\n pushTarget?: 'body' | 'main' | string;\n}\n\n/**\n * Return type for useChatLayout hook\n */\nexport interface UseChatLayoutReturn {\n /** Current sidebar width */\n sidebarWidth: number;\n /** Apply layout changes for mode */\n applyLayout: (mode: ChatDisplayMode) => void;\n /** Reset layout to default */\n resetLayout: () => void;\n /** Update sidebar width (for resize) */\n updateWidth: (width: number) => void;\n /** Start resize operation */\n startResize: (e: React.MouseEvent) => void;\n /** Whether currently resizing */\n isResizing: boolean;\n /** Get CSS for sidebar container */\n getSidebarStyles: () => React.CSSProperties;\n /** Get CSS for floating container */\n getFloatingStyles: (position: 'bottom-right' | 'bottom-left') => React.CSSProperties;\n /** Get CSS for FAB button */\n getFabStyles: (position: 'bottom-right' | 'bottom-left') => React.CSSProperties;\n}\n\nconst DEFAULT_CONFIG: Required<ChatLayoutConfig> = {\n initialWidth: sidebarConfig.defaultWidth,\n animationDuration: sidebarConfig.animationDuration,\n pushTarget: 'body',\n};\n\n/** Stored original styles for fixed elements */\ninterface FixedElementOriginalStyles {\n element: HTMLElement;\n right: string;\n transition: string;\n}\n\n/**\n * Hook for managing chat layout embedding modes\n *\n * Handles:\n * - Sidebar mode: pushes content left by adding margin to target element\n * AND automatically adjusts all position:fixed elements with right:0\n * - Floating mode: positions chat at bottom-right/left\n * - Closed mode: just shows FAB button\n *\n * @example\n * ```tsx\n * const { applyLayout, getSidebarStyles, getFloatingStyles } = useChatLayout({\n * sidebarWidth: 400,\n * });\n *\n * useEffect(() => {\n * applyLayout(displayMode);\n * }, [displayMode]);\n * ```\n */\nexport function useChatLayout(config?: ChatLayoutConfig): UseChatLayoutReturn {\n const mergedConfig = { ...DEFAULT_CONFIG, ...config };\n const { initialWidth, animationDuration, pushTarget } = mergedConfig;\n\n // Sidebar width with localStorage persistence\n const [storedWidth, setStoredWidth] = useLocalStorage<number>(storageKeys.sidebarWidth, initialWidth);\n\n // Clamp stored width to valid range\n const sidebarWidth = Math.max(MIN_SIDEBAR_WIDTH, Math.min(MAX_SIDEBAR_WIDTH, storedWidth));\n const sidebarWidthRef = useRef(sidebarWidth);\n\n // Resizing state (runtime only, not persisted)\n const [isResizing, setIsResizing] = useState(false);\n\n // Keep ref in sync\n useEffect(() => {\n sidebarWidthRef.current = sidebarWidth;\n }, [sidebarWidth]);\n\n // Store original styles for cleanup\n const originalStylesRef = useRef<{\n marginRight?: string;\n overflowX?: string;\n transition?: string;\n } | null>(null);\n\n // Store original styles for fixed elements\n const fixedElementsRef = useRef<FixedElementOriginalStyles[]>([]);\n\n // Current mode for cleanup\n const currentModeRef = useRef<ChatDisplayMode>('closed');\n\n /**\n * Get the target element to push\n */\n const getTargetElement = useCallback((): HTMLElement | null => {\n if (typeof window === 'undefined') return null;\n\n if (pushTarget === 'body') {\n return document.body;\n } else if (pushTarget === 'main') {\n return document.querySelector('main');\n } else {\n return document.querySelector(pushTarget);\n }\n }, [pushTarget]);\n\n /**\n * Find all fixed/sticky elements that need right adjustment\n */\n const getFixedElements = useCallback((): HTMLElement[] => {\n if (typeof window === 'undefined') return [];\n\n const elements: HTMLElement[] = [];\n const allElements = document.querySelectorAll('*');\n\n allElements.forEach((el) => {\n if (!(el instanceof HTMLElement)) return;\n // Skip chat sidebar itself\n if (el.closest('[data-chat-sidebar-panel]')) return;\n\n const style = window.getComputedStyle(el);\n const position = style.position;\n const right = style.right;\n\n // Check for fixed/sticky elements with right: 0\n if ((position === 'fixed' || position === 'sticky') && right === '0px') {\n elements.push(el);\n }\n });\n\n return elements;\n }, []);\n\n /**\n * Save original styles before modification\n */\n const saveOriginalStyles = useCallback((element: HTMLElement) => {\n if (!originalStylesRef.current) {\n originalStylesRef.current = {\n marginRight: element.style.marginRight,\n overflowX: element.style.overflowX,\n transition: element.style.transition,\n };\n }\n }, []);\n\n /**\n * Restore original styles\n */\n const restoreOriginalStyles = useCallback((element: HTMLElement) => {\n if (originalStylesRef.current) {\n element.style.marginRight = originalStylesRef.current.marginRight || '';\n element.style.overflowX = originalStylesRef.current.overflowX || '';\n element.style.transition = originalStylesRef.current.transition || '';\n element.removeAttribute('data-chat-sidebar');\n originalStylesRef.current = null;\n }\n }, []);\n\n /**\n * Adjust fixed elements for sidebar\n */\n const adjustFixedElements = useCallback(\n (open: boolean) => {\n const currentWidth = sidebarWidthRef.current;\n if (open) {\n // Save and adjust fixed elements\n const fixedElements = getFixedElements();\n fixedElementsRef.current = fixedElements.map((el) => ({\n element: el,\n right: el.style.right,\n transition: el.style.transition,\n }));\n\n fixedElements.forEach((el) => {\n el.style.transition = `right ${animationDuration}ms ease`;\n el.style.right = `${currentWidth}px`;\n });\n } else {\n // Restore fixed elements\n fixedElementsRef.current.forEach(({ element, right, transition }) => {\n element.style.transition = `right ${animationDuration}ms ease`;\n element.style.right = '0px';\n\n // Restore original after animation\n setTimeout(() => {\n element.style.right = right;\n element.style.transition = transition;\n }, animationDuration);\n });\n fixedElementsRef.current = [];\n }\n },\n [getFixedElements, animationDuration]\n );\n\n /**\n * Apply sidebar mode layout\n */\n const applySidebarLayout = useCallback(() => {\n const target = getTargetElement();\n if (!target) return;\n\n const currentWidth = sidebarWidthRef.current;\n\n saveOriginalStyles(target);\n\n // Add smooth transition\n target.style.transition = `margin-right ${animationDuration}ms ease`;\n target.style.marginRight = `${currentWidth}px`;\n target.style.overflowX = 'hidden';\n target.setAttribute('data-chat-sidebar', 'open');\n\n // Adjust fixed elements (header, etc.)\n adjustFixedElements(true);\n\n currentModeRef.current = 'sidebar';\n }, [getTargetElement, saveOriginalStyles, animationDuration, adjustFixedElements]);\n\n /**\n * Apply floating/closed mode layout (reset sidebar push)\n */\n const applyDefaultLayout = useCallback(\n (mode: ChatDisplayMode) => {\n const target = getTargetElement();\n if (!target) return;\n\n // Only restore if we were in sidebar mode\n if (currentModeRef.current === 'sidebar') {\n // Add transition for smooth animation\n target.style.transition = `margin-right ${animationDuration}ms ease`;\n target.style.marginRight = '0px';\n\n // Restore fixed elements\n adjustFixedElements(false);\n\n // Remove styles after animation completes\n setTimeout(() => {\n restoreOriginalStyles(target);\n }, animationDuration);\n }\n\n currentModeRef.current = mode;\n },\n [getTargetElement, restoreOriginalStyles, animationDuration, adjustFixedElements]\n );\n\n /**\n * Apply layout changes for given mode\n */\n const applyLayout = useCallback(\n (mode: ChatDisplayMode) => {\n if (mode === 'sidebar') {\n applySidebarLayout();\n } else {\n applyDefaultLayout(mode);\n }\n },\n [applySidebarLayout, applyDefaultLayout]\n );\n\n /**\n * Reset layout to default (cleanup)\n */\n const resetLayout = useCallback(() => {\n const target = getTargetElement();\n if (target && originalStylesRef.current) {\n restoreOriginalStyles(target);\n }\n // Restore fixed elements immediately on cleanup\n fixedElementsRef.current.forEach(({ element, right, transition }) => {\n element.style.right = right;\n element.style.transition = transition;\n });\n fixedElementsRef.current = [];\n currentModeRef.current = 'closed';\n }, [getTargetElement, restoreOriginalStyles]);\n\n /**\n * Update width during resize (no animation)\n */\n const updateWidthImmediate = useCallback(\n (newWidth: number) => {\n const clampedWidth = Math.max(MIN_SIDEBAR_WIDTH, Math.min(MAX_SIDEBAR_WIDTH, newWidth));\n\n // Update body margin\n const target = getTargetElement();\n if (target && currentModeRef.current === 'sidebar') {\n target.style.transition = 'none';\n target.style.marginRight = `${clampedWidth}px`;\n }\n\n // Update fixed elements\n fixedElementsRef.current.forEach(({ element }) => {\n element.style.transition = 'none';\n element.style.right = `${clampedWidth}px`;\n });\n\n return clampedWidth;\n },\n [getTargetElement]\n );\n\n /**\n * Update sidebar width (for resize)\n */\n const updateWidth = useCallback(\n (newWidth: number) => {\n const clampedWidth = updateWidthImmediate(newWidth);\n setStoredWidth(clampedWidth);\n },\n [updateWidthImmediate, setStoredWidth]\n );\n\n /**\n * Start resize operation\n */\n const startResize = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n setIsResizing(true);\n\n const startX = e.clientX;\n const startWidth = sidebarWidthRef.current;\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n // Calculate new width (dragging left increases width)\n const deltaX = startX - moveEvent.clientX;\n const newWidth = startWidth + deltaX;\n const clampedWidth = Math.max(MIN_SIDEBAR_WIDTH, Math.min(MAX_SIDEBAR_WIDTH, newWidth));\n\n // Update DOM immediately for smooth feel\n updateWidthImmediate(clampedWidth);\n sidebarWidthRef.current = clampedWidth;\n\n // Also update React state so sidebar visually resizes\n setStoredWidth(clampedWidth);\n };\n\n const handleMouseUp = () => {\n setIsResizing(false);\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n document.body.style.cursor = 'ew-resize';\n document.body.style.userSelect = 'none';\n },\n [updateWidthImmediate, setStoredWidth]\n );\n\n /**\n * Get CSS styles for sidebar container\n */\n const getSidebarStyles = useCallback((): React.CSSProperties => {\n return {\n position: 'fixed',\n top: 0,\n right: 0,\n bottom: 0,\n width: `${sidebarWidth}px`,\n zIndex: sidebarConfig.zIndex,\n };\n }, [sidebarWidth]);\n\n /**\n * Get CSS styles for floating container\n */\n const getFloatingStyles = useCallback(\n (position: 'bottom-right' | 'bottom-left'): React.CSSProperties => {\n return {\n position: 'fixed',\n zIndex: sidebarConfig.zIndex - 50,\n bottom: fabConfig.bottom,\n ...(position === 'bottom-right' ? { right: fabConfig.right } : { left: fabConfig.right }),\n };\n },\n []\n );\n\n /**\n * Get CSS styles for FAB button\n */\n const getFabStyles = useCallback(\n (position: 'bottom-right' | 'bottom-left'): React.CSSProperties => {\n return {\n position: 'fixed',\n zIndex: sidebarConfig.zIndex - 50,\n bottom: fabConfig.bottom,\n ...(position === 'bottom-right' ? { right: fabConfig.right } : { left: fabConfig.right }),\n };\n },\n []\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n resetLayout();\n };\n }, [resetLayout]);\n\n return {\n sidebarWidth,\n applyLayout,\n resetLayout,\n updateWidth,\n startResize,\n isResizing,\n getSidebarStyles,\n getFloatingStyles,\n getFabStyles,\n };\n}\n","'use client';\n\nimport { Bot, ExternalLink, Loader2, User } from 'lucide-react';\nimport React from 'react';\n\nimport { useAuth } from '@djangocfg/api/auth';\nimport {\n Avatar, AvatarFallback, AvatarImage, Badge, Card, CardContent\n} from '@djangocfg/ui-nextjs';\nimport { MarkdownMessage } from '@djangocfg/ui-tools';\n\nimport type { AIChatMessage } from '../types';\n\nexport interface MessageBubbleProps {\n message: AIChatMessage;\n isCompact?: boolean;\n}\n\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nexport const MessageBubble = React.memo<MessageBubbleProps>(\n ({ message, isCompact = false }) => {\n const isUser = message.role === 'user';\n const isAssistant = message.role === 'assistant';\n const { user, isAuthenticated } = useAuth();\n\n // Prepare user data BEFORE render\n const showUserAvatar = isUser && isAuthenticated && user;\n const userAvatar = user?.avatar || '';\n const userDisplayName = user?.display_username || user?.email || 'User';\n const userInitial = userDisplayName.charAt(0).toUpperCase();\n const avatarSize = isCompact ? '28px' : '36px';\n const iconSize = isCompact ? 'h-3.5 w-3.5' : 'h-4 w-4';\n\n return (\n <div\n className={`flex gap-3 animate-in fade-in slide-in-from-bottom-2 duration-300 max-w-full overflow-hidden ${\n isUser ? 'flex-row-reverse' : ''\n }`}\n >\n {/* Avatar */}\n {showUserAvatar ? (\n // Authenticated user avatar\n <Avatar className=\"flex-shrink-0\" style={{ width: avatarSize, height: avatarSize }}>\n <AvatarImage src={userAvatar} alt={userDisplayName} />\n <AvatarFallback className=\"bg-primary text-primary-foreground text-xs\">\n {userInitial}\n </AvatarFallback>\n </Avatar>\n ) : isUser ? (\n // Guest user icon\n <div\n className=\"flex-shrink-0 rounded-full flex items-center justify-center bg-primary text-primary-foreground\"\n style={{ width: avatarSize, height: avatarSize }}\n >\n <User className={iconSize} />\n </div>\n ) : (\n // Bot icon\n <div\n className=\"flex-shrink-0 rounded-full flex items-center justify-center bg-muted text-muted-foreground\"\n style={{ width: avatarSize, height: avatarSize }}\n >\n <Bot className={iconSize} />\n </div>\n )}\n\n {/* Message Content */}\n <div className={`flex-1 min-w-0 ${isUser ? 'max-w-[80%] ml-auto' : 'max-w-[85%]'}`}>\n {/* Header */}\n <div className={`flex items-baseline gap-2 mb-1 ${isUser ? 'justify-end' : ''}`}>\n <span className={`font-medium ${isCompact ? 'text-xs' : 'text-sm'}`}>\n {isUser ? userDisplayName : 'DjangoCFG AI'}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {formatTime(message.timestamp)}\n </span>\n </div>\n\n {/* Message Bubble */}\n <Card\n className={`transition-all duration-200 ${\n isUser\n ? 'bg-primary text-primary-foreground ml-auto'\n : 'bg-muted'\n }`}\n >\n <CardContent className={isCompact ? 'p-2' : 'p-3'}>\n {/* Message Text */}\n <div className={`${isCompact ? 'text-xs' : 'text-sm'} overflow-hidden`} style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }}>\n {/* Always render markdown for immediate code block highlighting */}\n <MarkdownMessage\n content={message.content}\n isUser={isUser}\n isCompact={isCompact}\n />\n {/* Show spinner during streaming */}\n {message.isStreaming && (\n <Loader2 className=\"inline-block ml-1 h-3 w-3 animate-spin\" />\n )}\n </div>\n\n {/* Sources */}\n {isAssistant && message.sources && message.sources.length > 0 && (\n <div className=\"mt-3 pt-2 border-t border-border/50\">\n <p className=\"text-xs text-muted-foreground mb-1.5\">Related docs:</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {message.sources.slice(0, 3).map((source, idx) => (\n <a\n key={idx}\n href={source.url || source.path}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-block\"\n >\n <Badge\n variant=\"outline\"\n className=\"text-xs gap-1 hover:bg-primary/10 transition-colors cursor-pointer\"\n >\n {source.title}\n {source.section && ` - ${source.section}`}\n <ExternalLink className=\"h-2.5 w-2.5\" />\n </Badge>\n </a>\n ))}\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n </div>\n );\n }\n);\n\nMessageBubble.displayName = 'MessageBubble';\n","'use client';\n\nimport { Bot, MessageSquare, StopCircle } from 'lucide-react';\nimport React, { forwardRef, useImperativeHandle, useRef } from 'react';\n\nimport { Button } from '@djangocfg/ui-nextjs';\n\nimport { MessageBubble } from './MessageBubble';\n\nimport type { AIChatMessage } from '../types';\n\n/**\n * ChatMessages imperative handle\n */\nexport interface ChatMessagesHandle {\n scrollToBottom: (instant?: boolean) => void;\n scrollToLastMessage: (instant?: boolean) => void;\n}\n\nexport interface ChatMessagesProps {\n /** Messages to display */\n messages: AIChatMessage[];\n /** Whether loading/streaming is in progress */\n isLoading: boolean;\n /** Greeting to show when no messages */\n greeting?: string;\n /** Callback to stop streaming */\n onStopStreaming?: () => void;\n /** Use compact layout (smaller bubbles) */\n isCompact?: boolean;\n /** Use larger icon for greeting (sidebar mode) */\n largeGreetingIcon?: boolean;\n /** Custom greeting icon */\n greetingIcon?: 'bot' | 'message';\n /** Custom greeting title */\n greetingTitle?: string;\n}\n\n/**\n * ChatMessages - Shared component for displaying chat messages\n *\n * Uses flex-col-reverse for natural bottom scroll behavior:\n * - Scroll position 0 = visual bottom\n * - New content naturally stays at bottom\n * - No complex JS scroll management needed\n */\nexport const ChatMessages = forwardRef<ChatMessagesHandle, ChatMessagesProps>(\n (\n {\n messages,\n isLoading,\n greeting,\n onStopStreaming,\n isCompact = false,\n largeGreetingIcon = false,\n greetingIcon = 'bot',\n greetingTitle,\n },\n ref\n ) => {\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n\n // Expose scroll methods via ref (for compatibility)\n useImperativeHandle(ref, () => ({\n scrollToBottom: () => {\n // With flex-col-reverse, scroll to top = visual bottom\n scrollContainerRef.current?.scrollTo({ top: 0, behavior: 'smooth' });\n },\n scrollToLastMessage: () => {\n scrollContainerRef.current?.scrollTo({ top: 0, behavior: 'smooth' });\n },\n }), []);\n\n // No manual scroll effects needed - flex-col-reverse handles it naturally\n\n const GreetingIcon = greetingIcon === 'message' ? MessageSquare : Bot;\n const iconSize = largeGreetingIcon ? { container: '64px', icon: 'h-8 w-8' } : { container: '48px', icon: 'h-6 w-6' };\n const padding = largeGreetingIcon ? 'py-12' : 'py-8';\n\n return (\n <div ref={scrollContainerRef} className=\"h-full w-full overflow-y-auto flex flex-col-reverse\">\n <div className={`${isCompact ? 'p-3' : 'p-4'} space-y-4 max-w-full overflow-x-hidden`}>\n {/* Greeting */}\n {messages.length === 0 && greeting && (\n <div className={`text-center ${padding}`}>\n <div\n className=\"mx-auto mb-4 rounded-full bg-primary/10 flex items-center justify-center\"\n style={{ width: iconSize.container, height: iconSize.container }}\n >\n <GreetingIcon className={`${iconSize.icon} text-primary`} />\n </div>\n {greetingTitle && (\n <h4 className=\"font-medium mb-2\">{greetingTitle}</h4>\n )}\n <p className={`text-sm text-muted-foreground ${largeGreetingIcon ? 'max-w-[300px]' : 'max-w-[280px]'} mx-auto`}>\n {greeting}\n </p>\n </div>\n )}\n\n {/* Messages */}\n {messages.map((message) => (\n <div key={message.id} data-message-bubble>\n <MessageBubble message={message} isCompact={isCompact} />\n </div>\n ))}\n\n {/* Loading indicator with stop button */}\n {isLoading && messages.length > 0 && (\n <div className=\"flex items-center justify-between text-muted-foreground text-sm\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-1\">\n <span className=\"animate-bounce\" style={{ animationDelay: '0ms' }}>.</span>\n <span className=\"animate-bounce\" style={{ animationDelay: '150ms' }}>.</span>\n <span className=\"animate-bounce\" style={{ animationDelay: '300ms' }}>.</span>\n </div>\n <span>Generating response...</span>\n </div>\n {onStopStreaming && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onStopStreaming}\n className=\"h-6 px-2 text-xs\"\n >\n <StopCircle className=\"h-3 w-3 mr-1\" />\n Stop\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\nChatMessages.displayName = 'ChatMessages';\n","'use client';\n\nimport { Loader2, Send } from 'lucide-react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Button } from '@djangocfg/ui-nextjs';\n\nexport interface AIMessageInputProps {\n onSend: (message: string) => void;\n disabled?: boolean;\n isLoading?: boolean;\n placeholder?: string;\n maxRows?: number;\n}\n\nexport const AIMessageInput = React.memo<AIMessageInputProps>(\n ({\n onSend,\n disabled = false,\n isLoading = false,\n placeholder = 'Ask about DjangoCFG...',\n maxRows = 5,\n }) => {\n const [value, setValue] = useState('');\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // Auto-resize textarea\n const adjustHeight = useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n\n // Reset height to auto to get the correct scrollHeight\n textarea.style.height = 'auto';\n\n // Calculate line height and max height\n const lineHeight = 24; // ~1.5rem\n const minHeight = 44; // Single line height with padding\n const maxHeight = lineHeight * maxRows + 20; // padding\n\n // Set new height\n const newHeight = Math.min(Math.max(textarea.scrollHeight, minHeight), maxHeight);\n textarea.style.height = `${newHeight}px`;\n }, [maxRows]);\n\n // Adjust height when value changes\n useEffect(() => {\n adjustHeight();\n }, [value, adjustHeight]);\n\n const handleSubmit = useCallback(\n (e?: React.FormEvent) => {\n e?.preventDefault();\n\n const trimmed = value.trim();\n if (!trimmed || disabled || isLoading) return;\n\n onSend(trimmed);\n setValue('');\n\n // Reset height after sending\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto';\n }\n textareaRef.current?.focus();\n },\n [value, disabled, isLoading, onSend]\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n },\n [handleSubmit]\n );\n\n const canSend = value.trim().length > 0 && !disabled && !isLoading;\n\n return (\n <form onSubmit={handleSubmit} className=\"w-full\">\n <div\n className=\"relative flex items-end rounded-2xl border border-input bg-background transition-colors focus-within:ring-1 focus-within:ring-ring focus-within:border-ring\"\n style={{ minHeight: '44px' }}\n >\n {/* Textarea */}\n <textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled || isLoading}\n rows={1}\n className=\"flex-1 resize-none bg-transparent px-4 py-3 text-sm placeholder:text-muted-foreground focus:outline-none disabled:cursor-not-allowed disabled:opacity-50 pr-12\"\n style={{\n minHeight: '44px',\n maxHeight: `${24 * maxRows + 20}px`,\n lineHeight: '1.5rem',\n }}\n autoComplete=\"off\"\n />\n\n {/* Send Button - positioned inside, bottom right */}\n <div\n className=\"absolute flex items-center justify-center\"\n style={{\n right: '6px',\n bottom: '6px',\n }}\n >\n <Button\n type=\"submit\"\n size=\"icon\"\n disabled={!canSend}\n className=\"h-8 w-8 rounded-full transition-all\"\n style={{\n opacity: canSend ? 1 : 0.5,\n }}\n >\n {isLoading ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Send className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n </div>\n\n {/* Helper text */}\n <p className=\"mt-1.5 text-xs text-muted-foreground text-center\">\n Press Enter to send, Shift+Enter for new line\n </p>\n </form>\n );\n }\n);\n\nAIMessageInput.displayName = 'AIMessageInput';\n","'use client';\n\nimport { Bot, PanelRight, RotateCcw, X } from 'lucide-react';\nimport React from 'react';\n\nimport { Button, Card, CardContent, CardFooter, CardHeader } from '@djangocfg/ui-nextjs';\n\nimport { useAIChatContext } from '../context/AIChatContext';\nimport { ChatMessages } from './ChatMessages';\nimport { AIMessageInput } from './MessageInput';\n\nexport const ChatPanel = React.memo(() => {\n const {\n messages,\n isLoading,\n config,\n isMobile,\n sendMessage,\n closeChat,\n setDisplayMode,\n stopStreaming,\n clearMessages,\n } = useAIChatContext();\n\n // Mobile: fullscreen, Desktop: floating panel\n const panelStyles: React.CSSProperties = isMobile\n ? {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n width: '100%',\n height: '100%',\n maxHeight: '100dvh',\n borderRadius: 0,\n display: 'flex',\n flexDirection: 'column',\n margin: 0,\n border: 'none',\n }\n : {\n width: '380px',\n height: '520px',\n maxHeight: 'calc(100vh - 100px)',\n };\n\n return (\n <Card\n className={`flex flex-col ${isMobile ? 'rounded-none border-0 shadow-none' : 'shadow-2xl border-border/50'}`}\n style={panelStyles}\n >\n {/* Header */}\n <CardHeader className=\"flex flex-row items-center justify-between p-3 border-b\">\n <div className=\"flex items-center gap-2\">\n <div\n className=\"rounded-full bg-primary/10 flex items-center justify-center\"\n style={{ width: '32px', height: '32px' }}\n >\n <Bot className=\"h-4 w-4 text-primary\" />\n </div>\n <div>\n <h3 className=\"font-semibold text-sm\">{config.title || 'DjangoCFG AI'}</h3>\n <p className=\"text-xs text-muted-foreground\">AI Assistant</p>\n </div>\n </div>\n <div className=\"flex gap-1\">\n {messages.length > 0 && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={clearMessages}\n title=\"New chat\"\n >\n <RotateCcw className=\"h-4 w-4\" />\n </Button>\n )}\n {/* Sidebar mode button - only on desktop */}\n {!isMobile && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => setDisplayMode('sidebar')}\n title=\"Switch to sidebar mode\"\n >\n <PanelRight className=\"h-4 w-4\" />\n </Button>\n )}\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\" onClick={closeChat} title=\"Close\">\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </CardHeader>\n\n {/* Messages */}\n <CardContent className=\"flex-1 p-0 overflow-hidden\">\n <ChatMessages\n messages={messages}\n isLoading={isLoading}\n greeting={config.greeting}\n onStopStreaming={stopStreaming}\n isCompact\n greetingIcon=\"bot\"\n />\n </CardContent>\n\n {/* Input */}\n <CardFooter className=\"p-3 border-t\">\n <AIMessageInput\n onSend={sendMessage}\n isLoading={isLoading}\n placeholder={config.placeholder}\n />\n </CardFooter>\n </Card>\n );\n});\n\nChatPanel.displayName = 'ChatPanel';\n","'use client';\n\nimport { Bot, GripVertical, PanelRightClose, RotateCcw, X } from 'lucide-react';\nimport React, { useEffect } from 'react';\n\nimport { Button } from '@djangocfg/ui-nextjs';\n\nimport { useAIChatContext } from '../context/AIChatContext';\nimport { useChatLayout } from '../hooks/useChatLayout';\nimport { ChatMessages } from './ChatMessages';\nimport { AIMessageInput } from './MessageInput';\n\nexport interface ChatSidebarProps {\n /** Width of resize handle in pixels (default: 12) */\n resizeHandleWidth?: number;\n /** Show grip icon in resize handle (default: true) */\n showResizeIcon?: boolean;\n /** Custom class for resize handle */\n resizeHandleClassName?: string;\n}\n\nexport const ChatSidebar = React.memo<ChatSidebarProps>(({\n resizeHandleWidth = 12,\n showResizeIcon = true,\n resizeHandleClassName,\n}) => {\n const {\n messages,\n isLoading,\n config,\n sendMessage,\n closeChat,\n setDisplayMode,\n stopStreaming,\n clearMessages,\n } = useAIChatContext();\n\n // Use the layout hook for content pushing and resizing\n const { applyLayout, getSidebarStyles, startResize, isResizing } = useChatLayout();\n\n // Apply sidebar layout on mount, reset on unmount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => {\n applyLayout('sidebar');\n return () => {\n applyLayout('closed');\n };\n }, []);\n\n const sidebarStyles = getSidebarStyles();\n\n return (\n <div\n className=\"flex bg-background\"\n style={sidebarStyles}\n data-chat-sidebar-panel\n >\n {/* Resize handle */}\n <div\n className={`\n flex items-center justify-center cursor-ew-resize\n border-l border-border transition-colors select-none flex-shrink-0\n ${isResizing ? 'bg-primary/20' : 'bg-muted/30 hover:bg-muted/50'}\n ${resizeHandleClassName || ''}\n `}\n style={{ width: resizeHandleWidth }}\n onMouseDown={startResize}\n title=\"Drag to resize\"\n >\n {showResizeIcon && (\n <GripVertical className={`h-4 w-4 ${isResizing ? 'text-primary' : 'text-muted-foreground/50'}`} />\n )}\n </div>\n\n {/* Main sidebar content */}\n <div className=\"flex flex-col flex-1 min-w-0\">\n {/* Header - uses CSS variable for navbar height consistency */}\n <div\n className=\"flex items-center justify-between px-4 border-b border-border bg-muted/30\"\n style={{ height: 'var(--nextra-navbar-height, 64px)', minHeight: 'var(--nextra-navbar-height, 64px)' }}\n >\n <div className=\"flex items-center gap-2\">\n <div\n className=\"rounded-full bg-primary/10 flex items-center justify-center\"\n style={{ width: '32px', height: '32px' }}\n >\n <Bot className=\"h-4 w-4 text-primary\" />\n </div>\n <div>\n <h3 className=\"font-semibold text-sm\">{config.title || 'DjangoCFG AI'}</h3>\n <p className=\"text-xs text-muted-foreground\">AI Assistant</p>\n </div>\n </div>\n <div className=\"flex gap-1\">\n {messages.length > 0 && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={clearMessages}\n title=\"New chat\"\n >\n <RotateCcw className=\"h-4 w-4\" />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => setDisplayMode('floating')}\n title=\"Switch to floating mode\"\n >\n <PanelRightClose className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\" onClick={closeChat} title=\"Close chat\">\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {/* Messages */}\n <div className=\"flex-1 overflow-hidden\">\n <ChatMessages\n messages={messages}\n isLoading={isLoading}\n greeting={config.greeting}\n onStopStreaming={stopStreaming}\n isCompact={false}\n largeGreetingIcon\n greetingIcon=\"message\"\n greetingTitle=\"How can I help?\"\n />\n </div>\n\n {/* Input */}\n <div className=\"p-4 border-t border-border bg-muted/30\">\n <AIMessageInput onSend={sendMessage} isLoading={isLoading} placeholder={config.placeholder} />\n </div>\n </div>\n </div>\n );\n});\n\nChatSidebar.displayName = 'ChatSidebar';\n","'use client';\n\nimport { Zap } from 'lucide-react';\nimport React from 'react';\n\nimport { Button, Portal } from '@djangocfg/ui-nextjs';\n\nimport {\n AIChatProvider, useAIChatContext, useAIChatContextOptional\n} from '../context/AIChatContext';\nimport { useChatLayout } from '../hooks/useChatLayout';\nimport { ChatWidgetConfig, getMcpEndpoints} from '../types';\nimport { ChatPanel } from './ChatPanel';\nimport { ChatSidebar } from './ChatSidebar';\n\n// CSS for game-quality multi-layer animated border with smooth color flow\nconst fabAnimationStyles = `\n@keyframes rotate-gradient {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n@keyframes rotate-gradient-reverse {\n 0% { transform: rotate(360deg); }\n 100% { transform: rotate(0deg); }\n}\n\n@keyframes color-shift-glow {\n 0%, 100% {\n box-shadow:\n 0 0 20px rgba(251, 191, 36, 0.5),\n 0 0 40px rgba(168, 85, 247, 0.3),\n 0 0 60px rgba(20, 184, 166, 0.2);\n }\n 33% {\n box-shadow:\n 0 0 20px rgba(168, 85, 247, 0.5),\n 0 0 40px rgba(20, 184, 166, 0.3),\n 0 0 60px rgba(251, 191, 36, 0.2);\n }\n 66% {\n box-shadow:\n 0 0 20px rgba(20, 184, 166, 0.5),\n 0 0 40px rgba(236, 72, 153, 0.3),\n 0 0 60px rgba(168, 85, 247, 0.2);\n }\n}\n\n@keyframes icon-pulse {\n 0%, 100% {\n opacity: 1;\n transform: scale(1);\n filter: drop-shadow(0 0 4px rgba(251, 191, 36, 0.7));\n }\n 50% {\n opacity: 0.85;\n transform: scale(1.15);\n filter: drop-shadow(0 0 12px rgba(251, 191, 36, 1));\n }\n}\n\n@keyframes border-pulse {\n 0%, 100% {\n opacity: 1;\n filter: blur(0px);\n }\n 50% {\n opacity: 0.85;\n filter: blur(0.5px);\n }\n}\n\n@keyframes inner-glow-pulse {\n 0%, 100% {\n box-shadow:\n inset 0 0 15px rgba(251, 191, 36, 0.3),\n inset 0 0 25px rgba(168, 85, 247, 0.2);\n }\n 50% {\n box-shadow:\n inset 0 0 20px rgba(168, 85, 247, 0.35),\n inset 0 0 30px rgba(20, 184, 166, 0.25);\n }\n}\n\n@keyframes fab-entrance {\n 0% {\n transform: scale(0);\n }\n 50% {\n transform: scale(1.08);\n }\n 70% {\n transform: scale(0.98);\n }\n 85% {\n transform: scale(1.02);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n@keyframes fab-glow-entrance {\n 0% {\n box-shadow: 0 0 0 rgba(251, 191, 36, 0);\n }\n 40% {\n box-shadow:\n 0 0 25px rgba(251, 191, 36, 0.6),\n 0 0 50px rgba(168, 85, 247, 0.4),\n 0 0 75px rgba(20, 184, 166, 0.25);\n }\n 100% {\n box-shadow:\n 0 0 20px rgba(251, 191, 36, 0.5),\n 0 0 40px rgba(168, 85, 247, 0.3),\n 0 0 60px rgba(20, 184, 166, 0.2);\n }\n}\n`;\n\nexport interface AIChatWidgetProps extends ChatWidgetConfig {\n /** Custom class name for the container */\n className?: string;\n /** Enable streaming responses (default: true) */\n enableStreaming?: boolean;\n}\n\n/**\n * Internal AI chat widget that uses context\n */\nconst AIChatWidgetInternal = React.memo<{ className?: string }>(({ className }) => {\n const { config, displayMode, openChat, isMobile } = useAIChatContext();\n\n // Use layout hook for consistent positioning\n const { getFabStyles, getFloatingStyles } = useChatLayout();\n\n const position = config.position || 'bottom-right';\n const fabStyles = getFabStyles(position);\n const floatingStyles = getFloatingStyles(position);\n\n // Mode: closed - just show FAB with game-quality multi-layer animated border\n if (displayMode === 'closed') {\n return (\n <Portal>\n <style>{fabAnimationStyles}</style>\n <div style={fabStyles} className={className || ''}>\n {/* Outer glow container with entrance and color-shifting animations */}\n <div\n className=\"relative rounded-full\"\n style={{\n width: '68px',\n height: '68px',\n overflow: 'hidden',\n animation: 'fab-entrance 0.6s cubic-bezier(0.34, 1.45, 0.64, 1) 0s 1 normal forwards, fab-glow-entrance 0.8s ease-out 0s 1 normal forwards, color-shift-glow 8s ease-in-out 0.6s infinite',\n }}\n >\n {/* Border container - multiple layers for depth */}\n <div\n className=\"absolute rounded-full\"\n style={{\n inset: '0',\n overflow: 'hidden',\n }}\n >\n {/* Layer 1: Base smooth gradient with more color stops */}\n <div\n className=\"absolute rounded-full\"\n style={{\n inset: '0',\n background: `conic-gradient(\n from 0deg,\n rgba(251, 191, 36, 1) 0%,\n rgba(251, 191, 36, 0.7) 8%,\n rgba(251, 191, 36, 0) 15%,\n rgba(168, 85, 247, 0) 20%,\n rgba(168, 85, 247, 0.7) 28%,\n rgba(168, 85, 247, 1) 35%,\n rgba(168, 85, 247, 0.7) 42%,\n rgba(168, 85, 247, 0) 50%,\n rgba(20, 184, 166, 0) 55%,\n rgba(20, 184, 166, 0.7) 63%,\n rgba(20, 184, 166, 1) 70%,\n rgba(20, 184, 166, 0.7) 77%,\n rgba(20, 184, 166, 0) 85%,\n rgba(236, 72, 153, 0) 88%,\n rgba(236, 72, 153, 0.7) 93%,\n rgba(236, 72, 153, 1) 97%,\n rgba(251, 191, 36, 1) 100%\n )`,\n animation: 'rotate-gradient 7s linear infinite, border-pulse 4s ease-in-out infinite',\n filter: 'blur(1px)',\n opacity: 0.95,\n }}\n />\n\n {/* Layer 2: Secondary gradient (counter-clockwise) - stronger */}\n <div\n className=\"absolute rounded-full\"\n style={{\n inset: '1px',\n background: `conic-gradient(\n from 180deg,\n rgba(168, 85, 247, 0.85) 0%,\n rgba(168, 85, 247, 0.5) 10%,\n rgba(168, 85, 247, 0) 20%,\n rgba(20, 184, 166, 0) 30%,\n rgba(20, 184, 166, 0.5) 40%,\n rgba(20, 184, 166, 0.85) 50%,\n rgba(20, 184, 166, 0.5) 60%,\n rgba(20, 184, 166, 0) 70%,\n rgba(251, 191, 36, 0) 75%,\n rgba(251, 191, 36, 0.5) 85%,\n rgba(251, 191, 36, 0.85) 95%,\n rgba(168, 85, 247, 0.85) 100%\n )`,\n animation: 'rotate-gradient-reverse 9s linear infinite',\n filter: 'blur(0.75px)',\n opacity: 0.75,\n }}\n />\n\n {/* Inner mask with glowing edge */}\n <div\n className=\"absolute rounded-full bg-background\"\n style={{\n inset: '4px',\n animation: 'inner-glow-pulse 5s ease-in-out infinite',\n }}\n />\n\n {/* Main FAB button */}\n <Button\n onClick={openChat}\n variant=\"ghost\"\n className=\"absolute rounded-full hover:scale-105 transition-all duration-300 bg-background/80 hover:bg-background/95 border-0 backdrop-blur-sm\"\n style={{\n inset: '2.5px',\n width: 'auto',\n height: 'auto',\n }}\n >\n <Zap\n className=\"h-6 w-6\"\n style={{\n animation: 'icon-pulse 2.5s ease-in-out infinite',\n color: '#fbbf24',\n fill: '#fbbf24',\n }}\n />\n </Button>\n </div>\n </div>\n </div>\n </Portal>\n );\n }\n\n // Mode: sidebar - full-height panel on the right (desktop only)\n if (displayMode === 'sidebar') {\n return (\n <Portal>\n <ChatSidebar />\n </Portal>\n );\n }\n\n // Mode: floating - fullscreen on mobile (via Portal), floating panel on desktop\n if (isMobile) {\n return (\n <Portal>\n <div\n className=\"z-[400] overflow-hidden\"\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n width: '100vw',\n height: '100dvh',\n }}\n >\n <ChatPanel />\n </div>\n </Portal>\n );\n }\n\n return (\n <Portal>\n <div style={floatingStyles} className={className || ''}>\n <ChatPanel />\n </div>\n </Portal>\n );\n});\n\nAIChatWidgetInternal.displayName = 'AIChatWidgetInternal';\n\n/**\n * AI Chat Widget component\n *\n * AI-powered documentation assistant with streaming support.\n * Uses Mastra agent backend for intelligent responses.\n *\n * Can be used in two ways:\n * 1. Standalone (wraps itself in AIChatProvider)\n * 2. Inside an AIChatProvider (uses context directly)\n *\n * @example\n * ```tsx\n * // Standalone usage (always uses production API)\n * <AIChatWidget />\n *\n * // Auto-detect environment (dev/prod)\n * <AIChatWidget autoDetectEnvironment={true} />\n *\n * // With provider for custom control\n * <AIChatProvider apiEndpoint=\"/api/ai/chat\">\n * <MyApp />\n * <AIChatWidget />\n * </AIChatProvider>\n * ```\n */\nexport const AIChatWidget: React.FC<AIChatWidgetProps> = ({\n apiEndpoint,\n title = 'DjangoCFG AI',\n placeholder = 'Ask about DjangoCFG...',\n greeting = \"Hi! I'm your DjangoCFG AI assistant powered by GPT. Ask me anything about configuration, features, or how to use the library.\",\n position = 'bottom-right',\n variant = 'default',\n className,\n enableStreaming = true,\n autoDetectEnvironment = false,\n}) => {\n // Check if we're inside an AIChatProvider\n const existingContext = useAIChatContextOptional();\n\n // If already in context, use internal widget directly\n if (existingContext) {\n return <AIChatWidgetInternal className={className} />;\n }\n\n // Determine API endpoint: use provided, or get from config based on autoDetect\n const finalApiEndpoint = apiEndpoint || getMcpEndpoints(autoDetectEnvironment).chat;\n\n // Otherwise, wrap in provider\n return (\n <AIChatProvider\n apiEndpoint={finalApiEndpoint}\n config={{ title, placeholder, greeting, position, variant, autoDetectEnvironment }}\n enableStreaming={enableStreaming}\n >\n <AIChatWidgetInternal className={className} />\n </AIChatProvider>\n );\n};\n\nAIChatWidget.displayName = 'AIChatWidget';\n","/**\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","import React from 'react';\n\ninterface JsonLdProps {\n data: Record<string, any> | Record<string, any>[];\n}\n\n/**\n * JsonLd Component\n * \n * Renders JSON-LD structured data for SEO.\n * Use this for schema.org markup (Organization, WebSite, FAQPage, etc.)\n * \n * @example\n * ```tsx\n * <JsonLd data={{\n * \"@context\": \"https://schema.org\",\n * \"@type\": \"Organization\",\n * \"name\": \"My Company\"\n * }} />\n * ```\n */\nexport function JsonLd({ data }: JsonLdProps) {\n return (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(data, null, 0),\n }}\n />\n );\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","/**\n * Analytics Events Constants\n *\n * Predefined event names and categories for consistent tracking\n * across the entire application.\n */\n\n/**\n * Event Categories\n */\nexport const AnalyticsCategory = {\n AUTH: 'auth',\n ERROR: 'error',\n NAVIGATION: 'navigation',\n ENGAGEMENT: 'engagement',\n USER: 'user',\n} as const;\n\n/**\n * Predefined Event Names\n */\nexport const AnalyticsEvent = {\n // Auth Events\n AUTH_OTP_REQUEST: 'auth_otp_request',\n AUTH_OTP_VERIFY_SUCCESS: 'auth_otp_verify_success',\n AUTH_OTP_VERIFY_FAIL: 'auth_otp_verify_fail',\n AUTH_LOGIN_SUCCESS: 'auth_login_success',\n AUTH_LOGOUT: 'auth_logout',\n AUTH_SESSION_EXPIRED: 'auth_session_expired',\n AUTH_TOKEN_REFRESH: 'auth_token_refresh',\n AUTH_TOKEN_REFRESH_FAIL: 'auth_token_refresh_fail',\n\n // OAuth Events\n AUTH_OAUTH_START: 'auth_oauth_start',\n AUTH_OAUTH_SUCCESS: 'auth_oauth_success',\n AUTH_OAUTH_FAIL: 'auth_oauth_fail',\n\n // Error Events\n ERROR_BOUNDARY: 'error_boundary',\n ERROR_API: 'error_api',\n ERROR_VALIDATION: 'error_validation',\n ERROR_NETWORK: 'error_network',\n\n // Navigation Events\n NAV_ADMIN_ENTER: 'nav_admin_enter',\n NAV_DASHBOARD_ENTER: 'nav_dashboard_enter',\n NAV_PAGE_VIEW: 'nav_page_view',\n\n // Engagement Events\n THEME_CHANGE: 'theme_change',\n SIDEBAR_TOGGLE: 'sidebar_toggle',\n MOBILE_MENU_OPEN: 'mobile_menu_open',\n\n // User Events\n USER_PROFILE_VIEW: 'user_profile_view',\n USER_PROFILE_UPDATE: 'user_profile_update',\n} as const;\n\nexport type AnalyticsCategoryType = typeof AnalyticsCategory[keyof typeof AnalyticsCategory];\nexport type AnalyticsEventType = typeof AnalyticsEvent[keyof typeof AnalyticsEvent];\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 * Universal Error Configuration\n *\n * Provides standard error content for common HTTP status codes\n * Use this to maintain consistency across error pages\n *\n * NOTE: Only returns primitives (title, description) - NO React components\n * This ensures safe serialization during prerendering\n */\n\nexport interface ErrorContent {\n title: string;\n description: string;\n}\n\n/**\n * Get standardized error content based on status code\n *\n * @param statusCode - HTTP status code or custom error type\n * @returns Error content configuration (title and description only)\n *\n * @example\n * ```tsx\n * const { title, description } = getErrorContent(404);\n * <ErrorLayout title={title} description={description} code={404} />\n * ```\n */\nexport function getErrorContent(statusCode?: number | string): ErrorContent {\n const code = typeof statusCode === 'string' ? parseInt(statusCode, 10) : statusCode;\n\n switch (code) {\n // 400 Bad Request\n case 400:\n return {\n title: 'Bad Request',\n description: 'The request could not be understood. Please check your input and try again.',\n };\n\n // 401 Unauthorized\n case 401:\n return {\n title: 'Authentication Required',\n description: 'You need to sign in to access this page.',\n };\n\n // 403 Forbidden\n case 403:\n return {\n title: 'Access Denied',\n description: \"You don't have permission to access this resource.\",\n };\n\n // 404 Not Found\n case 404:\n return {\n title: 'Page Not Found',\n description: \"The page you're looking for doesn't exist or has been moved.\",\n };\n\n // 408 Request Timeout\n case 408:\n return {\n title: 'Request Timeout',\n description: 'The request took too long to process. Please try again.',\n };\n\n // 500 Internal Server Error\n case 500:\n return {\n title: 'Server Error',\n description: \"Something went wrong on our end. We're working to fix it.\",\n };\n\n // 502 Bad Gateway\n case 502:\n return {\n title: 'Bad Gateway',\n description: 'The server received an invalid response. Please try again later.',\n };\n\n // 503 Service Unavailable\n case 503:\n return {\n title: 'Service Unavailable',\n description: 'The service is temporarily unavailable. Please try again later.',\n };\n\n // 504 Gateway Timeout\n case 504:\n return {\n title: 'Gateway Timeout',\n description: 'The server took too long to respond. Please try again.',\n };\n\n // Default / Unknown Error\n default:\n return {\n title: 'Something Went Wrong',\n description: 'An unexpected error occurred. Please try again or contact support.',\n };\n }\n}\n\n/**\n * Common error codes as constants\n */\nexport const ERROR_CODES = {\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n TIMEOUT: 408,\n SERVER_ERROR: 500,\n BAD_GATEWAY: 502,\n SERVICE_UNAVAILABLE: 503,\n GATEWAY_TIMEOUT: 504,\n} as const;\n\n","/**\n * ErrorLayout - Universal Error Display\n *\n * Minimalist error page with customizable content\n * Works with Next.js error pages (404.tsx, 500.tsx, error.tsx)\n *\n * Usage:\n * ```tsx\n * // app/not-found.tsx\n * import { ErrorLayout } from '@djangocfg/layouts/components';\n *\n * export default function NotFound() {\n * return <ErrorLayout code={404} supportEmail={settings.contact.email} />;\n * }\n * ```\n */\n\n'use client';\n\nimport React from 'react';\n\nimport { Button } from '@djangocfg/ui-nextjs/components';\n\nimport { getErrorContent } from './errorConfig';\n\nexport interface ErrorLayoutProps {\n /** Error code (e.g., \"404\", \"500\", \"403\") - if provided, auto-configures title/description/icon */\n code?: string | number;\n /** Error title (auto-generated from code if not provided) */\n title?: string;\n /** Error description (auto-generated from code if not provided) */\n description?: string;\n /** Custom action buttons */\n actions?: React.ReactNode;\n /** Show default actions (back, home) */\n showDefaultActions?: boolean;\n /** Custom illustration/icon (auto-generated from code if not provided) */\n illustration?: React.ReactNode;\n /** Support email for contact link */\n supportEmail?: string;\n}\n\n// Local function to select the icon based on the code. \n// This is safe as it's defined and used inside a Client Component.\nfunction getErrorIcon(code?: string | number): React.ReactNode {\n const c = code ? String(code) : '';\n \n // NOTE: You can replace these SVG paths with imported Lucid Icons \n // (e.g., <AlertTriangle />) if you prefer.\n switch (c) {\n case '404':\n return (\n <svg\n className=\"w-32 h-32 mx-auto text-foreground/80\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n {/* Cloud with 404 Icon */}\n <g>\n <path fillRule=\"evenodd\" d=\"M19.889 21.734v-.947l-.631.947z\" />\n <path d=\"M15.484 19.636h1.032a.017.017 0 0 1 .017.017v3.1a.016.016 0 0 1-.016.016h-1.034a.016.016 0 0 1-.016-.016v-3.1a.017.017 0 0 1 .017-.017z\" />\n <g fillRule=\"evenodd\">\n <path d=\"M12.402 21.734v-.947l-.631.947z\" />\n <path d=\"M16 1.5A14.5 14.5 0 1 0 30.5 16 14.507 14.507 0 0 0 16 1.5zm-2.324 21.234H13.4v.532a.5.5 0 0 1-1 0v-.532h-1.563a.5.5 0 0 1-.416-.778l2.067-3.1a.5.5 0 0 1 .914.28v2.6h.274a.5.5 0 0 1 0 1zm-2.137-9.9A4.14 4.14 0 0 1 15.545 9.8a.5.5 0 0 1 0 1 3.138 3.138 0 0 0-3.04 2.3.5.5 0 0 1-.966-.259zm5.994 9.911a1.017 1.017 0 0 1-1.017 1.016h-1.032a1.017 1.017 0 0 1-1.017-1.016v-3.1a1.017 1.017 0 0 1 1.017-1.016h1.032a1.017 1.017 0 0 1 1.017 1.016zm3.63-.016h-.274v.532a.5.5 0 0 1-1 0v-.532h-1.565a.5.5 0 0 1-.416-.778l2.067-3.1a.5.5 0 0 1 .914.28v2.6h.274a.5.5 0 0 1 0 1zm1.036-1.52a.5.5 0 1 1-.4-.917 3.263 3.263 0 0 0-1.337-6.266.5.5 0 0 1-.5-.5 4.6 4.6 0 0 0-9.2 0 4.45 4.45 0 0 0 .153 1.161.5.5 0 0 1-.411.625 2.633 2.633 0 0 0-.364 5.148.5.5 0 0 1-.278.961 3.63 3.63 0 0 1-.024-6.984 5.467 5.467 0 0 1-.076-.911 5.6 5.6 0 0 1 11.182-.474 4.258 4.258 0 0 1 1.256 8.162z\" />\n </g>\n </g>\n </svg>\n );\n case '500':\n return (\n <svg\n className=\"w-32 h-32 mx-auto text-foreground/80\"\n viewBox=\"0 0 512 512\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n {/* Server Error Icon - Circle with Exclamation */}\n <g>\n <path d=\"M256 118c-76.1 0-138 61.88-138 138s61.9 138.05 138 138.05 138-61.93 138-138S332.1 118 256 118zm0 237.93a30.12 30.12 0 1 1 30.11-30.12A30.15 30.15 0 0 1 256 355.88zm30.11-80.31a8.48 8.48 0 0 1-8.47 8.48h-43.28a8.48 8.48 0 0 1-8.47-8.48v-111a8.47 8.47 0 0 1 8.47-8.47h43.28a8.47 8.47 0 0 1 8.47 8.47z\" />\n <path d=\"M256 312.6a13.17 13.17 0 1 0 13.16 13.16A13.17 13.17 0 0 0 256 312.6zM242.84 173.07h26.32v94.02h-26.32z\" />\n <path d=\"M256 0C114.62 0 0 114.62 0 256s114.62 256 256 256 256-114.62 256-256S397.38 0 256 0zm109.57 365.6A155 155 0 1 1 411 256a153.91 153.91 0 0 1-45.43 109.6z\" />\n </g>\n </svg>\n );\n case '403':\n return (\n <svg\n className=\"w-32 h-32 mx-auto text-foreground/80\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n {/* Forbidden Icon - Circle with X */}\n <path d=\"M12 1a11 11 0 1 0 11 11A11.013 11.013 0 0 0 12 1zm4.242 13.829a1 1 0 1 1-1.414 1.414L12 13.414l-2.828 2.829a1 1 0 0 1-1.414-1.414L10.586 12 7.758 9.171a1 1 0 1 1 1.414-1.414L12 10.586l2.828-2.829a1 1 0 1 1 1.414 1.414L13.414 12z\" />\n </svg>\n );\n default:\n return null;\n }\n}\n\n/**\n * ErrorLayout Component\n */\nexport function ErrorLayout({\n code,\n title,\n description,\n actions,\n showDefaultActions = true,\n illustration,\n supportEmail = 'support@example.com',\n}: ErrorLayoutProps) {\n \n // Get content (Title/Description) from config. Note: Illustration check removed.\n // The function getErrorContent MUST NOT return React components/functions.\n const autoContent = code && (!title || !description)\n ? getErrorContent(code)\n : null;\n\n // Fallback to auto-generated values\n const finalTitle = title || autoContent?.title || 'Error';\n const finalDescription = description || autoContent?.description;\n \n // ILLUSTRATION FIX: Use passed prop OR compute the icon locally using getErrorIcon.\n const finalIllustration = illustration ?? getErrorIcon(code);\n\n\n const handleGoBack = () => {\n if (document.referrer && document.referrer !== window.location.href) {\n window.location.href = document.referrer;\n } else if (window.history.length > 1) {\n window.history.back();\n } else {\n window.location.href = '/';\n }\n };\n\n const handleGoHome = () => {\n window.location.href = '/';\n };\n\n return (\n <div className=\"min-h-screen flex items-center justify-center px-4 bg-background\">\n <div className=\"max-w-2xl w-full text-center space-y-8\">\n {/* Illustration */}\n {finalIllustration && (\n <div className=\"flex justify-center py-8\">\n {finalIllustration}\n </div>\n )}\n\n {/* Error Content */}\n <div className=\"space-y-4\">\n <h2 className=\"text-4xl font-bold text-foreground\">\n {finalTitle}\n </h2>\n\n {finalDescription && (\n <p className=\"text-lg text-muted-foreground max-w-md mx-auto\">\n {finalDescription}\n </p>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"flex flex-col sm:flex-row items-center justify-center gap-4 pt-4\">\n {/* Custom actions */}\n {actions}\n\n {/* Default actions */}\n {showDefaultActions && !actions && (\n <>\n <Button\n variant=\"outline\"\n size=\"lg\"\n onClick={handleGoBack}\n style={{ minWidth: '140px', padding: '12px 32px' }}\n >\n Go Back\n </Button>\n <Button\n variant=\"default\"\n size=\"lg\"\n onClick={handleGoHome}\n style={{ minWidth: '140px', padding: '12px 32px' }}\n >\n Go Home\n </Button>\n </>\n )}\n </div>\n\n {/* Additional Info */}\n <div className=\"pt-8 text-sm text-muted-foreground\">\n <p>\n Need help? Contact{' '}\n <a\n href={`mailto:${supportEmail}`}\n className=\"text-primary hover:underline\"\n >\n support\n </a>\n </p>\n </div>\n </div>\n </div>\n );\n}\n\n","'use client';\n\nimport { useEffect } from 'react';\n\nimport { useAuth } from '@djangocfg/api/auth';\nimport { Preloader } from '@djangocfg/ui-nextjs/components';\nimport { useCfgRouter } from '@djangocfg/ui-nextjs/hooks';\n\nexport interface RedirectPageProps {\n /**\n * Path to redirect to when user is authenticated\n * @default '/private'\n */\n authenticatedPath?: string;\n /**\n * Path to redirect to when user is not authenticated\n * @default '/auth'\n */\n unauthenticatedPath?: string;\n /**\n * Custom loading text\n * @default 'Loading...'\n */\n loadingText?: string;\n}\n\n/**\n * RedirectPage - Root page component that handles authentication redirect\n *\n * Redirects authenticated users to authenticatedPath, otherwise to unauthenticatedPath\n *\n * Usage:\n * ```tsx\n * // app/page.tsx\n * import { RedirectPage } from '@djangocfg/layouts/components';\n *\n * export default function Page() {\n * return (\n * <RedirectPage\n * authenticatedPath=\"/private\"\n * unauthenticatedPath=\"/auth\"\n * />\n * );\n * }\n * ```\n */\nexport function RedirectPage({\n authenticatedPath = '/private',\n unauthenticatedPath = '/auth',\n loadingText = 'Loading...',\n}: RedirectPageProps) {\n const { isAuthenticated } = useAuth();\n const router = useCfgRouter();\n\n useEffect(() => {\n if (!isAuthenticated) {\n router.hardPush(unauthenticatedPath);\n } else {\n router.hardPush(authenticatedPath);\n }\n }, [isAuthenticated, router, authenticatedPath, unauthenticatedPath]);\n\n return (\n <Preloader\n variant=\"fullscreen\"\n text={loadingText}\n size=\"lg\"\n />\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","/**\n * Frontend configuration from environment variables\n */\nexport const config = {\n /**\n * Development mode flag\n * In development mode, any OTP code is accepted for authentication\n */\n isDevelopment: process.env.NODE_ENV === 'development',\n} as const;\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","\"use client\";\nimport { ChevronRight, Home } from 'lucide-react';\nimport Link from 'next/link';\nimport { usePathname } from 'next/navigation';\nimport React from 'react';\n\nexport interface BreadcrumbItem {\n path: string;\n label: string;\n isActive: boolean;\n}\n\ninterface BreadcrumbsProps {\n items?: BreadcrumbItem[];\n className?: string;\n}\n\nconst Breadcrumbs: React.FC<BreadcrumbsProps> = ({ items, className = \"\" }) => {\n const pathname = usePathname();\n \n // Use provided items or generate from pathname\n const breadcrumbs = items || generateBreadcrumbsFromPath(pathname);\n\n if (breadcrumbs.length <= 1) {\n return null;\n }\n\n return (\n <nav className={`flex items-center space-x-2 text-sm ${className}`} aria-label=\"Breadcrumb\">\n <ol className=\"flex items-center space-x-2\">\n {breadcrumbs.map((item: BreadcrumbItem, index: number) => (\n <li key={item.path} className=\"flex items-center\">\n {index > 0 && (\n <ChevronRight className=\"w-4 h-4 text-gray-400 mx-2\" />\n )}\n \n {item.isActive ? (\n <span className=\"text-gray-900 dark:text-white font-medium flex items-center gap-1\">\n {index === 0 && <Home className=\"w-4 h-4\" />}\n {item.label}\n </span>\n ) : (\n <Link\n href={item.path}\n className=\"text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 \n transition-colors duration-200 flex items-center gap-1 hover:underline\"\n >\n {index === 0 && <Home className=\"w-4 h-4\" />}\n {item.label}\n </Link>\n )}\n </li>\n ))}\n </ol>\n </nav>\n );\n};\n\n// Helper function to generate breadcrumbs from pathname\nfunction generateBreadcrumbsFromPath(pathname: string): BreadcrumbItem[] {\n const segments = pathname.split('/').filter(Boolean);\n const breadcrumbs: BreadcrumbItem[] = [\n { path: '/', label: 'Home', isActive: pathname === '/' }\n ];\n\n let currentPath = '';\n segments.forEach((segment, index) => {\n currentPath += `/${segment}`;\n breadcrumbs.push({\n path: currentPath,\n label: segment.charAt(0).toUpperCase() + segment.slice(1).replace(/-/g, ' '),\n isActive: index === segments.length - 1\n });\n });\n\n return breadcrumbs;\n}\n\nexport default Breadcrumbs;\nexport { generateBreadcrumbsFromPath };","'use client';\n\nimport React, {\n createContext, ReactNode, useCallback, useContext, useEffect, useMemo, useRef, useState\n} from 'react';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { useIsMobile, useLocalStorage } from '@djangocfg/ui-nextjs/hooks';\n\nimport { storageKeys } from '../config';\n\nimport type { AIChatMessage, ChatApiResponse, AIChatSource, ChatWidgetConfig, ChatDisplayMode } from '../types';\nconst MAX_STORED_MESSAGES = 50;\n\nfunction generateMessageId(): string {\n return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Serialized message format for localStorage\n */\ninterface SerializedMessage {\n id: string;\n role: 'user' | 'assistant' | 'system';\n content: string;\n timestamp: string; // ISO string\n sources?: AIChatSource[];\n}\n\n/**\n * Chat context state\n */\nexport interface ChatContextState {\n /** All chat messages */\n messages: AIChatMessage[];\n /** Whether a request is in progress */\n isLoading: boolean;\n /** Last error if any */\n error: Error | null;\n /** Whether chat panel is open */\n isOpen: boolean;\n /** Whether chat is minimized */\n isMinimized: boolean;\n /** Configuration */\n config: ChatWidgetConfig;\n /** Current display mode */\n displayMode: ChatDisplayMode;\n /** Is on mobile device */\n isMobile: boolean;\n /** User ID for this session */\n userId: string;\n}\n\n/**\n * Chat context actions\n */\nexport interface ChatContextActions {\n /** Send a message */\n sendMessage: (content: string) => Promise<void>;\n /** Clear all messages */\n clearMessages: () => void;\n /** Open chat panel */\n openChat: () => void;\n /** Close chat panel */\n closeChat: () => void;\n /** Toggle chat panel */\n toggleChat: () => void;\n /** Minimize/restore chat */\n toggleMinimize: () => void;\n /** Set display mode */\n setDisplayMode: (mode: ChatDisplayMode) => void;\n}\n\nexport type ChatContextValue = ChatContextState & ChatContextActions;\n\nconst ChatContext = createContext<ChatContextValue | null>(null);\n\n/**\n * Chat provider props\n */\nexport interface ChatProviderProps {\n children: ReactNode;\n /** API endpoint for chat */\n apiEndpoint?: string;\n /** Widget configuration */\n config?: Partial<ChatWidgetConfig>;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Chat provider component\n */\nexport function ChatProvider({\n children,\n apiEndpoint = '/api/chat',\n config: userConfig = {},\n onError,\n}: ChatProviderProps) {\n const [messages, setMessages] = useState<AIChatMessage[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [isMinimized, setIsMinimized] = useState(false);\n const isHydratedRef = useRef(false);\n const mobileResetRef = useRef(false);\n\n // Display mode with localStorage persistence\n const [storedMode, setStoredMode] = useLocalStorage<ChatDisplayMode>(storageKeys.mode, 'closed');\n\n // User ID with localStorage persistence\n const [userId, setUserId] = useLocalStorage<string>(storageKeys.userId, '');\n\n // Messages storage (serialized)\n const [storedMessages, setStoredMessages] = useLocalStorage<SerializedMessage[]>(storageKeys.messages, []);\n\n const isMobile = useIsMobile();\n\n // On mobile, always start closed on page load (don't restore state)\n useEffect(() => {\n if (isMobile && !mobileResetRef.current && storedMode !== 'closed') {\n mobileResetRef.current = true;\n setStoredMode('closed');\n }\n }, [isMobile, storedMode, setStoredMode]);\n\n // Generate user ID if not exists\n useEffect(() => {\n if (!userId) {\n setUserId(uuidv4());\n }\n }, [userId, setUserId]);\n\n // Load messages from localStorage on mount (once)\n useEffect(() => {\n if (isHydratedRef.current) return;\n isHydratedRef.current = true;\n\n if (storedMessages.length > 0) {\n const hydratedMessages: AIChatMessage[] = storedMessages.map((msg) => ({\n ...msg,\n timestamp: new Date(msg.timestamp),\n }));\n setMessages(hydratedMessages);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [storedMessages]); // Depend on storedMessages to wait for localStorage\n\n // Save messages to localStorage when they change\n useEffect(() => {\n if (!isHydratedRef.current) return;\n\n const toStore: SerializedMessage[] = messages.slice(-MAX_STORED_MESSAGES).map((msg) => ({\n id: msg.id,\n role: msg.role,\n content: msg.content,\n timestamp: msg.timestamp.toISOString(),\n sources: msg.sources,\n }));\n setStoredMessages(toStore);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [messages]);\n\n // On mobile, sidebar mode is not available - fallback to floating\n const displayMode: ChatDisplayMode = useMemo(() => {\n if (isMobile && storedMode === 'sidebar') {\n return 'floating';\n }\n return storedMode;\n }, [isMobile, storedMode]);\n\n // Derived state: isOpen is true when not in 'closed' mode\n const isOpen = displayMode !== 'closed';\n\n const config: ChatWidgetConfig = useMemo(\n () => ({\n apiEndpoint,\n title: 'DjangoCFG AI',\n placeholder: 'Ask about DjangoCFG...',\n greeting:\n \"Hi! I'm your DjangoCFG documentation assistant. Ask me anything about configuration, features, or how to use the library.\",\n position: 'bottom-right',\n variant: 'default',\n ...userConfig,\n }),\n [apiEndpoint, userConfig]\n );\n\n const sendMessage = useCallback(\n async (content: string) => {\n if (!content.trim() || isLoading) return;\n\n const userMessage: AIChatMessage = {\n id: generateMessageId(),\n role: 'user',\n content: content.trim(),\n timestamp: new Date(),\n };\n\n setMessages((prev) => [...prev, userMessage]);\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await fetch(config.apiEndpoint || apiEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n query: content,\n userId: userId || undefined,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n const data: ChatApiResponse = await response.json();\n\n if (!data.success) {\n throw new Error(data.error || 'Failed to get response');\n }\n\n const sources: AIChatSource[] =\n data.results?.map((r) => ({\n title: r.chunk.title,\n path: r.chunk.path,\n url: r.chunk.url,\n section: r.chunk.section,\n score: r.score,\n })) || [];\n\n const assistantMessage: AIChatMessage = {\n id: generateMessageId(),\n role: 'assistant',\n content: data.answer || 'I found some relevant documentation.',\n timestamp: new Date(),\n sources,\n };\n\n setMessages((prev) => [...prev, assistantMessage]);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Unknown error');\n setError(error);\n onError?.(error);\n\n const errorMessage: AIChatMessage = {\n id: generateMessageId(),\n role: 'assistant',\n content: `Sorry, I encountered an error: ${error.message}. Please try again.`,\n timestamp: new Date(),\n };\n\n setMessages((prev) => [...prev, errorMessage]);\n } finally {\n setIsLoading(false);\n }\n },\n [apiEndpoint, config.apiEndpoint, isLoading, onError, userId]\n );\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n setStoredMessages([]);\n setError(null);\n }, [setStoredMessages]);\n\n const openChat = useCallback(() => {\n setStoredMode('floating');\n setIsMinimized(false);\n }, [setStoredMode]);\n\n const closeChat = useCallback(() => {\n setStoredMode('closed');\n setIsMinimized(false);\n }, [setStoredMode]);\n\n const toggleChat = useCallback(() => {\n if (displayMode === 'closed') {\n setStoredMode('floating');\n setIsMinimized(false);\n } else {\n setStoredMode('closed');\n }\n }, [displayMode, setStoredMode]);\n\n const toggleMinimize = useCallback(() => {\n setIsMinimized((prev) => !prev);\n }, []);\n\n const setDisplayMode = useCallback(\n (mode: ChatDisplayMode) => {\n // On mobile, sidebar is not available\n if (isMobile && mode === 'sidebar') {\n setStoredMode('floating');\n } else {\n setStoredMode(mode);\n }\n setIsMinimized(false);\n },\n [isMobile, setStoredMode]\n );\n\n const value = useMemo<ChatContextValue>(\n () => ({\n messages,\n isLoading,\n error,\n isOpen,\n isMinimized,\n config,\n displayMode,\n isMobile,\n userId: userId || '',\n sendMessage,\n clearMessages,\n openChat,\n closeChat,\n toggleChat,\n toggleMinimize,\n setDisplayMode,\n }),\n [\n messages,\n isLoading,\n error,\n isOpen,\n isMinimized,\n config,\n displayMode,\n isMobile,\n userId,\n sendMessage,\n clearMessages,\n openChat,\n closeChat,\n toggleChat,\n toggleMinimize,\n setDisplayMode,\n ]\n );\n\n return <ChatContext.Provider value={value}>{children}</ChatContext.Provider>;\n}\n\n/**\n * Hook to access chat context\n */\nexport function useChatContext(): ChatContextValue {\n const context = useContext(ChatContext);\n if (!context) {\n throw new Error('useChatContext must be used within a ChatProvider');\n }\n return context;\n}\n\n/**\n * Hook to check if chat context is available\n */\nexport function useChatContextOptional(): ChatContextValue | null {\n return useContext(ChatContext);\n}\n","'use client';\n\nexport { ChatProvider, useChatContext, useChatContextOptional } from './ChatContext';\nexport type { ChatContextState, ChatContextActions, ChatContextValue, ChatProviderProps } from './ChatContext';\n\nexport { AIChatProvider, useAIChatContext, useAIChatContextOptional } from './AIChatContext';\nexport type { AIChatContextState, AIChatContextActions, AIChatContextValue, AIChatProviderProps } from './AIChatContext';\n","'use client';\n\nimport { MessageCircle } from 'lucide-react';\nimport React from 'react';\n\nimport { Button, Portal } from '@djangocfg/ui-nextjs';\n\nimport { ChatProvider, useChatContext, useChatContextOptional } from '../context';\nimport { useChatLayout } from '../hooks/useChatLayout';\nimport { ChatPanel } from './ChatPanel';\nimport { ChatSidebar } from './ChatSidebar';\n\nimport type { ChatWidgetConfig } from '../types';\n\nexport interface ChatWidgetProps extends ChatWidgetConfig {\n /** Custom class name for the container */\n className?: string;\n}\n\n/**\n * Internal chat widget that uses context\n */\nconst ChatWidgetInternal: React.FC<{ className?: string }> = ({ className }) => {\n const { config, displayMode, openChat, isMobile } = useChatContext();\n\n // Use layout hook for consistent positioning\n const { getFabStyles, getFloatingStyles } = useChatLayout();\n\n const position = config.position || 'bottom-right';\n const fabStyles = getFabStyles(position);\n const floatingStyles = getFloatingStyles(position);\n\n // Mobile fullscreen styles for floating mode\n // Using inset: 0 with height: 100dvh for proper mobile viewport handling\n const mobileFullscreenStyles: React.CSSProperties = {\n position: 'fixed',\n inset: 0,\n height: '100dvh',\n width: '100vw',\n zIndex: 400, // Higher z-index for mobile overlay\n overflow: 'hidden',\n };\n\n // Mode: closed - just show FAB\n if (displayMode === 'closed') {\n return (\n <Portal>\n <div style={fabStyles} className={className || ''}>\n <Button\n onClick={openChat}\n className=\"rounded-full shadow-lg hover:shadow-xl transition-shadow\"\n style={{ width: '56px', height: '56px' }}\n >\n <MessageCircle className=\"h-6 w-6\" />\n </Button>\n </div>\n </Portal>\n );\n }\n\n // Mode: sidebar - full-height panel on the right (desktop only)\n if (displayMode === 'sidebar') {\n return (\n <Portal>\n <ChatSidebar />\n </Portal>\n );\n }\n\n // Mode: floating - fullscreen on mobile, floating panel on desktop\n return (\n <Portal>\n <div style={isMobile ? mobileFullscreenStyles : floatingStyles} className={className || ''}>\n <ChatPanel />\n </div>\n </Portal>\n );\n};\n\n/**\n * ChatWidget component\n *\n * Can be used in two ways:\n * 1. Standalone (wraps itself in ChatProvider)\n * 2. Inside a ChatProvider (uses context directly)\n */\nexport const ChatWidget: React.FC<ChatWidgetProps> = ({\n apiEndpoint = '/api/chat',\n title = 'DjangoCFG AI',\n placeholder = 'Ask about DjangoCFG...',\n greeting = \"Hi! I'm your DjangoCFG documentation assistant. Ask me anything about configuration, features, or how to use the library.\",\n position = 'bottom-right',\n variant = 'default',\n className,\n}) => {\n // Check if we're inside a ChatProvider\n const existingContext = useChatContextOptional();\n\n // If already in context, use internal widget directly\n if (existingContext) {\n return <ChatWidgetInternal className={className} />;\n }\n\n // Otherwise, wrap in provider\n return (\n <ChatProvider\n apiEndpoint={apiEndpoint}\n config={{ title, placeholder, greeting, position, variant }}\n >\n <ChatWidgetInternal className={className} />\n </ChatProvider>\n );\n};\n\nChatWidget.displayName = 'ChatWidget';\n","'use client';\n\nexport { ChatWidget } from './ChatWidget';\nexport type { ChatWidgetProps } from './ChatWidget';\n\nexport { AIChatWidget } from './AIChatWidget';\nexport type { AIChatWidgetProps } from './AIChatWidget';\n\nexport { ChatPanel } from './ChatPanel';\n\nexport { ChatMessages } from './ChatMessages';\nexport type { ChatMessagesProps, ChatMessagesHandle } from './ChatMessages';\n\nexport { MessageBubble } from './MessageBubble';\nexport type { MessageBubbleProps } from './MessageBubble';\n\nexport { AIMessageInput } from './MessageInput';\nexport type { AIMessageInputProps } from './MessageInput';\n\nexport { ChatSidebar } from './ChatSidebar';\nexport type { ChatSidebarProps } from './ChatSidebar';\n\nexport { AskAIButton } from './AskAIButton';\nexport type { AskAIButtonProps } from './AskAIButton';\n","'use client';\n\nimport { useCallback } from 'react';\n\nimport type { McpChatEventDetail, UseMcpChatReturn } from '../types';\n\n/**\n * Hook to send messages to MCP Chat from anywhere in the app\n *\n * @example\n * ```tsx\n * function ErrorBoundary({ error }) {\n * const { sendToChat } = useMcpChat();\n *\n * const explainError = () => {\n * sendToChat({\n * message: `Explain this error: ${error.message}`,\n * context: {\n * type: 'error',\n * data: { error: error.stack },\n * source: 'ErrorBoundary'\n * }\n * });\n * };\n *\n * return <button onClick={explainError}>Explain Error</button>;\n * }\n * ```\n */\nexport function useMcpChat(): UseMcpChatReturn {\n /**\n * Send message to chat via CustomEvent\n */\n const sendToChat = useCallback((detail: McpChatEventDetail) => {\n if (typeof window === 'undefined') {\n console.error('[useMcpChat] Cannot send message: window is not available');\n return;\n }\n\n // Create custom event\n const event = new CustomEvent('mcp:chat:send', {\n detail,\n bubbles: true,\n });\n\n // Set up handler confirmation listener\n let handled = false;\n const handleConfirmation = () => {\n handled = true;\n };\n\n window.addEventListener('mcp:chat:handled', handleConfirmation, { once: true });\n\n // Dispatch event\n window.dispatchEvent(event);\n\n // Check if event was handled\n setTimeout(() => {\n window.removeEventListener('mcp:chat:handled', handleConfirmation);\n\n if (!handled) {\n const errorMessage = 'AI Chat is not available. Please make sure the chat component is loaded.';\n console.error('[useMcpChat]', errorMessage);\n\n // Import consola dynamically if available\n if (typeof window !== 'undefined' && (window as any).consola) {\n (window as any).consola.error('[useMcpChat] Chat not available');\n }\n\n // Show user-friendly alert\n alert(errorMessage);\n }\n }, 100);\n }, []);\n\n /**\n * Check if chat is available\n */\n const isChatAvailable = useCallback(() => {\n if (typeof window === 'undefined') return false;\n\n // Check if chat registered itself\n return (window as any).__MCP_CHAT_AVAILABLE__ === true;\n }, []);\n\n return {\n sendToChat,\n isChatAvailable,\n };\n}\n","'use client';\n\nimport { Bot } from 'lucide-react';\n\nimport { Button, ButtonProps} from '@djangocfg/ui-nextjs';\n\nimport { useMcpChat } from '../hooks/useMcpChat';\n\nimport type { McpChatEventDetail } from '../types';\n\nexport interface AskAIButtonProps extends Omit<ButtonProps, 'onClick'> {\n /** Message to send to AI */\n message: string;\n /** Additional context data */\n contextData?: Record<string, any>;\n /** Source component name */\n source?: string;\n /** Auto-send message (default: true) */\n autoSend?: boolean;\n /** Show icon (default: true) */\n showIcon?: boolean;\n /** Callback after sending */\n onSent?: () => void;\n}\n\n/**\n * Universal AI chat trigger button\n *\n * @example Basic usage\n * ```tsx\n * <AskAIButton message=\"Explain this feature\">\n * Explain this\n * </AskAIButton>\n * ```\n *\n * @example With context\n * ```tsx\n * <AskAIButton\n * message=\"Why is this failing?\"\n * contextData={{ error: error.stack }}\n * source=\"ErrorBoundary\"\n * >\n * Ask AI\n * </AskAIButton>\n * ```\n */\nexport function AskAIButton({\n message,\n contextData,\n source,\n autoSend = true,\n showIcon = true,\n onSent,\n children = 'Ask AI',\n variant = 'outline',\n size = 'default',\n className,\n ...buttonProps\n}: AskAIButtonProps) {\n const { sendToChat } = useMcpChat();\n\n const handleClick = () => {\n const detail: McpChatEventDetail = {\n message,\n autoSend,\n // No displayMode - chat will use remembered mode automatically\n };\n\n if (contextData || source) {\n detail.context = {\n data: contextData,\n source,\n };\n }\n\n sendToChat(detail);\n onSent?.();\n };\n\n return (\n <Button\n onClick={handleClick}\n variant={variant}\n size={size}\n className={className}\n {...buttonProps}\n >\n {showIcon && <Bot className=\"h-4 w-4 mr-2\" />}\n {children}\n </Button>\n );\n}\n","'use client';\n\nexport { useAIChat } from './useAIChat';\nexport { useChatLayout } from './useChatLayout';\nexport { useMcpChat } from './useMcpChat';\nexport type { ChatLayoutConfig, UseChatLayoutReturn } from './useChatLayout';\n","/**\n * LegalPage Component\n *\n * Reusable component for legal pages (Privacy, Terms, Cookies, Security)\n * Accepts configuration for flexible content rendering\n *\n * Usage:\n * ```tsx\n * import { LegalPage } from '@djangocfg/layouts/components/legal';\n * import { privacyConfig } from './config';\n *\n * export default function PrivacyPage() {\n * return <LegalPage config={privacyConfig} />;\n * }\n * ```\n */\n\n'use client';\n\nimport React from 'react';\n\nimport { Card, CardContent, CardHeader, CardTitle } from '@djangocfg/ui-nextjs/components';\n\nimport type { LegalPageConfig } from './types';\n\nexport interface LegalPageProps {\n config: LegalPageConfig;\n className?: string;\n}\n\n/**\n * Format date for display\n */\nfunction formatDate(date: string | Date | undefined): string {\n if (!date) return '';\n if (typeof date === 'string') return date;\n return date.toISOString().split('T')[0];\n}\n\n/**\n * LegalPage Component\n */\nexport function LegalPage({ config, className }: LegalPageProps) {\n const { title, lastUpdated, sections } = config;\n\n return (\n <div className={`container mx-auto max-w-4xl py-16 px-4 ${className || ''}`}>\n <div className=\"flex flex-col gap-8\">\n {/* Header */}\n <div className=\"flex flex-col gap-4\">\n <h1 className=\"text-4xl font-bold\">{title}</h1>\n {lastUpdated && (\n <p className=\"text-lg text-muted-foreground\">\n Last updated: {formatDate(lastUpdated)}\n </p>\n )}\n </div>\n\n {/* Sections */}\n {sections.map((section, index) => (\n <Card key={index}>\n <CardHeader>\n <CardTitle>{section.title}</CardTitle>\n </CardHeader>\n <CardContent className=\"text-muted-foreground\">\n {Array.isArray(section.content) ? (\n <div className=\"flex flex-col gap-2\">\n {section.content.map((paragraph, pIndex) => (\n <p key={pIndex}>{paragraph}</p>\n ))}\n </div>\n ) : (\n <p>{section.content}</p>\n )}\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n );\n}\n\n","/**\n * Default legal page configurations\n *\n * Pre-configured content for common legal pages\n * Can be customized or extended as needed\n */\n\nimport type { LegalPageConfig } from './types';\n\nexport const privacyConfig: LegalPageConfig = {\n title: 'Privacy Policy',\n sections: [\n {\n title: 'Information We Collect',\n content: 'We collect information that you provide directly to us, including when you create an account, use our services, or communicate with us.',\n },\n {\n title: 'How We Use Your Information',\n content: [\n 'We use the information we collect to:',\n 'Provide, maintain, and improve our services',\n 'Process transactions and send related information',\n 'Send technical notices and support messages',\n 'Respond to your comments and questions',\n ],\n },\n {\n title: 'Information Sharing',\n content: 'We do not share your personal information with third parties except as described in this privacy policy or with your consent.',\n },\n {\n title: 'Data Security',\n content: 'We take reasonable measures to help protect your personal information from loss, theft, misuse, unauthorized access, disclosure, alteration, and destruction.',\n },\n {\n title: 'Your Rights',\n content: 'You have the right to access, update, or delete your personal information at any time. Contact us if you wish to exercise these rights.',\n },\n {\n title: 'Changes to This Policy',\n content: 'We may update this privacy policy from time to time. We will notify you of any changes by posting the new policy on this page.',\n },\n ],\n};\n\nexport const termsConfig: LegalPageConfig = {\n title: 'Terms of Service',\n sections: [\n {\n title: '1. Acceptance of Terms',\n content: 'By accessing and using this service, you accept and agree to be bound by the terms and provision of this agreement.',\n },\n {\n title: '2. Use License',\n content: 'Permission is granted to temporarily download one copy of the materials on our service for personal, non-commercial transitory viewing only.',\n },\n {\n title: '3. Disclaimer',\n content: 'The materials on our service are provided on an \\'as is\\' basis. We make no warranties, expressed or implied, and hereby disclaim and negate all other warranties including, without limitation, implied warranties or conditions of merchantability, fitness for a particular purpose, or non-infringement of intellectual property or other violation of rights.',\n },\n {\n title: '4. Limitations',\n content: 'In no event shall we or our suppliers be liable for any damages (including, without limitation, damages for loss of data or profit, or due to business interruption) arising out of the use or inability to use the materials on our service.',\n },\n {\n title: '5. Revisions',\n content: 'We may revise these terms of service at any time without notice. By using this service you are agreeing to be bound by the then current version of these terms of service.',\n },\n ],\n};\n\nexport const cookiesConfig: LegalPageConfig = {\n title: 'Cookie Policy',\n sections: [\n {\n title: 'What Are Cookies?',\n content: 'Cookies are small text files that are placed on your device when you visit our website. They help us provide you with a better experience by remembering your preferences and understanding how you use our site.',\n },\n {\n title: 'Types of Cookies We Use',\n content: [\n 'Essential Cookies: These cookies are necessary for the website to function properly.',\n 'Performance Cookies: These cookies help us understand how visitors interact with our website.',\n 'Functionality Cookies: These cookies allow us to remember choices you make and provide enhanced features.',\n ],\n },\n {\n title: 'Managing Cookies',\n content: 'Most web browsers allow you to control cookies through their settings. You can set your browser to refuse cookies or delete certain cookies. However, please note that if you disable cookies, some features of our website may not function properly.',\n },\n {\n title: 'Third-Party Cookies',\n content: 'We may use third-party services that also use cookies. These third parties have their own privacy policies, and we do not accept any responsibility or liability for their policies.',\n },\n {\n title: 'Updates to This Policy',\n content: 'We may update our Cookie Policy from time to time. Any changes will be posted on this page with an updated revision date.',\n },\n ],\n};\n\nexport const securityConfig: LegalPageConfig = {\n title: 'Security Policy',\n sections: [\n {\n title: 'Our Commitment to Security',\n content: 'We take the security of your data seriously. We implement industry-standard security measures to protect your personal information from unauthorized access, disclosure, alteration, and destruction.',\n },\n {\n title: 'Data Encryption',\n content: 'All data transmitted between your device and our servers is encrypted using industry-standard SSL/TLS protocols. Sensitive data stored in our databases is encrypted at rest using advanced encryption standards.',\n },\n {\n title: 'Access Controls',\n content: 'Access to user data is strictly limited to authorized personnel who require it to perform their job functions. We employ multi-factor authentication and regular access reviews to ensure that only authorized individuals can access sensitive information.',\n },\n {\n title: 'Security Monitoring',\n content: 'We continuously monitor our systems for potential security threats and vulnerabilities. Our security team actively tracks and responds to any suspicious activity or potential security incidents.',\n },\n {\n title: 'Reporting Security Issues',\n content: 'If you discover a security vulnerability or have concerns about our security practices, please report it to us immediately. We appreciate responsible disclosure and will work with you to address any legitimate security concerns.',\n },\n {\n title: 'Regular Security Updates',\n content: 'We regularly update our systems and software to ensure that known security vulnerabilities are patched promptly. Our infrastructure undergoes periodic security audits and penetration testing to identify and address potential weaknesses.',\n },\n ],\n};\n\n","/**\n * Pre-built legal page components\n *\n * Ready-to-use page components with default configurations\n * Can be customized by passing custom config\n *\n * Usage:\n * ```tsx\n * // app/legal/privacy/page.tsx\n * import { PrivacyPage } from '@djangocfg/layouts/components/legal';\n *\n * export default PrivacyPage;\n * ```\n */\n\n'use client';\n\nimport { cookiesConfig, privacyConfig, securityConfig, termsConfig } from './configs';\nimport { LegalPage } from './LegalPage';\n\nimport type { LegalPageConfig } from './types';\n\nexport interface LegalPageComponentProps {\n config?: LegalPageConfig;\n}\n\n/**\n * Privacy Policy Page\n */\nexport function PrivacyPage({ config }: LegalPageComponentProps = {}) {\n return <LegalPage config={config || privacyConfig} />;\n}\n\n/**\n * Terms of Service Page\n */\nexport function TermsPage({ config }: LegalPageComponentProps = {}) {\n return <LegalPage config={config || termsConfig} />;\n}\n\n/**\n * Cookie Policy Page\n */\nexport function CookiesPage({ config }: LegalPageComponentProps = {}) {\n return <LegalPage config={config || cookiesConfig} />;\n}\n\n/**\n * Security Policy Page\n */\nexport function SecurityPage({ config }: LegalPageComponentProps = {}) {\n return <LegalPage config={config || securityConfig} />;\n}\n\n"]}