@nickle/chatbot-react 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/src/chatbot/components/chatbot-widget.tsx +4 -6
- package/src/styles.css +23 -0
package/dist/index.js
CHANGED
|
@@ -1281,10 +1281,10 @@ function ChatbotWidget() {
|
|
|
1281
1281
|
{
|
|
1282
1282
|
ref: panelRef,
|
|
1283
1283
|
className: (0, import_clsx.default)(
|
|
1284
|
-
"cb-pointer-events-auto cb-flex cb-flex-col cb-overflow-hidden cb-rounded-[var(--cb-radius)] cb-border cb-border-[var(--cb-border)] cb-bg-[var(--cb-surface)] cb-shadow-[var(--cb-shadow-panel)]
|
|
1284
|
+
"cb-panel-transition cb-pointer-events-auto cb-flex cb-flex-col cb-overflow-hidden cb-rounded-[var(--cb-radius)] cb-border cb-border-[var(--cb-border)] cb-bg-[var(--cb-surface)] cb-shadow-[var(--cb-shadow-panel)]",
|
|
1285
1285
|
panelOrigin,
|
|
1286
1286
|
panelSize.className,
|
|
1287
|
-
isOpen ? "cb-
|
|
1287
|
+
isOpen ? "cb-panel-open" : "cb-panel-closed cb-pointer-events-none",
|
|
1288
1288
|
classNames.panel
|
|
1289
1289
|
),
|
|
1290
1290
|
style: panelSize.style,
|
|
@@ -1548,7 +1548,7 @@ function ChatbotWidget() {
|
|
|
1548
1548
|
{
|
|
1549
1549
|
size: 22,
|
|
1550
1550
|
className: (0, import_clsx.default)(
|
|
1551
|
-
"cb-
|
|
1551
|
+
"cb-launcher-icon-transition cb-absolute cb-fill-current",
|
|
1552
1552
|
isOpen ? "cb-rotate-90 cb-opacity-0" : "cb-rotate-0 cb-opacity-100"
|
|
1553
1553
|
)
|
|
1554
1554
|
}
|
|
@@ -1558,7 +1558,7 @@ function ChatbotWidget() {
|
|
|
1558
1558
|
{
|
|
1559
1559
|
size: 22,
|
|
1560
1560
|
className: (0, import_clsx.default)(
|
|
1561
|
-
"cb-
|
|
1561
|
+
"cb-launcher-icon-transition cb-absolute",
|
|
1562
1562
|
isOpen ? "cb-rotate-0 cb-opacity-100" : "-cb-rotate-90 cb-opacity-0"
|
|
1563
1563
|
)
|
|
1564
1564
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/chatbot/context/chatbot-context.tsx","../src/chatbot/lib/defaults.ts","../src/chatbot/lib/adapter.ts","../src/chatbot/lib/transport.ts","../src/chatbot/lib/id.ts","../src/chatbot/lib/session.ts","../src/chatbot/lib/theme.ts","../src/chatbot/components/chatbot-widget.tsx","../src/chatbot/components/awaiting-dots.tsx","../src/chatbot/components/message-markdown.tsx","../src/chatbot/components/chatbot-page-config.tsx","../src/chatbot/hooks/use-chatbot.ts","../src/chatbot/hooks/use-chatbot-session.ts"],"sourcesContent":["export * from \"./chatbot\";\r\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport type {\n ChatMessage,\n ChatbotContextValue,\n ChatbotProviderProps,\n PageConfigOverrides,\n} from \"../types\";\nimport { DEFAULT_AGENT_NAME, DEFAULT_ASSISTANT_NOTE, DEFAULT_ICONS, DEFAULT_THEME } from \"../lib/defaults\";\nimport { withDefaultAdapter } from \"../lib/adapter\";\nimport { readAssistantResponse } from \"../lib/transport\";\nimport { createId } from \"../lib/id\";\nimport { getOrCreateSessionId, historyKey, resetSessionId } from \"../lib/session\";\nimport { resolveThemeTokens, toThemeCssVars } from \"../lib/theme\";\n\nconst ChatbotContext = createContext<ChatbotContextValue | undefined>(undefined);\nconst WELCOME_DELAY_MS = 1500;\nconst DEFAULT_LOCALE = \"en\";\nconst LOCALE_COPY: Record<\n string,\n {\n agentName: string;\n assistantNote: string;\n welcomeMessage: string;\n disclaimer: string;\n }\n> = {\n en: {\n agentName: DEFAULT_AGENT_NAME,\n assistantNote: DEFAULT_ASSISTANT_NOTE,\n welcomeMessage: \"Hi, how can I help you?\",\n disclaimer: \"AI can make mistakes.\",\n },\n de: {\n agentName: \"Assistent\",\n assistantNote: \"Wie kann ich helfen?\",\n welcomeMessage: \"Hallo, wie kann ich Ihnen helfen?\",\n disclaimer: \"KI kann Fehler machen.\",\n },\n es: {\n agentName: \"Asistente\",\n assistantNote: \"Como puedo ayudarte?\",\n welcomeMessage: \"Hola, como puedo ayudarte?\",\n disclaimer: \"La IA puede cometer errores.\",\n },\n fr: {\n agentName: \"Assistant\",\n assistantNote: \"Comment puis-je vous aider ?\",\n welcomeMessage: \"Bonjour, comment puis-je vous aider ?\",\n disclaimer: \"L'IA peut faire des erreurs.\",\n },\n it: {\n agentName: \"Assistente\",\n assistantNote: \"Come posso aiutarti?\",\n welcomeMessage: \"Ciao, come posso aiutarti?\",\n disclaimer: \"L'IA puo commettere errori.\",\n },\n nl: {\n agentName: \"Assistent\",\n assistantNote: \"Hoe kan ik je helpen?\",\n welcomeMessage: \"Hallo, hoe kan ik je helpen?\",\n disclaimer: \"AI kan fouten maken.\",\n },\n pt: {\n agentName: \"Assistente\",\n assistantNote: \"Como posso ajudar?\",\n welcomeMessage: \"Ola, como posso ajudar?\",\n disclaimer: \"A IA pode cometer erros.\",\n },\n pl: {\n agentName: \"Asystent\",\n assistantNote: \"Jak moge pomoc?\",\n welcomeMessage: \"Czesc, jak moge pomoc?\",\n disclaimer: \"AI moze popelniac bledy.\",\n },\n tr: {\n agentName: \"Asistan\",\n assistantNote: \"Nasil yardimci olabilirim?\",\n welcomeMessage: \"Merhaba, nasil yardimci olabilirim?\",\n disclaimer: \"Yapay zeka hata yapabilir.\",\n },\n sv: {\n agentName: \"Assistent\",\n assistantNote: \"Hur kan jag hjalpa dig?\",\n welcomeMessage: \"Hej, hur kan jag hjalpa dig?\",\n disclaimer: \"AI kan gora misstag.\",\n },\n da: {\n agentName: \"Assistent\",\n assistantNote: \"Hvordan kan jeg hjaelpe dig?\",\n welcomeMessage: \"Hej, hvordan kan jeg hjaelpe dig?\",\n disclaimer: \"AI kan lave fejl.\",\n },\n no: {\n agentName: \"Assistent\",\n assistantNote: \"Hvordan kan jeg hjelpe deg?\",\n welcomeMessage: \"Hei, hvordan kan jeg hjelpe deg?\",\n disclaimer: \"AI kan gjøre feil.\",\n },\n fi: {\n agentName: \"Avustaja\",\n assistantNote: \"Miten voin auttaa?\",\n welcomeMessage: \"Hei, miten voin auttaa?\",\n disclaimer: \"Tekoaly voi tehda virheita.\",\n },\n};\n\nfunction normalizeLocale(input: string | undefined): string {\n if (!input) {\n return DEFAULT_LOCALE;\n }\n\n return input.trim().toLowerCase().split(\"-\")[0] || DEFAULT_LOCALE;\n}\n\nfunction getBrowserLocale() {\n if (typeof navigator === \"undefined\") {\n return DEFAULT_LOCALE;\n }\n\n return navigator.language || DEFAULT_LOCALE;\n}\n\nfunction getLocaleCopy(locale: string) {\n return LOCALE_COPY[locale] ?? LOCALE_COPY[DEFAULT_LOCALE];\n}\n\nfunction readHistory(storage: Storage | undefined, sessionId: string): ChatMessage[] {\n if (!storage) {\n return [];\n }\n\n const raw = storage.getItem(historyKey(sessionId));\n if (!raw) {\n return [];\n }\n\n try {\n const parsed = JSON.parse(raw) as ChatMessage[];\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\nexport function ChatbotProvider({\n children,\n webhookUrl,\n locale,\n agentName,\n assistantNote,\n enableUploads = false,\n streamingMode = \"auto\",\n headers,\n theme,\n icons,\n adapter,\n events,\n initialOpen = false,\n position = \"bottom-right\",\n classNames,\n}: ChatbotProviderProps) {\n const [isHydrated, setIsHydrated] = useState(false);\n const [sessionId, setSessionId] = useState(\"cb:pending\");\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isOpen, setIsOpen] = useState(initialOpen);\n const [isAwaiting, setIsAwaiting] = useState(false);\n const [pageConfigs, setPageConfigs] = useState<Array<{ id: string; config: PageConfigOverrides }>>([]);\n const messagesRef = useRef<ChatMessage[]>([]);\n\n useEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n\n const activePageConfig = pageConfigs.length > 0 ? pageConfigs[pageConfigs.length - 1].config : undefined;\n const mergedTheme = useMemo(\n () => ({\n ...(theme ?? {}),\n ...(activePageConfig?.theme ?? {}),\n }),\n [activePageConfig?.theme, theme],\n );\n\n const resolvedTheme = useMemo(() => {\n if (!isHydrated) {\n return { ...DEFAULT_THEME, ...(mergedTheme ?? {}) };\n }\n return resolveThemeTokens(mergedTheme);\n }, [isHydrated, mergedTheme]);\n const themeVars = useMemo(() => toThemeCssVars(resolvedTheme), [resolvedTheme]);\n const mergedIcons = useMemo(() => {\n const merged = { ...DEFAULT_ICONS, ...(icons ?? {}) };\n merged.launcherClosed = icons?.launcherClosed ?? icons?.launcher ?? DEFAULT_ICONS.launcherClosed;\n merged.launcherOpen = icons?.launcherOpen ?? DEFAULT_ICONS.launcherOpen;\n return merged;\n }, [icons]);\n\n const resolvedLocale = useMemo(() => normalizeLocale(locale ?? getBrowserLocale()), [locale]);\n const localeCopy = useMemo(() => getLocaleCopy(resolvedLocale), [resolvedLocale]);\n const welcomeAssistantMessage = localeCopy.welcomeMessage;\n const disclaimerText = localeCopy.disclaimer;\n const resolvedAgentName = activePageConfig?.agentName ?? agentName ?? localeCopy.agentName;\n const resolvedAssistantNote = activePageConfig?.assistantNote ?? assistantNote ?? localeCopy.assistantNote;\n const uploadEnabled = activePageConfig?.enableUploads ?? enableUploads;\n const widgetEnabled = activePageConfig?.enabled ?? true;\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const storage = window.sessionStorage;\n const nextSessionId = getOrCreateSessionId(storage);\n setSessionId(nextSessionId);\n setMessages(readHistory(storage, nextSessionId));\n setIsHydrated(true);\n }, []);\n\n useEffect(() => {\n if (!isHydrated || typeof window === \"undefined\") {\n return;\n }\n\n const storage = window.sessionStorage;\n storage.setItem(historyKey(sessionId), JSON.stringify(messages));\n }, [isHydrated, messages, sessionId]);\n\n useEffect(() => {\n if (!isHydrated || !isOpen || !widgetEnabled || typeof window === \"undefined\") {\n return;\n }\n\n let timeoutId: number | undefined;\n\n setMessages((current) => {\n if (current.length > 0) {\n return current;\n }\n\n const welcomeId = createId(\"msg\");\n timeoutId = window.setTimeout(() => {\n setMessages((next) =>\n next.map((message): ChatMessage =>\n message.id === welcomeId\n ? {\n ...message,\n content: welcomeAssistantMessage,\n status: \"complete\",\n }\n : message,\n ),\n );\n }, WELCOME_DELAY_MS);\n\n return [\n ...current,\n {\n id: welcomeId,\n role: \"assistant\",\n content: \"\",\n createdAt: new Date().toISOString(),\n status: \"streaming\",\n },\n ];\n });\n\n return () => {\n if (timeoutId) {\n window.clearTimeout(timeoutId);\n }\n };\n }, [isHydrated, isOpen, welcomeAssistantMessage, widgetEnabled]);\n\n const open = useCallback(() => {\n setIsOpen(true);\n events?.onOpen?.();\n }, [events]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n events?.onClose?.();\n }, [events]);\n\n const toggle = useCallback(() => {\n setIsOpen((current) => {\n const next = !current;\n if (next) {\n events?.onOpen?.();\n } else {\n events?.onClose?.();\n }\n return next;\n });\n }, [events]);\n\n const clearConversation = useCallback(() => {\n setMessages([]);\n if (typeof window !== \"undefined\") {\n const storage = window.sessionStorage;\n storage.removeItem(historyKey(sessionId));\n }\n }, [sessionId]);\n\n const resetSession = useCallback(() => {\n const storage = typeof window !== \"undefined\" ? window.sessionStorage : undefined;\n const next = resetSessionId(storage);\n setSessionId(next);\n setMessages([]);\n }, []);\n\n const registerPageConfig = useCallback((id: string, config: PageConfigOverrides) => {\n setPageConfigs((current) => {\n const filtered = current.filter((entry) => entry.id !== id);\n return [...filtered, { id, config }];\n });\n }, []);\n\n const unregisterPageConfig = useCallback((id: string) => {\n setPageConfigs((current) => current.filter((entry) => entry.id !== id));\n }, []);\n\n const sendMessage = useCallback<ChatbotContextValue[\"sendMessage\"]>(\n async ({ text, files = [] }) => {\n const trimmed = text.trim();\n if (!trimmed && files.length === 0) {\n return;\n }\n\n const now = new Date().toISOString();\n const attachmentDtos = files.map((file) => ({\n id: createId(\"att\"),\n name: file.name,\n size: file.size,\n type: file.type,\n file,\n }));\n if (attachmentDtos.length > 0) {\n events?.onAttachmentAdded?.(attachmentDtos);\n }\n\n const userMessage: ChatMessage = {\n id: createId(\"msg\"),\n role: \"user\",\n content: trimmed,\n createdAt: now,\n status: \"complete\",\n attachments: attachmentDtos,\n };\n const ensureWelcomeMessage = (input: ChatMessage[]): ChatMessage[] => {\n if (input.some((message) => message.role === \"assistant\" && message.content === welcomeAssistantMessage)) {\n return input;\n }\n\n const firstStreamingAssistantIndex = input.findIndex(\n (message) => message.role === \"assistant\" && message.status === \"streaming\" && !message.content,\n );\n\n if (firstStreamingAssistantIndex >= 0) {\n return input.map((message, index): ChatMessage =>\n index === firstStreamingAssistantIndex\n ? {\n ...message,\n content: welcomeAssistantMessage,\n status: \"complete\",\n }\n : message,\n );\n }\n\n if (input.some((message) => message.role === \"assistant\")) {\n return input;\n }\n\n const welcomeMessage: ChatMessage = {\n id: createId(\"msg\"),\n role: \"assistant\",\n content: welcomeAssistantMessage,\n createdAt: now,\n status: \"complete\",\n };\n return [...input, welcomeMessage];\n };\n\n const normalizedHistory = ensureWelcomeMessage(messagesRef.current);\n const requestHistory = [...normalizedHistory, userMessage].map((message) => ({\n id: message.id,\n role: message.role,\n content: message.content,\n createdAt: message.createdAt,\n }));\n\n setMessages((current) => [...ensureWelcomeMessage(current), userMessage]);\n events?.onMessageSent?.(userMessage);\n\n const assistantId = createId(\"msg\");\n setMessages((current) => [\n ...current,\n {\n id: assistantId,\n role: \"assistant\",\n content: \"\",\n createdAt: new Date().toISOString(),\n status: \"streaming\",\n },\n ]);\n\n setIsAwaiting(true);\n const resolvedAdapter = withDefaultAdapter(adapter);\n\n try {\n const metadata = {\n sessionId,\n pageUrl: typeof window !== \"undefined\" ? window.location.href : \"\",\n timestamp: new Date().toISOString(),\n agentName: resolvedAgentName,\n locale: resolvedLocale,\n history: requestHistory,\n };\n\n const requestInit = resolvedAdapter.buildRequest({\n webhookUrl,\n message: trimmed,\n sessionId,\n agentName: resolvedAgentName,\n files: uploadEnabled ? files : [],\n metadata,\n headers,\n });\n\n const url = requestInit.url ?? webhookUrl;\n const response = await fetch(url, requestInit);\n\n let streamedContent = \"\";\n const responseText = await readAssistantResponse({\n response,\n adapter: resolvedAdapter,\n streamingMode,\n onDelta: (delta) => {\n streamedContent += delta;\n setMessages((current) =>\n current.map((message): ChatMessage =>\n message.id === assistantId\n ? {\n ...message,\n content: `${message.content}${delta}`,\n status: \"streaming\",\n }\n : message,\n ),\n );\n },\n onChunk: (chunk) => {\n events?.onChunkReceived?.(chunk);\n },\n onRecoverableError: (error) => {\n events?.onError?.(error);\n },\n });\n\n setMessages((current) => {\n const next: ChatMessage[] = current.map((message): ChatMessage => {\n if (message.id !== assistantId) {\n return message;\n }\n\n const hasStreamed = streamedContent.length > 0;\n const content = hasStreamed ? message.content : responseText;\n return {\n ...message,\n content,\n status: \"complete\",\n };\n });\n\n const completeMessage = next.find((message) => message.id === assistantId);\n if (completeMessage) {\n events?.onResponseComplete?.(completeMessage);\n }\n\n return next;\n });\n } catch (error) {\n const typedError = error instanceof Error ? error : new Error(String(error));\n events?.onError?.(typedError);\n\n setMessages((current) =>\n current.map((message): ChatMessage =>\n message.id === assistantId\n ? {\n ...message,\n content: message.content || \"Sorry, I ran into an issue while generating a response.\",\n status: \"error\",\n }\n : message,\n ),\n );\n } finally {\n setIsAwaiting(false);\n }\n },\n [\n adapter,\n events,\n headers,\n resolvedAgentName,\n resolvedLocale,\n sessionId,\n streamingMode,\n uploadEnabled,\n welcomeAssistantMessage,\n webhookUrl,\n ],\n );\n\n const value = useMemo<ChatbotContextValue>(\n () => ({\n isOpen,\n isAwaiting,\n messages,\n sessionId,\n uploadEnabled,\n agentName: resolvedAgentName,\n assistantNote: resolvedAssistantNote,\n disclaimerText,\n position,\n themeVars,\n icons: mergedIcons,\n classNames: classNames ?? {},\n open,\n close,\n toggle,\n sendMessage,\n clearConversation,\n registerPageConfig,\n unregisterPageConfig,\n widgetEnabled,\n resetSession,\n }),\n [\n classNames,\n clearConversation,\n close,\n disclaimerText,\n isAwaiting,\n isOpen,\n mergedIcons,\n messages,\n open,\n position,\n registerPageConfig,\n resolvedAgentName,\n resolvedAssistantNote,\n sendMessage,\n sessionId,\n themeVars,\n toggle,\n unregisterPageConfig,\n uploadEnabled,\n widgetEnabled,\n resetSession,\n ],\n );\n\n return <ChatbotContext.Provider value={value}>{children}</ChatbotContext.Provider>;\n}\n\nexport function useChatbotContext() {\n const context = useContext(ChatbotContext);\n if (!context) {\n throw new Error(\"useChatbotContext must be used within ChatbotProvider\");\n }\n return context;\n}\n","import {\n Bot,\n ChevronDown,\n Download,\n Ellipsis,\n Maximize2,\n MessageSquare,\n Paperclip,\n SendHorizontal,\n X,\n} from \"lucide-react\";\nimport type { ChatbotIcons, ChatbotThemeTokens } from \"../types\";\n\nexport const DEFAULT_THEME: ChatbotThemeTokens = {\n primary: \"#ffffff\",\n primaryForeground: \"#111111\",\n background: \"#0b0b0b\",\n surface: \"#111111\",\n surfaceForeground: \"#f5f5f5\",\n muted: \"#262626\",\n mutedForeground: \"#a3a3a3\",\n border: \"#2f2f2f\",\n ring: \"#737373\",\n userBubble: \"#ffffff\",\n userText: \"#111111\",\n assistantBubble: \"#2a2a2a\",\n assistantText: \"#f5f5f5\",\n radius: \"14px\",\n fontFamily: \"Inter, var(--font-sans), ui-sans-serif, system-ui, -apple-system, Segoe UI, sans-serif\",\n shadowBubble: \"0 18px 40px -16px rgba(0, 0, 0, 0.7)\",\n shadowPanel: \"0 34px 80px -36px rgba(0, 0, 0, 0.85)\",\n};\n\nexport const DEFAULT_ICONS: ChatbotIcons = {\n launcher: MessageSquare,\n launcherClosed: MessageSquare,\n launcherOpen: ChevronDown,\n close: X,\n send: SendHorizontal,\n attach: Paperclip,\n bot: Bot,\n menu: Ellipsis,\n expand: Maximize2,\n download: Download,\n};\n\nexport const DEFAULT_AGENT_NAME = \"Assistant\";\nexport const DEFAULT_ASSISTANT_NOTE = \"Here to help\";\n","import type {\n ChatbotAdapter,\n ChatbotAdapterRequestInput,\n NormalizedAssistantChunk,\n} from \"../types\";\n\nfunction extractFromRecord(record: Record<string, unknown>): string | undefined {\n const keys = [\"message\", \"text\", \"output\", \"response\", \"answer\", \"content\"];\n for (const key of keys) {\n const value = record[key];\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value;\n }\n }\n return undefined;\n}\n\nexport function defaultBuildRequest(input: ChatbotAdapterRequestInput): RequestInit & { url?: string } {\n const { files, metadata, message, headers, sessionId } = input;\n\n if (files.length > 0) {\n const formData = new FormData();\n formData.set(\"message\", message);\n formData.set(\"sessionId\", sessionId);\n formData.set(\"metadata\", JSON.stringify(metadata));\n\n files.forEach((file) => {\n formData.append(\"files[]\", file);\n });\n\n return {\n method: \"POST\",\n headers,\n body: formData,\n };\n }\n\n return {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify({\n message,\n sessionId,\n metadata,\n }),\n };\n}\n\nexport function defaultParseJsonResponse(raw: unknown): NormalizedAssistantChunk {\n if (typeof raw === \"string\") {\n return { message: raw };\n }\n\n if (Array.isArray(raw)) {\n const merged = raw\n .map((item) => {\n if (typeof item === \"string\") {\n return item;\n }\n\n if (item && typeof item === \"object\") {\n return extractFromRecord(item as Record<string, unknown>);\n }\n\n return undefined;\n })\n .filter(Boolean)\n .join(\"\\n\");\n\n return { message: merged };\n }\n\n if (raw && typeof raw === \"object\") {\n const record = raw as Record<string, unknown>;\n\n if (record.delta && typeof record.delta === \"string\") {\n return {\n delta: record.delta,\n done: Boolean(record.done),\n };\n }\n\n const text = extractFromRecord(record);\n if (text) {\n return { message: text, done: true };\n }\n\n if (record.data && typeof record.data === \"object\") {\n const nested = extractFromRecord(record.data as Record<string, unknown>);\n if (nested) {\n return { message: nested, done: true };\n }\n }\n }\n\n return { message: \"\", done: true };\n}\n\nexport function defaultParseStreamChunk(chunk: string): NormalizedAssistantChunk {\n const trimmed = chunk.trim();\n\n if (!trimmed) {\n return {};\n }\n\n if (trimmed === \"[DONE]\") {\n return { done: true };\n }\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return defaultParseJsonResponse(parsed);\n } catch {\n return { delta: trimmed };\n }\n}\n\nexport function withDefaultAdapter(adapter?: ChatbotAdapter): Required<ChatbotAdapter> {\n return {\n buildRequest: adapter?.buildRequest ?? defaultBuildRequest,\n parseJsonResponse: adapter?.parseJsonResponse ?? defaultParseJsonResponse,\n parseStreamChunk: adapter?.parseStreamChunk ?? defaultParseStreamChunk,\n };\n}\n","import type { ChatbotAdapter } from \"../types\";\n\ninterface ResponseInput {\n response: Response;\n adapter: Required<ChatbotAdapter>;\n streamingMode: \"auto\" | \"on\" | \"off\";\n onDelta: (chunk: string) => void;\n onChunk: (chunk: string) => void;\n onRecoverableError: (error: Error) => void;\n}\n\nfunction looksLikeStream(contentType: string | null) {\n if (!contentType) {\n return false;\n }\n\n const normalized = contentType.toLowerCase();\n return (\n normalized.includes(\"text/event-stream\") ||\n normalized.includes(\"application/x-ndjson\") ||\n normalized.includes(\"application/stream\")\n );\n}\n\nfunction parseAndAppend(\n rawChunk: string,\n adapter: Required<ChatbotAdapter>,\n onChunk: (chunk: string) => void,\n): { text: string; done: boolean } {\n const parsed = adapter.parseStreamChunk(rawChunk);\n onChunk(rawChunk);\n\n if (parsed.done && parsed.message) {\n return { text: parsed.message, done: true };\n }\n\n if (parsed.delta) {\n return { text: parsed.delta, done: Boolean(parsed.done) };\n }\n\n if (parsed.message) {\n return { text: parsed.message, done: Boolean(parsed.done) };\n }\n\n return { text: \"\", done: Boolean(parsed.done) };\n}\n\nasync function consumeEventStream(\n response: Response,\n adapter: Required<ChatbotAdapter>,\n onDelta: (chunk: string) => void,\n onChunk: (chunk: string) => void,\n): Promise<string> {\n const reader = response.body?.getReader();\n if (!reader) {\n return \"\";\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let fullText = \"\";\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n if (result.done) {\n break;\n }\n\n buffer += decoder.decode(result.value, { stream: true });\n\n while (buffer.includes(\"\\n\\n\")) {\n const index = buffer.indexOf(\"\\n\\n\");\n const block = buffer.slice(0, index);\n buffer = buffer.slice(index + 2);\n\n const lines = block.split(\"\\n\").filter((line) => line.startsWith(\"data:\"));\n for (const line of lines) {\n const data = line.slice(5).trim();\n const parsed = parseAndAppend(data, adapter, onChunk);\n if (parsed.text) {\n fullText += parsed.text;\n onDelta(parsed.text);\n }\n if (parsed.done) {\n done = true;\n break;\n }\n }\n }\n }\n\n if (buffer.trim()) {\n const fallback = parseAndAppend(buffer.trim(), adapter, onChunk);\n if (fallback.text) {\n fullText += fallback.text;\n onDelta(fallback.text);\n }\n }\n\n return fullText;\n}\n\nasync function consumeLineStream(\n response: Response,\n adapter: Required<ChatbotAdapter>,\n onDelta: (chunk: string) => void,\n onChunk: (chunk: string) => void,\n): Promise<string> {\n const reader = response.body?.getReader();\n if (!reader) {\n return \"\";\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let fullText = \"\";\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n if (result.done) {\n break;\n }\n\n buffer += decoder.decode(result.value, { stream: true });\n\n while (buffer.includes(\"\\n\")) {\n const index = buffer.indexOf(\"\\n\");\n const line = buffer.slice(0, index).trim();\n buffer = buffer.slice(index + 1);\n\n if (!line) {\n continue;\n }\n\n const parsed = parseAndAppend(line, adapter, onChunk);\n if (parsed.text) {\n fullText += parsed.text;\n onDelta(parsed.text);\n }\n if (parsed.done) {\n done = true;\n break;\n }\n }\n }\n\n if (buffer.trim()) {\n const parsed = parseAndAppend(buffer.trim(), adapter, onChunk);\n if (parsed.text) {\n fullText += parsed.text;\n onDelta(parsed.text);\n }\n }\n\n return fullText;\n}\n\nasync function parseNonStreaming(response: Response, adapter: Required<ChatbotAdapter>) {\n const contentType = response.headers.get(\"content-type\") || \"\";\n\n if (contentType.includes(\"application/json\")) {\n const payload = (await response.json()) as unknown;\n const parsed = adapter.parseJsonResponse(payload);\n return parsed.message ?? parsed.delta ?? \"\";\n }\n\n const rawText = await response.text();\n try {\n const parsedPayload = JSON.parse(rawText) as unknown;\n const parsed = adapter.parseJsonResponse(parsedPayload);\n return parsed.message ?? parsed.delta ?? rawText;\n } catch {\n const parsed = adapter.parseJsonResponse(rawText);\n return parsed.message ?? rawText;\n }\n}\n\nexport async function readAssistantResponse({\n response,\n adapter,\n streamingMode,\n onDelta,\n onChunk,\n onRecoverableError,\n}: ResponseInput): Promise<string> {\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`Webhook request failed (${response.status}): ${body}`);\n }\n\n const contentType = response.headers.get(\"content-type\");\n const streamEligible = streamingMode !== \"off\" && Boolean(response.body);\n const shouldStream = streamEligible && (streamingMode === \"on\" || looksLikeStream(contentType));\n\n if (!shouldStream) {\n return parseNonStreaming(response, adapter);\n }\n\n try {\n if ((contentType || \"\").toLowerCase().includes(\"text/event-stream\")) {\n return await consumeEventStream(response, adapter, onDelta, onChunk);\n }\n\n return await consumeLineStream(response, adapter, onDelta, onChunk);\n } catch (error) {\n onRecoverableError(error as Error);\n return \"\";\n }\n}","export function createId(prefix = \"cb\") {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return `${prefix}-${crypto.randomUUID()}`;\n }\n\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}","const SESSION_KEY = \"cb:session-id\";\n\nfunction createSessionId() {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n\n return `cb-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function getOrCreateSessionId(storage: Storage | undefined): string {\n if (!storage) {\n return createSessionId();\n }\n\n const existing = storage.getItem(SESSION_KEY);\n if (existing) {\n return existing;\n }\n\n const created = createSessionId();\n storage.setItem(SESSION_KEY, created);\n return created;\n}\n\nexport function resetSessionId(storage: Storage | undefined): string {\n const next = createSessionId();\n if (storage) {\n storage.setItem(SESSION_KEY, next);\n }\n return next;\n}\n\nexport function historyKey(sessionId: string) {\n return `cb:history:${sessionId}`;\n}","import { DEFAULT_THEME } from \"./defaults\";\nimport type { ChatbotThemeTokens } from \"../types\";\n\nexport function resolveThemeTokens(explicit?: Partial<ChatbotThemeTokens>): ChatbotThemeTokens {\n return {\n ...DEFAULT_THEME,\n ...(explicit ?? {}),\n };\n}\n\nexport function toThemeCssVars(tokens: ChatbotThemeTokens): Record<string, string> {\n return {\n \"--cb-primary\": tokens.primary,\n \"--cb-primary-foreground\": tokens.primaryForeground,\n \"--cb-background\": tokens.background,\n \"--cb-surface\": tokens.surface,\n \"--cb-surface-foreground\": tokens.surfaceForeground,\n \"--cb-muted\": tokens.muted,\n \"--cb-muted-foreground\": tokens.mutedForeground,\n \"--cb-border\": tokens.border,\n \"--cb-ring\": tokens.ring,\n \"--cb-user-bubble\": tokens.userBubble,\n \"--cb-user-text\": tokens.userText,\n \"--cb-assistant-bubble\": tokens.assistantBubble,\n \"--cb-assistant-text\": tokens.assistantText,\n \"--cb-radius\": tokens.radius,\n \"--cb-font-family\": tokens.fontFamily,\n \"--cb-shadow-bubble\": tokens.shadowBubble,\n \"--cb-shadow-panel\": tokens.shadowPanel,\n };\n}\n","import clsx from \"clsx\";\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type CSSProperties,\n type FormEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n} from \"react\";\nimport type { ChatMessage } from \"../types\";\nimport { useChatbotContext } from \"../context/chatbot-context\";\nimport { AwaitingDots } from \"./awaiting-dots\";\nimport { MessageMarkdown } from \"./message-markdown\";\n\nconst PANEL_INSET_REM = 1.5;\nconst EXPANDED_MAX_WIDTH_PX = 630;\nconst MOBILE_BREAKPOINT_PX = 768;\nconst ROOT_BOTTOM_OFFSET_REM = 1.5; // cb-bottom-6\nconst PANEL_TO_BUBBLE_GAP_REM = 0.75; // cb-gap-3\nconst BUBBLE_SIZE_REM = 3.5; // cb-h-14\nconst EXPANDED_BOTTOM_OFFSET_REM = ROOT_BOTTOM_OFFSET_REM + PANEL_TO_BUBBLE_GAP_REM + BUBBLE_SIZE_REM;\nconst EXPANDED_TOTAL_VERTICAL_INSET_REM = PANEL_INSET_REM + EXPANDED_BOTTOM_OFFSET_REM;\n\nfunction formatFileSize(size: number) {\n if (size < 1024) {\n return `${size} B`;\n }\n if (size < 1024 * 1024) {\n return `${(size / 1024).toFixed(1)} KB`;\n }\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction formatGmtOffset(date: Date) {\n const total = -date.getTimezoneOffset();\n const sign = total >= 0 ? \"+\" : \"-\";\n const abs = Math.abs(total);\n const hh = String(Math.floor(abs / 60)).padStart(2, \"0\");\n const mm = String(abs % 60).padStart(2, \"0\");\n return `GMT${sign}${hh}${mm}`;\n}\n\nfunction readTimeZoneName(date: Date, mode: \"long\" | \"short\") {\n const parts = new Intl.DateTimeFormat(undefined, { timeZoneName: mode }).formatToParts(date);\n return parts.find((part) => part.type === \"timeZoneName\")?.value ?? \"\";\n}\n\nfunction formatTranscriptDateTime(date: Date) {\n const datePart = new Intl.DateTimeFormat(undefined, {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n }).format(date);\n const timePart = new Intl.DateTimeFormat(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: true,\n }).format(date);\n const zoneLong = readTimeZoneName(date, \"long\");\n const zoneShort = readTimeZoneName(date, \"short\");\n const gmtOffset = formatGmtOffset(date);\n return `${datePart} at ${timePart} ${zoneLong} time ${zoneShort} (${gmtOffset})`.replace(/\\s+/g, \" \").trim();\n}\n\nfunction formatTranscriptMessageTime(value: string) {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n\n return new Intl.DateTimeFormat(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: true,\n }).format(date);\n}\n\nfunction toTranscript(messages: ChatMessage[], agentName: string) {\n const exportedAt = new Date();\n const firstDate =\n messages.length > 0 ? new Date(messages[0].createdAt) : exportedAt;\n const startedAt = Number.isNaN(firstDate.getTime()) ? exportedAt : firstDate;\n\n const lines: string[] = [\n `Conversation with ${agentName}`,\n `Started on ${formatTranscriptDateTime(startedAt)}`,\n \"\",\n \"---\",\n \"\",\n ];\n\n messages.forEach((message) => {\n const role = message.role === \"user\" ? \"Visitor\" : message.role === \"assistant\" ? agentName : \"System\";\n const content = message.content.trim();\n if (!content) {\n return;\n }\n\n lines.push(`${formatTranscriptMessageTime(message.createdAt)} | ${role}: ${content}`);\n lines.push(\"\");\n });\n\n lines.push(\"---\");\n lines.push(`Exported from ${agentName} on ${formatTranscriptDateTime(exportedAt)}`);\n\n return lines.join(\"\\n\");\n}\n\nfunction toTranscriptFilename(date: Date) {\n const yyyy = date.getFullYear();\n const mm = String(date.getMonth() + 1).padStart(2, \"0\");\n const dd = String(date.getDate()).padStart(2, \"0\");\n const hh = String(date.getHours()).padStart(2, \"0\");\n const min = String(date.getMinutes()).padStart(2, \"0\");\n const ss = String(date.getSeconds()).padStart(2, \"0\");\n return `chat-transcript-${yyyy}${mm}${dd}-${hh}${min}${ss}.txt`;\n}\n\nexport function ChatbotWidget() {\n const {\n isOpen,\n isAwaiting,\n messages,\n uploadEnabled,\n position,\n agentName,\n assistantNote,\n disclaimerText,\n themeVars,\n icons,\n classNames,\n close,\n open,\n sendMessage,\n widgetEnabled,\n } = useChatbotContext();\n\n const [inputValue, setInputValue] = useState(\"\");\n const [queuedFiles, setQueuedFiles] = useState<File[]>([]);\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [isExpanded, setIsExpanded] = useState(false);\n const [isMobileViewport, setIsMobileViewport] = useState(false);\n\n const panelRef = useRef<HTMLDivElement>(null);\n const messagesScrollRef = useRef<HTMLElement>(null);\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n const LauncherClosedIcon = icons.launcherClosed;\n const LauncherOpenIcon = icons.launcherOpen;\n const BotIcon = icons.bot;\n const MenuIcon = icons.menu;\n const CloseIcon = icons.close;\n const SendIcon = icons.send;\n const AttachIcon = icons.attach;\n const ExpandIcon = icons.expand;\n const DownloadIcon = icons.download;\n\n const alignment = position === \"bottom-left\" ? \"cb-left-6\" : \"cb-right-6\";\n const stackAlignment = position === \"bottom-left\" ? \"cb-items-start\" : \"cb-items-end\";\n const panelOrigin = position === \"bottom-left\" ? \"cb-origin-bottom-left\" : \"cb-origin-bottom-right\";\n const panelLayoutMode = isMobileViewport ? \"mobile\" : isExpanded ? \"desktop-expanded\" : \"desktop-collapsed\";\n const showExpandAction = !isMobileViewport;\n const showDownloadAction = messages.length > 0;\n const hasMenuActions = showExpandAction || showDownloadAction;\n\n const canSend = useMemo(() => {\n return !isAwaiting && (inputValue.trim().length > 0 || queuedFiles.length > 0);\n }, [inputValue, isAwaiting, queuedFiles.length]);\n\n const resizeComposer = () => {\n const textarea = inputRef.current;\n if (!textarea) {\n return;\n }\n\n if (textarea.value.length === 0) {\n textarea.style.height = \"38px\";\n textarea.style.overflowY = \"hidden\";\n return;\n }\n\n const maxHeightPx = 168;\n textarea.style.height = \"auto\";\n const nextHeight = Math.min(textarea.scrollHeight, maxHeightPx);\n textarea.style.height = `${nextHeight}px`;\n textarea.style.overflowY = textarea.scrollHeight > maxHeightPx ? \"auto\" : \"hidden\";\n };\n\n const scrollMessagesToBottom = () => {\n const container = messagesScrollRef.current;\n if (!container) {\n return;\n }\n\n container.scrollTop = container.scrollHeight;\n };\n\n const panelSize = useMemo<{ className: string; style?: CSSProperties }>(() => {\n const inset = `${PANEL_INSET_REM}rem`;\n\n if (panelLayoutMode === \"mobile\") {\n return {\n className: \"cb-fixed cb-max-h-none cb-max-w-none\",\n style: {\n top: inset,\n right: inset,\n bottom: `${EXPANDED_BOTTOM_OFFSET_REM}rem`,\n left: inset,\n },\n };\n }\n\n if (panelLayoutMode === \"desktop-expanded\") {\n return {\n className: \"cb-relative cb-max-h-none cb-max-w-none\",\n style: {\n width: `min(${EXPANDED_MAX_WIDTH_PX}px, calc(100vw - ${PANEL_INSET_REM * 2}rem))`,\n height: `calc(100vh - ${EXPANDED_TOTAL_VERTICAL_INSET_REM}rem)`,\n },\n };\n }\n\n return {\n className: \"cb-relative cb-h-[min(680px,calc(100vh-7.5rem))] cb-w-[min(92vw,420px)]\",\n style: undefined,\n };\n }, [panelLayoutMode]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const mediaQuery = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT_PX}px)`);\n const syncViewportMode = () => {\n setIsMobileViewport(mediaQuery.matches);\n };\n\n syncViewportMode();\n\n if (typeof mediaQuery.addEventListener === \"function\") {\n mediaQuery.addEventListener(\"change\", syncViewportMode);\n return () => mediaQuery.removeEventListener(\"change\", syncViewportMode);\n }\n\n mediaQuery.addListener(syncViewportMode);\n return () => mediaQuery.removeListener(syncViewportMode);\n }, []);\n\n useEffect(() => {\n if (!isOpen) {\n setIsMenuOpen(false);\n return;\n }\n\n inputRef.current?.focus();\n resizeComposer();\n }, [isOpen]);\n\n useEffect(() => {\n resizeComposer();\n }, [inputValue]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const rafId = window.requestAnimationFrame(() => {\n scrollMessagesToBottom();\n });\n\n return () => window.cancelAnimationFrame(rafId);\n }, [isOpen, messages, isAwaiting]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const onPointerDown = (event: MouseEvent) => {\n const target = event.target as Node;\n if (menuRef.current && !menuRef.current.contains(target)) {\n setIsMenuOpen(false);\n }\n };\n\n window.addEventListener(\"mousedown\", onPointerDown);\n return () => window.removeEventListener(\"mousedown\", onPointerDown);\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const onKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n if (isMenuOpen) {\n setIsMenuOpen(false);\n return;\n }\n close();\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [close, isMenuOpen, isOpen]);\n\n useEffect(() => {\n setIsMenuOpen(false);\n }, [isMobileViewport]);\n\n useEffect(() => {\n if (!hasMenuActions) {\n setIsMenuOpen(false);\n }\n }, [hasMenuActions]);\n\n const trapFocus = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.key !== \"Tab\") {\n return;\n }\n\n const root = panelRef.current;\n if (!root) {\n return;\n }\n\n const focusables = root.querySelectorAll<HTMLElement>(\n \"button, [href], textarea, input, select, [tabindex]:not([tabindex='-1'])\",\n );\n\n if (focusables.length === 0) {\n return;\n }\n\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n\n if (event.shiftKey && document.activeElement === first) {\n last.focus();\n event.preventDefault();\n } else if (!event.shiftKey && document.activeElement === last) {\n first.focus();\n event.preventDefault();\n }\n };\n\n const onSubmit = async (event: FormEvent) => {\n event.preventDefault();\n if (!canSend) {\n return;\n }\n\n const submittedText = inputValue;\n setInputValue(\"\");\n scrollMessagesToBottom();\n\n await sendMessage({\n text: submittedText,\n files: uploadEnabled ? queuedFiles : [],\n });\n\n setQueuedFiles([]);\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n };\n\n const onPickFiles = (event: ChangeEvent<HTMLInputElement>) => {\n const list = event.target.files;\n if (!list || !uploadEnabled) {\n return;\n }\n\n const files = Array.from(list);\n setQueuedFiles((current) => {\n const seen = new Set(current.map((file) => `${file.name}:${file.size}:${file.lastModified}`));\n const next = [...current];\n\n files.forEach((file) => {\n const key = `${file.name}:${file.size}:${file.lastModified}`;\n if (!seen.has(key)) {\n seen.add(key);\n next.push(file);\n }\n });\n\n return next;\n });\n };\n\n const createIdFromFile = (file: File) => `${file.name}:${file.size}:${file.lastModified}`;\n\n const removeQueuedFile = (fileId: string) => {\n setQueuedFiles((current) => current.filter((file) => createIdFromFile(file) !== fileId));\n };\n\n const downloadTranscript = () => {\n if (messages.length === 0) {\n return;\n }\n\n const now = new Date();\n const fileContent = toTranscript(messages, agentName);\n const blob = new Blob([fileContent], { type: \"text/plain;charset=utf-8\" });\n const objectUrl = URL.createObjectURL(blob);\n\n const anchor = document.createElement(\"a\");\n anchor.href = objectUrl;\n anchor.download = toTranscriptFilename(now);\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n URL.revokeObjectURL(objectUrl);\n\n setIsMenuOpen(false);\n };\n\n const toggleExpanded = () => {\n if (isMobileViewport) {\n return;\n }\n\n setIsExpanded((current) => !current);\n setIsMenuOpen(false);\n };\n\n if (!widgetEnabled) {\n return null;\n }\n\n return (\n <div\n className={clsx(\n \"cb-fixed cb-bottom-6 cb-z-[2147483640] cb-text-[var(--cb-surface-foreground)]\",\n alignment,\n classNames.root,\n )}\n style={themeVars}\n data-chatbot-root\n >\n <div className={clsx(\"cb-pointer-events-none cb-relative cb-flex cb-flex-col cb-gap-3\", stackAlignment)}>\n <div\n ref={panelRef}\n className={clsx(\n \"cb-pointer-events-auto cb-flex cb-flex-col cb-overflow-hidden cb-rounded-[var(--cb-radius)] cb-border cb-border-[var(--cb-border)] cb-bg-[var(--cb-surface)] cb-shadow-[var(--cb-shadow-panel)] cb-transition-[opacity,transform,width,height,top,left,right,bottom] cb-duration-[380ms] cb-ease-[cubic-bezier(0.22,1,0.36,1)]\",\n panelOrigin,\n panelSize.className,\n isOpen\n ? \"cb-translate-y-0 cb-scale-100 cb-opacity-100\"\n : \"cb-translate-y-3 cb-scale-90 cb-opacity-0 cb-pointer-events-none\",\n classNames.panel,\n )}\n style={panelSize.style}\n aria-hidden={!isOpen}\n onKeyDown={trapFocus}\n >\n <header\n className={clsx(\n \"cb-flex cb-items-center cb-justify-between cb-gap-2 cb-border-b cb-border-[var(--cb-border)] cb-bg-[var(--cb-surface)] cb-px-4 cb-py-3.5\",\n classNames.header,\n )}\n style={{\n borderBottomWidth: \"1px\",\n borderBottomStyle: \"solid\",\n borderBottomColor: \"var(--cb-border)\",\n }}\n >\n <div className={clsx(\"cb-flex cb-min-w-0 cb-items-center cb-gap-2.5\", classNames.headerMeta)}>\n <span className=\"cb-inline-flex cb-h-9 cb-w-9 cb-shrink-0 cb-items-center cb-justify-center cb-self-center cb-text-[var(--cb-surface-foreground)]\">\n <BotIcon size={34} />\n </span>\n <div className=\"cb-min-w-0 cb-space-y-0\">\n <p className=\"cb-m-0 cb-truncate cb-text-lg cb-font-semibold cb-leading-6 cb-text-[var(--cb-surface-foreground)]\">\n {agentName}\n </p>\n <p className=\"cb-m-0 cb-text-base cb-leading-5 cb-text-[var(--cb-muted-foreground)]\">{assistantNote}</p>\n </div>\n </div>\n\n <div ref={menuRef} className=\"cb-relative cb-flex cb-items-center cb-gap-1\">\n {hasMenuActions && (\n <button\n type=\"button\"\n onClick={() => setIsMenuOpen((current) => !current)}\n className={clsx(\n \"cb-flex cb-h-9 cb-w-9 cb-shrink-0 cb-items-center cb-justify-center cb-rounded-lg cb-bg-transparent cb-p-0 cb-text-[var(--cb-muted-foreground)] cb-transition hover:cb-bg-[var(--cb-muted)] hover:cb-text-white focus-visible:cb-bg-[var(--cb-muted)] focus-visible:cb-text-white\",\n isMenuOpen && \"cb-bg-[var(--cb-muted)] cb-text-white\",\n )}\n aria-label=\"More options\"\n aria-expanded={isMenuOpen}\n >\n <MenuIcon size={18} />\n </button>\n )}\n\n {isMenuOpen && hasMenuActions && (\n <div\n className={clsx(\n \"cb-absolute cb-right-0 cb-top-full cb-z-20 cb-mt-2 cb-flex cb-min-w-[220px] cb-flex-col cb-gap-1 cb-rounded-xl cb-border cb-border-[var(--cb-border)] cb-bg-[var(--cb-surface)] cb-p-1.5 cb-shadow-[var(--cb-shadow-panel)]\",\n classNames.menu,\n )}\n >\n {showExpandAction && (\n <button\n type=\"button\"\n onClick={toggleExpanded}\n className={clsx(\n \"cb-flex cb-w-full cb-items-center cb-gap-2 cb-rounded-lg cb-bg-transparent cb-px-3.5 cb-py-2.5 cb-text-left cb-text-sm cb-text-[var(--cb-muted-foreground)] cb-transition hover:cb-bg-[var(--cb-muted)] hover:cb-text-white focus-visible:cb-bg-[var(--cb-muted)] focus-visible:cb-text-white\",\n classNames.menuItem,\n )}\n >\n <ExpandIcon size={16} />\n <span>{isExpanded ? \"Restore window\" : \"Expand window\"}</span>\n </button>\n )}\n\n {showDownloadAction && (\n <button\n type=\"button\"\n onClick={downloadTranscript}\n className={clsx(\n \"cb-flex cb-w-full cb-items-center cb-gap-2 cb-rounded-lg cb-bg-transparent cb-px-3.5 cb-py-2.5 cb-text-left cb-text-sm cb-text-[var(--cb-muted-foreground)] cb-transition hover:cb-bg-[var(--cb-muted)] hover:cb-text-white focus-visible:cb-bg-[var(--cb-muted)] focus-visible:cb-text-white\",\n classNames.menuItem,\n )}\n >\n <DownloadIcon size={16} />\n <span>Download transcript</span>\n </button>\n )}\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={close}\n className=\"cb-flex cb-h-9 cb-w-9 cb-shrink-0 cb-items-center cb-justify-center cb-rounded-lg cb-bg-transparent cb-p-0 cb-text-[var(--cb-muted-foreground)] cb-transition hover:cb-bg-[var(--cb-muted)] hover:cb-text-white focus-visible:cb-bg-[var(--cb-muted)] focus-visible:cb-text-white\"\n aria-label=\"Close chatbot\"\n >\n <CloseIcon size={18} />\n </button>\n </div>\n </header>\n\n <section\n ref={messagesScrollRef}\n className={clsx(\n \"cb-chat-scroll cb-flex-1 cb-overflow-y-auto cb-scroll-smooth cb-bg-[var(--cb-background)] cb-px-4 cb-pt-4 cb-pb-36\",\n classNames.body,\n )}\n >\n <div className=\"cb-space-y-3.5\">\n {messages.length === 0 && (\n <div className=\"cb-rounded-xl cb-bg-[var(--cb-muted)] cb-p-3 cb-text-sm cb-text-[var(--cb-muted-foreground)]\">\n Ask anything about this company and the assistant will answer using your RAG knowledge base.\n </div>\n )}\n\n {messages.map((message) => {\n const isUser = message.role === \"user\";\n\n return (\n <article\n key={message.id}\n className={clsx(\n \"cb-flex\",\n isUser ? \"cb-justify-end cb-animate-cb-slide-fade-in-right\" : \"cb-justify-start cb-animate-cb-slide-fade-in-left\",\n )}\n >\n <div\n className={clsx(\n \"cb-max-w-[85%] cb-rounded-2xl cb-px-4 cb-py-2\",\n isUser\n ? \"cb-rounded-br-md cb-bg-[var(--cb-user-bubble)] cb-text-[var(--cb-user-text)]\"\n : \"cb-rounded-bl-md cb-bg-[var(--cb-assistant-bubble)] cb-text-[var(--cb-assistant-text)]\",\n )}\n >\n {message.role === \"assistant\" && message.status === \"streaming\" && !message.content ? (\n <AwaitingDots />\n ) : message.role === \"assistant\" ? (\n <MessageMarkdown content={message.content} />\n ) : (\n <p className=\"cb-message-text cb-m-0 cb-whitespace-pre-wrap cb-text-base cb-leading-6\">\n {message.content}\n </p>\n )}\n\n {message.attachments && message.attachments.length > 0 && (\n <div className=\"cb-mt-2 cb-flex cb-flex-wrap cb-gap-2\">\n {message.attachments.map((attachment) => (\n <span\n key={attachment.id}\n className=\"cb-inline-flex cb-items-center cb-gap-2 cb-rounded-full cb-bg-black/10 cb-px-2 cb-py-1 cb-text-xs\"\n >\n <span>{attachment.name}</span>\n <span className=\"cb-opacity-70\">{formatFileSize(attachment.size)}</span>\n </span>\n ))}\n </div>\n )}\n </div>\n </article>\n );\n })}\n\n <div />\n </div>\n </section>\n\n <footer\n className={clsx(\n \"cb-absolute cb-bottom-4 cb-left-4 cb-right-4 cb-z-10 cb-bg-transparent cb-p-0\",\n classNames.footer,\n )}\n >\n {uploadEnabled && queuedFiles.length > 0 && (\n <div className=\"cb-mb-2 cb-flex cb-flex-wrap cb-gap-2\">\n {queuedFiles.map((file) => {\n const fileId = createIdFromFile(file);\n return (\n <button\n type=\"button\"\n key={fileId}\n className=\"cb-inline-flex cb-items-center cb-gap-2 cb-rounded-full cb-bg-[var(--cb-muted)] cb-px-3 cb-py-1 cb-text-xs cb-text-[var(--cb-muted-foreground)]\"\n onClick={() => removeQueuedFile(fileId)}\n aria-label={`Remove ${file.name}`}\n >\n <span className=\"cb-max-w-[140px] cb-truncate\">{file.name}</span>\n <span>x</span>\n </button>\n );\n })}\n </div>\n )}\n\n <form onSubmit={onSubmit}>\n <div\n className={clsx(\n \"cb-flex cb-items-end cb-gap-2 cb-rounded-2xl cb-bg-[var(--cb-surface)] cb-p-2 cb-shadow-[0_18px_35px_-24px_rgba(0,0,0,0.85)] cb-transition\",\n classNames.composer,\n )}\n >\n {uploadEnabled && (\n <>\n <input\n type=\"file\"\n multiple\n ref={fileInputRef}\n className=\"cb-hidden\"\n onChange={onPickFiles}\n aria-label=\"Add attachments\"\n />\n <button\n type=\"button\"\n className=\"cb-flex cb-h-10 cb-w-10 cb-shrink-0 cb-items-center cb-justify-center cb-rounded-lg cb-bg-transparent cb-p-0 cb-text-[var(--cb-muted-foreground)] cb-transition hover:cb-bg-[var(--cb-muted)] hover:cb-text-white focus-visible:cb-bg-[var(--cb-muted)] focus-visible:cb-text-white\"\n onClick={() => fileInputRef.current?.click()}\n aria-label=\"Attach files\"\n >\n <AttachIcon size={18} />\n </button>\n </>\n )}\n\n <div className=\"cb-flex-1\">\n <textarea\n ref={inputRef}\n value={inputValue}\n onChange={(event) => setInputValue(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n void onSubmit(event);\n }\n }}\n rows={1}\n placeholder=\"Ask a question...\"\n className={clsx(\n \"cb-composer-input cb-min-h-[38px] cb-w-full cb-resize-none cb-bg-transparent cb-px-2 cb-py-1.5 cb-text-sm cb-leading-6 cb-text-[var(--cb-surface-foreground)] cb-outline-none placeholder:cb-text-[var(--cb-muted-foreground)]\",\n classNames.input,\n )}\n />\n </div>\n\n <button\n type=\"submit\"\n disabled={!canSend}\n className={clsx(\n \"cb-flex cb-h-10 cb-w-10 cb-shrink-0 cb-items-center cb-justify-center cb-rounded-full cb-bg-white cb-p-0 cb-text-[#111111] cb-transition cb-duration-200 hover:cb-scale-105 hover:cb-brightness-95 hover:cb-text-[#111111] active:cb-scale-95 focus-visible:cb-text-[#111111] disabled:cb-cursor-not-allowed disabled:cb-bg-white/70 disabled:cb-text-[#111111] disabled:cb-opacity-100\",\n classNames.sendButton,\n )}\n aria-label=\"Send message\"\n >\n <SendIcon size={18} />\n </button>\n </div>\n <p className=\"cb-m-0 cb-mt-1 cb-px-1 cb-text-center cb-text-xs cb-leading-4 cb-text-[var(--cb-muted-foreground)]\">\n {disclaimerText}\n </p>\n </form>\n </footer>\n </div>\n\n <button\n type=\"button\"\n onClick={isOpen ? close : open}\n className={clsx(\n \"cb-pointer-events-auto cb-group cb-flex cb-h-14 cb-w-14 cb-items-center cb-justify-center cb-rounded-full cb-border cb-border-[var(--cb-border)] cb-bg-[#111111] cb-text-[#f5f5f5] cb-shadow-[var(--cb-shadow-bubble)] cb-transition cb-duration-300 hover:cb-scale-110 hover:cb-bg-[#262626] hover:cb-shadow-[0_24px_50px_-18px_rgba(0,0,0,0.9)] active:cb-scale-95\",\n classNames.bubble,\n )}\n aria-label={isOpen ? \"Close chatbot\" : \"Open chatbot\"}\n >\n <span className=\"cb-relative cb-flex cb-h-6 cb-w-6 cb-items-center cb-justify-center\">\n <LauncherClosedIcon\n size={22}\n className={clsx(\n \"cb-absolute cb-fill-current cb-transition-all cb-duration-300 cb-ease-out\",\n isOpen ? \"cb-rotate-90 cb-opacity-0\" : \"cb-rotate-0 cb-opacity-100\",\n )}\n />\n <LauncherOpenIcon\n size={22}\n className={clsx(\n \"cb-absolute cb-transition-all cb-duration-300 cb-ease-out\",\n isOpen ? \"cb-rotate-0 cb-opacity-100\" : \"-cb-rotate-90 cb-opacity-0\",\n )}\n />\n </span>\n </button>\n </div>\n </div>\n );\n}\n","export function AwaitingDots() {\n return (\n <div className=\"cb-inline-flex cb-items-center cb-gap-1 cb-px-1\" aria-label=\"Assistant is typing\">\n <span className=\"cb-h-1.5 cb-w-1.5 cb-rounded-full cb-bg-[var(--cb-muted-foreground)] cb-opacity-70 cb-animate-cb-dots [animation-delay:-0.2s]\" />\n <span className=\"cb-h-1.5 cb-w-1.5 cb-rounded-full cb-bg-[var(--cb-muted-foreground)] cb-opacity-70 cb-animate-cb-dots [animation-delay:-0.1s]\" />\n <span className=\"cb-h-1.5 cb-w-1.5 cb-rounded-full cb-bg-[var(--cb-muted-foreground)] cb-opacity-70 cb-animate-cb-dots\" />\n </div>\n );\n}","import ReactMarkdown from \"react-markdown\";\nimport rehypeSanitize from \"rehype-sanitize\";\nimport remarkGfm from \"remark-gfm\";\n\ninterface MessageMarkdownProps {\n content: string;\n}\n\nexport function MessageMarkdown({ content }: MessageMarkdownProps) {\n return (\n <div className=\"cb-markdown cb-message-text cb-text-base cb-leading-6\">\n <ReactMarkdown remarkPlugins={[remarkGfm]} rehypePlugins={[rehypeSanitize]}>\n {content}\n </ReactMarkdown>\n </div>\n );\n}\n","import { useEffect, useMemo, useRef } from \"react\";\nimport type { PageConfigOverrides } from \"../types\";\nimport { useChatbotContext } from \"../context/chatbot-context\";\nimport { createId } from \"../lib/id\";\n\nexport function ChatbotPageConfig(props: PageConfigOverrides) {\n const { registerPageConfig, unregisterPageConfig } = useChatbotContext();\n const configId = useRef(createId(\"pagecfg\"));\n const stableConfig = useMemo(() => props, [props]);\n\n useEffect(() => {\n registerPageConfig(configId.current, stableConfig);\n return () => unregisterPageConfig(configId.current);\n }, [registerPageConfig, stableConfig, unregisterPageConfig]);\n\n return null;\n}","import { useChatbotContext } from \"../context/chatbot-context\";\n\nexport function useChatbot() {\n return useChatbotContext();\n}","import { useMemo } from \"react\";\nimport { useChatbotContext } from \"../context/chatbot-context\";\n\nexport function useChatbotSession() {\n const { sessionId, resetSession } = useChatbotContext();\n\n return useMemo(\n () => ({\n sessionId,\n resetSession,\n }),\n [resetSession, sessionId],\n );\n}"],"mappings":"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","names":["import_react","import_jsx_runtime","import_jsx_runtime","ReactMarkdown","remarkGfm","rehypeSanitize","import_jsx_runtime","clsx","import_react","import_react"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/chatbot/context/chatbot-context.tsx","../src/chatbot/lib/defaults.ts","../src/chatbot/lib/adapter.ts","../src/chatbot/lib/transport.ts","../src/chatbot/lib/id.ts","../src/chatbot/lib/session.ts","../src/chatbot/lib/theme.ts","../src/chatbot/components/chatbot-widget.tsx","../src/chatbot/components/awaiting-dots.tsx","../src/chatbot/components/message-markdown.tsx","../src/chatbot/components/chatbot-page-config.tsx","../src/chatbot/hooks/use-chatbot.ts","../src/chatbot/hooks/use-chatbot-session.ts"],"sourcesContent":["export * from \"./chatbot\";\r\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport type {\n ChatMessage,\n ChatbotContextValue,\n ChatbotProviderProps,\n PageConfigOverrides,\n} from \"../types\";\nimport { DEFAULT_AGENT_NAME, DEFAULT_ASSISTANT_NOTE, DEFAULT_ICONS, DEFAULT_THEME } from \"../lib/defaults\";\nimport { withDefaultAdapter } from \"../lib/adapter\";\nimport { readAssistantResponse } from \"../lib/transport\";\nimport { createId } from \"../lib/id\";\nimport { getOrCreateSessionId, historyKey, resetSessionId } from \"../lib/session\";\nimport { resolveThemeTokens, toThemeCssVars } from \"../lib/theme\";\n\nconst ChatbotContext = createContext<ChatbotContextValue | undefined>(undefined);\nconst WELCOME_DELAY_MS = 1500;\nconst DEFAULT_LOCALE = \"en\";\nconst LOCALE_COPY: Record<\n string,\n {\n agentName: string;\n assistantNote: string;\n welcomeMessage: string;\n disclaimer: string;\n }\n> = {\n en: {\n agentName: DEFAULT_AGENT_NAME,\n assistantNote: DEFAULT_ASSISTANT_NOTE,\n welcomeMessage: \"Hi, how can I help you?\",\n disclaimer: \"AI can make mistakes.\",\n },\n de: {\n agentName: \"Assistent\",\n assistantNote: \"Wie kann ich helfen?\",\n welcomeMessage: \"Hallo, wie kann ich Ihnen helfen?\",\n disclaimer: \"KI kann Fehler machen.\",\n },\n es: {\n agentName: \"Asistente\",\n assistantNote: \"Como puedo ayudarte?\",\n welcomeMessage: \"Hola, como puedo ayudarte?\",\n disclaimer: \"La IA puede cometer errores.\",\n },\n fr: {\n agentName: \"Assistant\",\n assistantNote: \"Comment puis-je vous aider ?\",\n welcomeMessage: \"Bonjour, comment puis-je vous aider ?\",\n disclaimer: \"L'IA peut faire des erreurs.\",\n },\n it: {\n agentName: \"Assistente\",\n assistantNote: \"Come posso aiutarti?\",\n welcomeMessage: \"Ciao, come posso aiutarti?\",\n disclaimer: \"L'IA puo commettere errori.\",\n },\n nl: {\n agentName: \"Assistent\",\n assistantNote: \"Hoe kan ik je helpen?\",\n welcomeMessage: \"Hallo, hoe kan ik je helpen?\",\n disclaimer: \"AI kan fouten maken.\",\n },\n pt: {\n agentName: \"Assistente\",\n assistantNote: \"Como posso ajudar?\",\n welcomeMessage: \"Ola, como posso ajudar?\",\n disclaimer: \"A IA pode cometer erros.\",\n },\n pl: {\n agentName: \"Asystent\",\n assistantNote: \"Jak moge pomoc?\",\n welcomeMessage: \"Czesc, jak moge pomoc?\",\n disclaimer: \"AI moze popelniac bledy.\",\n },\n tr: {\n agentName: \"Asistan\",\n assistantNote: \"Nasil yardimci olabilirim?\",\n welcomeMessage: \"Merhaba, nasil yardimci olabilirim?\",\n disclaimer: \"Yapay zeka hata yapabilir.\",\n },\n sv: {\n agentName: \"Assistent\",\n assistantNote: \"Hur kan jag hjalpa dig?\",\n welcomeMessage: \"Hej, hur kan jag hjalpa dig?\",\n disclaimer: \"AI kan gora misstag.\",\n },\n da: {\n agentName: \"Assistent\",\n assistantNote: \"Hvordan kan jeg hjaelpe dig?\",\n welcomeMessage: \"Hej, hvordan kan jeg hjaelpe dig?\",\n disclaimer: \"AI kan lave fejl.\",\n },\n no: {\n agentName: \"Assistent\",\n assistantNote: \"Hvordan kan jeg hjelpe deg?\",\n welcomeMessage: \"Hei, hvordan kan jeg hjelpe deg?\",\n disclaimer: \"AI kan gjøre feil.\",\n },\n fi: {\n agentName: \"Avustaja\",\n assistantNote: \"Miten voin auttaa?\",\n welcomeMessage: \"Hei, miten voin auttaa?\",\n disclaimer: \"Tekoaly voi tehda virheita.\",\n },\n};\n\nfunction normalizeLocale(input: string | undefined): string {\n if (!input) {\n return DEFAULT_LOCALE;\n }\n\n return input.trim().toLowerCase().split(\"-\")[0] || DEFAULT_LOCALE;\n}\n\nfunction getBrowserLocale() {\n if (typeof navigator === \"undefined\") {\n return DEFAULT_LOCALE;\n }\n\n return navigator.language || DEFAULT_LOCALE;\n}\n\nfunction getLocaleCopy(locale: string) {\n return LOCALE_COPY[locale] ?? LOCALE_COPY[DEFAULT_LOCALE];\n}\n\nfunction readHistory(storage: Storage | undefined, sessionId: string): ChatMessage[] {\n if (!storage) {\n return [];\n }\n\n const raw = storage.getItem(historyKey(sessionId));\n if (!raw) {\n return [];\n }\n\n try {\n const parsed = JSON.parse(raw) as ChatMessage[];\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\nexport function ChatbotProvider({\n children,\n webhookUrl,\n locale,\n agentName,\n assistantNote,\n enableUploads = false,\n streamingMode = \"auto\",\n headers,\n theme,\n icons,\n adapter,\n events,\n initialOpen = false,\n position = \"bottom-right\",\n classNames,\n}: ChatbotProviderProps) {\n const [isHydrated, setIsHydrated] = useState(false);\n const [sessionId, setSessionId] = useState(\"cb:pending\");\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isOpen, setIsOpen] = useState(initialOpen);\n const [isAwaiting, setIsAwaiting] = useState(false);\n const [pageConfigs, setPageConfigs] = useState<Array<{ id: string; config: PageConfigOverrides }>>([]);\n const messagesRef = useRef<ChatMessage[]>([]);\n\n useEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n\n const activePageConfig = pageConfigs.length > 0 ? pageConfigs[pageConfigs.length - 1].config : undefined;\n const mergedTheme = useMemo(\n () => ({\n ...(theme ?? {}),\n ...(activePageConfig?.theme ?? {}),\n }),\n [activePageConfig?.theme, theme],\n );\n\n const resolvedTheme = useMemo(() => {\n if (!isHydrated) {\n return { ...DEFAULT_THEME, ...(mergedTheme ?? {}) };\n }\n return resolveThemeTokens(mergedTheme);\n }, [isHydrated, mergedTheme]);\n const themeVars = useMemo(() => toThemeCssVars(resolvedTheme), [resolvedTheme]);\n const mergedIcons = useMemo(() => {\n const merged = { ...DEFAULT_ICONS, ...(icons ?? {}) };\n merged.launcherClosed = icons?.launcherClosed ?? icons?.launcher ?? DEFAULT_ICONS.launcherClosed;\n merged.launcherOpen = icons?.launcherOpen ?? DEFAULT_ICONS.launcherOpen;\n return merged;\n }, [icons]);\n\n const resolvedLocale = useMemo(() => normalizeLocale(locale ?? getBrowserLocale()), [locale]);\n const localeCopy = useMemo(() => getLocaleCopy(resolvedLocale), [resolvedLocale]);\n const welcomeAssistantMessage = localeCopy.welcomeMessage;\n const disclaimerText = localeCopy.disclaimer;\n const resolvedAgentName = activePageConfig?.agentName ?? agentName ?? localeCopy.agentName;\n const resolvedAssistantNote = activePageConfig?.assistantNote ?? assistantNote ?? localeCopy.assistantNote;\n const uploadEnabled = activePageConfig?.enableUploads ?? enableUploads;\n const widgetEnabled = activePageConfig?.enabled ?? true;\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const storage = window.sessionStorage;\n const nextSessionId = getOrCreateSessionId(storage);\n setSessionId(nextSessionId);\n setMessages(readHistory(storage, nextSessionId));\n setIsHydrated(true);\n }, []);\n\n useEffect(() => {\n if (!isHydrated || typeof window === \"undefined\") {\n return;\n }\n\n const storage = window.sessionStorage;\n storage.setItem(historyKey(sessionId), JSON.stringify(messages));\n }, [isHydrated, messages, sessionId]);\n\n useEffect(() => {\n if (!isHydrated || !isOpen || !widgetEnabled || typeof window === \"undefined\") {\n return;\n }\n\n let timeoutId: number | undefined;\n\n setMessages((current) => {\n if (current.length > 0) {\n return current;\n }\n\n const welcomeId = createId(\"msg\");\n timeoutId = window.setTimeout(() => {\n setMessages((next) =>\n next.map((message): ChatMessage =>\n message.id === welcomeId\n ? {\n ...message,\n content: welcomeAssistantMessage,\n status: \"complete\",\n }\n : message,\n ),\n );\n }, WELCOME_DELAY_MS);\n\n return [\n ...current,\n {\n id: welcomeId,\n role: \"assistant\",\n content: \"\",\n createdAt: new Date().toISOString(),\n status: \"streaming\",\n },\n ];\n });\n\n return () => {\n if (timeoutId) {\n window.clearTimeout(timeoutId);\n }\n };\n }, [isHydrated, isOpen, welcomeAssistantMessage, widgetEnabled]);\n\n const open = useCallback(() => {\n setIsOpen(true);\n events?.onOpen?.();\n }, [events]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n events?.onClose?.();\n }, [events]);\n\n const toggle = useCallback(() => {\n setIsOpen((current) => {\n const next = !current;\n if (next) {\n events?.onOpen?.();\n } else {\n events?.onClose?.();\n }\n return next;\n });\n }, [events]);\n\n const clearConversation = useCallback(() => {\n setMessages([]);\n if (typeof window !== \"undefined\") {\n const storage = window.sessionStorage;\n storage.removeItem(historyKey(sessionId));\n }\n }, [sessionId]);\n\n const resetSession = useCallback(() => {\n const storage = typeof window !== \"undefined\" ? window.sessionStorage : undefined;\n const next = resetSessionId(storage);\n setSessionId(next);\n setMessages([]);\n }, []);\n\n const registerPageConfig = useCallback((id: string, config: PageConfigOverrides) => {\n setPageConfigs((current) => {\n const filtered = current.filter((entry) => entry.id !== id);\n return [...filtered, { id, config }];\n });\n }, []);\n\n const unregisterPageConfig = useCallback((id: string) => {\n setPageConfigs((current) => current.filter((entry) => entry.id !== id));\n }, []);\n\n const sendMessage = useCallback<ChatbotContextValue[\"sendMessage\"]>(\n async ({ text, files = [] }) => {\n const trimmed = text.trim();\n if (!trimmed && files.length === 0) {\n return;\n }\n\n const now = new Date().toISOString();\n const attachmentDtos = files.map((file) => ({\n id: createId(\"att\"),\n name: file.name,\n size: file.size,\n type: file.type,\n file,\n }));\n if (attachmentDtos.length > 0) {\n events?.onAttachmentAdded?.(attachmentDtos);\n }\n\n const userMessage: ChatMessage = {\n id: createId(\"msg\"),\n role: \"user\",\n content: trimmed,\n createdAt: now,\n status: \"complete\",\n attachments: attachmentDtos,\n };\n const ensureWelcomeMessage = (input: ChatMessage[]): ChatMessage[] => {\n if (input.some((message) => message.role === \"assistant\" && message.content === welcomeAssistantMessage)) {\n return input;\n }\n\n const firstStreamingAssistantIndex = input.findIndex(\n (message) => message.role === \"assistant\" && message.status === \"streaming\" && !message.content,\n );\n\n if (firstStreamingAssistantIndex >= 0) {\n return input.map((message, index): ChatMessage =>\n index === firstStreamingAssistantIndex\n ? {\n ...message,\n content: welcomeAssistantMessage,\n status: \"complete\",\n }\n : message,\n );\n }\n\n if (input.some((message) => message.role === \"assistant\")) {\n return input;\n }\n\n const welcomeMessage: ChatMessage = {\n id: createId(\"msg\"),\n role: \"assistant\",\n content: welcomeAssistantMessage,\n createdAt: now,\n status: \"complete\",\n };\n return [...input, welcomeMessage];\n };\n\n const normalizedHistory = ensureWelcomeMessage(messagesRef.current);\n const requestHistory = [...normalizedHistory, userMessage].map((message) => ({\n id: message.id,\n role: message.role,\n content: message.content,\n createdAt: message.createdAt,\n }));\n\n setMessages((current) => [...ensureWelcomeMessage(current), userMessage]);\n events?.onMessageSent?.(userMessage);\n\n const assistantId = createId(\"msg\");\n setMessages((current) => [\n ...current,\n {\n id: assistantId,\n role: \"assistant\",\n content: \"\",\n createdAt: new Date().toISOString(),\n status: \"streaming\",\n },\n ]);\n\n setIsAwaiting(true);\n const resolvedAdapter = withDefaultAdapter(adapter);\n\n try {\n const metadata = {\n sessionId,\n pageUrl: typeof window !== \"undefined\" ? window.location.href : \"\",\n timestamp: new Date().toISOString(),\n agentName: resolvedAgentName,\n locale: resolvedLocale,\n history: requestHistory,\n };\n\n const requestInit = resolvedAdapter.buildRequest({\n webhookUrl,\n message: trimmed,\n sessionId,\n agentName: resolvedAgentName,\n files: uploadEnabled ? files : [],\n metadata,\n headers,\n });\n\n const url = requestInit.url ?? webhookUrl;\n const response = await fetch(url, requestInit);\n\n let streamedContent = \"\";\n const responseText = await readAssistantResponse({\n response,\n adapter: resolvedAdapter,\n streamingMode,\n onDelta: (delta) => {\n streamedContent += delta;\n setMessages((current) =>\n current.map((message): ChatMessage =>\n message.id === assistantId\n ? {\n ...message,\n content: `${message.content}${delta}`,\n status: \"streaming\",\n }\n : message,\n ),\n );\n },\n onChunk: (chunk) => {\n events?.onChunkReceived?.(chunk);\n },\n onRecoverableError: (error) => {\n events?.onError?.(error);\n },\n });\n\n setMessages((current) => {\n const next: ChatMessage[] = current.map((message): ChatMessage => {\n if (message.id !== assistantId) {\n return message;\n }\n\n const hasStreamed = streamedContent.length > 0;\n const content = hasStreamed ? message.content : responseText;\n return {\n ...message,\n content,\n status: \"complete\",\n };\n });\n\n const completeMessage = next.find((message) => message.id === assistantId);\n if (completeMessage) {\n events?.onResponseComplete?.(completeMessage);\n }\n\n return next;\n });\n } catch (error) {\n const typedError = error instanceof Error ? error : new Error(String(error));\n events?.onError?.(typedError);\n\n setMessages((current) =>\n current.map((message): ChatMessage =>\n message.id === assistantId\n ? {\n ...message,\n content: message.content || \"Sorry, I ran into an issue while generating a response.\",\n status: \"error\",\n }\n : message,\n ),\n );\n } finally {\n setIsAwaiting(false);\n }\n },\n [\n adapter,\n events,\n headers,\n resolvedAgentName,\n resolvedLocale,\n sessionId,\n streamingMode,\n uploadEnabled,\n welcomeAssistantMessage,\n webhookUrl,\n ],\n );\n\n const value = useMemo<ChatbotContextValue>(\n () => ({\n isOpen,\n isAwaiting,\n messages,\n sessionId,\n uploadEnabled,\n agentName: resolvedAgentName,\n assistantNote: resolvedAssistantNote,\n disclaimerText,\n position,\n themeVars,\n icons: mergedIcons,\n classNames: classNames ?? {},\n open,\n close,\n toggle,\n sendMessage,\n clearConversation,\n registerPageConfig,\n unregisterPageConfig,\n widgetEnabled,\n resetSession,\n }),\n [\n classNames,\n clearConversation,\n close,\n disclaimerText,\n isAwaiting,\n isOpen,\n mergedIcons,\n messages,\n open,\n position,\n registerPageConfig,\n resolvedAgentName,\n resolvedAssistantNote,\n sendMessage,\n sessionId,\n themeVars,\n toggle,\n unregisterPageConfig,\n uploadEnabled,\n widgetEnabled,\n resetSession,\n ],\n );\n\n return <ChatbotContext.Provider value={value}>{children}</ChatbotContext.Provider>;\n}\n\nexport function useChatbotContext() {\n const context = useContext(ChatbotContext);\n if (!context) {\n throw new Error(\"useChatbotContext must be used within ChatbotProvider\");\n }\n return context;\n}\n","import {\n Bot,\n ChevronDown,\n Download,\n Ellipsis,\n Maximize2,\n MessageSquare,\n Paperclip,\n SendHorizontal,\n X,\n} from \"lucide-react\";\nimport type { ChatbotIcons, ChatbotThemeTokens } from \"../types\";\n\nexport const DEFAULT_THEME: ChatbotThemeTokens = {\n primary: \"#ffffff\",\n primaryForeground: \"#111111\",\n background: \"#0b0b0b\",\n surface: \"#111111\",\n surfaceForeground: \"#f5f5f5\",\n muted: \"#262626\",\n mutedForeground: \"#a3a3a3\",\n border: \"#2f2f2f\",\n ring: \"#737373\",\n userBubble: \"#ffffff\",\n userText: \"#111111\",\n assistantBubble: \"#2a2a2a\",\n assistantText: \"#f5f5f5\",\n radius: \"14px\",\n fontFamily: \"Inter, var(--font-sans), ui-sans-serif, system-ui, -apple-system, Segoe UI, sans-serif\",\n shadowBubble: \"0 18px 40px -16px rgba(0, 0, 0, 0.7)\",\n shadowPanel: \"0 34px 80px -36px rgba(0, 0, 0, 0.85)\",\n};\n\nexport const DEFAULT_ICONS: ChatbotIcons = {\n launcher: MessageSquare,\n launcherClosed: MessageSquare,\n launcherOpen: ChevronDown,\n close: X,\n send: SendHorizontal,\n attach: Paperclip,\n bot: Bot,\n menu: Ellipsis,\n expand: Maximize2,\n download: Download,\n};\n\nexport const DEFAULT_AGENT_NAME = \"Assistant\";\nexport const DEFAULT_ASSISTANT_NOTE = \"Here to help\";\n","import type {\n ChatbotAdapter,\n ChatbotAdapterRequestInput,\n NormalizedAssistantChunk,\n} from \"../types\";\n\nfunction extractFromRecord(record: Record<string, unknown>): string | undefined {\n const keys = [\"message\", \"text\", \"output\", \"response\", \"answer\", \"content\"];\n for (const key of keys) {\n const value = record[key];\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value;\n }\n }\n return undefined;\n}\n\nexport function defaultBuildRequest(input: ChatbotAdapterRequestInput): RequestInit & { url?: string } {\n const { files, metadata, message, headers, sessionId } = input;\n\n if (files.length > 0) {\n const formData = new FormData();\n formData.set(\"message\", message);\n formData.set(\"sessionId\", sessionId);\n formData.set(\"metadata\", JSON.stringify(metadata));\n\n files.forEach((file) => {\n formData.append(\"files[]\", file);\n });\n\n return {\n method: \"POST\",\n headers,\n body: formData,\n };\n }\n\n return {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify({\n message,\n sessionId,\n metadata,\n }),\n };\n}\n\nexport function defaultParseJsonResponse(raw: unknown): NormalizedAssistantChunk {\n if (typeof raw === \"string\") {\n return { message: raw };\n }\n\n if (Array.isArray(raw)) {\n const merged = raw\n .map((item) => {\n if (typeof item === \"string\") {\n return item;\n }\n\n if (item && typeof item === \"object\") {\n return extractFromRecord(item as Record<string, unknown>);\n }\n\n return undefined;\n })\n .filter(Boolean)\n .join(\"\\n\");\n\n return { message: merged };\n }\n\n if (raw && typeof raw === \"object\") {\n const record = raw as Record<string, unknown>;\n\n if (record.delta && typeof record.delta === \"string\") {\n return {\n delta: record.delta,\n done: Boolean(record.done),\n };\n }\n\n const text = extractFromRecord(record);\n if (text) {\n return { message: text, done: true };\n }\n\n if (record.data && typeof record.data === \"object\") {\n const nested = extractFromRecord(record.data as Record<string, unknown>);\n if (nested) {\n return { message: nested, done: true };\n }\n }\n }\n\n return { message: \"\", done: true };\n}\n\nexport function defaultParseStreamChunk(chunk: string): NormalizedAssistantChunk {\n const trimmed = chunk.trim();\n\n if (!trimmed) {\n return {};\n }\n\n if (trimmed === \"[DONE]\") {\n return { done: true };\n }\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return defaultParseJsonResponse(parsed);\n } catch {\n return { delta: trimmed };\n }\n}\n\nexport function withDefaultAdapter(adapter?: ChatbotAdapter): Required<ChatbotAdapter> {\n return {\n buildRequest: adapter?.buildRequest ?? defaultBuildRequest,\n parseJsonResponse: adapter?.parseJsonResponse ?? defaultParseJsonResponse,\n parseStreamChunk: adapter?.parseStreamChunk ?? defaultParseStreamChunk,\n };\n}\n","import type { ChatbotAdapter } from \"../types\";\n\ninterface ResponseInput {\n response: Response;\n adapter: Required<ChatbotAdapter>;\n streamingMode: \"auto\" | \"on\" | \"off\";\n onDelta: (chunk: string) => void;\n onChunk: (chunk: string) => void;\n onRecoverableError: (error: Error) => void;\n}\n\nfunction looksLikeStream(contentType: string | null) {\n if (!contentType) {\n return false;\n }\n\n const normalized = contentType.toLowerCase();\n return (\n normalized.includes(\"text/event-stream\") ||\n normalized.includes(\"application/x-ndjson\") ||\n normalized.includes(\"application/stream\")\n );\n}\n\nfunction parseAndAppend(\n rawChunk: string,\n adapter: Required<ChatbotAdapter>,\n onChunk: (chunk: string) => void,\n): { text: string; done: boolean } {\n const parsed = adapter.parseStreamChunk(rawChunk);\n onChunk(rawChunk);\n\n if (parsed.done && parsed.message) {\n return { text: parsed.message, done: true };\n }\n\n if (parsed.delta) {\n return { text: parsed.delta, done: Boolean(parsed.done) };\n }\n\n if (parsed.message) {\n return { text: parsed.message, done: Boolean(parsed.done) };\n }\n\n return { text: \"\", done: Boolean(parsed.done) };\n}\n\nasync function consumeEventStream(\n response: Response,\n adapter: Required<ChatbotAdapter>,\n onDelta: (chunk: string) => void,\n onChunk: (chunk: string) => void,\n): Promise<string> {\n const reader = response.body?.getReader();\n if (!reader) {\n return \"\";\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let fullText = \"\";\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n if (result.done) {\n break;\n }\n\n buffer += decoder.decode(result.value, { stream: true });\n\n while (buffer.includes(\"\\n\\n\")) {\n const index = buffer.indexOf(\"\\n\\n\");\n const block = buffer.slice(0, index);\n buffer = buffer.slice(index + 2);\n\n const lines = block.split(\"\\n\").filter((line) => line.startsWith(\"data:\"));\n for (const line of lines) {\n const data = line.slice(5).trim();\n const parsed = parseAndAppend(data, adapter, onChunk);\n if (parsed.text) {\n fullText += parsed.text;\n onDelta(parsed.text);\n }\n if (parsed.done) {\n done = true;\n break;\n }\n }\n }\n }\n\n if (buffer.trim()) {\n const fallback = parseAndAppend(buffer.trim(), adapter, onChunk);\n if (fallback.text) {\n fullText += fallback.text;\n onDelta(fallback.text);\n }\n }\n\n return fullText;\n}\n\nasync function consumeLineStream(\n response: Response,\n adapter: Required<ChatbotAdapter>,\n onDelta: (chunk: string) => void,\n onChunk: (chunk: string) => void,\n): Promise<string> {\n const reader = response.body?.getReader();\n if (!reader) {\n return \"\";\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let fullText = \"\";\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n if (result.done) {\n break;\n }\n\n buffer += decoder.decode(result.value, { stream: true });\n\n while (buffer.includes(\"\\n\")) {\n const index = buffer.indexOf(\"\\n\");\n const line = buffer.slice(0, index).trim();\n buffer = buffer.slice(index + 1);\n\n if (!line) {\n continue;\n }\n\n const parsed = parseAndAppend(line, adapter, onChunk);\n if (parsed.text) {\n fullText += parsed.text;\n onDelta(parsed.text);\n }\n if (parsed.done) {\n done = true;\n break;\n }\n }\n }\n\n if (buffer.trim()) {\n const parsed = parseAndAppend(buffer.trim(), adapter, onChunk);\n if (parsed.text) {\n fullText += parsed.text;\n onDelta(parsed.text);\n }\n }\n\n return fullText;\n}\n\nasync function parseNonStreaming(response: Response, adapter: Required<ChatbotAdapter>) {\n const contentType = response.headers.get(\"content-type\") || \"\";\n\n if (contentType.includes(\"application/json\")) {\n const payload = (await response.json()) as unknown;\n const parsed = adapter.parseJsonResponse(payload);\n return parsed.message ?? parsed.delta ?? \"\";\n }\n\n const rawText = await response.text();\n try {\n const parsedPayload = JSON.parse(rawText) as unknown;\n const parsed = adapter.parseJsonResponse(parsedPayload);\n return parsed.message ?? parsed.delta ?? rawText;\n } catch {\n const parsed = adapter.parseJsonResponse(rawText);\n return parsed.message ?? rawText;\n }\n}\n\nexport async function readAssistantResponse({\n response,\n adapter,\n streamingMode,\n onDelta,\n onChunk,\n onRecoverableError,\n}: ResponseInput): Promise<string> {\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`Webhook request failed (${response.status}): ${body}`);\n }\n\n const contentType = response.headers.get(\"content-type\");\n const streamEligible = streamingMode !== \"off\" && Boolean(response.body);\n const shouldStream = streamEligible && (streamingMode === \"on\" || looksLikeStream(contentType));\n\n if (!shouldStream) {\n return parseNonStreaming(response, adapter);\n }\n\n try {\n if ((contentType || \"\").toLowerCase().includes(\"text/event-stream\")) {\n return await consumeEventStream(response, adapter, onDelta, onChunk);\n }\n\n return await consumeLineStream(response, adapter, onDelta, onChunk);\n } catch (error) {\n onRecoverableError(error as Error);\n return \"\";\n }\n}","export function createId(prefix = \"cb\") {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return `${prefix}-${crypto.randomUUID()}`;\n }\n\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}","const SESSION_KEY = \"cb:session-id\";\n\nfunction createSessionId() {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n\n return `cb-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function getOrCreateSessionId(storage: Storage | undefined): string {\n if (!storage) {\n return createSessionId();\n }\n\n const existing = storage.getItem(SESSION_KEY);\n if (existing) {\n return existing;\n }\n\n const created = createSessionId();\n storage.setItem(SESSION_KEY, created);\n return created;\n}\n\nexport function resetSessionId(storage: Storage | undefined): string {\n const next = createSessionId();\n if (storage) {\n storage.setItem(SESSION_KEY, next);\n }\n return next;\n}\n\nexport function historyKey(sessionId: string) {\n return `cb:history:${sessionId}`;\n}","import { DEFAULT_THEME } from \"./defaults\";\nimport type { ChatbotThemeTokens } from \"../types\";\n\nexport function resolveThemeTokens(explicit?: Partial<ChatbotThemeTokens>): ChatbotThemeTokens {\n return {\n ...DEFAULT_THEME,\n ...(explicit ?? {}),\n };\n}\n\nexport function toThemeCssVars(tokens: ChatbotThemeTokens): Record<string, string> {\n return {\n \"--cb-primary\": tokens.primary,\n \"--cb-primary-foreground\": tokens.primaryForeground,\n \"--cb-background\": tokens.background,\n \"--cb-surface\": tokens.surface,\n \"--cb-surface-foreground\": tokens.surfaceForeground,\n \"--cb-muted\": tokens.muted,\n \"--cb-muted-foreground\": tokens.mutedForeground,\n \"--cb-border\": tokens.border,\n \"--cb-ring\": tokens.ring,\n \"--cb-user-bubble\": tokens.userBubble,\n \"--cb-user-text\": tokens.userText,\n \"--cb-assistant-bubble\": tokens.assistantBubble,\n \"--cb-assistant-text\": tokens.assistantText,\n \"--cb-radius\": tokens.radius,\n \"--cb-font-family\": tokens.fontFamily,\n \"--cb-shadow-bubble\": tokens.shadowBubble,\n \"--cb-shadow-panel\": tokens.shadowPanel,\n };\n}\n","import clsx from \"clsx\";\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type CSSProperties,\n type FormEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n} from \"react\";\nimport type { ChatMessage } from \"../types\";\nimport { useChatbotContext } from \"../context/chatbot-context\";\nimport { AwaitingDots } from \"./awaiting-dots\";\nimport { MessageMarkdown } from \"./message-markdown\";\n\nconst PANEL_INSET_REM = 1.5;\nconst EXPANDED_MAX_WIDTH_PX = 630;\nconst MOBILE_BREAKPOINT_PX = 768;\nconst ROOT_BOTTOM_OFFSET_REM = 1.5; // cb-bottom-6\nconst PANEL_TO_BUBBLE_GAP_REM = 0.75; // cb-gap-3\nconst BUBBLE_SIZE_REM = 3.5; // cb-h-14\nconst EXPANDED_BOTTOM_OFFSET_REM = ROOT_BOTTOM_OFFSET_REM + PANEL_TO_BUBBLE_GAP_REM + BUBBLE_SIZE_REM;\nconst EXPANDED_TOTAL_VERTICAL_INSET_REM = PANEL_INSET_REM + EXPANDED_BOTTOM_OFFSET_REM;\n\nfunction formatFileSize(size: number) {\n if (size < 1024) {\n return `${size} B`;\n }\n if (size < 1024 * 1024) {\n return `${(size / 1024).toFixed(1)} KB`;\n }\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction formatGmtOffset(date: Date) {\n const total = -date.getTimezoneOffset();\n const sign = total >= 0 ? \"+\" : \"-\";\n const abs = Math.abs(total);\n const hh = String(Math.floor(abs / 60)).padStart(2, \"0\");\n const mm = String(abs % 60).padStart(2, \"0\");\n return `GMT${sign}${hh}${mm}`;\n}\n\nfunction readTimeZoneName(date: Date, mode: \"long\" | \"short\") {\n const parts = new Intl.DateTimeFormat(undefined, { timeZoneName: mode }).formatToParts(date);\n return parts.find((part) => part.type === \"timeZoneName\")?.value ?? \"\";\n}\n\nfunction formatTranscriptDateTime(date: Date) {\n const datePart = new Intl.DateTimeFormat(undefined, {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n }).format(date);\n const timePart = new Intl.DateTimeFormat(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: true,\n }).format(date);\n const zoneLong = readTimeZoneName(date, \"long\");\n const zoneShort = readTimeZoneName(date, \"short\");\n const gmtOffset = formatGmtOffset(date);\n return `${datePart} at ${timePart} ${zoneLong} time ${zoneShort} (${gmtOffset})`.replace(/\\s+/g, \" \").trim();\n}\n\nfunction formatTranscriptMessageTime(value: string) {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n\n return new Intl.DateTimeFormat(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: true,\n }).format(date);\n}\n\nfunction toTranscript(messages: ChatMessage[], agentName: string) {\n const exportedAt = new Date();\n const firstDate =\n messages.length > 0 ? new Date(messages[0].createdAt) : exportedAt;\n const startedAt = Number.isNaN(firstDate.getTime()) ? exportedAt : firstDate;\n\n const lines: string[] = [\n `Conversation with ${agentName}`,\n `Started on ${formatTranscriptDateTime(startedAt)}`,\n \"\",\n \"---\",\n \"\",\n ];\n\n messages.forEach((message) => {\n const role = message.role === \"user\" ? \"Visitor\" : message.role === \"assistant\" ? agentName : \"System\";\n const content = message.content.trim();\n if (!content) {\n return;\n }\n\n lines.push(`${formatTranscriptMessageTime(message.createdAt)} | ${role}: ${content}`);\n lines.push(\"\");\n });\n\n lines.push(\"---\");\n lines.push(`Exported from ${agentName} on ${formatTranscriptDateTime(exportedAt)}`);\n\n return lines.join(\"\\n\");\n}\n\nfunction toTranscriptFilename(date: Date) {\n const yyyy = date.getFullYear();\n const mm = String(date.getMonth() + 1).padStart(2, \"0\");\n const dd = String(date.getDate()).padStart(2, \"0\");\n const hh = String(date.getHours()).padStart(2, \"0\");\n const min = String(date.getMinutes()).padStart(2, \"0\");\n const ss = String(date.getSeconds()).padStart(2, \"0\");\n return `chat-transcript-${yyyy}${mm}${dd}-${hh}${min}${ss}.txt`;\n}\n\nexport function ChatbotWidget() {\n const {\n isOpen,\n isAwaiting,\n messages,\n uploadEnabled,\n position,\n agentName,\n assistantNote,\n disclaimerText,\n themeVars,\n icons,\n classNames,\n close,\n open,\n sendMessage,\n widgetEnabled,\n } = useChatbotContext();\n\n const [inputValue, setInputValue] = useState(\"\");\n const [queuedFiles, setQueuedFiles] = useState<File[]>([]);\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [isExpanded, setIsExpanded] = useState(false);\n const [isMobileViewport, setIsMobileViewport] = useState(false);\n\n const panelRef = useRef<HTMLDivElement>(null);\n const messagesScrollRef = useRef<HTMLElement>(null);\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n const LauncherClosedIcon = icons.launcherClosed;\n const LauncherOpenIcon = icons.launcherOpen;\n const BotIcon = icons.bot;\n const MenuIcon = icons.menu;\n const CloseIcon = icons.close;\n const SendIcon = icons.send;\n const AttachIcon = icons.attach;\n const ExpandIcon = icons.expand;\n const DownloadIcon = icons.download;\n\n const alignment = position === \"bottom-left\" ? \"cb-left-6\" : \"cb-right-6\";\n const stackAlignment = position === \"bottom-left\" ? \"cb-items-start\" : \"cb-items-end\";\n const panelOrigin = position === \"bottom-left\" ? \"cb-origin-bottom-left\" : \"cb-origin-bottom-right\";\n const panelLayoutMode = isMobileViewport ? \"mobile\" : isExpanded ? \"desktop-expanded\" : \"desktop-collapsed\";\n const showExpandAction = !isMobileViewport;\n const showDownloadAction = messages.length > 0;\n const hasMenuActions = showExpandAction || showDownloadAction;\n\n const canSend = useMemo(() => {\n return !isAwaiting && (inputValue.trim().length > 0 || queuedFiles.length > 0);\n }, [inputValue, isAwaiting, queuedFiles.length]);\n\n const resizeComposer = () => {\n const textarea = inputRef.current;\n if (!textarea) {\n return;\n }\n\n if (textarea.value.length === 0) {\n textarea.style.height = \"38px\";\n textarea.style.overflowY = \"hidden\";\n return;\n }\n\n const maxHeightPx = 168;\n textarea.style.height = \"auto\";\n const nextHeight = Math.min(textarea.scrollHeight, maxHeightPx);\n textarea.style.height = `${nextHeight}px`;\n textarea.style.overflowY = textarea.scrollHeight > maxHeightPx ? \"auto\" : \"hidden\";\n };\n\n const scrollMessagesToBottom = () => {\n const container = messagesScrollRef.current;\n if (!container) {\n return;\n }\n\n container.scrollTop = container.scrollHeight;\n };\n\n const panelSize = useMemo<{ className: string; style?: CSSProperties }>(() => {\n const inset = `${PANEL_INSET_REM}rem`;\n\n if (panelLayoutMode === \"mobile\") {\n return {\n className: \"cb-fixed cb-max-h-none cb-max-w-none\",\n style: {\n top: inset,\n right: inset,\n bottom: `${EXPANDED_BOTTOM_OFFSET_REM}rem`,\n left: inset,\n },\n };\n }\n\n if (panelLayoutMode === \"desktop-expanded\") {\n return {\n className: \"cb-relative cb-max-h-none cb-max-w-none\",\n style: {\n width: `min(${EXPANDED_MAX_WIDTH_PX}px, calc(100vw - ${PANEL_INSET_REM * 2}rem))`,\n height: `calc(100vh - ${EXPANDED_TOTAL_VERTICAL_INSET_REM}rem)`,\n },\n };\n }\n\n return {\n className: \"cb-relative cb-h-[min(680px,calc(100vh-7.5rem))] cb-w-[min(92vw,420px)]\",\n style: undefined,\n };\n }, [panelLayoutMode]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const mediaQuery = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT_PX}px)`);\n const syncViewportMode = () => {\n setIsMobileViewport(mediaQuery.matches);\n };\n\n syncViewportMode();\n\n if (typeof mediaQuery.addEventListener === \"function\") {\n mediaQuery.addEventListener(\"change\", syncViewportMode);\n return () => mediaQuery.removeEventListener(\"change\", syncViewportMode);\n }\n\n mediaQuery.addListener(syncViewportMode);\n return () => mediaQuery.removeListener(syncViewportMode);\n }, []);\n\n useEffect(() => {\n if (!isOpen) {\n setIsMenuOpen(false);\n return;\n }\n\n inputRef.current?.focus();\n resizeComposer();\n }, [isOpen]);\n\n useEffect(() => {\n resizeComposer();\n }, [inputValue]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const rafId = window.requestAnimationFrame(() => {\n scrollMessagesToBottom();\n });\n\n return () => window.cancelAnimationFrame(rafId);\n }, [isOpen, messages, isAwaiting]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const onPointerDown = (event: MouseEvent) => {\n const target = event.target as Node;\n if (menuRef.current && !menuRef.current.contains(target)) {\n setIsMenuOpen(false);\n }\n };\n\n window.addEventListener(\"mousedown\", onPointerDown);\n return () => window.removeEventListener(\"mousedown\", onPointerDown);\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const onKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n if (isMenuOpen) {\n setIsMenuOpen(false);\n return;\n }\n close();\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [close, isMenuOpen, isOpen]);\n\n useEffect(() => {\n setIsMenuOpen(false);\n }, [isMobileViewport]);\n\n useEffect(() => {\n if (!hasMenuActions) {\n setIsMenuOpen(false);\n }\n }, [hasMenuActions]);\n\n const trapFocus = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.key !== \"Tab\") {\n return;\n }\n\n const root = panelRef.current;\n if (!root) {\n return;\n }\n\n const focusables = root.querySelectorAll<HTMLElement>(\n \"button, [href], textarea, input, select, [tabindex]:not([tabindex='-1'])\",\n );\n\n if (focusables.length === 0) {\n return;\n }\n\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n\n if (event.shiftKey && document.activeElement === first) {\n last.focus();\n event.preventDefault();\n } else if (!event.shiftKey && document.activeElement === last) {\n first.focus();\n event.preventDefault();\n }\n };\n\n const onSubmit = async (event: FormEvent) => {\n event.preventDefault();\n if (!canSend) {\n return;\n }\n\n const submittedText = inputValue;\n setInputValue(\"\");\n scrollMessagesToBottom();\n\n await sendMessage({\n text: submittedText,\n files: uploadEnabled ? queuedFiles : [],\n });\n\n setQueuedFiles([]);\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n };\n\n const onPickFiles = (event: ChangeEvent<HTMLInputElement>) => {\n const list = event.target.files;\n if (!list || !uploadEnabled) {\n return;\n }\n\n const files = Array.from(list);\n setQueuedFiles((current) => {\n const seen = new Set(current.map((file) => `${file.name}:${file.size}:${file.lastModified}`));\n const next = [...current];\n\n files.forEach((file) => {\n const key = `${file.name}:${file.size}:${file.lastModified}`;\n if (!seen.has(key)) {\n seen.add(key);\n next.push(file);\n }\n });\n\n return next;\n });\n };\n\n const createIdFromFile = (file: File) => `${file.name}:${file.size}:${file.lastModified}`;\n\n const removeQueuedFile = (fileId: string) => {\n setQueuedFiles((current) => current.filter((file) => createIdFromFile(file) !== fileId));\n };\n\n const downloadTranscript = () => {\n if (messages.length === 0) {\n return;\n }\n\n const now = new Date();\n const fileContent = toTranscript(messages, agentName);\n const blob = new Blob([fileContent], { type: \"text/plain;charset=utf-8\" });\n const objectUrl = URL.createObjectURL(blob);\n\n const anchor = document.createElement(\"a\");\n anchor.href = objectUrl;\n anchor.download = toTranscriptFilename(now);\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n URL.revokeObjectURL(objectUrl);\n\n setIsMenuOpen(false);\n };\n\n const toggleExpanded = () => {\n if (isMobileViewport) {\n return;\n }\n\n setIsExpanded((current) => !current);\n setIsMenuOpen(false);\n };\n\n if (!widgetEnabled) {\n return null;\n }\n\n return (\n <div\n className={clsx(\n \"cb-fixed cb-bottom-6 cb-z-[2147483640] cb-text-[var(--cb-surface-foreground)]\",\n alignment,\n classNames.root,\n )}\n style={themeVars}\n data-chatbot-root\n >\n <div className={clsx(\"cb-pointer-events-none cb-relative cb-flex cb-flex-col cb-gap-3\", stackAlignment)}>\n <div\n ref={panelRef}\n className={clsx(\n \"cb-panel-transition cb-pointer-events-auto cb-flex cb-flex-col cb-overflow-hidden cb-rounded-[var(--cb-radius)] cb-border cb-border-[var(--cb-border)] cb-bg-[var(--cb-surface)] cb-shadow-[var(--cb-shadow-panel)]\",\n panelOrigin,\n panelSize.className,\n isOpen ? \"cb-panel-open\" : \"cb-panel-closed cb-pointer-events-none\",\n classNames.panel,\n )}\n style={panelSize.style}\n aria-hidden={!isOpen}\n onKeyDown={trapFocus}\n >\n <header\n className={clsx(\n \"cb-flex cb-items-center cb-justify-between cb-gap-2 cb-border-b cb-border-[var(--cb-border)] cb-bg-[var(--cb-surface)] cb-px-4 cb-py-3.5\",\n classNames.header,\n )}\n style={{\n borderBottomWidth: \"1px\",\n borderBottomStyle: \"solid\",\n borderBottomColor: \"var(--cb-border)\",\n }}\n >\n <div className={clsx(\"cb-flex cb-min-w-0 cb-items-center cb-gap-2.5\", classNames.headerMeta)}>\n <span className=\"cb-inline-flex cb-h-9 cb-w-9 cb-shrink-0 cb-items-center cb-justify-center cb-self-center cb-text-[var(--cb-surface-foreground)]\">\n <BotIcon size={34} />\n </span>\n <div className=\"cb-min-w-0 cb-space-y-0\">\n <p className=\"cb-m-0 cb-truncate cb-text-lg cb-font-semibold cb-leading-6 cb-text-[var(--cb-surface-foreground)]\">\n {agentName}\n </p>\n <p className=\"cb-m-0 cb-text-base cb-leading-5 cb-text-[var(--cb-muted-foreground)]\">{assistantNote}</p>\n </div>\n </div>\n\n <div ref={menuRef} className=\"cb-relative cb-flex cb-items-center cb-gap-1\">\n {hasMenuActions && (\n <button\n type=\"button\"\n onClick={() => setIsMenuOpen((current) => !current)}\n className={clsx(\n \"cb-flex cb-h-9 cb-w-9 cb-shrink-0 cb-items-center cb-justify-center cb-rounded-lg cb-bg-transparent cb-p-0 cb-text-[var(--cb-muted-foreground)] cb-transition hover:cb-bg-[var(--cb-muted)] hover:cb-text-white focus-visible:cb-bg-[var(--cb-muted)] focus-visible:cb-text-white\",\n isMenuOpen && \"cb-bg-[var(--cb-muted)] cb-text-white\",\n )}\n aria-label=\"More options\"\n aria-expanded={isMenuOpen}\n >\n <MenuIcon size={18} />\n </button>\n )}\n\n {isMenuOpen && hasMenuActions && (\n <div\n className={clsx(\n \"cb-absolute cb-right-0 cb-top-full cb-z-20 cb-mt-2 cb-flex cb-min-w-[220px] cb-flex-col cb-gap-1 cb-rounded-xl cb-border cb-border-[var(--cb-border)] cb-bg-[var(--cb-surface)] cb-p-1.5 cb-shadow-[var(--cb-shadow-panel)]\",\n classNames.menu,\n )}\n >\n {showExpandAction && (\n <button\n type=\"button\"\n onClick={toggleExpanded}\n className={clsx(\n \"cb-flex cb-w-full cb-items-center cb-gap-2 cb-rounded-lg cb-bg-transparent cb-px-3.5 cb-py-2.5 cb-text-left cb-text-sm cb-text-[var(--cb-muted-foreground)] cb-transition hover:cb-bg-[var(--cb-muted)] hover:cb-text-white focus-visible:cb-bg-[var(--cb-muted)] focus-visible:cb-text-white\",\n classNames.menuItem,\n )}\n >\n <ExpandIcon size={16} />\n <span>{isExpanded ? \"Restore window\" : \"Expand window\"}</span>\n </button>\n )}\n\n {showDownloadAction && (\n <button\n type=\"button\"\n onClick={downloadTranscript}\n className={clsx(\n \"cb-flex cb-w-full cb-items-center cb-gap-2 cb-rounded-lg cb-bg-transparent cb-px-3.5 cb-py-2.5 cb-text-left cb-text-sm cb-text-[var(--cb-muted-foreground)] cb-transition hover:cb-bg-[var(--cb-muted)] hover:cb-text-white focus-visible:cb-bg-[var(--cb-muted)] focus-visible:cb-text-white\",\n classNames.menuItem,\n )}\n >\n <DownloadIcon size={16} />\n <span>Download transcript</span>\n </button>\n )}\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={close}\n className=\"cb-flex cb-h-9 cb-w-9 cb-shrink-0 cb-items-center cb-justify-center cb-rounded-lg cb-bg-transparent cb-p-0 cb-text-[var(--cb-muted-foreground)] cb-transition hover:cb-bg-[var(--cb-muted)] hover:cb-text-white focus-visible:cb-bg-[var(--cb-muted)] focus-visible:cb-text-white\"\n aria-label=\"Close chatbot\"\n >\n <CloseIcon size={18} />\n </button>\n </div>\n </header>\n\n <section\n ref={messagesScrollRef}\n className={clsx(\n \"cb-chat-scroll cb-flex-1 cb-overflow-y-auto cb-scroll-smooth cb-bg-[var(--cb-background)] cb-px-4 cb-pt-4 cb-pb-36\",\n classNames.body,\n )}\n >\n <div className=\"cb-space-y-3.5\">\n {messages.length === 0 && (\n <div className=\"cb-rounded-xl cb-bg-[var(--cb-muted)] cb-p-3 cb-text-sm cb-text-[var(--cb-muted-foreground)]\">\n Ask anything about this company and the assistant will answer using your RAG knowledge base.\n </div>\n )}\n\n {messages.map((message) => {\n const isUser = message.role === \"user\";\n\n return (\n <article\n key={message.id}\n className={clsx(\n \"cb-flex\",\n isUser ? \"cb-justify-end cb-animate-cb-slide-fade-in-right\" : \"cb-justify-start cb-animate-cb-slide-fade-in-left\",\n )}\n >\n <div\n className={clsx(\n \"cb-max-w-[85%] cb-rounded-2xl cb-px-4 cb-py-2\",\n isUser\n ? \"cb-rounded-br-md cb-bg-[var(--cb-user-bubble)] cb-text-[var(--cb-user-text)]\"\n : \"cb-rounded-bl-md cb-bg-[var(--cb-assistant-bubble)] cb-text-[var(--cb-assistant-text)]\",\n )}\n >\n {message.role === \"assistant\" && message.status === \"streaming\" && !message.content ? (\n <AwaitingDots />\n ) : message.role === \"assistant\" ? (\n <MessageMarkdown content={message.content} />\n ) : (\n <p className=\"cb-message-text cb-m-0 cb-whitespace-pre-wrap cb-text-base cb-leading-6\">\n {message.content}\n </p>\n )}\n\n {message.attachments && message.attachments.length > 0 && (\n <div className=\"cb-mt-2 cb-flex cb-flex-wrap cb-gap-2\">\n {message.attachments.map((attachment) => (\n <span\n key={attachment.id}\n className=\"cb-inline-flex cb-items-center cb-gap-2 cb-rounded-full cb-bg-black/10 cb-px-2 cb-py-1 cb-text-xs\"\n >\n <span>{attachment.name}</span>\n <span className=\"cb-opacity-70\">{formatFileSize(attachment.size)}</span>\n </span>\n ))}\n </div>\n )}\n </div>\n </article>\n );\n })}\n\n <div />\n </div>\n </section>\n\n <footer\n className={clsx(\n \"cb-absolute cb-bottom-4 cb-left-4 cb-right-4 cb-z-10 cb-bg-transparent cb-p-0\",\n classNames.footer,\n )}\n >\n {uploadEnabled && queuedFiles.length > 0 && (\n <div className=\"cb-mb-2 cb-flex cb-flex-wrap cb-gap-2\">\n {queuedFiles.map((file) => {\n const fileId = createIdFromFile(file);\n return (\n <button\n type=\"button\"\n key={fileId}\n className=\"cb-inline-flex cb-items-center cb-gap-2 cb-rounded-full cb-bg-[var(--cb-muted)] cb-px-3 cb-py-1 cb-text-xs cb-text-[var(--cb-muted-foreground)]\"\n onClick={() => removeQueuedFile(fileId)}\n aria-label={`Remove ${file.name}`}\n >\n <span className=\"cb-max-w-[140px] cb-truncate\">{file.name}</span>\n <span>x</span>\n </button>\n );\n })}\n </div>\n )}\n\n <form onSubmit={onSubmit}>\n <div\n className={clsx(\n \"cb-flex cb-items-end cb-gap-2 cb-rounded-2xl cb-bg-[var(--cb-surface)] cb-p-2 cb-shadow-[0_18px_35px_-24px_rgba(0,0,0,0.85)] cb-transition\",\n classNames.composer,\n )}\n >\n {uploadEnabled && (\n <>\n <input\n type=\"file\"\n multiple\n ref={fileInputRef}\n className=\"cb-hidden\"\n onChange={onPickFiles}\n aria-label=\"Add attachments\"\n />\n <button\n type=\"button\"\n className=\"cb-flex cb-h-10 cb-w-10 cb-shrink-0 cb-items-center cb-justify-center cb-rounded-lg cb-bg-transparent cb-p-0 cb-text-[var(--cb-muted-foreground)] cb-transition hover:cb-bg-[var(--cb-muted)] hover:cb-text-white focus-visible:cb-bg-[var(--cb-muted)] focus-visible:cb-text-white\"\n onClick={() => fileInputRef.current?.click()}\n aria-label=\"Attach files\"\n >\n <AttachIcon size={18} />\n </button>\n </>\n )}\n\n <div className=\"cb-flex-1\">\n <textarea\n ref={inputRef}\n value={inputValue}\n onChange={(event) => setInputValue(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n void onSubmit(event);\n }\n }}\n rows={1}\n placeholder=\"Ask a question...\"\n className={clsx(\n \"cb-composer-input cb-min-h-[38px] cb-w-full cb-resize-none cb-bg-transparent cb-px-2 cb-py-1.5 cb-text-sm cb-leading-6 cb-text-[var(--cb-surface-foreground)] cb-outline-none placeholder:cb-text-[var(--cb-muted-foreground)]\",\n classNames.input,\n )}\n />\n </div>\n\n <button\n type=\"submit\"\n disabled={!canSend}\n className={clsx(\n \"cb-flex cb-h-10 cb-w-10 cb-shrink-0 cb-items-center cb-justify-center cb-rounded-full cb-bg-white cb-p-0 cb-text-[#111111] cb-transition cb-duration-200 hover:cb-scale-105 hover:cb-brightness-95 hover:cb-text-[#111111] active:cb-scale-95 focus-visible:cb-text-[#111111] disabled:cb-cursor-not-allowed disabled:cb-bg-white/70 disabled:cb-text-[#111111] disabled:cb-opacity-100\",\n classNames.sendButton,\n )}\n aria-label=\"Send message\"\n >\n <SendIcon size={18} />\n </button>\n </div>\n <p className=\"cb-m-0 cb-mt-1 cb-px-1 cb-text-center cb-text-xs cb-leading-4 cb-text-[var(--cb-muted-foreground)]\">\n {disclaimerText}\n </p>\n </form>\n </footer>\n </div>\n\n <button\n type=\"button\"\n onClick={isOpen ? close : open}\n className={clsx(\n \"cb-pointer-events-auto cb-group cb-flex cb-h-14 cb-w-14 cb-items-center cb-justify-center cb-rounded-full cb-border cb-border-[var(--cb-border)] cb-bg-[#111111] cb-text-[#f5f5f5] cb-shadow-[var(--cb-shadow-bubble)] cb-transition cb-duration-300 hover:cb-scale-110 hover:cb-bg-[#262626] hover:cb-shadow-[0_24px_50px_-18px_rgba(0,0,0,0.9)] active:cb-scale-95\",\n classNames.bubble,\n )}\n aria-label={isOpen ? \"Close chatbot\" : \"Open chatbot\"}\n >\n <span className=\"cb-relative cb-flex cb-h-6 cb-w-6 cb-items-center cb-justify-center\">\n <LauncherClosedIcon\n size={22}\n className={clsx(\n \"cb-launcher-icon-transition cb-absolute cb-fill-current\",\n isOpen ? \"cb-rotate-90 cb-opacity-0\" : \"cb-rotate-0 cb-opacity-100\",\n )}\n />\n <LauncherOpenIcon\n size={22}\n className={clsx(\n \"cb-launcher-icon-transition cb-absolute\",\n isOpen ? \"cb-rotate-0 cb-opacity-100\" : \"-cb-rotate-90 cb-opacity-0\",\n )}\n />\n </span>\n </button>\n </div>\n </div>\n );\n}\n","export function AwaitingDots() {\n return (\n <div className=\"cb-inline-flex cb-items-center cb-gap-1 cb-px-1\" aria-label=\"Assistant is typing\">\n <span className=\"cb-h-1.5 cb-w-1.5 cb-rounded-full cb-bg-[var(--cb-muted-foreground)] cb-opacity-70 cb-animate-cb-dots [animation-delay:-0.2s]\" />\n <span className=\"cb-h-1.5 cb-w-1.5 cb-rounded-full cb-bg-[var(--cb-muted-foreground)] cb-opacity-70 cb-animate-cb-dots [animation-delay:-0.1s]\" />\n <span className=\"cb-h-1.5 cb-w-1.5 cb-rounded-full cb-bg-[var(--cb-muted-foreground)] cb-opacity-70 cb-animate-cb-dots\" />\n </div>\n );\n}","import ReactMarkdown from \"react-markdown\";\nimport rehypeSanitize from \"rehype-sanitize\";\nimport remarkGfm from \"remark-gfm\";\n\ninterface MessageMarkdownProps {\n content: string;\n}\n\nexport function MessageMarkdown({ content }: MessageMarkdownProps) {\n return (\n <div className=\"cb-markdown cb-message-text cb-text-base cb-leading-6\">\n <ReactMarkdown remarkPlugins={[remarkGfm]} rehypePlugins={[rehypeSanitize]}>\n {content}\n </ReactMarkdown>\n </div>\n );\n}\n","import { useEffect, useMemo, useRef } from \"react\";\nimport type { PageConfigOverrides } from \"../types\";\nimport { useChatbotContext } from \"../context/chatbot-context\";\nimport { createId } from \"../lib/id\";\n\nexport function ChatbotPageConfig(props: PageConfigOverrides) {\n const { registerPageConfig, unregisterPageConfig } = useChatbotContext();\n const configId = useRef(createId(\"pagecfg\"));\n const stableConfig = useMemo(() => props, [props]);\n\n useEffect(() => {\n registerPageConfig(configId.current, stableConfig);\n return () => unregisterPageConfig(configId.current);\n }, [registerPageConfig, stableConfig, unregisterPageConfig]);\n\n return null;\n}","import { useChatbotContext } from \"../context/chatbot-context\";\n\nexport function useChatbot() {\n return useChatbotContext();\n}","import { useMemo } from \"react\";\nimport { useChatbotContext } from \"../context/chatbot-context\";\n\nexport function useChatbotSession() {\n const { sessionId, resetSession } = useChatbotContext();\n\n return useMemo(\n () => ({\n sessionId,\n resetSession,\n }),\n [resetSession, sessionId],\n );\n}"],"mappings":"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","names":["import_react","import_jsx_runtime","import_jsx_runtime","ReactMarkdown","remarkGfm","rehypeSanitize","import_jsx_runtime","clsx","import_react","import_react"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1264,10 +1264,10 @@ function ChatbotWidget() {
|
|
|
1264
1264
|
{
|
|
1265
1265
|
ref: panelRef,
|
|
1266
1266
|
className: clsx(
|
|
1267
|
-
"cb-pointer-events-auto cb-flex cb-flex-col cb-overflow-hidden cb-rounded-[var(--cb-radius)] cb-border cb-border-[var(--cb-border)] cb-bg-[var(--cb-surface)] cb-shadow-[var(--cb-shadow-panel)]
|
|
1267
|
+
"cb-panel-transition cb-pointer-events-auto cb-flex cb-flex-col cb-overflow-hidden cb-rounded-[var(--cb-radius)] cb-border cb-border-[var(--cb-border)] cb-bg-[var(--cb-surface)] cb-shadow-[var(--cb-shadow-panel)]",
|
|
1268
1268
|
panelOrigin,
|
|
1269
1269
|
panelSize.className,
|
|
1270
|
-
isOpen ? "cb-
|
|
1270
|
+
isOpen ? "cb-panel-open" : "cb-panel-closed cb-pointer-events-none",
|
|
1271
1271
|
classNames.panel
|
|
1272
1272
|
),
|
|
1273
1273
|
style: panelSize.style,
|
|
@@ -1531,7 +1531,7 @@ function ChatbotWidget() {
|
|
|
1531
1531
|
{
|
|
1532
1532
|
size: 22,
|
|
1533
1533
|
className: clsx(
|
|
1534
|
-
"cb-
|
|
1534
|
+
"cb-launcher-icon-transition cb-absolute cb-fill-current",
|
|
1535
1535
|
isOpen ? "cb-rotate-90 cb-opacity-0" : "cb-rotate-0 cb-opacity-100"
|
|
1536
1536
|
)
|
|
1537
1537
|
}
|
|
@@ -1541,7 +1541,7 @@ function ChatbotWidget() {
|
|
|
1541
1541
|
{
|
|
1542
1542
|
size: 22,
|
|
1543
1543
|
className: clsx(
|
|
1544
|
-
"cb-
|
|
1544
|
+
"cb-launcher-icon-transition cb-absolute",
|
|
1545
1545
|
isOpen ? "cb-rotate-0 cb-opacity-100" : "-cb-rotate-90 cb-opacity-0"
|
|
1546
1546
|
)
|
|
1547
1547
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/chatbot/context/chatbot-context.tsx","../src/chatbot/lib/defaults.ts","../src/chatbot/lib/adapter.ts","../src/chatbot/lib/transport.ts","../src/chatbot/lib/id.ts","../src/chatbot/lib/session.ts","../src/chatbot/lib/theme.ts","../src/chatbot/components/chatbot-widget.tsx","../src/chatbot/components/awaiting-dots.tsx","../src/chatbot/components/message-markdown.tsx","../src/chatbot/components/chatbot-page-config.tsx","../src/chatbot/hooks/use-chatbot.ts","../src/chatbot/hooks/use-chatbot-session.ts"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport type {\n ChatMessage,\n ChatbotContextValue,\n ChatbotProviderProps,\n PageConfigOverrides,\n} from \"../types\";\nimport { DEFAULT_AGENT_NAME, DEFAULT_ASSISTANT_NOTE, DEFAULT_ICONS, DEFAULT_THEME } from \"../lib/defaults\";\nimport { withDefaultAdapter } from \"../lib/adapter\";\nimport { readAssistantResponse } from \"../lib/transport\";\nimport { createId } from \"../lib/id\";\nimport { getOrCreateSessionId, historyKey, resetSessionId } from \"../lib/session\";\nimport { resolveThemeTokens, toThemeCssVars } from \"../lib/theme\";\n\nconst ChatbotContext = createContext<ChatbotContextValue | undefined>(undefined);\nconst WELCOME_DELAY_MS = 1500;\nconst DEFAULT_LOCALE = \"en\";\nconst LOCALE_COPY: Record<\n string,\n {\n agentName: string;\n assistantNote: string;\n welcomeMessage: string;\n disclaimer: string;\n }\n> = {\n en: {\n agentName: DEFAULT_AGENT_NAME,\n assistantNote: DEFAULT_ASSISTANT_NOTE,\n welcomeMessage: \"Hi, how can I help you?\",\n disclaimer: \"AI can make mistakes.\",\n },\n de: {\n agentName: \"Assistent\",\n assistantNote: \"Wie kann ich helfen?\",\n welcomeMessage: \"Hallo, wie kann ich Ihnen helfen?\",\n disclaimer: \"KI kann Fehler machen.\",\n },\n es: {\n agentName: \"Asistente\",\n assistantNote: \"Como puedo ayudarte?\",\n welcomeMessage: \"Hola, como puedo ayudarte?\",\n disclaimer: \"La IA puede cometer errores.\",\n },\n fr: {\n agentName: \"Assistant\",\n assistantNote: \"Comment puis-je vous aider ?\",\n welcomeMessage: \"Bonjour, comment puis-je vous aider ?\",\n disclaimer: \"L'IA peut faire des erreurs.\",\n },\n it: {\n agentName: \"Assistente\",\n assistantNote: \"Come posso aiutarti?\",\n welcomeMessage: \"Ciao, come posso aiutarti?\",\n disclaimer: \"L'IA puo commettere errori.\",\n },\n nl: {\n agentName: \"Assistent\",\n assistantNote: \"Hoe kan ik je helpen?\",\n welcomeMessage: \"Hallo, hoe kan ik je helpen?\",\n disclaimer: \"AI kan fouten maken.\",\n },\n pt: {\n agentName: \"Assistente\",\n assistantNote: \"Como posso ajudar?\",\n welcomeMessage: \"Ola, como posso ajudar?\",\n disclaimer: \"A IA pode cometer erros.\",\n },\n pl: {\n agentName: \"Asystent\",\n assistantNote: \"Jak moge pomoc?\",\n welcomeMessage: \"Czesc, jak moge pomoc?\",\n disclaimer: \"AI moze popelniac bledy.\",\n },\n tr: {\n agentName: \"Asistan\",\n assistantNote: \"Nasil yardimci olabilirim?\",\n welcomeMessage: \"Merhaba, nasil yardimci olabilirim?\",\n disclaimer: \"Yapay zeka hata yapabilir.\",\n },\n sv: {\n agentName: \"Assistent\",\n assistantNote: \"Hur kan jag hjalpa dig?\",\n welcomeMessage: \"Hej, hur kan jag hjalpa dig?\",\n disclaimer: \"AI kan gora misstag.\",\n },\n da: {\n agentName: \"Assistent\",\n assistantNote: \"Hvordan kan jeg hjaelpe dig?\",\n welcomeMessage: \"Hej, hvordan kan jeg hjaelpe dig?\",\n disclaimer: \"AI kan lave fejl.\",\n },\n no: {\n agentName: \"Assistent\",\n assistantNote: \"Hvordan kan jeg hjelpe deg?\",\n welcomeMessage: \"Hei, hvordan kan jeg hjelpe deg?\",\n disclaimer: \"AI kan gjøre feil.\",\n },\n fi: {\n agentName: \"Avustaja\",\n assistantNote: \"Miten voin auttaa?\",\n welcomeMessage: \"Hei, miten voin auttaa?\",\n disclaimer: \"Tekoaly voi tehda virheita.\",\n },\n};\n\nfunction normalizeLocale(input: string | undefined): string {\n if (!input) {\n return DEFAULT_LOCALE;\n }\n\n return input.trim().toLowerCase().split(\"-\")[0] || DEFAULT_LOCALE;\n}\n\nfunction getBrowserLocale() {\n if (typeof navigator === \"undefined\") {\n return DEFAULT_LOCALE;\n }\n\n return navigator.language || DEFAULT_LOCALE;\n}\n\nfunction getLocaleCopy(locale: string) {\n return LOCALE_COPY[locale] ?? LOCALE_COPY[DEFAULT_LOCALE];\n}\n\nfunction readHistory(storage: Storage | undefined, sessionId: string): ChatMessage[] {\n if (!storage) {\n return [];\n }\n\n const raw = storage.getItem(historyKey(sessionId));\n if (!raw) {\n return [];\n }\n\n try {\n const parsed = JSON.parse(raw) as ChatMessage[];\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\nexport function ChatbotProvider({\n children,\n webhookUrl,\n locale,\n agentName,\n assistantNote,\n enableUploads = false,\n streamingMode = \"auto\",\n headers,\n theme,\n icons,\n adapter,\n events,\n initialOpen = false,\n position = \"bottom-right\",\n classNames,\n}: ChatbotProviderProps) {\n const [isHydrated, setIsHydrated] = useState(false);\n const [sessionId, setSessionId] = useState(\"cb:pending\");\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isOpen, setIsOpen] = useState(initialOpen);\n const [isAwaiting, setIsAwaiting] = useState(false);\n const [pageConfigs, setPageConfigs] = useState<Array<{ id: string; config: PageConfigOverrides }>>([]);\n const messagesRef = useRef<ChatMessage[]>([]);\n\n useEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n\n const activePageConfig = pageConfigs.length > 0 ? pageConfigs[pageConfigs.length - 1].config : undefined;\n const mergedTheme = useMemo(\n () => ({\n ...(theme ?? {}),\n ...(activePageConfig?.theme ?? {}),\n }),\n [activePageConfig?.theme, theme],\n );\n\n const resolvedTheme = useMemo(() => {\n if (!isHydrated) {\n return { ...DEFAULT_THEME, ...(mergedTheme ?? {}) };\n }\n return resolveThemeTokens(mergedTheme);\n }, [isHydrated, mergedTheme]);\n const themeVars = useMemo(() => toThemeCssVars(resolvedTheme), [resolvedTheme]);\n const mergedIcons = useMemo(() => {\n const merged = { ...DEFAULT_ICONS, ...(icons ?? {}) };\n merged.launcherClosed = icons?.launcherClosed ?? icons?.launcher ?? DEFAULT_ICONS.launcherClosed;\n merged.launcherOpen = icons?.launcherOpen ?? DEFAULT_ICONS.launcherOpen;\n return merged;\n }, [icons]);\n\n const resolvedLocale = useMemo(() => normalizeLocale(locale ?? getBrowserLocale()), [locale]);\n const localeCopy = useMemo(() => getLocaleCopy(resolvedLocale), [resolvedLocale]);\n const welcomeAssistantMessage = localeCopy.welcomeMessage;\n const disclaimerText = localeCopy.disclaimer;\n const resolvedAgentName = activePageConfig?.agentName ?? agentName ?? localeCopy.agentName;\n const resolvedAssistantNote = activePageConfig?.assistantNote ?? assistantNote ?? localeCopy.assistantNote;\n const uploadEnabled = activePageConfig?.enableUploads ?? enableUploads;\n const widgetEnabled = activePageConfig?.enabled ?? true;\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const storage = window.sessionStorage;\n const nextSessionId = getOrCreateSessionId(storage);\n setSessionId(nextSessionId);\n setMessages(readHistory(storage, nextSessionId));\n setIsHydrated(true);\n }, []);\n\n useEffect(() => {\n if (!isHydrated || typeof window === \"undefined\") {\n return;\n }\n\n const storage = window.sessionStorage;\n storage.setItem(historyKey(sessionId), JSON.stringify(messages));\n }, [isHydrated, messages, sessionId]);\n\n useEffect(() => {\n if (!isHydrated || !isOpen || !widgetEnabled || typeof window === \"undefined\") {\n return;\n }\n\n let timeoutId: number | undefined;\n\n setMessages((current) => {\n if (current.length > 0) {\n return current;\n }\n\n const welcomeId = createId(\"msg\");\n timeoutId = window.setTimeout(() => {\n setMessages((next) =>\n next.map((message): ChatMessage =>\n message.id === welcomeId\n ? {\n ...message,\n content: welcomeAssistantMessage,\n status: \"complete\",\n }\n : message,\n ),\n );\n }, WELCOME_DELAY_MS);\n\n return [\n ...current,\n {\n id: welcomeId,\n role: \"assistant\",\n content: \"\",\n createdAt: new Date().toISOString(),\n status: \"streaming\",\n },\n ];\n });\n\n return () => {\n if (timeoutId) {\n window.clearTimeout(timeoutId);\n }\n };\n }, [isHydrated, isOpen, welcomeAssistantMessage, widgetEnabled]);\n\n const open = useCallback(() => {\n setIsOpen(true);\n events?.onOpen?.();\n }, [events]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n events?.onClose?.();\n }, [events]);\n\n const toggle = useCallback(() => {\n setIsOpen((current) => {\n const next = !current;\n if (next) {\n events?.onOpen?.();\n } else {\n events?.onClose?.();\n }\n return next;\n });\n }, [events]);\n\n const clearConversation = useCallback(() => {\n setMessages([]);\n if (typeof window !== \"undefined\") {\n const storage = window.sessionStorage;\n storage.removeItem(historyKey(sessionId));\n }\n }, [sessionId]);\n\n const resetSession = useCallback(() => {\n const storage = typeof window !== \"undefined\" ? window.sessionStorage : undefined;\n const next = resetSessionId(storage);\n setSessionId(next);\n setMessages([]);\n }, []);\n\n const registerPageConfig = useCallback((id: string, config: PageConfigOverrides) => {\n setPageConfigs((current) => {\n const filtered = current.filter((entry) => entry.id !== id);\n return [...filtered, { id, config }];\n });\n }, []);\n\n const unregisterPageConfig = useCallback((id: string) => {\n setPageConfigs((current) => current.filter((entry) => entry.id !== id));\n }, []);\n\n const sendMessage = useCallback<ChatbotContextValue[\"sendMessage\"]>(\n async ({ text, files = [] }) => {\n const trimmed = text.trim();\n if (!trimmed && files.length === 0) {\n return;\n }\n\n const now = new Date().toISOString();\n const attachmentDtos = files.map((file) => ({\n id: createId(\"att\"),\n name: file.name,\n size: file.size,\n type: file.type,\n file,\n }));\n if (attachmentDtos.length > 0) {\n events?.onAttachmentAdded?.(attachmentDtos);\n }\n\n const userMessage: ChatMessage = {\n id: createId(\"msg\"),\n role: \"user\",\n content: trimmed,\n createdAt: now,\n status: \"complete\",\n attachments: attachmentDtos,\n };\n const ensureWelcomeMessage = (input: ChatMessage[]): ChatMessage[] => {\n if (input.some((message) => message.role === \"assistant\" && message.content === welcomeAssistantMessage)) {\n return input;\n }\n\n const firstStreamingAssistantIndex = input.findIndex(\n (message) => message.role === \"assistant\" && message.status === \"streaming\" && !message.content,\n );\n\n if (firstStreamingAssistantIndex >= 0) {\n return input.map((message, index): ChatMessage =>\n index === firstStreamingAssistantIndex\n ? {\n ...message,\n content: welcomeAssistantMessage,\n status: \"complete\",\n }\n : message,\n );\n }\n\n if (input.some((message) => message.role === \"assistant\")) {\n return input;\n }\n\n const welcomeMessage: ChatMessage = {\n id: createId(\"msg\"),\n role: \"assistant\",\n content: welcomeAssistantMessage,\n createdAt: now,\n status: \"complete\",\n };\n return [...input, welcomeMessage];\n };\n\n const normalizedHistory = ensureWelcomeMessage(messagesRef.current);\n const requestHistory = [...normalizedHistory, userMessage].map((message) => ({\n id: message.id,\n role: message.role,\n content: message.content,\n createdAt: message.createdAt,\n }));\n\n setMessages((current) => [...ensureWelcomeMessage(current), userMessage]);\n events?.onMessageSent?.(userMessage);\n\n const assistantId = createId(\"msg\");\n setMessages((current) => [\n ...current,\n {\n id: assistantId,\n role: \"assistant\",\n content: \"\",\n createdAt: new Date().toISOString(),\n status: \"streaming\",\n },\n ]);\n\n setIsAwaiting(true);\n const resolvedAdapter = withDefaultAdapter(adapter);\n\n try {\n const metadata = {\n sessionId,\n pageUrl: typeof window !== \"undefined\" ? window.location.href : \"\",\n timestamp: new Date().toISOString(),\n agentName: resolvedAgentName,\n locale: resolvedLocale,\n history: requestHistory,\n };\n\n const requestInit = resolvedAdapter.buildRequest({\n webhookUrl,\n message: trimmed,\n sessionId,\n agentName: resolvedAgentName,\n files: uploadEnabled ? files : [],\n metadata,\n headers,\n });\n\n const url = requestInit.url ?? webhookUrl;\n const response = await fetch(url, requestInit);\n\n let streamedContent = \"\";\n const responseText = await readAssistantResponse({\n response,\n adapter: resolvedAdapter,\n streamingMode,\n onDelta: (delta) => {\n streamedContent += delta;\n setMessages((current) =>\n current.map((message): ChatMessage =>\n message.id === assistantId\n ? {\n ...message,\n content: `${message.content}${delta}`,\n status: \"streaming\",\n }\n : message,\n ),\n );\n },\n onChunk: (chunk) => {\n events?.onChunkReceived?.(chunk);\n },\n onRecoverableError: (error) => {\n events?.onError?.(error);\n },\n });\n\n setMessages((current) => {\n const next: ChatMessage[] = current.map((message): ChatMessage => {\n if (message.id !== assistantId) {\n return message;\n }\n\n const hasStreamed = streamedContent.length > 0;\n const content = hasStreamed ? message.content : responseText;\n return {\n ...message,\n content,\n status: \"complete\",\n };\n });\n\n const completeMessage = next.find((message) => message.id === assistantId);\n if (completeMessage) {\n events?.onResponseComplete?.(completeMessage);\n }\n\n return next;\n });\n } catch (error) {\n const typedError = error instanceof Error ? error : new Error(String(error));\n events?.onError?.(typedError);\n\n setMessages((current) =>\n current.map((message): ChatMessage =>\n message.id === assistantId\n ? {\n ...message,\n content: message.content || \"Sorry, I ran into an issue while generating a response.\",\n status: \"error\",\n }\n : message,\n ),\n );\n } finally {\n setIsAwaiting(false);\n }\n },\n [\n adapter,\n events,\n headers,\n resolvedAgentName,\n resolvedLocale,\n sessionId,\n streamingMode,\n uploadEnabled,\n welcomeAssistantMessage,\n webhookUrl,\n ],\n );\n\n const value = useMemo<ChatbotContextValue>(\n () => ({\n isOpen,\n isAwaiting,\n messages,\n sessionId,\n uploadEnabled,\n agentName: resolvedAgentName,\n assistantNote: resolvedAssistantNote,\n disclaimerText,\n position,\n themeVars,\n icons: mergedIcons,\n classNames: classNames ?? {},\n open,\n close,\n toggle,\n sendMessage,\n clearConversation,\n registerPageConfig,\n unregisterPageConfig,\n widgetEnabled,\n resetSession,\n }),\n [\n classNames,\n clearConversation,\n close,\n disclaimerText,\n isAwaiting,\n isOpen,\n mergedIcons,\n messages,\n open,\n position,\n registerPageConfig,\n resolvedAgentName,\n resolvedAssistantNote,\n sendMessage,\n sessionId,\n themeVars,\n toggle,\n unregisterPageConfig,\n uploadEnabled,\n widgetEnabled,\n resetSession,\n ],\n );\n\n return <ChatbotContext.Provider value={value}>{children}</ChatbotContext.Provider>;\n}\n\nexport function useChatbotContext() {\n const context = useContext(ChatbotContext);\n if (!context) {\n throw new Error(\"useChatbotContext must be used within ChatbotProvider\");\n }\n return context;\n}\n","import {\n Bot,\n ChevronDown,\n Download,\n Ellipsis,\n Maximize2,\n MessageSquare,\n Paperclip,\n SendHorizontal,\n X,\n} from \"lucide-react\";\nimport type { ChatbotIcons, ChatbotThemeTokens } from \"../types\";\n\nexport const DEFAULT_THEME: ChatbotThemeTokens = {\n primary: \"#ffffff\",\n primaryForeground: \"#111111\",\n background: \"#0b0b0b\",\n surface: \"#111111\",\n surfaceForeground: \"#f5f5f5\",\n muted: \"#262626\",\n mutedForeground: \"#a3a3a3\",\n border: \"#2f2f2f\",\n ring: \"#737373\",\n userBubble: \"#ffffff\",\n userText: \"#111111\",\n assistantBubble: \"#2a2a2a\",\n assistantText: \"#f5f5f5\",\n radius: \"14px\",\n fontFamily: \"Inter, var(--font-sans), ui-sans-serif, system-ui, -apple-system, Segoe UI, sans-serif\",\n shadowBubble: \"0 18px 40px -16px rgba(0, 0, 0, 0.7)\",\n shadowPanel: \"0 34px 80px -36px rgba(0, 0, 0, 0.85)\",\n};\n\nexport const DEFAULT_ICONS: ChatbotIcons = {\n launcher: MessageSquare,\n launcherClosed: MessageSquare,\n launcherOpen: ChevronDown,\n close: X,\n send: SendHorizontal,\n attach: Paperclip,\n bot: Bot,\n menu: Ellipsis,\n expand: Maximize2,\n download: Download,\n};\n\nexport const DEFAULT_AGENT_NAME = \"Assistant\";\nexport const DEFAULT_ASSISTANT_NOTE = \"Here to help\";\n","import type {\n ChatbotAdapter,\n ChatbotAdapterRequestInput,\n NormalizedAssistantChunk,\n} from \"../types\";\n\nfunction extractFromRecord(record: Record<string, unknown>): string | undefined {\n const keys = [\"message\", \"text\", \"output\", \"response\", \"answer\", \"content\"];\n for (const key of keys) {\n const value = record[key];\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value;\n }\n }\n return undefined;\n}\n\nexport function defaultBuildRequest(input: ChatbotAdapterRequestInput): RequestInit & { url?: string } {\n const { files, metadata, message, headers, sessionId } = input;\n\n if (files.length > 0) {\n const formData = new FormData();\n formData.set(\"message\", message);\n formData.set(\"sessionId\", sessionId);\n formData.set(\"metadata\", JSON.stringify(metadata));\n\n files.forEach((file) => {\n formData.append(\"files[]\", file);\n });\n\n return {\n method: \"POST\",\n headers,\n body: formData,\n };\n }\n\n return {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify({\n message,\n sessionId,\n metadata,\n }),\n };\n}\n\nexport function defaultParseJsonResponse(raw: unknown): NormalizedAssistantChunk {\n if (typeof raw === \"string\") {\n return { message: raw };\n }\n\n if (Array.isArray(raw)) {\n const merged = raw\n .map((item) => {\n if (typeof item === \"string\") {\n return item;\n }\n\n if (item && typeof item === \"object\") {\n return extractFromRecord(item as Record<string, unknown>);\n }\n\n return undefined;\n })\n .filter(Boolean)\n .join(\"\\n\");\n\n return { message: merged };\n }\n\n if (raw && typeof raw === \"object\") {\n const record = raw as Record<string, unknown>;\n\n if (record.delta && typeof record.delta === \"string\") {\n return {\n delta: record.delta,\n done: Boolean(record.done),\n };\n }\n\n const text = extractFromRecord(record);\n if (text) {\n return { message: text, done: true };\n }\n\n if (record.data && typeof record.data === \"object\") {\n const nested = extractFromRecord(record.data as Record<string, unknown>);\n if (nested) {\n return { message: nested, done: true };\n }\n }\n }\n\n return { message: \"\", done: true };\n}\n\nexport function defaultParseStreamChunk(chunk: string): NormalizedAssistantChunk {\n const trimmed = chunk.trim();\n\n if (!trimmed) {\n return {};\n }\n\n if (trimmed === \"[DONE]\") {\n return { done: true };\n }\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return defaultParseJsonResponse(parsed);\n } catch {\n return { delta: trimmed };\n }\n}\n\nexport function withDefaultAdapter(adapter?: ChatbotAdapter): Required<ChatbotAdapter> {\n return {\n buildRequest: adapter?.buildRequest ?? defaultBuildRequest,\n parseJsonResponse: adapter?.parseJsonResponse ?? defaultParseJsonResponse,\n parseStreamChunk: adapter?.parseStreamChunk ?? defaultParseStreamChunk,\n };\n}\n","import type { ChatbotAdapter } from \"../types\";\n\ninterface ResponseInput {\n response: Response;\n adapter: Required<ChatbotAdapter>;\n streamingMode: \"auto\" | \"on\" | \"off\";\n onDelta: (chunk: string) => void;\n onChunk: (chunk: string) => void;\n onRecoverableError: (error: Error) => void;\n}\n\nfunction looksLikeStream(contentType: string | null) {\n if (!contentType) {\n return false;\n }\n\n const normalized = contentType.toLowerCase();\n return (\n normalized.includes(\"text/event-stream\") ||\n normalized.includes(\"application/x-ndjson\") ||\n normalized.includes(\"application/stream\")\n );\n}\n\nfunction parseAndAppend(\n rawChunk: string,\n adapter: Required<ChatbotAdapter>,\n onChunk: (chunk: string) => void,\n): { text: string; done: boolean } {\n const parsed = adapter.parseStreamChunk(rawChunk);\n onChunk(rawChunk);\n\n if (parsed.done && parsed.message) {\n return { text: parsed.message, done: true };\n }\n\n if (parsed.delta) {\n return { text: parsed.delta, done: Boolean(parsed.done) };\n }\n\n if (parsed.message) {\n return { text: parsed.message, done: Boolean(parsed.done) };\n }\n\n return { text: \"\", done: Boolean(parsed.done) };\n}\n\nasync function consumeEventStream(\n response: Response,\n adapter: Required<ChatbotAdapter>,\n onDelta: (chunk: string) => void,\n onChunk: (chunk: string) => void,\n): Promise<string> {\n const reader = response.body?.getReader();\n if (!reader) {\n return \"\";\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let fullText = \"\";\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n if (result.done) {\n break;\n }\n\n buffer += decoder.decode(result.value, { stream: true });\n\n while (buffer.includes(\"\\n\\n\")) {\n const index = buffer.indexOf(\"\\n\\n\");\n const block = buffer.slice(0, index);\n buffer = buffer.slice(index + 2);\n\n const lines = block.split(\"\\n\").filter((line) => line.startsWith(\"data:\"));\n for (const line of lines) {\n const data = line.slice(5).trim();\n const parsed = parseAndAppend(data, adapter, onChunk);\n if (parsed.text) {\n fullText += parsed.text;\n onDelta(parsed.text);\n }\n if (parsed.done) {\n done = true;\n break;\n }\n }\n }\n }\n\n if (buffer.trim()) {\n const fallback = parseAndAppend(buffer.trim(), adapter, onChunk);\n if (fallback.text) {\n fullText += fallback.text;\n onDelta(fallback.text);\n }\n }\n\n return fullText;\n}\n\nasync function consumeLineStream(\n response: Response,\n adapter: Required<ChatbotAdapter>,\n onDelta: (chunk: string) => void,\n onChunk: (chunk: string) => void,\n): Promise<string> {\n const reader = response.body?.getReader();\n if (!reader) {\n return \"\";\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let fullText = \"\";\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n if (result.done) {\n break;\n }\n\n buffer += decoder.decode(result.value, { stream: true });\n\n while (buffer.includes(\"\\n\")) {\n const index = buffer.indexOf(\"\\n\");\n const line = buffer.slice(0, index).trim();\n buffer = buffer.slice(index + 1);\n\n if (!line) {\n continue;\n }\n\n const parsed = parseAndAppend(line, adapter, onChunk);\n if (parsed.text) {\n fullText += parsed.text;\n onDelta(parsed.text);\n }\n if (parsed.done) {\n done = true;\n break;\n }\n }\n }\n\n if (buffer.trim()) {\n const parsed = parseAndAppend(buffer.trim(), adapter, onChunk);\n if (parsed.text) {\n fullText += parsed.text;\n onDelta(parsed.text);\n }\n }\n\n return fullText;\n}\n\nasync function parseNonStreaming(response: Response, adapter: Required<ChatbotAdapter>) {\n const contentType = response.headers.get(\"content-type\") || \"\";\n\n if (contentType.includes(\"application/json\")) {\n const payload = (await response.json()) as unknown;\n const parsed = adapter.parseJsonResponse(payload);\n return parsed.message ?? parsed.delta ?? \"\";\n }\n\n const rawText = await response.text();\n try {\n const parsedPayload = JSON.parse(rawText) as unknown;\n const parsed = adapter.parseJsonResponse(parsedPayload);\n return parsed.message ?? parsed.delta ?? rawText;\n } catch {\n const parsed = adapter.parseJsonResponse(rawText);\n return parsed.message ?? rawText;\n }\n}\n\nexport async function readAssistantResponse({\n response,\n adapter,\n streamingMode,\n onDelta,\n onChunk,\n onRecoverableError,\n}: ResponseInput): Promise<string> {\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`Webhook request failed (${response.status}): ${body}`);\n }\n\n const contentType = response.headers.get(\"content-type\");\n const streamEligible = streamingMode !== \"off\" && Boolean(response.body);\n const shouldStream = streamEligible && (streamingMode === \"on\" || looksLikeStream(contentType));\n\n if (!shouldStream) {\n return parseNonStreaming(response, adapter);\n }\n\n try {\n if ((contentType || \"\").toLowerCase().includes(\"text/event-stream\")) {\n return await consumeEventStream(response, adapter, onDelta, onChunk);\n }\n\n return await consumeLineStream(response, adapter, onDelta, onChunk);\n } catch (error) {\n onRecoverableError(error as Error);\n return \"\";\n }\n}","export function createId(prefix = \"cb\") {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return `${prefix}-${crypto.randomUUID()}`;\n }\n\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}","const SESSION_KEY = \"cb:session-id\";\n\nfunction createSessionId() {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n\n return `cb-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function getOrCreateSessionId(storage: Storage | undefined): string {\n if (!storage) {\n return createSessionId();\n }\n\n const existing = storage.getItem(SESSION_KEY);\n if (existing) {\n return existing;\n }\n\n const created = createSessionId();\n storage.setItem(SESSION_KEY, created);\n return created;\n}\n\nexport function resetSessionId(storage: Storage | undefined): string {\n const next = createSessionId();\n if (storage) {\n storage.setItem(SESSION_KEY, next);\n }\n return next;\n}\n\nexport function historyKey(sessionId: string) {\n return `cb:history:${sessionId}`;\n}","import { DEFAULT_THEME } from \"./defaults\";\nimport type { ChatbotThemeTokens } from \"../types\";\n\nexport function resolveThemeTokens(explicit?: Partial<ChatbotThemeTokens>): ChatbotThemeTokens {\n return {\n ...DEFAULT_THEME,\n ...(explicit ?? {}),\n };\n}\n\nexport function toThemeCssVars(tokens: ChatbotThemeTokens): Record<string, string> {\n return {\n \"--cb-primary\": tokens.primary,\n \"--cb-primary-foreground\": tokens.primaryForeground,\n \"--cb-background\": tokens.background,\n \"--cb-surface\": tokens.surface,\n \"--cb-surface-foreground\": tokens.surfaceForeground,\n \"--cb-muted\": tokens.muted,\n \"--cb-muted-foreground\": tokens.mutedForeground,\n \"--cb-border\": tokens.border,\n \"--cb-ring\": tokens.ring,\n \"--cb-user-bubble\": tokens.userBubble,\n \"--cb-user-text\": tokens.userText,\n \"--cb-assistant-bubble\": tokens.assistantBubble,\n \"--cb-assistant-text\": tokens.assistantText,\n \"--cb-radius\": tokens.radius,\n \"--cb-font-family\": tokens.fontFamily,\n \"--cb-shadow-bubble\": tokens.shadowBubble,\n \"--cb-shadow-panel\": tokens.shadowPanel,\n };\n}\n","import clsx from \"clsx\";\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type CSSProperties,\n type FormEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n} from \"react\";\nimport type { ChatMessage } from \"../types\";\nimport { useChatbotContext } from \"../context/chatbot-context\";\nimport { AwaitingDots } from \"./awaiting-dots\";\nimport { MessageMarkdown } from \"./message-markdown\";\n\nconst PANEL_INSET_REM = 1.5;\nconst EXPANDED_MAX_WIDTH_PX = 630;\nconst MOBILE_BREAKPOINT_PX = 768;\nconst ROOT_BOTTOM_OFFSET_REM = 1.5; // cb-bottom-6\nconst PANEL_TO_BUBBLE_GAP_REM = 0.75; // cb-gap-3\nconst BUBBLE_SIZE_REM = 3.5; // cb-h-14\nconst EXPANDED_BOTTOM_OFFSET_REM = ROOT_BOTTOM_OFFSET_REM + PANEL_TO_BUBBLE_GAP_REM + BUBBLE_SIZE_REM;\nconst EXPANDED_TOTAL_VERTICAL_INSET_REM = PANEL_INSET_REM + EXPANDED_BOTTOM_OFFSET_REM;\n\nfunction formatFileSize(size: number) {\n if (size < 1024) {\n return `${size} B`;\n }\n if (size < 1024 * 1024) {\n return `${(size / 1024).toFixed(1)} KB`;\n }\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction formatGmtOffset(date: Date) {\n const total = -date.getTimezoneOffset();\n const sign = total >= 0 ? \"+\" : \"-\";\n const abs = Math.abs(total);\n const hh = String(Math.floor(abs / 60)).padStart(2, \"0\");\n const mm = String(abs % 60).padStart(2, \"0\");\n return `GMT${sign}${hh}${mm}`;\n}\n\nfunction readTimeZoneName(date: Date, mode: \"long\" | \"short\") {\n const parts = new Intl.DateTimeFormat(undefined, { timeZoneName: mode }).formatToParts(date);\n return parts.find((part) => part.type === \"timeZoneName\")?.value ?? \"\";\n}\n\nfunction formatTranscriptDateTime(date: Date) {\n const datePart = new Intl.DateTimeFormat(undefined, {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n }).format(date);\n const timePart = new Intl.DateTimeFormat(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: true,\n }).format(date);\n const zoneLong = readTimeZoneName(date, \"long\");\n const zoneShort = readTimeZoneName(date, \"short\");\n const gmtOffset = formatGmtOffset(date);\n return `${datePart} at ${timePart} ${zoneLong} time ${zoneShort} (${gmtOffset})`.replace(/\\s+/g, \" \").trim();\n}\n\nfunction formatTranscriptMessageTime(value: string) {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n\n return new Intl.DateTimeFormat(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: true,\n }).format(date);\n}\n\nfunction toTranscript(messages: ChatMessage[], agentName: string) {\n const exportedAt = new Date();\n const firstDate =\n messages.length > 0 ? new Date(messages[0].createdAt) : exportedAt;\n const startedAt = Number.isNaN(firstDate.getTime()) ? exportedAt : firstDate;\n\n const lines: string[] = [\n `Conversation with ${agentName}`,\n `Started on ${formatTranscriptDateTime(startedAt)}`,\n \"\",\n \"---\",\n \"\",\n ];\n\n messages.forEach((message) => {\n const role = message.role === \"user\" ? \"Visitor\" : message.role === \"assistant\" ? agentName : \"System\";\n const content = message.content.trim();\n if (!content) {\n return;\n }\n\n lines.push(`${formatTranscriptMessageTime(message.createdAt)} | ${role}: ${content}`);\n lines.push(\"\");\n });\n\n lines.push(\"---\");\n lines.push(`Exported from ${agentName} on ${formatTranscriptDateTime(exportedAt)}`);\n\n return lines.join(\"\\n\");\n}\n\nfunction toTranscriptFilename(date: Date) {\n const yyyy = date.getFullYear();\n const mm = String(date.getMonth() + 1).padStart(2, \"0\");\n const dd = String(date.getDate()).padStart(2, \"0\");\n const hh = String(date.getHours()).padStart(2, \"0\");\n const min = String(date.getMinutes()).padStart(2, \"0\");\n const ss = String(date.getSeconds()).padStart(2, \"0\");\n return `chat-transcript-${yyyy}${mm}${dd}-${hh}${min}${ss}.txt`;\n}\n\nexport function ChatbotWidget() {\n const {\n isOpen,\n isAwaiting,\n messages,\n uploadEnabled,\n position,\n agentName,\n assistantNote,\n disclaimerText,\n themeVars,\n icons,\n classNames,\n close,\n open,\n sendMessage,\n widgetEnabled,\n } = useChatbotContext();\n\n const [inputValue, setInputValue] = useState(\"\");\n const [queuedFiles, setQueuedFiles] = useState<File[]>([]);\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [isExpanded, setIsExpanded] = useState(false);\n const [isMobileViewport, setIsMobileViewport] = useState(false);\n\n const panelRef = useRef<HTMLDivElement>(null);\n const messagesScrollRef = useRef<HTMLElement>(null);\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n const LauncherClosedIcon = icons.launcherClosed;\n const LauncherOpenIcon = icons.launcherOpen;\n const BotIcon = icons.bot;\n const MenuIcon = icons.menu;\n const CloseIcon = icons.close;\n const SendIcon = icons.send;\n const AttachIcon = icons.attach;\n const ExpandIcon = icons.expand;\n const DownloadIcon = icons.download;\n\n const alignment = position === \"bottom-left\" ? \"cb-left-6\" : \"cb-right-6\";\n const stackAlignment = position === \"bottom-left\" ? \"cb-items-start\" : \"cb-items-end\";\n const panelOrigin = position === \"bottom-left\" ? \"cb-origin-bottom-left\" : \"cb-origin-bottom-right\";\n const panelLayoutMode = isMobileViewport ? \"mobile\" : isExpanded ? \"desktop-expanded\" : \"desktop-collapsed\";\n const showExpandAction = !isMobileViewport;\n const showDownloadAction = messages.length > 0;\n const hasMenuActions = showExpandAction || showDownloadAction;\n\n const canSend = useMemo(() => {\n return !isAwaiting && (inputValue.trim().length > 0 || queuedFiles.length > 0);\n }, [inputValue, isAwaiting, queuedFiles.length]);\n\n const resizeComposer = () => {\n const textarea = inputRef.current;\n if (!textarea) {\n return;\n }\n\n if (textarea.value.length === 0) {\n textarea.style.height = \"38px\";\n textarea.style.overflowY = \"hidden\";\n return;\n }\n\n const maxHeightPx = 168;\n textarea.style.height = \"auto\";\n const nextHeight = Math.min(textarea.scrollHeight, maxHeightPx);\n textarea.style.height = `${nextHeight}px`;\n textarea.style.overflowY = textarea.scrollHeight > maxHeightPx ? \"auto\" : \"hidden\";\n };\n\n const scrollMessagesToBottom = () => {\n const container = messagesScrollRef.current;\n if (!container) {\n return;\n }\n\n container.scrollTop = container.scrollHeight;\n };\n\n const panelSize = useMemo<{ className: string; style?: CSSProperties }>(() => {\n const inset = `${PANEL_INSET_REM}rem`;\n\n if (panelLayoutMode === \"mobile\") {\n return {\n className: \"cb-fixed cb-max-h-none cb-max-w-none\",\n style: {\n top: inset,\n right: inset,\n bottom: `${EXPANDED_BOTTOM_OFFSET_REM}rem`,\n left: inset,\n },\n };\n }\n\n if (panelLayoutMode === \"desktop-expanded\") {\n return {\n className: \"cb-relative cb-max-h-none cb-max-w-none\",\n style: {\n width: `min(${EXPANDED_MAX_WIDTH_PX}px, calc(100vw - ${PANEL_INSET_REM * 2}rem))`,\n height: `calc(100vh - ${EXPANDED_TOTAL_VERTICAL_INSET_REM}rem)`,\n },\n };\n }\n\n return {\n className: \"cb-relative cb-h-[min(680px,calc(100vh-7.5rem))] cb-w-[min(92vw,420px)]\",\n style: undefined,\n };\n }, [panelLayoutMode]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const mediaQuery = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT_PX}px)`);\n const syncViewportMode = () => {\n setIsMobileViewport(mediaQuery.matches);\n };\n\n syncViewportMode();\n\n if (typeof mediaQuery.addEventListener === \"function\") {\n mediaQuery.addEventListener(\"change\", syncViewportMode);\n return () => mediaQuery.removeEventListener(\"change\", syncViewportMode);\n }\n\n mediaQuery.addListener(syncViewportMode);\n return () => mediaQuery.removeListener(syncViewportMode);\n }, []);\n\n useEffect(() => {\n if (!isOpen) {\n setIsMenuOpen(false);\n return;\n }\n\n inputRef.current?.focus();\n resizeComposer();\n }, [isOpen]);\n\n useEffect(() => {\n resizeComposer();\n }, [inputValue]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const rafId = window.requestAnimationFrame(() => {\n scrollMessagesToBottom();\n });\n\n return () => window.cancelAnimationFrame(rafId);\n }, [isOpen, messages, isAwaiting]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const onPointerDown = (event: MouseEvent) => {\n const target = event.target as Node;\n if (menuRef.current && !menuRef.current.contains(target)) {\n setIsMenuOpen(false);\n }\n };\n\n window.addEventListener(\"mousedown\", onPointerDown);\n return () => window.removeEventListener(\"mousedown\", onPointerDown);\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const onKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n if (isMenuOpen) {\n setIsMenuOpen(false);\n return;\n }\n close();\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [close, isMenuOpen, isOpen]);\n\n useEffect(() => {\n setIsMenuOpen(false);\n }, [isMobileViewport]);\n\n useEffect(() => {\n if (!hasMenuActions) {\n setIsMenuOpen(false);\n }\n }, [hasMenuActions]);\n\n const trapFocus = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.key !== \"Tab\") {\n return;\n }\n\n const root = panelRef.current;\n if (!root) {\n return;\n }\n\n const focusables = root.querySelectorAll<HTMLElement>(\n \"button, [href], textarea, input, select, [tabindex]:not([tabindex='-1'])\",\n );\n\n if (focusables.length === 0) {\n return;\n }\n\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n\n if (event.shiftKey && document.activeElement === first) {\n last.focus();\n event.preventDefault();\n } else if (!event.shiftKey && document.activeElement === last) {\n first.focus();\n event.preventDefault();\n }\n };\n\n const onSubmit = async (event: FormEvent) => {\n event.preventDefault();\n if (!canSend) {\n return;\n }\n\n const submittedText = inputValue;\n setInputValue(\"\");\n scrollMessagesToBottom();\n\n await sendMessage({\n text: submittedText,\n files: uploadEnabled ? queuedFiles : [],\n });\n\n setQueuedFiles([]);\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n };\n\n const onPickFiles = (event: ChangeEvent<HTMLInputElement>) => {\n const list = event.target.files;\n if (!list || !uploadEnabled) {\n return;\n }\n\n const files = Array.from(list);\n setQueuedFiles((current) => {\n const seen = new Set(current.map((file) => `${file.name}:${file.size}:${file.lastModified}`));\n const next = [...current];\n\n files.forEach((file) => {\n const key = `${file.name}:${file.size}:${file.lastModified}`;\n if (!seen.has(key)) {\n seen.add(key);\n next.push(file);\n }\n });\n\n return next;\n });\n };\n\n const createIdFromFile = (file: File) => `${file.name}:${file.size}:${file.lastModified}`;\n\n const removeQueuedFile = (fileId: string) => {\n setQueuedFiles((current) => current.filter((file) => createIdFromFile(file) !== fileId));\n };\n\n const downloadTranscript = () => {\n if (messages.length === 0) {\n return;\n }\n\n const now = new Date();\n const fileContent = toTranscript(messages, agentName);\n const blob = new Blob([fileContent], { type: \"text/plain;charset=utf-8\" });\n const objectUrl = URL.createObjectURL(blob);\n\n const anchor = document.createElement(\"a\");\n anchor.href = objectUrl;\n anchor.download = toTranscriptFilename(now);\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n URL.revokeObjectURL(objectUrl);\n\n setIsMenuOpen(false);\n };\n\n const toggleExpanded = () => {\n if (isMobileViewport) {\n return;\n }\n\n setIsExpanded((current) => !current);\n setIsMenuOpen(false);\n };\n\n if (!widgetEnabled) {\n return null;\n }\n\n return (\n <div\n className={clsx(\n \"cb-fixed cb-bottom-6 cb-z-[2147483640] cb-text-[var(--cb-surface-foreground)]\",\n alignment,\n classNames.root,\n )}\n style={themeVars}\n data-chatbot-root\n >\n <div className={clsx(\"cb-pointer-events-none cb-relative cb-flex cb-flex-col cb-gap-3\", stackAlignment)}>\n <div\n ref={panelRef}\n className={clsx(\n \"cb-pointer-events-auto cb-flex cb-flex-col cb-overflow-hidden cb-rounded-[var(--cb-radius)] cb-border cb-border-[var(--cb-border)] cb-bg-[var(--cb-surface)] cb-shadow-[var(--cb-shadow-panel)] cb-transition-[opacity,transform,width,height,top,left,right,bottom] cb-duration-[380ms] cb-ease-[cubic-bezier(0.22,1,0.36,1)]\",\n panelOrigin,\n panelSize.className,\n isOpen\n ? \"cb-translate-y-0 cb-scale-100 cb-opacity-100\"\n : \"cb-translate-y-3 cb-scale-90 cb-opacity-0 cb-pointer-events-none\",\n classNames.panel,\n )}\n style={panelSize.style}\n aria-hidden={!isOpen}\n onKeyDown={trapFocus}\n >\n <header\n className={clsx(\n \"cb-flex cb-items-center cb-justify-between cb-gap-2 cb-border-b cb-border-[var(--cb-border)] cb-bg-[var(--cb-surface)] cb-px-4 cb-py-3.5\",\n classNames.header,\n )}\n style={{\n borderBottomWidth: \"1px\",\n borderBottomStyle: \"solid\",\n borderBottomColor: \"var(--cb-border)\",\n }}\n >\n <div className={clsx(\"cb-flex cb-min-w-0 cb-items-center cb-gap-2.5\", classNames.headerMeta)}>\n <span className=\"cb-inline-flex cb-h-9 cb-w-9 cb-shrink-0 cb-items-center cb-justify-center cb-self-center cb-text-[var(--cb-surface-foreground)]\">\n <BotIcon size={34} />\n </span>\n <div className=\"cb-min-w-0 cb-space-y-0\">\n <p className=\"cb-m-0 cb-truncate cb-text-lg cb-font-semibold cb-leading-6 cb-text-[var(--cb-surface-foreground)]\">\n {agentName}\n </p>\n <p className=\"cb-m-0 cb-text-base cb-leading-5 cb-text-[var(--cb-muted-foreground)]\">{assistantNote}</p>\n </div>\n </div>\n\n <div ref={menuRef} className=\"cb-relative cb-flex cb-items-center cb-gap-1\">\n {hasMenuActions && (\n <button\n type=\"button\"\n onClick={() => setIsMenuOpen((current) => !current)}\n className={clsx(\n \"cb-flex cb-h-9 cb-w-9 cb-shrink-0 cb-items-center cb-justify-center cb-rounded-lg cb-bg-transparent cb-p-0 cb-text-[var(--cb-muted-foreground)] cb-transition hover:cb-bg-[var(--cb-muted)] hover:cb-text-white focus-visible:cb-bg-[var(--cb-muted)] focus-visible:cb-text-white\",\n isMenuOpen && \"cb-bg-[var(--cb-muted)] cb-text-white\",\n )}\n aria-label=\"More options\"\n aria-expanded={isMenuOpen}\n >\n <MenuIcon size={18} />\n </button>\n )}\n\n {isMenuOpen && hasMenuActions && (\n <div\n className={clsx(\n \"cb-absolute cb-right-0 cb-top-full cb-z-20 cb-mt-2 cb-flex cb-min-w-[220px] cb-flex-col cb-gap-1 cb-rounded-xl cb-border cb-border-[var(--cb-border)] cb-bg-[var(--cb-surface)] cb-p-1.5 cb-shadow-[var(--cb-shadow-panel)]\",\n classNames.menu,\n )}\n >\n {showExpandAction && (\n <button\n type=\"button\"\n onClick={toggleExpanded}\n className={clsx(\n \"cb-flex cb-w-full cb-items-center cb-gap-2 cb-rounded-lg cb-bg-transparent cb-px-3.5 cb-py-2.5 cb-text-left cb-text-sm cb-text-[var(--cb-muted-foreground)] cb-transition hover:cb-bg-[var(--cb-muted)] hover:cb-text-white focus-visible:cb-bg-[var(--cb-muted)] focus-visible:cb-text-white\",\n classNames.menuItem,\n )}\n >\n <ExpandIcon size={16} />\n <span>{isExpanded ? \"Restore window\" : \"Expand window\"}</span>\n </button>\n )}\n\n {showDownloadAction && (\n <button\n type=\"button\"\n onClick={downloadTranscript}\n className={clsx(\n \"cb-flex cb-w-full cb-items-center cb-gap-2 cb-rounded-lg cb-bg-transparent cb-px-3.5 cb-py-2.5 cb-text-left cb-text-sm cb-text-[var(--cb-muted-foreground)] cb-transition hover:cb-bg-[var(--cb-muted)] hover:cb-text-white focus-visible:cb-bg-[var(--cb-muted)] focus-visible:cb-text-white\",\n classNames.menuItem,\n )}\n >\n <DownloadIcon size={16} />\n <span>Download transcript</span>\n </button>\n )}\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={close}\n className=\"cb-flex cb-h-9 cb-w-9 cb-shrink-0 cb-items-center cb-justify-center cb-rounded-lg cb-bg-transparent cb-p-0 cb-text-[var(--cb-muted-foreground)] cb-transition hover:cb-bg-[var(--cb-muted)] hover:cb-text-white focus-visible:cb-bg-[var(--cb-muted)] focus-visible:cb-text-white\"\n aria-label=\"Close chatbot\"\n >\n <CloseIcon size={18} />\n </button>\n </div>\n </header>\n\n <section\n ref={messagesScrollRef}\n className={clsx(\n \"cb-chat-scroll cb-flex-1 cb-overflow-y-auto cb-scroll-smooth cb-bg-[var(--cb-background)] cb-px-4 cb-pt-4 cb-pb-36\",\n classNames.body,\n )}\n >\n <div className=\"cb-space-y-3.5\">\n {messages.length === 0 && (\n <div className=\"cb-rounded-xl cb-bg-[var(--cb-muted)] cb-p-3 cb-text-sm cb-text-[var(--cb-muted-foreground)]\">\n Ask anything about this company and the assistant will answer using your RAG knowledge base.\n </div>\n )}\n\n {messages.map((message) => {\n const isUser = message.role === \"user\";\n\n return (\n <article\n key={message.id}\n className={clsx(\n \"cb-flex\",\n isUser ? \"cb-justify-end cb-animate-cb-slide-fade-in-right\" : \"cb-justify-start cb-animate-cb-slide-fade-in-left\",\n )}\n >\n <div\n className={clsx(\n \"cb-max-w-[85%] cb-rounded-2xl cb-px-4 cb-py-2\",\n isUser\n ? \"cb-rounded-br-md cb-bg-[var(--cb-user-bubble)] cb-text-[var(--cb-user-text)]\"\n : \"cb-rounded-bl-md cb-bg-[var(--cb-assistant-bubble)] cb-text-[var(--cb-assistant-text)]\",\n )}\n >\n {message.role === \"assistant\" && message.status === \"streaming\" && !message.content ? (\n <AwaitingDots />\n ) : message.role === \"assistant\" ? (\n <MessageMarkdown content={message.content} />\n ) : (\n <p className=\"cb-message-text cb-m-0 cb-whitespace-pre-wrap cb-text-base cb-leading-6\">\n {message.content}\n </p>\n )}\n\n {message.attachments && message.attachments.length > 0 && (\n <div className=\"cb-mt-2 cb-flex cb-flex-wrap cb-gap-2\">\n {message.attachments.map((attachment) => (\n <span\n key={attachment.id}\n className=\"cb-inline-flex cb-items-center cb-gap-2 cb-rounded-full cb-bg-black/10 cb-px-2 cb-py-1 cb-text-xs\"\n >\n <span>{attachment.name}</span>\n <span className=\"cb-opacity-70\">{formatFileSize(attachment.size)}</span>\n </span>\n ))}\n </div>\n )}\n </div>\n </article>\n );\n })}\n\n <div />\n </div>\n </section>\n\n <footer\n className={clsx(\n \"cb-absolute cb-bottom-4 cb-left-4 cb-right-4 cb-z-10 cb-bg-transparent cb-p-0\",\n classNames.footer,\n )}\n >\n {uploadEnabled && queuedFiles.length > 0 && (\n <div className=\"cb-mb-2 cb-flex cb-flex-wrap cb-gap-2\">\n {queuedFiles.map((file) => {\n const fileId = createIdFromFile(file);\n return (\n <button\n type=\"button\"\n key={fileId}\n className=\"cb-inline-flex cb-items-center cb-gap-2 cb-rounded-full cb-bg-[var(--cb-muted)] cb-px-3 cb-py-1 cb-text-xs cb-text-[var(--cb-muted-foreground)]\"\n onClick={() => removeQueuedFile(fileId)}\n aria-label={`Remove ${file.name}`}\n >\n <span className=\"cb-max-w-[140px] cb-truncate\">{file.name}</span>\n <span>x</span>\n </button>\n );\n })}\n </div>\n )}\n\n <form onSubmit={onSubmit}>\n <div\n className={clsx(\n \"cb-flex cb-items-end cb-gap-2 cb-rounded-2xl cb-bg-[var(--cb-surface)] cb-p-2 cb-shadow-[0_18px_35px_-24px_rgba(0,0,0,0.85)] cb-transition\",\n classNames.composer,\n )}\n >\n {uploadEnabled && (\n <>\n <input\n type=\"file\"\n multiple\n ref={fileInputRef}\n className=\"cb-hidden\"\n onChange={onPickFiles}\n aria-label=\"Add attachments\"\n />\n <button\n type=\"button\"\n className=\"cb-flex cb-h-10 cb-w-10 cb-shrink-0 cb-items-center cb-justify-center cb-rounded-lg cb-bg-transparent cb-p-0 cb-text-[var(--cb-muted-foreground)] cb-transition hover:cb-bg-[var(--cb-muted)] hover:cb-text-white focus-visible:cb-bg-[var(--cb-muted)] focus-visible:cb-text-white\"\n onClick={() => fileInputRef.current?.click()}\n aria-label=\"Attach files\"\n >\n <AttachIcon size={18} />\n </button>\n </>\n )}\n\n <div className=\"cb-flex-1\">\n <textarea\n ref={inputRef}\n value={inputValue}\n onChange={(event) => setInputValue(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n void onSubmit(event);\n }\n }}\n rows={1}\n placeholder=\"Ask a question...\"\n className={clsx(\n \"cb-composer-input cb-min-h-[38px] cb-w-full cb-resize-none cb-bg-transparent cb-px-2 cb-py-1.5 cb-text-sm cb-leading-6 cb-text-[var(--cb-surface-foreground)] cb-outline-none placeholder:cb-text-[var(--cb-muted-foreground)]\",\n classNames.input,\n )}\n />\n </div>\n\n <button\n type=\"submit\"\n disabled={!canSend}\n className={clsx(\n \"cb-flex cb-h-10 cb-w-10 cb-shrink-0 cb-items-center cb-justify-center cb-rounded-full cb-bg-white cb-p-0 cb-text-[#111111] cb-transition cb-duration-200 hover:cb-scale-105 hover:cb-brightness-95 hover:cb-text-[#111111] active:cb-scale-95 focus-visible:cb-text-[#111111] disabled:cb-cursor-not-allowed disabled:cb-bg-white/70 disabled:cb-text-[#111111] disabled:cb-opacity-100\",\n classNames.sendButton,\n )}\n aria-label=\"Send message\"\n >\n <SendIcon size={18} />\n </button>\n </div>\n <p className=\"cb-m-0 cb-mt-1 cb-px-1 cb-text-center cb-text-xs cb-leading-4 cb-text-[var(--cb-muted-foreground)]\">\n {disclaimerText}\n </p>\n </form>\n </footer>\n </div>\n\n <button\n type=\"button\"\n onClick={isOpen ? close : open}\n className={clsx(\n \"cb-pointer-events-auto cb-group cb-flex cb-h-14 cb-w-14 cb-items-center cb-justify-center cb-rounded-full cb-border cb-border-[var(--cb-border)] cb-bg-[#111111] cb-text-[#f5f5f5] cb-shadow-[var(--cb-shadow-bubble)] cb-transition cb-duration-300 hover:cb-scale-110 hover:cb-bg-[#262626] hover:cb-shadow-[0_24px_50px_-18px_rgba(0,0,0,0.9)] active:cb-scale-95\",\n classNames.bubble,\n )}\n aria-label={isOpen ? \"Close chatbot\" : \"Open chatbot\"}\n >\n <span className=\"cb-relative cb-flex cb-h-6 cb-w-6 cb-items-center cb-justify-center\">\n <LauncherClosedIcon\n size={22}\n className={clsx(\n \"cb-absolute cb-fill-current cb-transition-all cb-duration-300 cb-ease-out\",\n isOpen ? \"cb-rotate-90 cb-opacity-0\" : \"cb-rotate-0 cb-opacity-100\",\n )}\n />\n <LauncherOpenIcon\n size={22}\n className={clsx(\n \"cb-absolute cb-transition-all cb-duration-300 cb-ease-out\",\n isOpen ? \"cb-rotate-0 cb-opacity-100\" : \"-cb-rotate-90 cb-opacity-0\",\n )}\n />\n </span>\n </button>\n </div>\n </div>\n );\n}\n","export function AwaitingDots() {\n return (\n <div className=\"cb-inline-flex cb-items-center cb-gap-1 cb-px-1\" aria-label=\"Assistant is typing\">\n <span className=\"cb-h-1.5 cb-w-1.5 cb-rounded-full cb-bg-[var(--cb-muted-foreground)] cb-opacity-70 cb-animate-cb-dots [animation-delay:-0.2s]\" />\n <span className=\"cb-h-1.5 cb-w-1.5 cb-rounded-full cb-bg-[var(--cb-muted-foreground)] cb-opacity-70 cb-animate-cb-dots [animation-delay:-0.1s]\" />\n <span className=\"cb-h-1.5 cb-w-1.5 cb-rounded-full cb-bg-[var(--cb-muted-foreground)] cb-opacity-70 cb-animate-cb-dots\" />\n </div>\n );\n}","import ReactMarkdown from \"react-markdown\";\nimport rehypeSanitize from \"rehype-sanitize\";\nimport remarkGfm from \"remark-gfm\";\n\ninterface MessageMarkdownProps {\n content: string;\n}\n\nexport function MessageMarkdown({ content }: MessageMarkdownProps) {\n return (\n <div className=\"cb-markdown cb-message-text cb-text-base cb-leading-6\">\n <ReactMarkdown remarkPlugins={[remarkGfm]} rehypePlugins={[rehypeSanitize]}>\n {content}\n </ReactMarkdown>\n </div>\n );\n}\n","import { useEffect, useMemo, useRef } from \"react\";\nimport type { PageConfigOverrides } from \"../types\";\nimport { useChatbotContext } from \"../context/chatbot-context\";\nimport { createId } from \"../lib/id\";\n\nexport function ChatbotPageConfig(props: PageConfigOverrides) {\n const { registerPageConfig, unregisterPageConfig } = useChatbotContext();\n const configId = useRef(createId(\"pagecfg\"));\n const stableConfig = useMemo(() => props, [props]);\n\n useEffect(() => {\n registerPageConfig(configId.current, stableConfig);\n return () => unregisterPageConfig(configId.current);\n }, [registerPageConfig, stableConfig, unregisterPageConfig]);\n\n return null;\n}","import { useChatbotContext } from \"../context/chatbot-context\";\n\nexport function useChatbot() {\n return useChatbotContext();\n}","import { useMemo } from \"react\";\nimport { useChatbotContext } from \"../context/chatbot-context\";\n\nexport function useChatbotSession() {\n const { sessionId, resetSession } = useChatbotContext();\n\n return useMemo(\n () => ({\n sessionId,\n resetSession,\n }),\n [resetSession, sessionId],\n );\n}"],"mappings":"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","names":["useEffect","useMemo","useRef","useState","jsx","jsx","jsx","jsxs","useState","useRef","useMemo","useEffect","useEffect","useMemo","useRef","useRef","useMemo","useEffect","useMemo","useMemo"]}
|
|
1
|
+
{"version":3,"sources":["../src/chatbot/context/chatbot-context.tsx","../src/chatbot/lib/defaults.ts","../src/chatbot/lib/adapter.ts","../src/chatbot/lib/transport.ts","../src/chatbot/lib/id.ts","../src/chatbot/lib/session.ts","../src/chatbot/lib/theme.ts","../src/chatbot/components/chatbot-widget.tsx","../src/chatbot/components/awaiting-dots.tsx","../src/chatbot/components/message-markdown.tsx","../src/chatbot/components/chatbot-page-config.tsx","../src/chatbot/hooks/use-chatbot.ts","../src/chatbot/hooks/use-chatbot-session.ts"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport type {\n ChatMessage,\n ChatbotContextValue,\n ChatbotProviderProps,\n PageConfigOverrides,\n} from \"../types\";\nimport { DEFAULT_AGENT_NAME, DEFAULT_ASSISTANT_NOTE, DEFAULT_ICONS, DEFAULT_THEME } from \"../lib/defaults\";\nimport { withDefaultAdapter } from \"../lib/adapter\";\nimport { readAssistantResponse } from \"../lib/transport\";\nimport { createId } from \"../lib/id\";\nimport { getOrCreateSessionId, historyKey, resetSessionId } from \"../lib/session\";\nimport { resolveThemeTokens, toThemeCssVars } from \"../lib/theme\";\n\nconst ChatbotContext = createContext<ChatbotContextValue | undefined>(undefined);\nconst WELCOME_DELAY_MS = 1500;\nconst DEFAULT_LOCALE = \"en\";\nconst LOCALE_COPY: Record<\n string,\n {\n agentName: string;\n assistantNote: string;\n welcomeMessage: string;\n disclaimer: string;\n }\n> = {\n en: {\n agentName: DEFAULT_AGENT_NAME,\n assistantNote: DEFAULT_ASSISTANT_NOTE,\n welcomeMessage: \"Hi, how can I help you?\",\n disclaimer: \"AI can make mistakes.\",\n },\n de: {\n agentName: \"Assistent\",\n assistantNote: \"Wie kann ich helfen?\",\n welcomeMessage: \"Hallo, wie kann ich Ihnen helfen?\",\n disclaimer: \"KI kann Fehler machen.\",\n },\n es: {\n agentName: \"Asistente\",\n assistantNote: \"Como puedo ayudarte?\",\n welcomeMessage: \"Hola, como puedo ayudarte?\",\n disclaimer: \"La IA puede cometer errores.\",\n },\n fr: {\n agentName: \"Assistant\",\n assistantNote: \"Comment puis-je vous aider ?\",\n welcomeMessage: \"Bonjour, comment puis-je vous aider ?\",\n disclaimer: \"L'IA peut faire des erreurs.\",\n },\n it: {\n agentName: \"Assistente\",\n assistantNote: \"Come posso aiutarti?\",\n welcomeMessage: \"Ciao, come posso aiutarti?\",\n disclaimer: \"L'IA puo commettere errori.\",\n },\n nl: {\n agentName: \"Assistent\",\n assistantNote: \"Hoe kan ik je helpen?\",\n welcomeMessage: \"Hallo, hoe kan ik je helpen?\",\n disclaimer: \"AI kan fouten maken.\",\n },\n pt: {\n agentName: \"Assistente\",\n assistantNote: \"Como posso ajudar?\",\n welcomeMessage: \"Ola, como posso ajudar?\",\n disclaimer: \"A IA pode cometer erros.\",\n },\n pl: {\n agentName: \"Asystent\",\n assistantNote: \"Jak moge pomoc?\",\n welcomeMessage: \"Czesc, jak moge pomoc?\",\n disclaimer: \"AI moze popelniac bledy.\",\n },\n tr: {\n agentName: \"Asistan\",\n assistantNote: \"Nasil yardimci olabilirim?\",\n welcomeMessage: \"Merhaba, nasil yardimci olabilirim?\",\n disclaimer: \"Yapay zeka hata yapabilir.\",\n },\n sv: {\n agentName: \"Assistent\",\n assistantNote: \"Hur kan jag hjalpa dig?\",\n welcomeMessage: \"Hej, hur kan jag hjalpa dig?\",\n disclaimer: \"AI kan gora misstag.\",\n },\n da: {\n agentName: \"Assistent\",\n assistantNote: \"Hvordan kan jeg hjaelpe dig?\",\n welcomeMessage: \"Hej, hvordan kan jeg hjaelpe dig?\",\n disclaimer: \"AI kan lave fejl.\",\n },\n no: {\n agentName: \"Assistent\",\n assistantNote: \"Hvordan kan jeg hjelpe deg?\",\n welcomeMessage: \"Hei, hvordan kan jeg hjelpe deg?\",\n disclaimer: \"AI kan gjøre feil.\",\n },\n fi: {\n agentName: \"Avustaja\",\n assistantNote: \"Miten voin auttaa?\",\n welcomeMessage: \"Hei, miten voin auttaa?\",\n disclaimer: \"Tekoaly voi tehda virheita.\",\n },\n};\n\nfunction normalizeLocale(input: string | undefined): string {\n if (!input) {\n return DEFAULT_LOCALE;\n }\n\n return input.trim().toLowerCase().split(\"-\")[0] || DEFAULT_LOCALE;\n}\n\nfunction getBrowserLocale() {\n if (typeof navigator === \"undefined\") {\n return DEFAULT_LOCALE;\n }\n\n return navigator.language || DEFAULT_LOCALE;\n}\n\nfunction getLocaleCopy(locale: string) {\n return LOCALE_COPY[locale] ?? LOCALE_COPY[DEFAULT_LOCALE];\n}\n\nfunction readHistory(storage: Storage | undefined, sessionId: string): ChatMessage[] {\n if (!storage) {\n return [];\n }\n\n const raw = storage.getItem(historyKey(sessionId));\n if (!raw) {\n return [];\n }\n\n try {\n const parsed = JSON.parse(raw) as ChatMessage[];\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\nexport function ChatbotProvider({\n children,\n webhookUrl,\n locale,\n agentName,\n assistantNote,\n enableUploads = false,\n streamingMode = \"auto\",\n headers,\n theme,\n icons,\n adapter,\n events,\n initialOpen = false,\n position = \"bottom-right\",\n classNames,\n}: ChatbotProviderProps) {\n const [isHydrated, setIsHydrated] = useState(false);\n const [sessionId, setSessionId] = useState(\"cb:pending\");\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isOpen, setIsOpen] = useState(initialOpen);\n const [isAwaiting, setIsAwaiting] = useState(false);\n const [pageConfigs, setPageConfigs] = useState<Array<{ id: string; config: PageConfigOverrides }>>([]);\n const messagesRef = useRef<ChatMessage[]>([]);\n\n useEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n\n const activePageConfig = pageConfigs.length > 0 ? pageConfigs[pageConfigs.length - 1].config : undefined;\n const mergedTheme = useMemo(\n () => ({\n ...(theme ?? {}),\n ...(activePageConfig?.theme ?? {}),\n }),\n [activePageConfig?.theme, theme],\n );\n\n const resolvedTheme = useMemo(() => {\n if (!isHydrated) {\n return { ...DEFAULT_THEME, ...(mergedTheme ?? {}) };\n }\n return resolveThemeTokens(mergedTheme);\n }, [isHydrated, mergedTheme]);\n const themeVars = useMemo(() => toThemeCssVars(resolvedTheme), [resolvedTheme]);\n const mergedIcons = useMemo(() => {\n const merged = { ...DEFAULT_ICONS, ...(icons ?? {}) };\n merged.launcherClosed = icons?.launcherClosed ?? icons?.launcher ?? DEFAULT_ICONS.launcherClosed;\n merged.launcherOpen = icons?.launcherOpen ?? DEFAULT_ICONS.launcherOpen;\n return merged;\n }, [icons]);\n\n const resolvedLocale = useMemo(() => normalizeLocale(locale ?? getBrowserLocale()), [locale]);\n const localeCopy = useMemo(() => getLocaleCopy(resolvedLocale), [resolvedLocale]);\n const welcomeAssistantMessage = localeCopy.welcomeMessage;\n const disclaimerText = localeCopy.disclaimer;\n const resolvedAgentName = activePageConfig?.agentName ?? agentName ?? localeCopy.agentName;\n const resolvedAssistantNote = activePageConfig?.assistantNote ?? assistantNote ?? localeCopy.assistantNote;\n const uploadEnabled = activePageConfig?.enableUploads ?? enableUploads;\n const widgetEnabled = activePageConfig?.enabled ?? true;\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const storage = window.sessionStorage;\n const nextSessionId = getOrCreateSessionId(storage);\n setSessionId(nextSessionId);\n setMessages(readHistory(storage, nextSessionId));\n setIsHydrated(true);\n }, []);\n\n useEffect(() => {\n if (!isHydrated || typeof window === \"undefined\") {\n return;\n }\n\n const storage = window.sessionStorage;\n storage.setItem(historyKey(sessionId), JSON.stringify(messages));\n }, [isHydrated, messages, sessionId]);\n\n useEffect(() => {\n if (!isHydrated || !isOpen || !widgetEnabled || typeof window === \"undefined\") {\n return;\n }\n\n let timeoutId: number | undefined;\n\n setMessages((current) => {\n if (current.length > 0) {\n return current;\n }\n\n const welcomeId = createId(\"msg\");\n timeoutId = window.setTimeout(() => {\n setMessages((next) =>\n next.map((message): ChatMessage =>\n message.id === welcomeId\n ? {\n ...message,\n content: welcomeAssistantMessage,\n status: \"complete\",\n }\n : message,\n ),\n );\n }, WELCOME_DELAY_MS);\n\n return [\n ...current,\n {\n id: welcomeId,\n role: \"assistant\",\n content: \"\",\n createdAt: new Date().toISOString(),\n status: \"streaming\",\n },\n ];\n });\n\n return () => {\n if (timeoutId) {\n window.clearTimeout(timeoutId);\n }\n };\n }, [isHydrated, isOpen, welcomeAssistantMessage, widgetEnabled]);\n\n const open = useCallback(() => {\n setIsOpen(true);\n events?.onOpen?.();\n }, [events]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n events?.onClose?.();\n }, [events]);\n\n const toggle = useCallback(() => {\n setIsOpen((current) => {\n const next = !current;\n if (next) {\n events?.onOpen?.();\n } else {\n events?.onClose?.();\n }\n return next;\n });\n }, [events]);\n\n const clearConversation = useCallback(() => {\n setMessages([]);\n if (typeof window !== \"undefined\") {\n const storage = window.sessionStorage;\n storage.removeItem(historyKey(sessionId));\n }\n }, [sessionId]);\n\n const resetSession = useCallback(() => {\n const storage = typeof window !== \"undefined\" ? window.sessionStorage : undefined;\n const next = resetSessionId(storage);\n setSessionId(next);\n setMessages([]);\n }, []);\n\n const registerPageConfig = useCallback((id: string, config: PageConfigOverrides) => {\n setPageConfigs((current) => {\n const filtered = current.filter((entry) => entry.id !== id);\n return [...filtered, { id, config }];\n });\n }, []);\n\n const unregisterPageConfig = useCallback((id: string) => {\n setPageConfigs((current) => current.filter((entry) => entry.id !== id));\n }, []);\n\n const sendMessage = useCallback<ChatbotContextValue[\"sendMessage\"]>(\n async ({ text, files = [] }) => {\n const trimmed = text.trim();\n if (!trimmed && files.length === 0) {\n return;\n }\n\n const now = new Date().toISOString();\n const attachmentDtos = files.map((file) => ({\n id: createId(\"att\"),\n name: file.name,\n size: file.size,\n type: file.type,\n file,\n }));\n if (attachmentDtos.length > 0) {\n events?.onAttachmentAdded?.(attachmentDtos);\n }\n\n const userMessage: ChatMessage = {\n id: createId(\"msg\"),\n role: \"user\",\n content: trimmed,\n createdAt: now,\n status: \"complete\",\n attachments: attachmentDtos,\n };\n const ensureWelcomeMessage = (input: ChatMessage[]): ChatMessage[] => {\n if (input.some((message) => message.role === \"assistant\" && message.content === welcomeAssistantMessage)) {\n return input;\n }\n\n const firstStreamingAssistantIndex = input.findIndex(\n (message) => message.role === \"assistant\" && message.status === \"streaming\" && !message.content,\n );\n\n if (firstStreamingAssistantIndex >= 0) {\n return input.map((message, index): ChatMessage =>\n index === firstStreamingAssistantIndex\n ? {\n ...message,\n content: welcomeAssistantMessage,\n status: \"complete\",\n }\n : message,\n );\n }\n\n if (input.some((message) => message.role === \"assistant\")) {\n return input;\n }\n\n const welcomeMessage: ChatMessage = {\n id: createId(\"msg\"),\n role: \"assistant\",\n content: welcomeAssistantMessage,\n createdAt: now,\n status: \"complete\",\n };\n return [...input, welcomeMessage];\n };\n\n const normalizedHistory = ensureWelcomeMessage(messagesRef.current);\n const requestHistory = [...normalizedHistory, userMessage].map((message) => ({\n id: message.id,\n role: message.role,\n content: message.content,\n createdAt: message.createdAt,\n }));\n\n setMessages((current) => [...ensureWelcomeMessage(current), userMessage]);\n events?.onMessageSent?.(userMessage);\n\n const assistantId = createId(\"msg\");\n setMessages((current) => [\n ...current,\n {\n id: assistantId,\n role: \"assistant\",\n content: \"\",\n createdAt: new Date().toISOString(),\n status: \"streaming\",\n },\n ]);\n\n setIsAwaiting(true);\n const resolvedAdapter = withDefaultAdapter(adapter);\n\n try {\n const metadata = {\n sessionId,\n pageUrl: typeof window !== \"undefined\" ? window.location.href : \"\",\n timestamp: new Date().toISOString(),\n agentName: resolvedAgentName,\n locale: resolvedLocale,\n history: requestHistory,\n };\n\n const requestInit = resolvedAdapter.buildRequest({\n webhookUrl,\n message: trimmed,\n sessionId,\n agentName: resolvedAgentName,\n files: uploadEnabled ? files : [],\n metadata,\n headers,\n });\n\n const url = requestInit.url ?? webhookUrl;\n const response = await fetch(url, requestInit);\n\n let streamedContent = \"\";\n const responseText = await readAssistantResponse({\n response,\n adapter: resolvedAdapter,\n streamingMode,\n onDelta: (delta) => {\n streamedContent += delta;\n setMessages((current) =>\n current.map((message): ChatMessage =>\n message.id === assistantId\n ? {\n ...message,\n content: `${message.content}${delta}`,\n status: \"streaming\",\n }\n : message,\n ),\n );\n },\n onChunk: (chunk) => {\n events?.onChunkReceived?.(chunk);\n },\n onRecoverableError: (error) => {\n events?.onError?.(error);\n },\n });\n\n setMessages((current) => {\n const next: ChatMessage[] = current.map((message): ChatMessage => {\n if (message.id !== assistantId) {\n return message;\n }\n\n const hasStreamed = streamedContent.length > 0;\n const content = hasStreamed ? message.content : responseText;\n return {\n ...message,\n content,\n status: \"complete\",\n };\n });\n\n const completeMessage = next.find((message) => message.id === assistantId);\n if (completeMessage) {\n events?.onResponseComplete?.(completeMessage);\n }\n\n return next;\n });\n } catch (error) {\n const typedError = error instanceof Error ? error : new Error(String(error));\n events?.onError?.(typedError);\n\n setMessages((current) =>\n current.map((message): ChatMessage =>\n message.id === assistantId\n ? {\n ...message,\n content: message.content || \"Sorry, I ran into an issue while generating a response.\",\n status: \"error\",\n }\n : message,\n ),\n );\n } finally {\n setIsAwaiting(false);\n }\n },\n [\n adapter,\n events,\n headers,\n resolvedAgentName,\n resolvedLocale,\n sessionId,\n streamingMode,\n uploadEnabled,\n welcomeAssistantMessage,\n webhookUrl,\n ],\n );\n\n const value = useMemo<ChatbotContextValue>(\n () => ({\n isOpen,\n isAwaiting,\n messages,\n sessionId,\n uploadEnabled,\n agentName: resolvedAgentName,\n assistantNote: resolvedAssistantNote,\n disclaimerText,\n position,\n themeVars,\n icons: mergedIcons,\n classNames: classNames ?? {},\n open,\n close,\n toggle,\n sendMessage,\n clearConversation,\n registerPageConfig,\n unregisterPageConfig,\n widgetEnabled,\n resetSession,\n }),\n [\n classNames,\n clearConversation,\n close,\n disclaimerText,\n isAwaiting,\n isOpen,\n mergedIcons,\n messages,\n open,\n position,\n registerPageConfig,\n resolvedAgentName,\n resolvedAssistantNote,\n sendMessage,\n sessionId,\n themeVars,\n toggle,\n unregisterPageConfig,\n uploadEnabled,\n widgetEnabled,\n resetSession,\n ],\n );\n\n return <ChatbotContext.Provider value={value}>{children}</ChatbotContext.Provider>;\n}\n\nexport function useChatbotContext() {\n const context = useContext(ChatbotContext);\n if (!context) {\n throw new Error(\"useChatbotContext must be used within ChatbotProvider\");\n }\n return context;\n}\n","import {\n Bot,\n ChevronDown,\n Download,\n Ellipsis,\n Maximize2,\n MessageSquare,\n Paperclip,\n SendHorizontal,\n X,\n} from \"lucide-react\";\nimport type { ChatbotIcons, ChatbotThemeTokens } from \"../types\";\n\nexport const DEFAULT_THEME: ChatbotThemeTokens = {\n primary: \"#ffffff\",\n primaryForeground: \"#111111\",\n background: \"#0b0b0b\",\n surface: \"#111111\",\n surfaceForeground: \"#f5f5f5\",\n muted: \"#262626\",\n mutedForeground: \"#a3a3a3\",\n border: \"#2f2f2f\",\n ring: \"#737373\",\n userBubble: \"#ffffff\",\n userText: \"#111111\",\n assistantBubble: \"#2a2a2a\",\n assistantText: \"#f5f5f5\",\n radius: \"14px\",\n fontFamily: \"Inter, var(--font-sans), ui-sans-serif, system-ui, -apple-system, Segoe UI, sans-serif\",\n shadowBubble: \"0 18px 40px -16px rgba(0, 0, 0, 0.7)\",\n shadowPanel: \"0 34px 80px -36px rgba(0, 0, 0, 0.85)\",\n};\n\nexport const DEFAULT_ICONS: ChatbotIcons = {\n launcher: MessageSquare,\n launcherClosed: MessageSquare,\n launcherOpen: ChevronDown,\n close: X,\n send: SendHorizontal,\n attach: Paperclip,\n bot: Bot,\n menu: Ellipsis,\n expand: Maximize2,\n download: Download,\n};\n\nexport const DEFAULT_AGENT_NAME = \"Assistant\";\nexport const DEFAULT_ASSISTANT_NOTE = \"Here to help\";\n","import type {\n ChatbotAdapter,\n ChatbotAdapterRequestInput,\n NormalizedAssistantChunk,\n} from \"../types\";\n\nfunction extractFromRecord(record: Record<string, unknown>): string | undefined {\n const keys = [\"message\", \"text\", \"output\", \"response\", \"answer\", \"content\"];\n for (const key of keys) {\n const value = record[key];\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value;\n }\n }\n return undefined;\n}\n\nexport function defaultBuildRequest(input: ChatbotAdapterRequestInput): RequestInit & { url?: string } {\n const { files, metadata, message, headers, sessionId } = input;\n\n if (files.length > 0) {\n const formData = new FormData();\n formData.set(\"message\", message);\n formData.set(\"sessionId\", sessionId);\n formData.set(\"metadata\", JSON.stringify(metadata));\n\n files.forEach((file) => {\n formData.append(\"files[]\", file);\n });\n\n return {\n method: \"POST\",\n headers,\n body: formData,\n };\n }\n\n return {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify({\n message,\n sessionId,\n metadata,\n }),\n };\n}\n\nexport function defaultParseJsonResponse(raw: unknown): NormalizedAssistantChunk {\n if (typeof raw === \"string\") {\n return { message: raw };\n }\n\n if (Array.isArray(raw)) {\n const merged = raw\n .map((item) => {\n if (typeof item === \"string\") {\n return item;\n }\n\n if (item && typeof item === \"object\") {\n return extractFromRecord(item as Record<string, unknown>);\n }\n\n return undefined;\n })\n .filter(Boolean)\n .join(\"\\n\");\n\n return { message: merged };\n }\n\n if (raw && typeof raw === \"object\") {\n const record = raw as Record<string, unknown>;\n\n if (record.delta && typeof record.delta === \"string\") {\n return {\n delta: record.delta,\n done: Boolean(record.done),\n };\n }\n\n const text = extractFromRecord(record);\n if (text) {\n return { message: text, done: true };\n }\n\n if (record.data && typeof record.data === \"object\") {\n const nested = extractFromRecord(record.data as Record<string, unknown>);\n if (nested) {\n return { message: nested, done: true };\n }\n }\n }\n\n return { message: \"\", done: true };\n}\n\nexport function defaultParseStreamChunk(chunk: string): NormalizedAssistantChunk {\n const trimmed = chunk.trim();\n\n if (!trimmed) {\n return {};\n }\n\n if (trimmed === \"[DONE]\") {\n return { done: true };\n }\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return defaultParseJsonResponse(parsed);\n } catch {\n return { delta: trimmed };\n }\n}\n\nexport function withDefaultAdapter(adapter?: ChatbotAdapter): Required<ChatbotAdapter> {\n return {\n buildRequest: adapter?.buildRequest ?? defaultBuildRequest,\n parseJsonResponse: adapter?.parseJsonResponse ?? defaultParseJsonResponse,\n parseStreamChunk: adapter?.parseStreamChunk ?? defaultParseStreamChunk,\n };\n}\n","import type { ChatbotAdapter } from \"../types\";\n\ninterface ResponseInput {\n response: Response;\n adapter: Required<ChatbotAdapter>;\n streamingMode: \"auto\" | \"on\" | \"off\";\n onDelta: (chunk: string) => void;\n onChunk: (chunk: string) => void;\n onRecoverableError: (error: Error) => void;\n}\n\nfunction looksLikeStream(contentType: string | null) {\n if (!contentType) {\n return false;\n }\n\n const normalized = contentType.toLowerCase();\n return (\n normalized.includes(\"text/event-stream\") ||\n normalized.includes(\"application/x-ndjson\") ||\n normalized.includes(\"application/stream\")\n );\n}\n\nfunction parseAndAppend(\n rawChunk: string,\n adapter: Required<ChatbotAdapter>,\n onChunk: (chunk: string) => void,\n): { text: string; done: boolean } {\n const parsed = adapter.parseStreamChunk(rawChunk);\n onChunk(rawChunk);\n\n if (parsed.done && parsed.message) {\n return { text: parsed.message, done: true };\n }\n\n if (parsed.delta) {\n return { text: parsed.delta, done: Boolean(parsed.done) };\n }\n\n if (parsed.message) {\n return { text: parsed.message, done: Boolean(parsed.done) };\n }\n\n return { text: \"\", done: Boolean(parsed.done) };\n}\n\nasync function consumeEventStream(\n response: Response,\n adapter: Required<ChatbotAdapter>,\n onDelta: (chunk: string) => void,\n onChunk: (chunk: string) => void,\n): Promise<string> {\n const reader = response.body?.getReader();\n if (!reader) {\n return \"\";\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let fullText = \"\";\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n if (result.done) {\n break;\n }\n\n buffer += decoder.decode(result.value, { stream: true });\n\n while (buffer.includes(\"\\n\\n\")) {\n const index = buffer.indexOf(\"\\n\\n\");\n const block = buffer.slice(0, index);\n buffer = buffer.slice(index + 2);\n\n const lines = block.split(\"\\n\").filter((line) => line.startsWith(\"data:\"));\n for (const line of lines) {\n const data = line.slice(5).trim();\n const parsed = parseAndAppend(data, adapter, onChunk);\n if (parsed.text) {\n fullText += parsed.text;\n onDelta(parsed.text);\n }\n if (parsed.done) {\n done = true;\n break;\n }\n }\n }\n }\n\n if (buffer.trim()) {\n const fallback = parseAndAppend(buffer.trim(), adapter, onChunk);\n if (fallback.text) {\n fullText += fallback.text;\n onDelta(fallback.text);\n }\n }\n\n return fullText;\n}\n\nasync function consumeLineStream(\n response: Response,\n adapter: Required<ChatbotAdapter>,\n onDelta: (chunk: string) => void,\n onChunk: (chunk: string) => void,\n): Promise<string> {\n const reader = response.body?.getReader();\n if (!reader) {\n return \"\";\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let fullText = \"\";\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n if (result.done) {\n break;\n }\n\n buffer += decoder.decode(result.value, { stream: true });\n\n while (buffer.includes(\"\\n\")) {\n const index = buffer.indexOf(\"\\n\");\n const line = buffer.slice(0, index).trim();\n buffer = buffer.slice(index + 1);\n\n if (!line) {\n continue;\n }\n\n const parsed = parseAndAppend(line, adapter, onChunk);\n if (parsed.text) {\n fullText += parsed.text;\n onDelta(parsed.text);\n }\n if (parsed.done) {\n done = true;\n break;\n }\n }\n }\n\n if (buffer.trim()) {\n const parsed = parseAndAppend(buffer.trim(), adapter, onChunk);\n if (parsed.text) {\n fullText += parsed.text;\n onDelta(parsed.text);\n }\n }\n\n return fullText;\n}\n\nasync function parseNonStreaming(response: Response, adapter: Required<ChatbotAdapter>) {\n const contentType = response.headers.get(\"content-type\") || \"\";\n\n if (contentType.includes(\"application/json\")) {\n const payload = (await response.json()) as unknown;\n const parsed = adapter.parseJsonResponse(payload);\n return parsed.message ?? parsed.delta ?? \"\";\n }\n\n const rawText = await response.text();\n try {\n const parsedPayload = JSON.parse(rawText) as unknown;\n const parsed = adapter.parseJsonResponse(parsedPayload);\n return parsed.message ?? parsed.delta ?? rawText;\n } catch {\n const parsed = adapter.parseJsonResponse(rawText);\n return parsed.message ?? rawText;\n }\n}\n\nexport async function readAssistantResponse({\n response,\n adapter,\n streamingMode,\n onDelta,\n onChunk,\n onRecoverableError,\n}: ResponseInput): Promise<string> {\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`Webhook request failed (${response.status}): ${body}`);\n }\n\n const contentType = response.headers.get(\"content-type\");\n const streamEligible = streamingMode !== \"off\" && Boolean(response.body);\n const shouldStream = streamEligible && (streamingMode === \"on\" || looksLikeStream(contentType));\n\n if (!shouldStream) {\n return parseNonStreaming(response, adapter);\n }\n\n try {\n if ((contentType || \"\").toLowerCase().includes(\"text/event-stream\")) {\n return await consumeEventStream(response, adapter, onDelta, onChunk);\n }\n\n return await consumeLineStream(response, adapter, onDelta, onChunk);\n } catch (error) {\n onRecoverableError(error as Error);\n return \"\";\n }\n}","export function createId(prefix = \"cb\") {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return `${prefix}-${crypto.randomUUID()}`;\n }\n\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}","const SESSION_KEY = \"cb:session-id\";\n\nfunction createSessionId() {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n\n return `cb-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function getOrCreateSessionId(storage: Storage | undefined): string {\n if (!storage) {\n return createSessionId();\n }\n\n const existing = storage.getItem(SESSION_KEY);\n if (existing) {\n return existing;\n }\n\n const created = createSessionId();\n storage.setItem(SESSION_KEY, created);\n return created;\n}\n\nexport function resetSessionId(storage: Storage | undefined): string {\n const next = createSessionId();\n if (storage) {\n storage.setItem(SESSION_KEY, next);\n }\n return next;\n}\n\nexport function historyKey(sessionId: string) {\n return `cb:history:${sessionId}`;\n}","import { DEFAULT_THEME } from \"./defaults\";\nimport type { ChatbotThemeTokens } from \"../types\";\n\nexport function resolveThemeTokens(explicit?: Partial<ChatbotThemeTokens>): ChatbotThemeTokens {\n return {\n ...DEFAULT_THEME,\n ...(explicit ?? {}),\n };\n}\n\nexport function toThemeCssVars(tokens: ChatbotThemeTokens): Record<string, string> {\n return {\n \"--cb-primary\": tokens.primary,\n \"--cb-primary-foreground\": tokens.primaryForeground,\n \"--cb-background\": tokens.background,\n \"--cb-surface\": tokens.surface,\n \"--cb-surface-foreground\": tokens.surfaceForeground,\n \"--cb-muted\": tokens.muted,\n \"--cb-muted-foreground\": tokens.mutedForeground,\n \"--cb-border\": tokens.border,\n \"--cb-ring\": tokens.ring,\n \"--cb-user-bubble\": tokens.userBubble,\n \"--cb-user-text\": tokens.userText,\n \"--cb-assistant-bubble\": tokens.assistantBubble,\n \"--cb-assistant-text\": tokens.assistantText,\n \"--cb-radius\": tokens.radius,\n \"--cb-font-family\": tokens.fontFamily,\n \"--cb-shadow-bubble\": tokens.shadowBubble,\n \"--cb-shadow-panel\": tokens.shadowPanel,\n };\n}\n","import clsx from \"clsx\";\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type CSSProperties,\n type FormEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n} from \"react\";\nimport type { ChatMessage } from \"../types\";\nimport { useChatbotContext } from \"../context/chatbot-context\";\nimport { AwaitingDots } from \"./awaiting-dots\";\nimport { MessageMarkdown } from \"./message-markdown\";\n\nconst PANEL_INSET_REM = 1.5;\nconst EXPANDED_MAX_WIDTH_PX = 630;\nconst MOBILE_BREAKPOINT_PX = 768;\nconst ROOT_BOTTOM_OFFSET_REM = 1.5; // cb-bottom-6\nconst PANEL_TO_BUBBLE_GAP_REM = 0.75; // cb-gap-3\nconst BUBBLE_SIZE_REM = 3.5; // cb-h-14\nconst EXPANDED_BOTTOM_OFFSET_REM = ROOT_BOTTOM_OFFSET_REM + PANEL_TO_BUBBLE_GAP_REM + BUBBLE_SIZE_REM;\nconst EXPANDED_TOTAL_VERTICAL_INSET_REM = PANEL_INSET_REM + EXPANDED_BOTTOM_OFFSET_REM;\n\nfunction formatFileSize(size: number) {\n if (size < 1024) {\n return `${size} B`;\n }\n if (size < 1024 * 1024) {\n return `${(size / 1024).toFixed(1)} KB`;\n }\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction formatGmtOffset(date: Date) {\n const total = -date.getTimezoneOffset();\n const sign = total >= 0 ? \"+\" : \"-\";\n const abs = Math.abs(total);\n const hh = String(Math.floor(abs / 60)).padStart(2, \"0\");\n const mm = String(abs % 60).padStart(2, \"0\");\n return `GMT${sign}${hh}${mm}`;\n}\n\nfunction readTimeZoneName(date: Date, mode: \"long\" | \"short\") {\n const parts = new Intl.DateTimeFormat(undefined, { timeZoneName: mode }).formatToParts(date);\n return parts.find((part) => part.type === \"timeZoneName\")?.value ?? \"\";\n}\n\nfunction formatTranscriptDateTime(date: Date) {\n const datePart = new Intl.DateTimeFormat(undefined, {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n }).format(date);\n const timePart = new Intl.DateTimeFormat(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: true,\n }).format(date);\n const zoneLong = readTimeZoneName(date, \"long\");\n const zoneShort = readTimeZoneName(date, \"short\");\n const gmtOffset = formatGmtOffset(date);\n return `${datePart} at ${timePart} ${zoneLong} time ${zoneShort} (${gmtOffset})`.replace(/\\s+/g, \" \").trim();\n}\n\nfunction formatTranscriptMessageTime(value: string) {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n\n return new Intl.DateTimeFormat(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: true,\n }).format(date);\n}\n\nfunction toTranscript(messages: ChatMessage[], agentName: string) {\n const exportedAt = new Date();\n const firstDate =\n messages.length > 0 ? new Date(messages[0].createdAt) : exportedAt;\n const startedAt = Number.isNaN(firstDate.getTime()) ? exportedAt : firstDate;\n\n const lines: string[] = [\n `Conversation with ${agentName}`,\n `Started on ${formatTranscriptDateTime(startedAt)}`,\n \"\",\n \"---\",\n \"\",\n ];\n\n messages.forEach((message) => {\n const role = message.role === \"user\" ? \"Visitor\" : message.role === \"assistant\" ? agentName : \"System\";\n const content = message.content.trim();\n if (!content) {\n return;\n }\n\n lines.push(`${formatTranscriptMessageTime(message.createdAt)} | ${role}: ${content}`);\n lines.push(\"\");\n });\n\n lines.push(\"---\");\n lines.push(`Exported from ${agentName} on ${formatTranscriptDateTime(exportedAt)}`);\n\n return lines.join(\"\\n\");\n}\n\nfunction toTranscriptFilename(date: Date) {\n const yyyy = date.getFullYear();\n const mm = String(date.getMonth() + 1).padStart(2, \"0\");\n const dd = String(date.getDate()).padStart(2, \"0\");\n const hh = String(date.getHours()).padStart(2, \"0\");\n const min = String(date.getMinutes()).padStart(2, \"0\");\n const ss = String(date.getSeconds()).padStart(2, \"0\");\n return `chat-transcript-${yyyy}${mm}${dd}-${hh}${min}${ss}.txt`;\n}\n\nexport function ChatbotWidget() {\n const {\n isOpen,\n isAwaiting,\n messages,\n uploadEnabled,\n position,\n agentName,\n assistantNote,\n disclaimerText,\n themeVars,\n icons,\n classNames,\n close,\n open,\n sendMessage,\n widgetEnabled,\n } = useChatbotContext();\n\n const [inputValue, setInputValue] = useState(\"\");\n const [queuedFiles, setQueuedFiles] = useState<File[]>([]);\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [isExpanded, setIsExpanded] = useState(false);\n const [isMobileViewport, setIsMobileViewport] = useState(false);\n\n const panelRef = useRef<HTMLDivElement>(null);\n const messagesScrollRef = useRef<HTMLElement>(null);\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n const LauncherClosedIcon = icons.launcherClosed;\n const LauncherOpenIcon = icons.launcherOpen;\n const BotIcon = icons.bot;\n const MenuIcon = icons.menu;\n const CloseIcon = icons.close;\n const SendIcon = icons.send;\n const AttachIcon = icons.attach;\n const ExpandIcon = icons.expand;\n const DownloadIcon = icons.download;\n\n const alignment = position === \"bottom-left\" ? \"cb-left-6\" : \"cb-right-6\";\n const stackAlignment = position === \"bottom-left\" ? \"cb-items-start\" : \"cb-items-end\";\n const panelOrigin = position === \"bottom-left\" ? \"cb-origin-bottom-left\" : \"cb-origin-bottom-right\";\n const panelLayoutMode = isMobileViewport ? \"mobile\" : isExpanded ? \"desktop-expanded\" : \"desktop-collapsed\";\n const showExpandAction = !isMobileViewport;\n const showDownloadAction = messages.length > 0;\n const hasMenuActions = showExpandAction || showDownloadAction;\n\n const canSend = useMemo(() => {\n return !isAwaiting && (inputValue.trim().length > 0 || queuedFiles.length > 0);\n }, [inputValue, isAwaiting, queuedFiles.length]);\n\n const resizeComposer = () => {\n const textarea = inputRef.current;\n if (!textarea) {\n return;\n }\n\n if (textarea.value.length === 0) {\n textarea.style.height = \"38px\";\n textarea.style.overflowY = \"hidden\";\n return;\n }\n\n const maxHeightPx = 168;\n textarea.style.height = \"auto\";\n const nextHeight = Math.min(textarea.scrollHeight, maxHeightPx);\n textarea.style.height = `${nextHeight}px`;\n textarea.style.overflowY = textarea.scrollHeight > maxHeightPx ? \"auto\" : \"hidden\";\n };\n\n const scrollMessagesToBottom = () => {\n const container = messagesScrollRef.current;\n if (!container) {\n return;\n }\n\n container.scrollTop = container.scrollHeight;\n };\n\n const panelSize = useMemo<{ className: string; style?: CSSProperties }>(() => {\n const inset = `${PANEL_INSET_REM}rem`;\n\n if (panelLayoutMode === \"mobile\") {\n return {\n className: \"cb-fixed cb-max-h-none cb-max-w-none\",\n style: {\n top: inset,\n right: inset,\n bottom: `${EXPANDED_BOTTOM_OFFSET_REM}rem`,\n left: inset,\n },\n };\n }\n\n if (panelLayoutMode === \"desktop-expanded\") {\n return {\n className: \"cb-relative cb-max-h-none cb-max-w-none\",\n style: {\n width: `min(${EXPANDED_MAX_WIDTH_PX}px, calc(100vw - ${PANEL_INSET_REM * 2}rem))`,\n height: `calc(100vh - ${EXPANDED_TOTAL_VERTICAL_INSET_REM}rem)`,\n },\n };\n }\n\n return {\n className: \"cb-relative cb-h-[min(680px,calc(100vh-7.5rem))] cb-w-[min(92vw,420px)]\",\n style: undefined,\n };\n }, [panelLayoutMode]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const mediaQuery = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT_PX}px)`);\n const syncViewportMode = () => {\n setIsMobileViewport(mediaQuery.matches);\n };\n\n syncViewportMode();\n\n if (typeof mediaQuery.addEventListener === \"function\") {\n mediaQuery.addEventListener(\"change\", syncViewportMode);\n return () => mediaQuery.removeEventListener(\"change\", syncViewportMode);\n }\n\n mediaQuery.addListener(syncViewportMode);\n return () => mediaQuery.removeListener(syncViewportMode);\n }, []);\n\n useEffect(() => {\n if (!isOpen) {\n setIsMenuOpen(false);\n return;\n }\n\n inputRef.current?.focus();\n resizeComposer();\n }, [isOpen]);\n\n useEffect(() => {\n resizeComposer();\n }, [inputValue]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const rafId = window.requestAnimationFrame(() => {\n scrollMessagesToBottom();\n });\n\n return () => window.cancelAnimationFrame(rafId);\n }, [isOpen, messages, isAwaiting]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const onPointerDown = (event: MouseEvent) => {\n const target = event.target as Node;\n if (menuRef.current && !menuRef.current.contains(target)) {\n setIsMenuOpen(false);\n }\n };\n\n window.addEventListener(\"mousedown\", onPointerDown);\n return () => window.removeEventListener(\"mousedown\", onPointerDown);\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const onKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n if (isMenuOpen) {\n setIsMenuOpen(false);\n return;\n }\n close();\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [close, isMenuOpen, isOpen]);\n\n useEffect(() => {\n setIsMenuOpen(false);\n }, [isMobileViewport]);\n\n useEffect(() => {\n if (!hasMenuActions) {\n setIsMenuOpen(false);\n }\n }, [hasMenuActions]);\n\n const trapFocus = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.key !== \"Tab\") {\n return;\n }\n\n const root = panelRef.current;\n if (!root) {\n return;\n }\n\n const focusables = root.querySelectorAll<HTMLElement>(\n \"button, [href], textarea, input, select, [tabindex]:not([tabindex='-1'])\",\n );\n\n if (focusables.length === 0) {\n return;\n }\n\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n\n if (event.shiftKey && document.activeElement === first) {\n last.focus();\n event.preventDefault();\n } else if (!event.shiftKey && document.activeElement === last) {\n first.focus();\n event.preventDefault();\n }\n };\n\n const onSubmit = async (event: FormEvent) => {\n event.preventDefault();\n if (!canSend) {\n return;\n }\n\n const submittedText = inputValue;\n setInputValue(\"\");\n scrollMessagesToBottom();\n\n await sendMessage({\n text: submittedText,\n files: uploadEnabled ? queuedFiles : [],\n });\n\n setQueuedFiles([]);\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n };\n\n const onPickFiles = (event: ChangeEvent<HTMLInputElement>) => {\n const list = event.target.files;\n if (!list || !uploadEnabled) {\n return;\n }\n\n const files = Array.from(list);\n setQueuedFiles((current) => {\n const seen = new Set(current.map((file) => `${file.name}:${file.size}:${file.lastModified}`));\n const next = [...current];\n\n files.forEach((file) => {\n const key = `${file.name}:${file.size}:${file.lastModified}`;\n if (!seen.has(key)) {\n seen.add(key);\n next.push(file);\n }\n });\n\n return next;\n });\n };\n\n const createIdFromFile = (file: File) => `${file.name}:${file.size}:${file.lastModified}`;\n\n const removeQueuedFile = (fileId: string) => {\n setQueuedFiles((current) => current.filter((file) => createIdFromFile(file) !== fileId));\n };\n\n const downloadTranscript = () => {\n if (messages.length === 0) {\n return;\n }\n\n const now = new Date();\n const fileContent = toTranscript(messages, agentName);\n const blob = new Blob([fileContent], { type: \"text/plain;charset=utf-8\" });\n const objectUrl = URL.createObjectURL(blob);\n\n const anchor = document.createElement(\"a\");\n anchor.href = objectUrl;\n anchor.download = toTranscriptFilename(now);\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n URL.revokeObjectURL(objectUrl);\n\n setIsMenuOpen(false);\n };\n\n const toggleExpanded = () => {\n if (isMobileViewport) {\n return;\n }\n\n setIsExpanded((current) => !current);\n setIsMenuOpen(false);\n };\n\n if (!widgetEnabled) {\n return null;\n }\n\n return (\n <div\n className={clsx(\n \"cb-fixed cb-bottom-6 cb-z-[2147483640] cb-text-[var(--cb-surface-foreground)]\",\n alignment,\n classNames.root,\n )}\n style={themeVars}\n data-chatbot-root\n >\n <div className={clsx(\"cb-pointer-events-none cb-relative cb-flex cb-flex-col cb-gap-3\", stackAlignment)}>\n <div\n ref={panelRef}\n className={clsx(\n \"cb-panel-transition cb-pointer-events-auto cb-flex cb-flex-col cb-overflow-hidden cb-rounded-[var(--cb-radius)] cb-border cb-border-[var(--cb-border)] cb-bg-[var(--cb-surface)] cb-shadow-[var(--cb-shadow-panel)]\",\n panelOrigin,\n panelSize.className,\n isOpen ? \"cb-panel-open\" : \"cb-panel-closed cb-pointer-events-none\",\n classNames.panel,\n )}\n style={panelSize.style}\n aria-hidden={!isOpen}\n onKeyDown={trapFocus}\n >\n <header\n className={clsx(\n \"cb-flex cb-items-center cb-justify-between cb-gap-2 cb-border-b cb-border-[var(--cb-border)] cb-bg-[var(--cb-surface)] cb-px-4 cb-py-3.5\",\n classNames.header,\n )}\n style={{\n borderBottomWidth: \"1px\",\n borderBottomStyle: \"solid\",\n borderBottomColor: \"var(--cb-border)\",\n }}\n >\n <div className={clsx(\"cb-flex cb-min-w-0 cb-items-center cb-gap-2.5\", classNames.headerMeta)}>\n <span className=\"cb-inline-flex cb-h-9 cb-w-9 cb-shrink-0 cb-items-center cb-justify-center cb-self-center cb-text-[var(--cb-surface-foreground)]\">\n <BotIcon size={34} />\n </span>\n <div className=\"cb-min-w-0 cb-space-y-0\">\n <p className=\"cb-m-0 cb-truncate cb-text-lg cb-font-semibold cb-leading-6 cb-text-[var(--cb-surface-foreground)]\">\n {agentName}\n </p>\n <p className=\"cb-m-0 cb-text-base cb-leading-5 cb-text-[var(--cb-muted-foreground)]\">{assistantNote}</p>\n </div>\n </div>\n\n <div ref={menuRef} className=\"cb-relative cb-flex cb-items-center cb-gap-1\">\n {hasMenuActions && (\n <button\n type=\"button\"\n onClick={() => setIsMenuOpen((current) => !current)}\n className={clsx(\n \"cb-flex cb-h-9 cb-w-9 cb-shrink-0 cb-items-center cb-justify-center cb-rounded-lg cb-bg-transparent cb-p-0 cb-text-[var(--cb-muted-foreground)] cb-transition hover:cb-bg-[var(--cb-muted)] hover:cb-text-white focus-visible:cb-bg-[var(--cb-muted)] focus-visible:cb-text-white\",\n isMenuOpen && \"cb-bg-[var(--cb-muted)] cb-text-white\",\n )}\n aria-label=\"More options\"\n aria-expanded={isMenuOpen}\n >\n <MenuIcon size={18} />\n </button>\n )}\n\n {isMenuOpen && hasMenuActions && (\n <div\n className={clsx(\n \"cb-absolute cb-right-0 cb-top-full cb-z-20 cb-mt-2 cb-flex cb-min-w-[220px] cb-flex-col cb-gap-1 cb-rounded-xl cb-border cb-border-[var(--cb-border)] cb-bg-[var(--cb-surface)] cb-p-1.5 cb-shadow-[var(--cb-shadow-panel)]\",\n classNames.menu,\n )}\n >\n {showExpandAction && (\n <button\n type=\"button\"\n onClick={toggleExpanded}\n className={clsx(\n \"cb-flex cb-w-full cb-items-center cb-gap-2 cb-rounded-lg cb-bg-transparent cb-px-3.5 cb-py-2.5 cb-text-left cb-text-sm cb-text-[var(--cb-muted-foreground)] cb-transition hover:cb-bg-[var(--cb-muted)] hover:cb-text-white focus-visible:cb-bg-[var(--cb-muted)] focus-visible:cb-text-white\",\n classNames.menuItem,\n )}\n >\n <ExpandIcon size={16} />\n <span>{isExpanded ? \"Restore window\" : \"Expand window\"}</span>\n </button>\n )}\n\n {showDownloadAction && (\n <button\n type=\"button\"\n onClick={downloadTranscript}\n className={clsx(\n \"cb-flex cb-w-full cb-items-center cb-gap-2 cb-rounded-lg cb-bg-transparent cb-px-3.5 cb-py-2.5 cb-text-left cb-text-sm cb-text-[var(--cb-muted-foreground)] cb-transition hover:cb-bg-[var(--cb-muted)] hover:cb-text-white focus-visible:cb-bg-[var(--cb-muted)] focus-visible:cb-text-white\",\n classNames.menuItem,\n )}\n >\n <DownloadIcon size={16} />\n <span>Download transcript</span>\n </button>\n )}\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={close}\n className=\"cb-flex cb-h-9 cb-w-9 cb-shrink-0 cb-items-center cb-justify-center cb-rounded-lg cb-bg-transparent cb-p-0 cb-text-[var(--cb-muted-foreground)] cb-transition hover:cb-bg-[var(--cb-muted)] hover:cb-text-white focus-visible:cb-bg-[var(--cb-muted)] focus-visible:cb-text-white\"\n aria-label=\"Close chatbot\"\n >\n <CloseIcon size={18} />\n </button>\n </div>\n </header>\n\n <section\n ref={messagesScrollRef}\n className={clsx(\n \"cb-chat-scroll cb-flex-1 cb-overflow-y-auto cb-scroll-smooth cb-bg-[var(--cb-background)] cb-px-4 cb-pt-4 cb-pb-36\",\n classNames.body,\n )}\n >\n <div className=\"cb-space-y-3.5\">\n {messages.length === 0 && (\n <div className=\"cb-rounded-xl cb-bg-[var(--cb-muted)] cb-p-3 cb-text-sm cb-text-[var(--cb-muted-foreground)]\">\n Ask anything about this company and the assistant will answer using your RAG knowledge base.\n </div>\n )}\n\n {messages.map((message) => {\n const isUser = message.role === \"user\";\n\n return (\n <article\n key={message.id}\n className={clsx(\n \"cb-flex\",\n isUser ? \"cb-justify-end cb-animate-cb-slide-fade-in-right\" : \"cb-justify-start cb-animate-cb-slide-fade-in-left\",\n )}\n >\n <div\n className={clsx(\n \"cb-max-w-[85%] cb-rounded-2xl cb-px-4 cb-py-2\",\n isUser\n ? \"cb-rounded-br-md cb-bg-[var(--cb-user-bubble)] cb-text-[var(--cb-user-text)]\"\n : \"cb-rounded-bl-md cb-bg-[var(--cb-assistant-bubble)] cb-text-[var(--cb-assistant-text)]\",\n )}\n >\n {message.role === \"assistant\" && message.status === \"streaming\" && !message.content ? (\n <AwaitingDots />\n ) : message.role === \"assistant\" ? (\n <MessageMarkdown content={message.content} />\n ) : (\n <p className=\"cb-message-text cb-m-0 cb-whitespace-pre-wrap cb-text-base cb-leading-6\">\n {message.content}\n </p>\n )}\n\n {message.attachments && message.attachments.length > 0 && (\n <div className=\"cb-mt-2 cb-flex cb-flex-wrap cb-gap-2\">\n {message.attachments.map((attachment) => (\n <span\n key={attachment.id}\n className=\"cb-inline-flex cb-items-center cb-gap-2 cb-rounded-full cb-bg-black/10 cb-px-2 cb-py-1 cb-text-xs\"\n >\n <span>{attachment.name}</span>\n <span className=\"cb-opacity-70\">{formatFileSize(attachment.size)}</span>\n </span>\n ))}\n </div>\n )}\n </div>\n </article>\n );\n })}\n\n <div />\n </div>\n </section>\n\n <footer\n className={clsx(\n \"cb-absolute cb-bottom-4 cb-left-4 cb-right-4 cb-z-10 cb-bg-transparent cb-p-0\",\n classNames.footer,\n )}\n >\n {uploadEnabled && queuedFiles.length > 0 && (\n <div className=\"cb-mb-2 cb-flex cb-flex-wrap cb-gap-2\">\n {queuedFiles.map((file) => {\n const fileId = createIdFromFile(file);\n return (\n <button\n type=\"button\"\n key={fileId}\n className=\"cb-inline-flex cb-items-center cb-gap-2 cb-rounded-full cb-bg-[var(--cb-muted)] cb-px-3 cb-py-1 cb-text-xs cb-text-[var(--cb-muted-foreground)]\"\n onClick={() => removeQueuedFile(fileId)}\n aria-label={`Remove ${file.name}`}\n >\n <span className=\"cb-max-w-[140px] cb-truncate\">{file.name}</span>\n <span>x</span>\n </button>\n );\n })}\n </div>\n )}\n\n <form onSubmit={onSubmit}>\n <div\n className={clsx(\n \"cb-flex cb-items-end cb-gap-2 cb-rounded-2xl cb-bg-[var(--cb-surface)] cb-p-2 cb-shadow-[0_18px_35px_-24px_rgba(0,0,0,0.85)] cb-transition\",\n classNames.composer,\n )}\n >\n {uploadEnabled && (\n <>\n <input\n type=\"file\"\n multiple\n ref={fileInputRef}\n className=\"cb-hidden\"\n onChange={onPickFiles}\n aria-label=\"Add attachments\"\n />\n <button\n type=\"button\"\n className=\"cb-flex cb-h-10 cb-w-10 cb-shrink-0 cb-items-center cb-justify-center cb-rounded-lg cb-bg-transparent cb-p-0 cb-text-[var(--cb-muted-foreground)] cb-transition hover:cb-bg-[var(--cb-muted)] hover:cb-text-white focus-visible:cb-bg-[var(--cb-muted)] focus-visible:cb-text-white\"\n onClick={() => fileInputRef.current?.click()}\n aria-label=\"Attach files\"\n >\n <AttachIcon size={18} />\n </button>\n </>\n )}\n\n <div className=\"cb-flex-1\">\n <textarea\n ref={inputRef}\n value={inputValue}\n onChange={(event) => setInputValue(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n void onSubmit(event);\n }\n }}\n rows={1}\n placeholder=\"Ask a question...\"\n className={clsx(\n \"cb-composer-input cb-min-h-[38px] cb-w-full cb-resize-none cb-bg-transparent cb-px-2 cb-py-1.5 cb-text-sm cb-leading-6 cb-text-[var(--cb-surface-foreground)] cb-outline-none placeholder:cb-text-[var(--cb-muted-foreground)]\",\n classNames.input,\n )}\n />\n </div>\n\n <button\n type=\"submit\"\n disabled={!canSend}\n className={clsx(\n \"cb-flex cb-h-10 cb-w-10 cb-shrink-0 cb-items-center cb-justify-center cb-rounded-full cb-bg-white cb-p-0 cb-text-[#111111] cb-transition cb-duration-200 hover:cb-scale-105 hover:cb-brightness-95 hover:cb-text-[#111111] active:cb-scale-95 focus-visible:cb-text-[#111111] disabled:cb-cursor-not-allowed disabled:cb-bg-white/70 disabled:cb-text-[#111111] disabled:cb-opacity-100\",\n classNames.sendButton,\n )}\n aria-label=\"Send message\"\n >\n <SendIcon size={18} />\n </button>\n </div>\n <p className=\"cb-m-0 cb-mt-1 cb-px-1 cb-text-center cb-text-xs cb-leading-4 cb-text-[var(--cb-muted-foreground)]\">\n {disclaimerText}\n </p>\n </form>\n </footer>\n </div>\n\n <button\n type=\"button\"\n onClick={isOpen ? close : open}\n className={clsx(\n \"cb-pointer-events-auto cb-group cb-flex cb-h-14 cb-w-14 cb-items-center cb-justify-center cb-rounded-full cb-border cb-border-[var(--cb-border)] cb-bg-[#111111] cb-text-[#f5f5f5] cb-shadow-[var(--cb-shadow-bubble)] cb-transition cb-duration-300 hover:cb-scale-110 hover:cb-bg-[#262626] hover:cb-shadow-[0_24px_50px_-18px_rgba(0,0,0,0.9)] active:cb-scale-95\",\n classNames.bubble,\n )}\n aria-label={isOpen ? \"Close chatbot\" : \"Open chatbot\"}\n >\n <span className=\"cb-relative cb-flex cb-h-6 cb-w-6 cb-items-center cb-justify-center\">\n <LauncherClosedIcon\n size={22}\n className={clsx(\n \"cb-launcher-icon-transition cb-absolute cb-fill-current\",\n isOpen ? \"cb-rotate-90 cb-opacity-0\" : \"cb-rotate-0 cb-opacity-100\",\n )}\n />\n <LauncherOpenIcon\n size={22}\n className={clsx(\n \"cb-launcher-icon-transition cb-absolute\",\n isOpen ? \"cb-rotate-0 cb-opacity-100\" : \"-cb-rotate-90 cb-opacity-0\",\n )}\n />\n </span>\n </button>\n </div>\n </div>\n );\n}\n","export function AwaitingDots() {\n return (\n <div className=\"cb-inline-flex cb-items-center cb-gap-1 cb-px-1\" aria-label=\"Assistant is typing\">\n <span className=\"cb-h-1.5 cb-w-1.5 cb-rounded-full cb-bg-[var(--cb-muted-foreground)] cb-opacity-70 cb-animate-cb-dots [animation-delay:-0.2s]\" />\n <span className=\"cb-h-1.5 cb-w-1.5 cb-rounded-full cb-bg-[var(--cb-muted-foreground)] cb-opacity-70 cb-animate-cb-dots [animation-delay:-0.1s]\" />\n <span className=\"cb-h-1.5 cb-w-1.5 cb-rounded-full cb-bg-[var(--cb-muted-foreground)] cb-opacity-70 cb-animate-cb-dots\" />\n </div>\n );\n}","import ReactMarkdown from \"react-markdown\";\nimport rehypeSanitize from \"rehype-sanitize\";\nimport remarkGfm from \"remark-gfm\";\n\ninterface MessageMarkdownProps {\n content: string;\n}\n\nexport function MessageMarkdown({ content }: MessageMarkdownProps) {\n return (\n <div className=\"cb-markdown cb-message-text cb-text-base cb-leading-6\">\n <ReactMarkdown remarkPlugins={[remarkGfm]} rehypePlugins={[rehypeSanitize]}>\n {content}\n </ReactMarkdown>\n </div>\n );\n}\n","import { useEffect, useMemo, useRef } from \"react\";\nimport type { PageConfigOverrides } from \"../types\";\nimport { useChatbotContext } from \"../context/chatbot-context\";\nimport { createId } from \"../lib/id\";\n\nexport function ChatbotPageConfig(props: PageConfigOverrides) {\n const { registerPageConfig, unregisterPageConfig } = useChatbotContext();\n const configId = useRef(createId(\"pagecfg\"));\n const stableConfig = useMemo(() => props, [props]);\n\n useEffect(() => {\n registerPageConfig(configId.current, stableConfig);\n return () => unregisterPageConfig(configId.current);\n }, [registerPageConfig, stableConfig, unregisterPageConfig]);\n\n return null;\n}","import { useChatbotContext } from \"../context/chatbot-context\";\n\nexport function useChatbot() {\n return useChatbotContext();\n}","import { useMemo } from \"react\";\nimport { useChatbotContext } from \"../context/chatbot-context\";\n\nexport function useChatbotSession() {\n const { sessionId, resetSession } = useChatbotContext();\n\n return useMemo(\n () => ({\n sessionId,\n resetSession,\n }),\n [resetSession, sessionId],\n );\n}"],"mappings":"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","names":["useEffect","useMemo","useRef","useState","jsx","jsx","jsx","jsxs","useState","useRef","useMemo","useEffect","useEffect","useMemo","useRef","useRef","useMemo","useEffect","useMemo","useMemo"]}
|
package/dist/styles.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.cb-pointer-events-none{pointer-events:none}.cb-pointer-events-auto{pointer-events:auto}.cb-fixed{position:fixed}.cb-absolute{position:absolute}.cb-relative{position:relative}.cb-bottom-4{bottom:1rem}.cb-bottom-6{bottom:1.5rem}.cb-left-4{left:1rem}.cb-left-6{left:1.5rem}.cb-right-0{right:0}.cb-right-4{right:1rem}.cb-right-6{right:1.5rem}.cb-top-full{top:100%}.cb-z-10{z-index:10}.cb-z-20{z-index:20}.cb-z-\[2147483640\]{z-index:2147483640}.cb-m-0{margin:0}.cb-mb-2{margin-bottom:.5rem}.cb-mt-1{margin-top:.25rem}.cb-mt-2{margin-top:.5rem}.cb-flex{display:flex}.cb-inline-flex{display:inline-flex}.cb-hidden{display:none}.cb-h-1\.5{height:.375rem}.cb-h-10{height:2.5rem}.cb-h-14{height:3.5rem}.cb-h-6{height:1.5rem}.cb-h-9{height:2.25rem}.cb-h-\[min\(680px\,calc\(100vh-7\.5rem\)\)\]{height:min(680px,calc(100vh - 7.5rem))}.cb-max-h-none{max-height:none}.cb-min-h-\[38px\]{min-height:38px}.cb-w-1\.5{width:.375rem}.cb-w-10{width:2.5rem}.cb-w-14{width:3.5rem}.cb-w-6{width:1.5rem}.cb-w-9{width:2.25rem}.cb-w-\[min\(92vw\,420px\)\]{width:min(92vw,420px)}.cb-w-full{width:100%}.cb-min-w-0{min-width:0}.cb-min-w-\[220px\]{min-width:220px}.cb-max-w-\[140px\]{max-width:140px}.cb-max-w-\[85\%\]{max-width:85%}.cb-max-w-none{max-width:none}.cb-flex-1{flex:1 1 0%}.cb-shrink-0{flex-shrink:0}.cb-origin-bottom-left{transform-origin:bottom left}.cb-origin-bottom-right{transform-origin:bottom right}.cb-translate-y-0{--tw-translate-y:0px}.cb-translate-y-0,.cb-translate-y-3{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cb-translate-y-3{--tw-translate-y:0.75rem}.-cb-rotate-90{--tw-rotate:-90deg}.-cb-rotate-90,.cb-rotate-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cb-rotate-0{--tw-rotate:0deg}.cb-rotate-90{--tw-rotate:90deg}.cb-rotate-90,.cb-scale-100{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cb-scale-100{--tw-scale-x:1;--tw-scale-y:1}.cb-scale-90{--tw-scale-x:.9;--tw-scale-y:.9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cb-resize-none{resize:none}.cb-flex-col{flex-direction:column}.cb-flex-wrap{flex-wrap:wrap}.cb-items-start{align-items:flex-start}.cb-items-end{align-items:flex-end}.cb-items-center{align-items:center}.cb-justify-start{justify-content:flex-start}.cb-justify-end{justify-content:flex-end}.cb-justify-center{justify-content:center}.cb-justify-between{justify-content:space-between}.cb-gap-1{gap:.25rem}.cb-gap-2{gap:.5rem}.cb-gap-2\.5{gap:.625rem}.cb-gap-3{gap:.75rem}.cb-space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.cb-space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.cb-self-center{align-self:center}.cb-overflow-hidden{overflow:hidden}.cb-overflow-y-auto{overflow-y:auto}.cb-scroll-smooth{scroll-behavior:smooth}.cb-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cb-whitespace-pre-wrap{white-space:pre-wrap}.cb-rounded-2xl{border-radius:1rem}.cb-rounded-\[var\(--cb-radius\)\]{border-radius:var(--cb-radius)}.cb-rounded-full{border-radius:9999px}.cb-rounded-lg{border-radius:.5rem}.cb-rounded-xl{border-radius:.75rem}.cb-rounded-bl-md{border-bottom-left-radius:.375rem}.cb-rounded-br-md{border-bottom-right-radius:.375rem}.cb-border{border-width:1px}.cb-border-b{border-bottom-width:1px}.cb-border-\[var\(--cb-border\)\]{border-color:var(--cb-border)}.cb-bg-\[\#111111\]{--tw-bg-opacity:1;background-color:rgb(17 17 17/var(--tw-bg-opacity,1))}.cb-bg-\[var\(--cb-assistant-bubble\)\]{background-color:var(--cb-assistant-bubble)}.cb-bg-\[var\(--cb-background\)\]{background-color:var(--cb-background)}.cb-bg-\[var\(--cb-muted\)\]{background-color:var(--cb-muted)}.cb-bg-\[var\(--cb-muted-foreground\)\]{background-color:var(--cb-muted-foreground)}.cb-bg-\[var\(--cb-surface\)\]{background-color:var(--cb-surface)}.cb-bg-\[var\(--cb-user-bubble\)\]{background-color:var(--cb-user-bubble)}.cb-bg-black\/10{background-color:rgba(0,0,0,.1)}.cb-bg-transparent{background-color:transparent}.cb-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.cb-fill-current{fill:currentColor}.cb-p-0{padding:0}.cb-p-1\.5{padding:.375rem}.cb-p-2{padding:.5rem}.cb-p-3{padding:.75rem}.cb-px-1{padding-left:.25rem;padding-right:.25rem}.cb-px-2{padding-left:.5rem;padding-right:.5rem}.cb-px-3{padding-left:.75rem;padding-right:.75rem}.cb-px-3\.5{padding-left:.875rem;padding-right:.875rem}.cb-px-4{padding-left:1rem;padding-right:1rem}.cb-py-1{padding-top:.25rem;padding-bottom:.25rem}.cb-py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.cb-py-2{padding-top:.5rem;padding-bottom:.5rem}.cb-py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.cb-py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.cb-pb-36{padding-bottom:9rem}.cb-pt-4{padding-top:1rem}.cb-text-left{text-align:left}.cb-text-center{text-align:center}.cb-text-base{font-size:1rem;line-height:1.5rem}.cb-text-lg{font-size:1.125rem;line-height:1.75rem}.cb-text-sm{font-size:.875rem;line-height:1.25rem}.cb-text-xs{font-size:.75rem;line-height:1rem}.cb-font-semibold{font-weight:600}.cb-leading-4{line-height:1rem}.cb-leading-5{line-height:1.25rem}.cb-leading-6{line-height:1.5rem}.cb-text-\[\#111111\]{--tw-text-opacity:1;color:rgb(17 17 17/var(--tw-text-opacity,1))}.cb-text-\[\#f5f5f5\]{--tw-text-opacity:1;color:rgb(245 245 245/var(--tw-text-opacity,1))}.cb-text-\[var\(--cb-assistant-text\)\]{color:var(--cb-assistant-text)}.cb-text-\[var\(--cb-muted-foreground\)\]{color:var(--cb-muted-foreground)}.cb-text-\[var\(--cb-surface-foreground\)\]{color:var(--cb-surface-foreground)}.cb-text-\[var\(--cb-user-text\)\]{color:var(--cb-user-text)}.cb-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.cb-opacity-0{opacity:0}.cb-opacity-100{opacity:1}.cb-opacity-70{opacity:.7}.cb-shadow-\[0_18px_35px_-24px_rgba\(0\,0\,0\,0\.85\)\]{--tw-shadow:0 18px 35px -24px rgba(0,0,0,.85);--tw-shadow-colored:0 18px 35px -24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.cb-shadow-\[var\(--cb-shadow-bubble\)\]{--tw-shadow-color:var(--cb-shadow-bubble);--tw-shadow:var(--tw-shadow-colored)}.cb-shadow-\[var\(--cb-shadow-panel\)\]{--tw-shadow-color:var(--cb-shadow-panel);--tw-shadow:var(--tw-shadow-colored)}.cb-outline-none{outline:2px solid transparent;outline-offset:2px}.cb-transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.cb-transition-\[opacity\,transform\,width\,height\,top\,left\,right\,bottom\]{transition-property:opacity,transform,width,height,top,left,right,bottom;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.cb-transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.cb-duration-200{transition-duration:.2s}.cb-duration-300{transition-duration:.3s}.cb-duration-\[380ms\]{transition-duration:.38s}.cb-ease-\[cubic-bezier\(0\.22\,1\,0\.36\,1\)\]{transition-timing-function:cubic-bezier(.22,1,.36,1)}.cb-ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[animation-delay\:-0\.1s\]{animation-delay:-.1s}.\[animation-delay\:-0\.2s\]{animation-delay:-.2s}[data-chatbot-root]{font-family:var(--cb-font-family)}[data-chatbot-root] *{box-sizing:border-box}[data-chatbot-root] button,[data-chatbot-root] input,[data-chatbot-root] select,[data-chatbot-root] textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;box-shadow:none;font:inherit}[data-chatbot-root] input,[data-chatbot-root] select,[data-chatbot-root] textarea{background:none;color:inherit}[data-chatbot-root] button{cursor:pointer;pointer-events:auto}[data-chatbot-root] button:disabled{cursor:not-allowed}[data-chatbot-root] textarea::-moz-placeholder{color:var(--cb-muted-foreground);opacity:1;font:inherit}[data-chatbot-root] textarea::placeholder{color:var(--cb-muted-foreground);opacity:1;font:inherit}.cb-message-text{word-break:normal;overflow-wrap:break-word;hyphens:auto}.cb-message-text code,.cb-message-text pre{word-break:normal;overflow-wrap:normal;hyphens:manual}.cb-composer-input{scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--cb-border) 85%,#000 15%) transparent}.cb-composer-input::-webkit-scrollbar{width:10px}.cb-composer-input::-webkit-scrollbar-track{background:transparent}.cb-composer-input::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--cb-border) 85%,#000 15%);border:2px solid transparent;background-clip:content-box;border-radius:999px}.cb-composer-input::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--cb-muted-foreground) 65%,#000 35%)}.cb-chat-scroll{scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--cb-border) 85%,#000 15%) transparent;scrollbar-gutter:stable}.cb-chat-scroll::-webkit-scrollbar{width:10px}.cb-chat-scroll::-webkit-scrollbar-track{background:transparent}.cb-chat-scroll::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--cb-border) 85%,#000 15%);border:3px solid transparent;background-clip:content-box;border-radius:999px}.cb-chat-scroll::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--cb-muted-foreground) 65%,#000 35%)}.cb-markdown blockquote,.cb-markdown ol,.cb-markdown p,.cb-markdown pre,.cb-markdown table,.cb-markdown ul{margin:.2rem 0}.cb-markdown h1,.cb-markdown h2,.cb-markdown h3,.cb-markdown h4,.cb-markdown h5,.cb-markdown h6{font-weight:600;margin:.3rem 0;line-height:1.35}.cb-markdown>:first-child{margin-top:0}.cb-markdown>:last-child{margin-bottom:0}.cb-markdown h1{font-size:1.1rem}.cb-markdown h2{font-size:1rem}.cb-markdown h3,.cb-markdown h4,.cb-markdown h5,.cb-markdown h6{font-size:.95rem}.cb-markdown ol,.cb-markdown ul{padding-left:1.2rem}.cb-markdown a{text-decoration:underline;color:var(--cb-primary)}.cb-markdown code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;background-color:color-mix(in srgb,var(--cb-muted) 70%,transparent);border-radius:.35rem;padding:.1rem .3rem;font-size:.85em}.cb-markdown pre{overflow-x:auto;border-radius:.8rem;border:1px solid var(--cb-border);background:color-mix(in srgb,var(--cb-muted) 60%,transparent);padding:.65rem .75rem}.cb-markdown pre code{background:transparent;padding:0}.cb-markdown blockquote{border-left:2px solid var(--cb-border);padding-left:.75rem;color:var(--cb-muted-foreground)}.cb-markdown table{width:100%;border-collapse:collapse;font-size:.875rem}.cb-markdown td,.cb-markdown th{border:1px solid var(--cb-border);padding:.35rem .45rem;text-align:left}@keyframes cb-slide-fade-in-left{0%{opacity:0;transform:translate3d(-14px,8px,0) scale(.985)}to{opacity:1;transform:translateZ(0) scale(1)}}@keyframes cb-slide-fade-in-right{0%{opacity:0;transform:translate3d(14px,8px,0) scale(.985)}to{opacity:1;transform:translateZ(0) scale(1)}}@keyframes cb-dots{0%,80%,to{transform:translateY(0);opacity:.35}40%{transform:translateY(-2px);opacity:.9}}.cb-animate-cb-slide-fade-in-left{animation:cb-slide-fade-in-left .3s cubic-bezier(.22,1,.36,1)}.cb-animate-cb-slide-fade-in-right{animation:cb-slide-fade-in-right .3s cubic-bezier(.22,1,.36,1)}.cb-animate-cb-dots{animation:cb-dots 1s ease-in-out infinite}@media (prefers-reduced-motion:reduce){[data-chatbot-root] *{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}.placeholder\:cb-text-\[var\(--cb-muted-foreground\)\]::-moz-placeholder{color:var(--cb-muted-foreground)}.placeholder\:cb-text-\[var\(--cb-muted-foreground\)\]::placeholder{color:var(--cb-muted-foreground)}.hover\:cb-scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}.hover\:cb-scale-105:hover,.hover\:cb-scale-110:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:cb-scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}.hover\:cb-bg-\[\#262626\]:hover{--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity,1))}.hover\:cb-bg-\[var\(--cb-muted\)\]:hover{background-color:var(--cb-muted)}.hover\:cb-text-\[\#111111\]:hover{--tw-text-opacity:1;color:rgb(17 17 17/var(--tw-text-opacity,1))}.hover\:cb-text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.hover\:cb-shadow-\[0_24px_50px_-18px_rgba\(0\2c 0\2c 0\2c 0\.9\)\]:hover{--tw-shadow:0 24px 50px -18px rgba(0,0,0,.9);--tw-shadow-colored:0 24px 50px -18px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:cb-brightness-95:hover{--tw-brightness:brightness(.95);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.focus-visible\:cb-bg-\[var\(--cb-muted\)\]:focus-visible{background-color:var(--cb-muted)}.focus-visible\:cb-text-\[\#111111\]:focus-visible{--tw-text-opacity:1;color:rgb(17 17 17/var(--tw-text-opacity,1))}.focus-visible\:cb-text-white:focus-visible{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.active\:cb-scale-95:active{--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\:cb-cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:cb-bg-white\/70:disabled{background-color:hsla(0,0%,100%,.7)}.disabled\:cb-text-\[\#111111\]:disabled{--tw-text-opacity:1;color:rgb(17 17 17/var(--tw-text-opacity,1))}.disabled\:cb-opacity-100:disabled{opacity:1}
|
|
1
|
+
.cb-pointer-events-none{pointer-events:none}.cb-pointer-events-auto{pointer-events:auto}.cb-fixed{position:fixed}.cb-absolute{position:absolute}.cb-relative{position:relative}.cb-bottom-4{bottom:1rem}.cb-bottom-6{bottom:1.5rem}.cb-left-4{left:1rem}.cb-left-6{left:1.5rem}.cb-right-0{right:0}.cb-right-4{right:1rem}.cb-right-6{right:1.5rem}.cb-top-full{top:100%}.cb-z-10{z-index:10}.cb-z-20{z-index:20}.cb-z-\[2147483640\]{z-index:2147483640}.cb-m-0{margin:0}.cb-mb-2{margin-bottom:.5rem}.cb-mt-1{margin-top:.25rem}.cb-mt-2{margin-top:.5rem}.cb-flex{display:flex}.cb-inline-flex{display:inline-flex}.cb-hidden{display:none}.cb-h-1\.5{height:.375rem}.cb-h-10{height:2.5rem}.cb-h-14{height:3.5rem}.cb-h-6{height:1.5rem}.cb-h-9{height:2.25rem}.cb-h-\[min\(680px\,calc\(100vh-7\.5rem\)\)\]{height:min(680px,calc(100vh - 7.5rem))}.cb-max-h-none{max-height:none}.cb-min-h-\[38px\]{min-height:38px}.cb-w-1\.5{width:.375rem}.cb-w-10{width:2.5rem}.cb-w-14{width:3.5rem}.cb-w-6{width:1.5rem}.cb-w-9{width:2.25rem}.cb-w-\[min\(92vw\,420px\)\]{width:min(92vw,420px)}.cb-w-full{width:100%}.cb-min-w-0{min-width:0}.cb-min-w-\[220px\]{min-width:220px}.cb-max-w-\[140px\]{max-width:140px}.cb-max-w-\[85\%\]{max-width:85%}.cb-max-w-none{max-width:none}.cb-flex-1{flex:1 1 0%}.cb-shrink-0{flex-shrink:0}.cb-origin-bottom-left{transform-origin:bottom left}.cb-origin-bottom-right{transform-origin:bottom right}.-cb-rotate-90{--tw-rotate:-90deg}.-cb-rotate-90,.cb-rotate-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cb-rotate-0{--tw-rotate:0deg}.cb-rotate-90{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cb-resize-none{resize:none}.cb-flex-col{flex-direction:column}.cb-flex-wrap{flex-wrap:wrap}.cb-items-start{align-items:flex-start}.cb-items-end{align-items:flex-end}.cb-items-center{align-items:center}.cb-justify-start{justify-content:flex-start}.cb-justify-end{justify-content:flex-end}.cb-justify-center{justify-content:center}.cb-justify-between{justify-content:space-between}.cb-gap-1{gap:.25rem}.cb-gap-2{gap:.5rem}.cb-gap-2\.5{gap:.625rem}.cb-gap-3{gap:.75rem}.cb-space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.cb-space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.cb-self-center{align-self:center}.cb-overflow-hidden{overflow:hidden}.cb-overflow-y-auto{overflow-y:auto}.cb-scroll-smooth{scroll-behavior:smooth}.cb-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cb-whitespace-pre-wrap{white-space:pre-wrap}.cb-rounded-2xl{border-radius:1rem}.cb-rounded-\[var\(--cb-radius\)\]{border-radius:var(--cb-radius)}.cb-rounded-full{border-radius:9999px}.cb-rounded-lg{border-radius:.5rem}.cb-rounded-xl{border-radius:.75rem}.cb-rounded-bl-md{border-bottom-left-radius:.375rem}.cb-rounded-br-md{border-bottom-right-radius:.375rem}.cb-border{border-width:1px}.cb-border-b{border-bottom-width:1px}.cb-border-\[var\(--cb-border\)\]{border-color:var(--cb-border)}.cb-bg-\[\#111111\]{--tw-bg-opacity:1;background-color:rgb(17 17 17/var(--tw-bg-opacity,1))}.cb-bg-\[var\(--cb-assistant-bubble\)\]{background-color:var(--cb-assistant-bubble)}.cb-bg-\[var\(--cb-background\)\]{background-color:var(--cb-background)}.cb-bg-\[var\(--cb-muted\)\]{background-color:var(--cb-muted)}.cb-bg-\[var\(--cb-muted-foreground\)\]{background-color:var(--cb-muted-foreground)}.cb-bg-\[var\(--cb-surface\)\]{background-color:var(--cb-surface)}.cb-bg-\[var\(--cb-user-bubble\)\]{background-color:var(--cb-user-bubble)}.cb-bg-black\/10{background-color:rgba(0,0,0,.1)}.cb-bg-transparent{background-color:transparent}.cb-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.cb-fill-current{fill:currentColor}.cb-p-0{padding:0}.cb-p-1\.5{padding:.375rem}.cb-p-2{padding:.5rem}.cb-p-3{padding:.75rem}.cb-px-1{padding-left:.25rem;padding-right:.25rem}.cb-px-2{padding-left:.5rem;padding-right:.5rem}.cb-px-3{padding-left:.75rem;padding-right:.75rem}.cb-px-3\.5{padding-left:.875rem;padding-right:.875rem}.cb-px-4{padding-left:1rem;padding-right:1rem}.cb-py-1{padding-top:.25rem;padding-bottom:.25rem}.cb-py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.cb-py-2{padding-top:.5rem;padding-bottom:.5rem}.cb-py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.cb-py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.cb-pb-36{padding-bottom:9rem}.cb-pt-4{padding-top:1rem}.cb-text-left{text-align:left}.cb-text-center{text-align:center}.cb-text-base{font-size:1rem;line-height:1.5rem}.cb-text-lg{font-size:1.125rem;line-height:1.75rem}.cb-text-sm{font-size:.875rem;line-height:1.25rem}.cb-text-xs{font-size:.75rem;line-height:1rem}.cb-font-semibold{font-weight:600}.cb-leading-4{line-height:1rem}.cb-leading-5{line-height:1.25rem}.cb-leading-6{line-height:1.5rem}.cb-text-\[\#111111\]{--tw-text-opacity:1;color:rgb(17 17 17/var(--tw-text-opacity,1))}.cb-text-\[\#f5f5f5\]{--tw-text-opacity:1;color:rgb(245 245 245/var(--tw-text-opacity,1))}.cb-text-\[var\(--cb-assistant-text\)\]{color:var(--cb-assistant-text)}.cb-text-\[var\(--cb-muted-foreground\)\]{color:var(--cb-muted-foreground)}.cb-text-\[var\(--cb-surface-foreground\)\]{color:var(--cb-surface-foreground)}.cb-text-\[var\(--cb-user-text\)\]{color:var(--cb-user-text)}.cb-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.cb-opacity-0{opacity:0}.cb-opacity-100{opacity:1}.cb-opacity-70{opacity:.7}.cb-shadow-\[0_18px_35px_-24px_rgba\(0\,0\,0\,0\.85\)\]{--tw-shadow:0 18px 35px -24px rgba(0,0,0,.85);--tw-shadow-colored:0 18px 35px -24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.cb-shadow-\[var\(--cb-shadow-bubble\)\]{--tw-shadow-color:var(--cb-shadow-bubble);--tw-shadow:var(--tw-shadow-colored)}.cb-shadow-\[var\(--cb-shadow-panel\)\]{--tw-shadow-color:var(--cb-shadow-panel);--tw-shadow:var(--tw-shadow-colored)}.cb-outline-none{outline:2px solid transparent;outline-offset:2px}.cb-transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.cb-duration-200{transition-duration:.2s}.cb-duration-300{transition-duration:.3s}.\[animation-delay\:-0\.1s\]{animation-delay:-.1s}.\[animation-delay\:-0\.2s\]{animation-delay:-.2s}[data-chatbot-root]{font-family:var(--cb-font-family)}[data-chatbot-root] *{box-sizing:border-box}[data-chatbot-root] button,[data-chatbot-root] input,[data-chatbot-root] select,[data-chatbot-root] textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;box-shadow:none;font:inherit}[data-chatbot-root] input,[data-chatbot-root] select,[data-chatbot-root] textarea{background:none;color:inherit}[data-chatbot-root] button{cursor:pointer;pointer-events:auto}[data-chatbot-root] button:disabled{cursor:not-allowed}[data-chatbot-root] textarea::-moz-placeholder{color:var(--cb-muted-foreground);opacity:1;font:inherit}[data-chatbot-root] textarea::placeholder{color:var(--cb-muted-foreground);opacity:1;font:inherit}.cb-message-text{word-break:normal;overflow-wrap:break-word;hyphens:auto}.cb-message-text code,.cb-message-text pre{word-break:normal;overflow-wrap:normal;hyphens:manual}.cb-composer-input{scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--cb-border) 85%,#000 15%) transparent}.cb-composer-input::-webkit-scrollbar{width:10px}.cb-composer-input::-webkit-scrollbar-track{background:transparent}.cb-composer-input::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--cb-border) 85%,#000 15%);border:2px solid transparent;background-clip:content-box;border-radius:999px}.cb-composer-input::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--cb-muted-foreground) 65%,#000 35%)}.cb-chat-scroll{scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--cb-border) 85%,#000 15%) transparent;scrollbar-gutter:stable}.cb-chat-scroll::-webkit-scrollbar{width:10px}.cb-chat-scroll::-webkit-scrollbar-track{background:transparent}.cb-chat-scroll::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--cb-border) 85%,#000 15%);border:3px solid transparent;background-clip:content-box;border-radius:999px}.cb-chat-scroll::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--cb-muted-foreground) 65%,#000 35%)}.cb-markdown blockquote,.cb-markdown ol,.cb-markdown p,.cb-markdown pre,.cb-markdown table,.cb-markdown ul{margin:.2rem 0}.cb-markdown h1,.cb-markdown h2,.cb-markdown h3,.cb-markdown h4,.cb-markdown h5,.cb-markdown h6{font-weight:600;margin:.3rem 0;line-height:1.35}.cb-markdown>:first-child{margin-top:0}.cb-markdown>:last-child{margin-bottom:0}.cb-markdown h1{font-size:1.1rem}.cb-markdown h2{font-size:1rem}.cb-markdown h3,.cb-markdown h4,.cb-markdown h5,.cb-markdown h6{font-size:.95rem}.cb-markdown ol,.cb-markdown ul{padding-left:1.2rem}.cb-markdown a{text-decoration:underline;color:var(--cb-primary)}.cb-markdown code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;background-color:color-mix(in srgb,var(--cb-muted) 70%,transparent);border-radius:.35rem;padding:.1rem .3rem;font-size:.85em}.cb-markdown pre{overflow-x:auto;border-radius:.8rem;border:1px solid var(--cb-border);background:color-mix(in srgb,var(--cb-muted) 60%,transparent);padding:.65rem .75rem}.cb-markdown pre code{background:transparent;padding:0}.cb-markdown blockquote{border-left:2px solid var(--cb-border);padding-left:.75rem;color:var(--cb-muted-foreground)}.cb-markdown table{width:100%;border-collapse:collapse;font-size:.875rem}.cb-markdown td,.cb-markdown th{border:1px solid var(--cb-border);padding:.35rem .45rem;text-align:left}@keyframes cb-slide-fade-in-left{0%{opacity:0;transform:translate3d(-14px,8px,0) scale(.985)}to{opacity:1;transform:translateZ(0) scale(1)}}@keyframes cb-slide-fade-in-right{0%{opacity:0;transform:translate3d(14px,8px,0) scale(.985)}to{opacity:1;transform:translateZ(0) scale(1)}}@keyframes cb-dots{0%,80%,to{transform:translateY(0);opacity:.35}40%{transform:translateY(-2px);opacity:.9}}.cb-animate-cb-slide-fade-in-left{animation:cb-slide-fade-in-left .3s cubic-bezier(.22,1,.36,1)}.cb-animate-cb-slide-fade-in-right{animation:cb-slide-fade-in-right .3s cubic-bezier(.22,1,.36,1)}.cb-animate-cb-dots{animation:cb-dots 1s ease-in-out infinite}.cb-panel-transition{transition-property:opacity,transform,width,height,top,left,right,bottom;transition-duration:.38s;transition-timing-function:cubic-bezier(.22,1,.36,1);will-change:opacity,transform}.cb-panel-open{opacity:1;transform:translateZ(0) scale(1)}.cb-panel-closed{opacity:0;transform:translate3d(0,12px,0) scale(.9)}.cb-launcher-icon-transition{transition-property:transform,opacity;transition-duration:.3s;transition-timing-function:ease-out}@media (prefers-reduced-motion:reduce){[data-chatbot-root] *{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}.placeholder\:cb-text-\[var\(--cb-muted-foreground\)\]::-moz-placeholder{color:var(--cb-muted-foreground)}.placeholder\:cb-text-\[var\(--cb-muted-foreground\)\]::placeholder{color:var(--cb-muted-foreground)}.hover\:cb-scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}.hover\:cb-scale-105:hover,.hover\:cb-scale-110:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:cb-scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}.hover\:cb-bg-\[\#262626\]:hover{--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity,1))}.hover\:cb-bg-\[var\(--cb-muted\)\]:hover{background-color:var(--cb-muted)}.hover\:cb-text-\[\#111111\]:hover{--tw-text-opacity:1;color:rgb(17 17 17/var(--tw-text-opacity,1))}.hover\:cb-text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.hover\:cb-shadow-\[0_24px_50px_-18px_rgba\(0\2c 0\2c 0\2c 0\.9\)\]:hover{--tw-shadow:0 24px 50px -18px rgba(0,0,0,.9);--tw-shadow-colored:0 24px 50px -18px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:cb-brightness-95:hover{--tw-brightness:brightness(.95);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.focus-visible\:cb-bg-\[var\(--cb-muted\)\]:focus-visible{background-color:var(--cb-muted)}.focus-visible\:cb-text-\[\#111111\]:focus-visible{--tw-text-opacity:1;color:rgb(17 17 17/var(--tw-text-opacity,1))}.focus-visible\:cb-text-white:focus-visible{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.active\:cb-scale-95:active{--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\:cb-cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:cb-bg-white\/70:disabled{background-color:hsla(0,0%,100%,.7)}.disabled\:cb-text-\[\#111111\]:disabled{--tw-text-opacity:1;color:rgb(17 17 17/var(--tw-text-opacity,1))}.disabled\:cb-opacity-100:disabled{opacity:1}
|
package/package.json
CHANGED
|
@@ -450,12 +450,10 @@ export function ChatbotWidget() {
|
|
|
450
450
|
<div
|
|
451
451
|
ref={panelRef}
|
|
452
452
|
className={clsx(
|
|
453
|
-
"cb-pointer-events-auto cb-flex cb-flex-col cb-overflow-hidden cb-rounded-[var(--cb-radius)] cb-border cb-border-[var(--cb-border)] cb-bg-[var(--cb-surface)] cb-shadow-[var(--cb-shadow-panel)]
|
|
453
|
+
"cb-panel-transition cb-pointer-events-auto cb-flex cb-flex-col cb-overflow-hidden cb-rounded-[var(--cb-radius)] cb-border cb-border-[var(--cb-border)] cb-bg-[var(--cb-surface)] cb-shadow-[var(--cb-shadow-panel)]",
|
|
454
454
|
panelOrigin,
|
|
455
455
|
panelSize.className,
|
|
456
|
-
isOpen
|
|
457
|
-
? "cb-translate-y-0 cb-scale-100 cb-opacity-100"
|
|
458
|
-
: "cb-translate-y-3 cb-scale-90 cb-opacity-0 cb-pointer-events-none",
|
|
456
|
+
isOpen ? "cb-panel-open" : "cb-panel-closed cb-pointer-events-none",
|
|
459
457
|
classNames.panel,
|
|
460
458
|
)}
|
|
461
459
|
style={panelSize.style}
|
|
@@ -720,14 +718,14 @@ export function ChatbotWidget() {
|
|
|
720
718
|
<LauncherClosedIcon
|
|
721
719
|
size={22}
|
|
722
720
|
className={clsx(
|
|
723
|
-
"cb-
|
|
721
|
+
"cb-launcher-icon-transition cb-absolute cb-fill-current",
|
|
724
722
|
isOpen ? "cb-rotate-90 cb-opacity-0" : "cb-rotate-0 cb-opacity-100",
|
|
725
723
|
)}
|
|
726
724
|
/>
|
|
727
725
|
<LauncherOpenIcon
|
|
728
726
|
size={22}
|
|
729
727
|
className={clsx(
|
|
730
|
-
"cb-
|
|
728
|
+
"cb-launcher-icon-transition cb-absolute",
|
|
731
729
|
isOpen ? "cb-rotate-0 cb-opacity-100" : "-cb-rotate-90 cb-opacity-0",
|
|
732
730
|
)}
|
|
733
731
|
/>
|
package/src/styles.css
CHANGED
|
@@ -247,6 +247,29 @@
|
|
|
247
247
|
animation: cb-dots 1s infinite ease-in-out;
|
|
248
248
|
}
|
|
249
249
|
|
|
250
|
+
.cb-panel-transition {
|
|
251
|
+
transition-property: opacity, transform, width, height, top, left, right, bottom;
|
|
252
|
+
transition-duration: 380ms;
|
|
253
|
+
transition-timing-function: cubic-bezier(0.22, 1, 0.36, 1);
|
|
254
|
+
will-change: opacity, transform;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
.cb-panel-open {
|
|
258
|
+
opacity: 1;
|
|
259
|
+
transform: translate3d(0, 0, 0) scale(1);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
.cb-panel-closed {
|
|
263
|
+
opacity: 0;
|
|
264
|
+
transform: translate3d(0, 12px, 0) scale(0.9);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
.cb-launcher-icon-transition {
|
|
268
|
+
transition-property: transform, opacity;
|
|
269
|
+
transition-duration: 300ms;
|
|
270
|
+
transition-timing-function: ease-out;
|
|
271
|
+
}
|
|
272
|
+
|
|
250
273
|
@media (prefers-reduced-motion: reduce) {
|
|
251
274
|
[data-chatbot-root] * {
|
|
252
275
|
animation-duration: 0.01ms !important;
|