@nickle/chatbot-react 0.1.0 → 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/README.md +2 -0
- package/dist/index.js +8 -47
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8 -47
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +2 -3
- package/src/chatbot/components/chatbot-widget.tsx +4 -6
- package/src/chatbot/lib/theme.ts +4 -49
- package/src/styles.css +23 -0
package/dist/index.mjs
CHANGED
|
@@ -348,50 +348,11 @@ function historyKey(sessionId) {
|
|
|
348
348
|
}
|
|
349
349
|
|
|
350
350
|
// src/chatbot/lib/theme.ts
|
|
351
|
-
var HOST_TOKEN_MAP = {
|
|
352
|
-
primary: ["--color-primary", "--primary"],
|
|
353
|
-
primaryForeground: ["--color-primary-foreground", "--primary-foreground"],
|
|
354
|
-
background: ["--cb-background", "--color-background", "--color-bg", "--background"],
|
|
355
|
-
surface: ["--cb-surface", "--color-surface", "--color-card", "--card"],
|
|
356
|
-
surfaceForeground: ["--cb-surface-foreground", "--color-text", "--color-foreground", "--foreground"],
|
|
357
|
-
muted: ["--color-muted", "--muted"],
|
|
358
|
-
mutedForeground: ["--color-muted-foreground", "--muted-foreground"],
|
|
359
|
-
border: ["--color-border", "--border"],
|
|
360
|
-
ring: ["--color-ring", "--ring"],
|
|
361
|
-
userBubble: ["--cb-user-bubble"],
|
|
362
|
-
userText: ["--cb-user-text"],
|
|
363
|
-
assistantBubble: ["--cb-assistant-bubble", "--color-muted", "--muted"],
|
|
364
|
-
assistantText: ["--cb-assistant-text", "--color-text", "--foreground"],
|
|
365
|
-
radius: ["--radius-md", "--radius", "--rounded"],
|
|
366
|
-
fontFamily: ["--font-sans", "--font-family"],
|
|
367
|
-
shadowBubble: ["--shadow-bubble"],
|
|
368
|
-
shadowPanel: ["--shadow-panel"]
|
|
369
|
-
};
|
|
370
|
-
function readRootVar(name) {
|
|
371
|
-
if (typeof window === "undefined") {
|
|
372
|
-
return void 0;
|
|
373
|
-
}
|
|
374
|
-
const styles = getComputedStyle(document.documentElement);
|
|
375
|
-
const value = styles.getPropertyValue(name).trim();
|
|
376
|
-
return value || void 0;
|
|
377
|
-
}
|
|
378
351
|
function resolveThemeTokens(explicit) {
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
return;
|
|
384
|
-
}
|
|
385
|
-
const hostCandidates = HOST_TOKEN_MAP[key] ?? [];
|
|
386
|
-
for (const candidate of hostCandidates) {
|
|
387
|
-
const value = readRootVar(candidate);
|
|
388
|
-
if (value) {
|
|
389
|
-
resolved[key] = value;
|
|
390
|
-
break;
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
});
|
|
394
|
-
return resolved;
|
|
352
|
+
return {
|
|
353
|
+
...DEFAULT_THEME,
|
|
354
|
+
...explicit ?? {}
|
|
355
|
+
};
|
|
395
356
|
}
|
|
396
357
|
function toThemeCssVars(tokens) {
|
|
397
358
|
return {
|
|
@@ -1303,10 +1264,10 @@ function ChatbotWidget() {
|
|
|
1303
1264
|
{
|
|
1304
1265
|
ref: panelRef,
|
|
1305
1266
|
className: clsx(
|
|
1306
|
-
"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)]",
|
|
1307
1268
|
panelOrigin,
|
|
1308
1269
|
panelSize.className,
|
|
1309
|
-
isOpen ? "cb-
|
|
1270
|
+
isOpen ? "cb-panel-open" : "cb-panel-closed cb-pointer-events-none",
|
|
1310
1271
|
classNames.panel
|
|
1311
1272
|
),
|
|
1312
1273
|
style: panelSize.style,
|
|
@@ -1570,7 +1531,7 @@ function ChatbotWidget() {
|
|
|
1570
1531
|
{
|
|
1571
1532
|
size: 22,
|
|
1572
1533
|
className: clsx(
|
|
1573
|
-
"cb-
|
|
1534
|
+
"cb-launcher-icon-transition cb-absolute cb-fill-current",
|
|
1574
1535
|
isOpen ? "cb-rotate-90 cb-opacity-0" : "cb-rotate-0 cb-opacity-100"
|
|
1575
1536
|
)
|
|
1576
1537
|
}
|
|
@@ -1580,7 +1541,7 @@ function ChatbotWidget() {
|
|
|
1580
1541
|
{
|
|
1581
1542
|
size: 22,
|
|
1582
1543
|
className: clsx(
|
|
1583
|
-
"cb-
|
|
1544
|
+
"cb-launcher-icon-transition cb-absolute",
|
|
1584
1545
|
isOpen ? "cb-rotate-0 cb-opacity-100" : "-cb-rotate-90 cb-opacity-0"
|
|
1585
1546
|
)
|
|
1586
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\nconst HOST_TOKEN_MAP: Record<keyof ChatbotThemeTokens, string[]> = {\n primary: [\"--color-primary\", \"--primary\"],\n primaryForeground: [\"--color-primary-foreground\", \"--primary-foreground\"],\n background: [\"--cb-background\", \"--color-background\", \"--color-bg\", \"--background\"],\n surface: [\"--cb-surface\", \"--color-surface\", \"--color-card\", \"--card\"],\n surfaceForeground: [\"--cb-surface-foreground\", \"--color-text\", \"--color-foreground\", \"--foreground\"],\n muted: [\"--color-muted\", \"--muted\"],\n mutedForeground: [\"--color-muted-foreground\", \"--muted-foreground\"],\n border: [\"--color-border\", \"--border\"],\n ring: [\"--color-ring\", \"--ring\"],\n userBubble: [\"--cb-user-bubble\"],\n userText: [\"--cb-user-text\"],\n assistantBubble: [\"--cb-assistant-bubble\", \"--color-muted\", \"--muted\"],\n assistantText: [\"--cb-assistant-text\", \"--color-text\", \"--foreground\"],\n radius: [\"--radius-md\", \"--radius\", \"--rounded\"],\n fontFamily: [\"--font-sans\", \"--font-family\"],\n shadowBubble: [\"--shadow-bubble\"],\n shadowPanel: [\"--shadow-panel\"],\n};\n\nfunction readRootVar(name: string): string | undefined {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n const styles = getComputedStyle(document.documentElement);\n const value = styles.getPropertyValue(name).trim();\n return value || undefined;\n}\n\nexport function resolveThemeTokens(explicit?: Partial<ChatbotThemeTokens>): ChatbotThemeTokens {\n const resolved = { ...DEFAULT_THEME };\n\n (Object.keys(DEFAULT_THEME) as Array<keyof ChatbotThemeTokens>).forEach((key) => {\n if (explicit?.[key]) {\n resolved[key] = explicit[key] as string;\n return;\n }\n\n const hostCandidates = HOST_TOKEN_MAP[key] ?? [];\n for (const candidate of hostCandidates) {\n const value = readRootVar(candidate);\n if (value) {\n resolved[key] = value;\n break;\n }\n }\n });\n\n return resolved;\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"]}
|