@djangocfg/layouts 2.1.103 → 2.1.105

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 (94) hide show
  1. package/package.json +33 -37
  2. package/src/components/RedirectPage/RedirectPage.tsx +2 -2
  3. package/src/components/core/ClientOnly.tsx +1 -1
  4. package/src/components/errors/ErrorLayout.tsx +1 -1
  5. package/src/components/errors/ErrorsTracker/components/ErrorButtons.tsx +1 -1
  6. package/src/components/index.ts +2 -0
  7. package/src/index.ts +2 -0
  8. package/src/layouts/AuthLayout/components/AuthHelp.tsx +1 -1
  9. package/src/layouts/AuthLayout/components/AuthSuccess.tsx +1 -1
  10. package/src/layouts/AuthLayout/components/IdentifierForm.tsx +1 -1
  11. package/src/layouts/AuthLayout/components/OTPForm.tsx +1 -1
  12. package/src/layouts/AuthLayout/components/TwoFactorForm.tsx +1 -1
  13. package/src/layouts/AuthLayout/components/TwoFactorSetup.tsx +1 -1
  14. package/src/layouts/AuthLayout/components/oauth/OAuthCallback.tsx +1 -1
  15. package/src/layouts/AuthLayout/components/oauth/OAuthProviders.tsx +1 -1
  16. package/src/layouts/PrivateLayout/PrivateLayout.tsx +3 -2
  17. package/src/layouts/PrivateLayout/components/PrivateHeader.tsx +2 -2
  18. package/src/layouts/ProfileLayout/ProfileLayout.tsx +1 -1
  19. package/src/layouts/ProfileLayout/__tests__/TwoFactorSection.test.tsx +1 -1
  20. package/src/layouts/ProfileLayout/components/AvatarSection.tsx +1 -1
  21. package/src/layouts/ProfileLayout/components/DeleteAccountSection.tsx +1 -1
  22. package/src/layouts/ProfileLayout/components/ProfileForm.tsx +1 -1
  23. package/src/layouts/ProfileLayout/components/TwoFactorSection.tsx +1 -1
  24. package/src/layouts/PublicLayout/components/PublicFooter/PublicFooter.tsx +1 -1
  25. package/src/layouts/PublicLayout/components/PublicMobileDrawer.tsx +1 -1
  26. package/src/layouts/PublicLayout/components/PublicNavigation.tsx +2 -2
  27. package/src/layouts/_components/UserMenu.tsx +1 -1
  28. package/src/layouts/index.ts +2 -0
  29. package/src/pages/index.ts +2 -0
  30. package/src/pages/legal/LegalPage.tsx +1 -1
  31. package/src/snippets/AuthDialog/AuthDialog.tsx +3 -2
  32. package/src/snippets/McpChat/components/AIChatWidget.tsx +1 -1
  33. package/src/snippets/McpChat/components/AskAIButton.tsx +1 -1
  34. package/src/snippets/McpChat/components/ChatMessages.tsx +1 -1
  35. package/src/snippets/McpChat/components/ChatPanel.tsx +1 -1
  36. package/src/snippets/McpChat/components/ChatSidebar.tsx +1 -1
  37. package/src/snippets/McpChat/components/ChatWidget.tsx +1 -1
  38. package/src/snippets/McpChat/components/MessageBubble.tsx +1 -1
  39. package/src/snippets/McpChat/components/MessageInput.tsx +1 -1
  40. package/src/snippets/McpChat/context/AIChatContext.tsx +1 -1
  41. package/src/snippets/McpChat/context/ChatContext.tsx +1 -1
  42. package/src/snippets/McpChat/hooks/useChatLayout.ts +1 -1
  43. package/src/snippets/PWAInstall/components/A2HSHint.tsx +0 -1
  44. package/src/snippets/PWAInstall/components/DesktopGuide.tsx +1 -1
  45. package/src/snippets/PWAInstall/components/IOSGuide.tsx +1 -1
  46. package/src/snippets/PWAInstall/components/IOSGuideDrawer.tsx +1 -1
  47. package/src/snippets/PWAInstall/components/IOSGuideModal.tsx +1 -1
  48. package/src/snippets/PWAInstall/hooks/useInstallPrompt.ts +2 -2
  49. package/src/snippets/PushNotifications/components/PushPrompt.tsx +1 -1
  50. package/src/snippets/index.ts +1 -0
  51. package/dist/AIChatWidget-LUPM7S2O.mjs +0 -1644
  52. package/dist/AIChatWidget-LUPM7S2O.mjs.map +0 -1
  53. package/dist/AIChatWidget-O23TJJ7C.mjs +0 -3
  54. package/dist/AIChatWidget-O23TJJ7C.mjs.map +0 -1
  55. package/dist/chunk-53YKWR6F.mjs +0 -6
  56. package/dist/chunk-53YKWR6F.mjs.map +0 -1
  57. package/dist/chunk-EI7TDN2G.mjs +0 -1652
  58. package/dist/chunk-EI7TDN2G.mjs.map +0 -1
  59. package/dist/components.cjs +0 -925
  60. package/dist/components.cjs.map +0 -1
  61. package/dist/components.d.mts +0 -583
  62. package/dist/components.d.ts +0 -583
  63. package/dist/components.mjs +0 -879
  64. package/dist/components.mjs.map +0 -1
  65. package/dist/index.cjs +0 -7573
  66. package/dist/index.cjs.map +0 -1
  67. package/dist/index.d.mts +0 -2376
  68. package/dist/index.d.ts +0 -2376
  69. package/dist/index.mjs +0 -5673
  70. package/dist/index.mjs.map +0 -1
  71. package/dist/layouts.cjs +0 -6530
  72. package/dist/layouts.cjs.map +0 -1
  73. package/dist/layouts.d.mts +0 -748
  74. package/dist/layouts.d.ts +0 -748
  75. package/dist/layouts.mjs +0 -4741
  76. package/dist/layouts.mjs.map +0 -1
  77. package/dist/pages.cjs +0 -178
  78. package/dist/pages.cjs.map +0 -1
  79. package/dist/pages.d.mts +0 -57
  80. package/dist/pages.d.ts +0 -57
  81. package/dist/pages.mjs +0 -168
  82. package/dist/pages.mjs.map +0 -1
  83. package/dist/snippets.cjs +0 -3793
  84. package/dist/snippets.cjs.map +0 -1
  85. package/dist/snippets.d.mts +0 -1192
  86. package/dist/snippets.d.ts +0 -1192
  87. package/dist/snippets.mjs +0 -3738
  88. package/dist/snippets.mjs.map +0 -1
  89. package/dist/utils.cjs +0 -34
  90. package/dist/utils.cjs.map +0 -1
  91. package/dist/utils.d.mts +0 -40
  92. package/dist/utils.d.ts +0 -40
  93. package/dist/utils.mjs +0 -25
  94. package/dist/utils.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/snippets/McpChat/config.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"],"names":["error","useState","useRef","useEffect","useCallback","useLocalStorage","jsx","Bot","jsxs","React","Button","Loader2","Card","CardContent","RotateCcw","X"],"mappings":"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","file":"AIChatWidget-LUPM7S2O.mjs","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","'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"]}
@@ -1,3 +0,0 @@
1
- export { AIChatWidget } from './chunk-EI7TDN2G.mjs';
2
- //# sourceMappingURL=AIChatWidget-O23TJJ7C.mjs.map
3
- //# sourceMappingURL=AIChatWidget-O23TJJ7C.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"AIChatWidget-O23TJJ7C.mjs"}
@@ -1,6 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
-
4
- export { __name };
5
- //# sourceMappingURL=chunk-53YKWR6F.mjs.map
6
- //# sourceMappingURL=chunk-53YKWR6F.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-53YKWR6F.mjs"}