@mnexium/chat-react 1.0.0 → 1.0.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.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +26 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +26 -9
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -133,6 +133,7 @@ GOOGLE_API_KEY=...
|
|
|
133
133
|
| `placeholder` | `string` | `'Type a message...'` | Input placeholder |
|
|
134
134
|
| `position` | `'bottom-right' \| 'bottom-left'` | `'bottom-right'` | Widget position |
|
|
135
135
|
| `primaryColor` | `string` | `'#facc15'` | Accent color (use 6-char hex, e.g. `#45b1eb`) |
|
|
136
|
+
| `textColor` | `string` | `'#000'` | Text color for button and user messages |
|
|
136
137
|
| `theme` | `'light' \| 'dark'` | `'dark'` | Color theme |
|
|
137
138
|
| `defaultOpen` | `boolean` | `false` | Start with chat open |
|
|
138
139
|
| `eagerInit` | `boolean` | `true` | Initialize on page load (no "Initializing..." delay) |
|
|
@@ -231,6 +232,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })
|
|
|
231
232
|
buttonLabel="Ask AI"
|
|
232
233
|
position="bottom-right"
|
|
233
234
|
primaryColor="#45b1eb"
|
|
235
|
+
textColor="#fff"
|
|
234
236
|
theme="dark"
|
|
235
237
|
logo="/logo.png"
|
|
236
238
|
welcomeIcon="🤖"
|
package/dist/index.d.mts
CHANGED
|
@@ -13,6 +13,7 @@ interface MnexiumChatProps {
|
|
|
13
13
|
buttonLabel?: string;
|
|
14
14
|
position?: 'bottom-right' | 'bottom-left';
|
|
15
15
|
primaryColor?: string;
|
|
16
|
+
textColor?: string;
|
|
16
17
|
defaultOpen?: boolean;
|
|
17
18
|
logo?: string;
|
|
18
19
|
theme?: 'light' | 'dark';
|
|
@@ -21,6 +22,6 @@ interface MnexiumChatProps {
|
|
|
21
22
|
history?: boolean;
|
|
22
23
|
eagerInit?: boolean;
|
|
23
24
|
}
|
|
24
|
-
declare function MnexiumChat({ endpoint, placeholder, title, buttonLabel, position, primaryColor, defaultOpen, logo, theme, welcomeIcon, welcomeMessage, history, eagerInit, }: MnexiumChatProps): react_jsx_runtime.JSX.Element;
|
|
25
|
+
declare function MnexiumChat({ endpoint, placeholder, title, buttonLabel, position, primaryColor, textColor, defaultOpen, logo, theme, welcomeIcon, welcomeMessage, history, eagerInit, }: MnexiumChatProps): react_jsx_runtime.JSX.Element;
|
|
25
26
|
|
|
26
27
|
export { type Message, MnexiumChat, type MnexiumChatProps, MnexiumChat as default };
|
package/dist/index.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ interface MnexiumChatProps {
|
|
|
13
13
|
buttonLabel?: string;
|
|
14
14
|
position?: 'bottom-right' | 'bottom-left';
|
|
15
15
|
primaryColor?: string;
|
|
16
|
+
textColor?: string;
|
|
16
17
|
defaultOpen?: boolean;
|
|
17
18
|
logo?: string;
|
|
18
19
|
theme?: 'light' | 'dark';
|
|
@@ -21,6 +22,6 @@ interface MnexiumChatProps {
|
|
|
21
22
|
history?: boolean;
|
|
22
23
|
eagerInit?: boolean;
|
|
23
24
|
}
|
|
24
|
-
declare function MnexiumChat({ endpoint, placeholder, title, buttonLabel, position, primaryColor, defaultOpen, logo, theme, welcomeIcon, welcomeMessage, history, eagerInit, }: MnexiumChatProps): react_jsx_runtime.JSX.Element;
|
|
25
|
+
declare function MnexiumChat({ endpoint, placeholder, title, buttonLabel, position, primaryColor, textColor, defaultOpen, logo, theme, welcomeIcon, welcomeMessage, history, eagerInit, }: MnexiumChatProps): react_jsx_runtime.JSX.Element;
|
|
25
26
|
|
|
26
27
|
export { type Message, MnexiumChat, type MnexiumChatProps, MnexiumChat as default };
|
package/dist/index.js
CHANGED
|
@@ -147,6 +147,7 @@ function MnexiumChat({
|
|
|
147
147
|
buttonLabel = "Ask AI",
|
|
148
148
|
position = "bottom-right",
|
|
149
149
|
primaryColor = "#facc15",
|
|
150
|
+
textColor = "#000",
|
|
150
151
|
defaultOpen = false,
|
|
151
152
|
logo,
|
|
152
153
|
theme = "dark",
|
|
@@ -339,9 +340,6 @@ function MnexiumChat({
|
|
|
339
340
|
.mnx-btn-icon {
|
|
340
341
|
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
341
342
|
}
|
|
342
|
-
.mnx-btn-icon.open {
|
|
343
|
-
transform: rotate(45deg);
|
|
344
|
-
}
|
|
345
343
|
` }),
|
|
346
344
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: {
|
|
347
345
|
position: "fixed",
|
|
@@ -464,7 +462,7 @@ function MnexiumChat({
|
|
|
464
462
|
...message.role === "user" ? {
|
|
465
463
|
alignSelf: "flex-end",
|
|
466
464
|
backgroundColor: `${primaryColor}cc`,
|
|
467
|
-
color:
|
|
465
|
+
color: textColor,
|
|
468
466
|
borderBottomRightRadius: "4px"
|
|
469
467
|
} : {
|
|
470
468
|
alignSelf: "flex-start",
|
|
@@ -564,7 +562,7 @@ function MnexiumChat({
|
|
|
564
562
|
gap: "8px",
|
|
565
563
|
padding: "12px 16px",
|
|
566
564
|
backgroundColor: primaryColor,
|
|
567
|
-
color:
|
|
565
|
+
color: textColor,
|
|
568
566
|
border: "none",
|
|
569
567
|
borderRadius: "12px",
|
|
570
568
|
fontSize: "14px",
|
|
@@ -597,11 +595,30 @@ function MnexiumChat({
|
|
|
597
595
|
] })
|
|
598
596
|
}
|
|
599
597
|
),
|
|
600
|
-
/* @__PURE__ */ (0, import_jsx_runtime.
|
|
601
|
-
|
|
598
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: {
|
|
599
|
+
display: "inline-flex",
|
|
602
600
|
overflow: "hidden",
|
|
603
|
-
whiteSpace: "nowrap"
|
|
604
|
-
|
|
601
|
+
whiteSpace: "nowrap",
|
|
602
|
+
position: "relative",
|
|
603
|
+
height: "1.2em",
|
|
604
|
+
alignItems: "center"
|
|
605
|
+
}, children: [
|
|
606
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: {
|
|
607
|
+
display: "inline-block",
|
|
608
|
+
transition: "transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s, max-width 0.3s cubic-bezier(0.4, 0, 0.2, 1)",
|
|
609
|
+
transform: isOpen ? "translateY(-100%)" : "translateY(0)",
|
|
610
|
+
opacity: isOpen ? 0 : 1,
|
|
611
|
+
maxWidth: isOpen ? "0" : "300px"
|
|
612
|
+
}, children: buttonLabel }),
|
|
613
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: {
|
|
614
|
+
display: "inline-block",
|
|
615
|
+
transition: "transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s, max-width 0.3s cubic-bezier(0.4, 0, 0.2, 1)",
|
|
616
|
+
transform: isOpen ? "translateY(0)" : "translateY(100%)",
|
|
617
|
+
opacity: isOpen ? 1 : 0,
|
|
618
|
+
maxWidth: isOpen ? "50px" : "0",
|
|
619
|
+
overflow: "hidden"
|
|
620
|
+
}, children: "Close" })
|
|
621
|
+
] })
|
|
605
622
|
]
|
|
606
623
|
}
|
|
607
624
|
)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/client/MnexiumChat.tsx"],"sourcesContent":["export { MnexiumChat, type MnexiumChatProps, type Message } from './client/MnexiumChat';\nexport { MnexiumChat as default } from './client/MnexiumChat';\n","'use client';\n\nimport React, { useState, useEffect, useRef, useCallback } from 'react';\n\nexport interface Message {\n id: string;\n role: 'user' | 'assistant';\n content: string;\n timestamp: Date;\n}\n\nexport interface MnexiumChatProps {\n endpoint?: string;\n placeholder?: string;\n title?: string;\n buttonLabel?: string;\n position?: 'bottom-right' | 'bottom-left';\n primaryColor?: string;\n defaultOpen?: boolean;\n logo?: string;\n theme?: 'light' | 'dark';\n welcomeIcon?: string;\n welcomeMessage?: string;\n history?: boolean;\n eagerInit?: boolean;\n}\n\nconst themes = {\n dark: {\n bg: '#1a1a1a',\n bgSecondary: '#2a2a2a',\n border: '#333',\n text: '#fff',\n textSecondary: '#e5e5e5',\n textMuted: '#888',\n inputBg: '#2a2a2a',\n inputBorder: '#444',\n codeBg: '#374151',\n codeBlockBg: '#1f2937',\n },\n light: {\n bg: '#ffffff',\n bgSecondary: '#f3f4f6',\n border: '#e5e7eb',\n text: '#111827',\n textSecondary: '#374151',\n textMuted: '#6b7280',\n inputBg: '#f9fafb',\n inputBorder: '#d1d5db',\n codeBg: '#e5e7eb',\n codeBlockBg: '#f3f4f6',\n },\n};\n\nfunction generateId(): string {\n return Math.random().toString(36).substring(2, 15);\n}\n\nfunction renderMarkdown(text: string, themeColors: { codeBg: string; codeBlockBg: string }): React.ReactNode {\n if (!text) return null;\n const lines = text.split('\\n');\n const elements: React.ReactNode[] = [];\n let inCodeBlock = false;\n let codeContent: string[] = [];\n\n const processInline = (line: string): React.ReactNode => {\n const parts: React.ReactNode[] = [];\n let remaining = line;\n let key = 0;\n\n while (remaining.length > 0) {\n const codeMatch = remaining.match(/`([^`]+)`/);\n const boldMatch = remaining.match(/\\*\\*([^*]+)\\*\\*/);\n const italicMatch = remaining.match(/\\*([^*]+)\\*/);\n\n const matches = [\n codeMatch ? { type: 'code', match: codeMatch, index: codeMatch.index! } : null,\n boldMatch ? { type: 'bold', match: boldMatch, index: boldMatch.index! } : null,\n italicMatch ? { type: 'italic', match: italicMatch, index: italicMatch.index! } : null,\n ].filter(Boolean).sort((a, b) => a!.index - b!.index);\n\n if (matches.length === 0) {\n parts.push(remaining);\n break;\n }\n\n const first = matches[0]!;\n if (first.index > 0) {\n parts.push(remaining.substring(0, first.index));\n }\n\n if (first.type === 'code') {\n parts.push(\n <code key={key++} style={{ backgroundColor: themeColors.codeBg, padding: '2px 6px', borderRadius: '4px', fontSize: '13px' }}>\n {first.match![1]}\n </code>\n );\n } else if (first.type === 'bold') {\n parts.push(<strong key={key++}>{first.match![1]}</strong>);\n } else if (first.type === 'italic') {\n parts.push(<em key={key++}>{first.match![1]}</em>);\n }\n\n remaining = remaining.substring(first.index + first.match![0].length);\n }\n\n return parts.length === 1 ? parts[0] : parts;\n };\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n if (line.startsWith('```')) {\n if (!inCodeBlock) {\n inCodeBlock = true;\n codeContent = [];\n } else {\n elements.push(\n <pre key={i} style={{ backgroundColor: themeColors.codeBlockBg, padding: '12px', borderRadius: '8px', overflow: 'auto', fontSize: '13px', margin: '8px 0' }}>\n <code>{codeContent.join('\\n')}</code>\n </pre>\n );\n inCodeBlock = false;\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeContent.push(line);\n continue;\n }\n\n if (line.startsWith('### ')) {\n elements.push(<h4 key={i} style={{ margin: '12px 0 8px', fontSize: '14px', fontWeight: 600 }}>{processInline(line.slice(4))}</h4>);\n } else if (line.startsWith('## ')) {\n elements.push(<h3 key={i} style={{ margin: '12px 0 8px', fontSize: '15px', fontWeight: 600 }}>{processInline(line.slice(3))}</h3>);\n } else if (line.startsWith('# ')) {\n elements.push(<h2 key={i} style={{ margin: '12px 0 8px', fontSize: '16px', fontWeight: 600 }}>{processInline(line.slice(2))}</h2>);\n } else if (line.startsWith('- ') || line.startsWith('* ')) {\n elements.push(<li key={i} style={{ marginLeft: '16px', listStyleType: 'disc' }}>{processInline(line.slice(2))}</li>);\n } else if (/^\\d+\\.\\s/.test(line)) {\n const content = line.replace(/^\\d+\\.\\s/, '');\n elements.push(<li key={i} style={{ marginLeft: '16px', listStyleType: 'decimal' }}>{processInline(content)}</li>);\n } else if (line.trim() === '') {\n elements.push(<br key={i} />);\n } else {\n elements.push(<p key={i} style={{ margin: '4px 0' }}>{processInline(line)}</p>);\n }\n }\n\n if (inCodeBlock && codeContent.length > 0) {\n elements.push(\n <pre key=\"final-code\" style={{ backgroundColor: themeColors.codeBlockBg, padding: '12px', borderRadius: '8px', overflow: 'auto', fontSize: '13px', margin: '8px 0' }}>\n <code>{codeContent.join('\\n')}</code>\n </pre>\n );\n }\n\n return <div>{elements}</div>;\n}\n\nexport function MnexiumChat({\n endpoint = '/api/mnx',\n placeholder = 'Type a message...',\n title = 'Ask AI',\n buttonLabel = 'Ask AI',\n position = 'bottom-right',\n primaryColor = '#facc15',\n defaultOpen = false,\n logo,\n theme = 'dark',\n welcomeIcon = '👋',\n welcomeMessage = 'How can I help you today?',\n history = false,\n eagerInit = true,\n}: MnexiumChatProps) {\n const t = themes[theme];\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const [messages, setMessages] = useState<Message[]>([]);\n const [input, setInput] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [isInitialized, setIsInitialized] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const scrollToBottom = useCallback(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, []);\n\n useEffect(() => {\n scrollToBottom();\n }, [messages, scrollToBottom]);\n\n useEffect(() => {\n if (isOpen && inputRef.current) {\n inputRef.current.focus();\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (!eagerInit && !isOpen) return;\n \n const bootstrap = async () => {\n if (isInitialized) return;\n \n try {\n const res = await fetch(`${endpoint}/bootstrap`);\n if (!res.ok) throw new Error('Failed to bootstrap');\n \n const data = await res.json();\n \n if (history && data.chat_id) {\n try {\n const historyRes = await fetch(`${endpoint}/conversations/${data.chat_id}`);\n if (historyRes.ok) {\n const historyData = await historyRes.json();\n if (historyData.messages && Array.isArray(historyData.messages)) {\n setMessages(historyData.messages.map((m: { role: string; content: string }) => ({\n id: generateId(),\n role: m.role as 'user' | 'assistant',\n content: m.content,\n timestamp: new Date(),\n })));\n }\n }\n } catch {\n // History endpoint is optional\n }\n }\n \n setIsInitialized(true);\n } catch (err) {\n setError('Failed to initialize chat');\n console.error('Bootstrap error:', err);\n }\n };\n\n bootstrap();\n }, [endpoint, isOpen, isInitialized, history, eagerInit]);\n\n const sendMessage = async () => {\n if (!input.trim() || isLoading || isStreaming) return;\n\n const userMessage: Message = {\n id: generateId(),\n role: 'user',\n content: input.trim(),\n timestamp: new Date(),\n };\n\n setMessages(prev => [...prev, userMessage]);\n setInput('');\n setIsLoading(true);\n setError(null);\n\n const assistantMessageId = generateId();\n\n try {\n const res = await fetch(`${endpoint}/chat`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ message: userMessage.content }),\n });\n\n if (!res.ok) throw new Error('Failed to send message');\n if (!res.body) throw new Error('No response body');\n\n setIsLoading(false);\n setIsStreaming(true);\n\n const assistantMessage: Message = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n };\n setMessages(prev => [...prev, assistantMessage]);\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') continue;\n\n try {\n const parsed = JSON.parse(data);\n const content = parsed.choices?.[0]?.delta?.content;\n if (content) {\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantMessageId\n ? { ...m, content: m.content + content }\n : m\n )\n );\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n if (buffer.startsWith('data: ')) {\n const data = buffer.slice(6);\n if (data !== '[DONE]') {\n try {\n const parsed = JSON.parse(data);\n const content = parsed.choices?.[0]?.delta?.content;\n if (content) {\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantMessageId\n ? { ...m, content: m.content + content }\n : m\n )\n );\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n } catch (err) {\n setError('Failed to send message');\n console.error('Chat error:', err);\n setMessages(prev => prev.filter(m => m.id !== assistantMessageId));\n } finally {\n setIsLoading(false);\n setIsStreaming(false);\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n sendMessage();\n }\n };\n\n const startNewChat = async () => {\n try {\n const res = await fetch(`${endpoint}/new-chat`, { method: 'POST' });\n if (res.ok) {\n setMessages([]);\n }\n } catch {\n // Fallback: just clear messages locally\n setMessages([]);\n }\n };\n\n const positionStyles = position === 'bottom-right' \n ? { right: '20px', bottom: '20px' }\n : { left: '20px', bottom: '20px' };\n\n const chatPositionStyles = position === 'bottom-right'\n ? { right: '0', bottom: '60px' }\n : { left: '0', bottom: '60px' };\n\n return (\n <>\n <style>{`\n @keyframes mnx-typing {\n 0%, 80%, 100% { transform: scale(0.8); opacity: 0.5; }\n 40% { transform: scale(1); opacity: 1; }\n }\n @keyframes mnx-fade-in {\n from { opacity: 0; transform: translateY(10px) scale(0.95); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n }\n @keyframes mnx-fade-out {\n from { opacity: 1; transform: translateY(0) scale(1); }\n to { opacity: 0; transform: translateY(10px) scale(0.95); }\n }\n @keyframes mnx-pulse {\n 0% { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); }\n 50% { box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4); }\n 100% { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); }\n }\n .mnx-typing-dot:nth-child(1) { animation-delay: 0s; }\n .mnx-typing-dot:nth-child(2) { animation-delay: 0.2s; }\n .mnx-typing-dot:nth-child(3) { animation-delay: 0.4s; }\n .mnx-btn-icon {\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .mnx-btn-icon.open {\n transform: rotate(45deg);\n }\n `}</style>\n\n <div style={{\n position: 'fixed',\n zIndex: 9999,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n ...positionStyles,\n }}>\n {isOpen && (\n <div style={{\n position: 'absolute',\n ...chatPositionStyles,\n width: '380px',\n height: '500px',\n backgroundColor: theme === 'dark' ? 'rgba(26, 26, 26, 0.9)' : 'rgba(255, 255, 255, 0.9)',\n backdropFilter: 'blur(8px) saturate(180%)',\n WebkitBackdropFilter: 'blur(16px) saturate(180%)',\n borderRadius: '16px',\n border: `1px solid ${primaryColor}33`,\n boxShadow: theme === 'dark' ? '0 25px 50px -12px rgba(0, 0, 0, 0.5)' : '0 25px 50px -12px rgba(0, 0, 0, 0.15)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n animation: 'mnx-fade-in 0.2s ease-out',\n transform: 'translateZ(0)',\n isolation: 'isolate',\n }}>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '8px 8px',\n borderBottom: `1px solid ${t.border}`,\n backgroundColor: theme === 'dark' ? 'rgba(26, 26, 26, 0.7)' : 'rgba(255, 255, 255, 0.7)',\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>\n <div style={{\n width: '32px',\n height: '32px',\n backgroundColor: primaryColor,\n borderRadius: '8px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n }}>\n {logo ? (\n <img src={logo} alt=\"\" style={{ width: '100%', height: '100%', objectFit: 'cover' }} />\n ) : (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#000\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\"/>\n <path d=\"M2 17l10 5 10-5\"/>\n <path d=\"M2 12l10 5 10-5\"/>\n </svg>\n )}\n </div>\n <span style={{ color: t.text, fontWeight: 600, fontSize: '15px' }}>{title}</span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n <button\n onClick={startNewChat}\n style={{\n background: 'none',\n border: 'none',\n color: t.textMuted,\n cursor: 'pointer',\n padding: '6px',\n borderRadius: '6px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n title=\"New chat\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/>\n </svg>\n </button>\n <button\n onClick={() => setIsOpen(false)}\n style={{\n background: 'none',\n border: 'none',\n color: t.textMuted,\n cursor: 'pointer',\n padding: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <div style={{\n flex: 1,\n overflowY: 'auto',\n padding: '8px 8px',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n }}>\n {!isInitialized && !error && (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%', color: t.textMuted }}>\n Initializing...\n </div>\n )}\n {error && (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%', color: '#ef4444' }}>\n {error}\n </div>\n )}\n {isInitialized && messages.length === 0 && !error && (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%', color: t.textMuted, textAlign: 'center' }}>\n <div>\n <div style={{ fontSize: '24px', marginBottom: '8px' }}>{welcomeIcon}</div>\n <div>{welcomeMessage}</div>\n </div>\n </div>\n )}\n {messages.map(message => (\n <div\n key={message.id}\n style={{\n maxWidth: '85%',\n padding: '10px 14px',\n borderRadius: '12px',\n fontSize: '14px',\n lineHeight: 1.5,\n wordBreak: 'break-word',\n ...(message.role === 'user' \n ? { \n alignSelf: 'flex-end',\n backgroundColor: `${primaryColor}cc`,\n color: '#000',\n borderBottomRightRadius: '4px',\n }\n : {\n alignSelf: 'flex-start',\n backgroundColor: theme === 'dark' ? 'rgba(42, 42, 42, 0.7)' : 'rgba(243, 244, 246, 0.7)',\n color: t.textSecondary,\n borderBottomLeftRadius: '4px',\n }\n ),\n }}\n >\n {message.role === 'assistant' ? renderMarkdown(message.content, { codeBg: t.codeBg, codeBlockBg: t.codeBlockBg }) : message.content}\n </div>\n ))}\n {isLoading && (\n <div style={{\n display: 'flex',\n gap: '4px',\n padding: '10px 14px',\n alignSelf: 'flex-start',\n backgroundColor: theme === 'dark' ? 'rgba(42, 42, 42, 0.7)' : 'rgba(243, 244, 246, 0.7)',\n borderRadius: '12px',\n borderBottomLeftRadius: '4px',\n }}>\n <div className=\"mnx-typing-dot\" style={{ width: '6px', height: '6px', backgroundColor: t.textMuted, borderRadius: '50%', animation: 'mnx-typing 1.4s infinite ease-in-out' }} />\n <div className=\"mnx-typing-dot\" style={{ width: '6px', height: '6px', backgroundColor: t.textMuted, borderRadius: '50%', animation: 'mnx-typing 1.4s infinite ease-in-out' }} />\n <div className=\"mnx-typing-dot\" style={{ width: '6px', height: '6px', backgroundColor: t.textMuted, borderRadius: '50%', animation: 'mnx-typing 1.4s infinite ease-in-out' }} />\n </div>\n )}\n <div ref={messagesEndRef} />\n </div>\n\n <div style={{\n display: 'flex',\n gap: '8px',\n padding: '8px 8px',\n borderTop: `1px solid ${t.border}`,\n backgroundColor: theme === 'dark' ? 'rgba(26, 26, 26, 0.5)' : 'rgba(255, 255, 255, 0.5)',\n }}>\n <input\n ref={inputRef}\n type=\"text\"\n value={input}\n onChange={e => setInput(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={!isInitialized || isLoading || isStreaming}\n style={{\n flex: 1,\n padding: '10px 14px',\n backgroundColor: theme === 'dark' ? 'rgba(42, 42, 42, 0.6)' : 'rgba(249, 250, 251, 0.6)',\n border: 'none',\n borderRadius: '8px',\n fontSize: '14px',\n color: t.text,\n outline: 'none',\n transition: 'box-shadow 0.15s ease',\n }}\n onFocus={e => {\n e.currentTarget.style.boxShadow = `0 0 0 2px ${primaryColor}`;\n }}\n onBlur={e => {\n e.currentTarget.style.boxShadow = 'none';\n }}\n />\n <button\n onClick={sendMessage}\n disabled={!isInitialized || !input.trim() || isLoading || isStreaming}\n style={{\n padding: '10px 16px',\n backgroundColor: !isInitialized || !input.trim() || isLoading || isStreaming ? t.inputBorder : primaryColor,\n color: '#000',\n border: 'none',\n borderRadius: '8px',\n fontSize: '14px',\n fontWeight: 500,\n cursor: !isInitialized || !input.trim() || isLoading || isStreaming ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"/>\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"/>\n </svg>\n </button>\n </div>\n </div>\n )}\n\n <button\n onClick={() => setIsOpen(!isOpen)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '12px 16px',\n backgroundColor: primaryColor,\n color: '#000',\n border: 'none',\n borderRadius: '12px',\n fontSize: '14px',\n fontWeight: 600,\n cursor: 'pointer',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.3)',\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n }}\n onMouseEnter={e => {\n e.currentTarget.style.transform = 'scale(1.05)';\n e.currentTarget.style.boxShadow = '0 6px 20px rgba(0, 0, 0, 0.4)';\n }}\n onMouseLeave={e => {\n e.currentTarget.style.transform = 'scale(1)';\n e.currentTarget.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.3)';\n }}\n >\n <span \n className={`mnx-btn-icon ${isOpen ? 'open' : ''}`}\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n >\n {isOpen ? (\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n ) : logo ? (\n <img src={logo} alt=\"\" style={{ height: '28px', width: 'auto', objectFit: 'contain' }} />\n ) : (\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\"/>\n <path d=\"M2 17l10 5 10-5\"/>\n <path d=\"M2 12l10 5 10-5\"/>\n </svg>\n )}\n </span>\n <span style={{ \n transition: 'opacity 0.2s, width 0.3s',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n }}>\n {isOpen ? 'Close' : buttonLabel}\n </span>\n </button>\n </div>\n </>\n );\n}\n\nexport default MnexiumChat;\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/client/MnexiumChat.tsx"],"sourcesContent":["export { MnexiumChat, type MnexiumChatProps, type Message } from './client/MnexiumChat';\nexport { MnexiumChat as default } from './client/MnexiumChat';\n","'use client';\n\nimport React, { useState, useEffect, useRef, useCallback } from 'react';\n\nexport interface Message {\n id: string;\n role: 'user' | 'assistant';\n content: string;\n timestamp: Date;\n}\n\nexport interface MnexiumChatProps {\n endpoint?: string;\n placeholder?: string;\n title?: string;\n buttonLabel?: string;\n position?: 'bottom-right' | 'bottom-left';\n primaryColor?: string;\n textColor?: string;\n defaultOpen?: boolean;\n logo?: string;\n theme?: 'light' | 'dark';\n welcomeIcon?: string;\n welcomeMessage?: string;\n history?: boolean;\n eagerInit?: boolean;\n}\n\nconst themes = {\n dark: {\n bg: '#1a1a1a',\n bgSecondary: '#2a2a2a',\n border: '#333',\n text: '#fff',\n textSecondary: '#e5e5e5',\n textMuted: '#888',\n inputBg: '#2a2a2a',\n inputBorder: '#444',\n codeBg: '#374151',\n codeBlockBg: '#1f2937',\n },\n light: {\n bg: '#ffffff',\n bgSecondary: '#f3f4f6',\n border: '#e5e7eb',\n text: '#111827',\n textSecondary: '#374151',\n textMuted: '#6b7280',\n inputBg: '#f9fafb',\n inputBorder: '#d1d5db',\n codeBg: '#e5e7eb',\n codeBlockBg: '#f3f4f6',\n },\n};\n\nfunction generateId(): string {\n return Math.random().toString(36).substring(2, 15);\n}\n\nfunction renderMarkdown(text: string, themeColors: { codeBg: string; codeBlockBg: string }): React.ReactNode {\n if (!text) return null;\n const lines = text.split('\\n');\n const elements: React.ReactNode[] = [];\n let inCodeBlock = false;\n let codeContent: string[] = [];\n\n const processInline = (line: string): React.ReactNode => {\n const parts: React.ReactNode[] = [];\n let remaining = line;\n let key = 0;\n\n while (remaining.length > 0) {\n const codeMatch = remaining.match(/`([^`]+)`/);\n const boldMatch = remaining.match(/\\*\\*([^*]+)\\*\\*/);\n const italicMatch = remaining.match(/\\*([^*]+)\\*/);\n\n const matches = [\n codeMatch ? { type: 'code', match: codeMatch, index: codeMatch.index! } : null,\n boldMatch ? { type: 'bold', match: boldMatch, index: boldMatch.index! } : null,\n italicMatch ? { type: 'italic', match: italicMatch, index: italicMatch.index! } : null,\n ].filter(Boolean).sort((a, b) => a!.index - b!.index);\n\n if (matches.length === 0) {\n parts.push(remaining);\n break;\n }\n\n const first = matches[0]!;\n if (first.index > 0) {\n parts.push(remaining.substring(0, first.index));\n }\n\n if (first.type === 'code') {\n parts.push(\n <code key={key++} style={{ backgroundColor: themeColors.codeBg, padding: '2px 6px', borderRadius: '4px', fontSize: '13px' }}>\n {first.match![1]}\n </code>\n );\n } else if (first.type === 'bold') {\n parts.push(<strong key={key++}>{first.match![1]}</strong>);\n } else if (first.type === 'italic') {\n parts.push(<em key={key++}>{first.match![1]}</em>);\n }\n\n remaining = remaining.substring(first.index + first.match![0].length);\n }\n\n return parts.length === 1 ? parts[0] : parts;\n };\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n if (line.startsWith('```')) {\n if (!inCodeBlock) {\n inCodeBlock = true;\n codeContent = [];\n } else {\n elements.push(\n <pre key={i} style={{ backgroundColor: themeColors.codeBlockBg, padding: '12px', borderRadius: '8px', overflow: 'auto', fontSize: '13px', margin: '8px 0' }}>\n <code>{codeContent.join('\\n')}</code>\n </pre>\n );\n inCodeBlock = false;\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeContent.push(line);\n continue;\n }\n\n if (line.startsWith('### ')) {\n elements.push(<h4 key={i} style={{ margin: '12px 0 8px', fontSize: '14px', fontWeight: 600 }}>{processInline(line.slice(4))}</h4>);\n } else if (line.startsWith('## ')) {\n elements.push(<h3 key={i} style={{ margin: '12px 0 8px', fontSize: '15px', fontWeight: 600 }}>{processInline(line.slice(3))}</h3>);\n } else if (line.startsWith('# ')) {\n elements.push(<h2 key={i} style={{ margin: '12px 0 8px', fontSize: '16px', fontWeight: 600 }}>{processInline(line.slice(2))}</h2>);\n } else if (line.startsWith('- ') || line.startsWith('* ')) {\n elements.push(<li key={i} style={{ marginLeft: '16px', listStyleType: 'disc' }}>{processInline(line.slice(2))}</li>);\n } else if (/^\\d+\\.\\s/.test(line)) {\n const content = line.replace(/^\\d+\\.\\s/, '');\n elements.push(<li key={i} style={{ marginLeft: '16px', listStyleType: 'decimal' }}>{processInline(content)}</li>);\n } else if (line.trim() === '') {\n elements.push(<br key={i} />);\n } else {\n elements.push(<p key={i} style={{ margin: '4px 0' }}>{processInline(line)}</p>);\n }\n }\n\n if (inCodeBlock && codeContent.length > 0) {\n elements.push(\n <pre key=\"final-code\" style={{ backgroundColor: themeColors.codeBlockBg, padding: '12px', borderRadius: '8px', overflow: 'auto', fontSize: '13px', margin: '8px 0' }}>\n <code>{codeContent.join('\\n')}</code>\n </pre>\n );\n }\n\n return <div>{elements}</div>;\n}\n\nexport function MnexiumChat({\n endpoint = '/api/mnx',\n placeholder = 'Type a message...',\n title = 'Ask AI',\n buttonLabel = 'Ask AI',\n position = 'bottom-right',\n primaryColor = '#facc15',\n textColor = '#000',\n defaultOpen = false,\n logo,\n theme = 'dark',\n welcomeIcon = '👋',\n welcomeMessage = 'How can I help you today?',\n history = false,\n eagerInit = true,\n}: MnexiumChatProps) {\n const t = themes[theme];\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const [messages, setMessages] = useState<Message[]>([]);\n const [input, setInput] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [isInitialized, setIsInitialized] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const scrollToBottom = useCallback(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, []);\n\n useEffect(() => {\n scrollToBottom();\n }, [messages, scrollToBottom]);\n\n useEffect(() => {\n if (isOpen && inputRef.current) {\n inputRef.current.focus();\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (!eagerInit && !isOpen) return;\n \n const bootstrap = async () => {\n if (isInitialized) return;\n \n try {\n const res = await fetch(`${endpoint}/bootstrap`);\n if (!res.ok) throw new Error('Failed to bootstrap');\n \n const data = await res.json();\n \n if (history && data.chat_id) {\n try {\n const historyRes = await fetch(`${endpoint}/conversations/${data.chat_id}`);\n if (historyRes.ok) {\n const historyData = await historyRes.json();\n if (historyData.messages && Array.isArray(historyData.messages)) {\n setMessages(historyData.messages.map((m: { role: string; content: string }) => ({\n id: generateId(),\n role: m.role as 'user' | 'assistant',\n content: m.content,\n timestamp: new Date(),\n })));\n }\n }\n } catch {\n // History endpoint is optional\n }\n }\n \n setIsInitialized(true);\n } catch (err) {\n setError('Failed to initialize chat');\n console.error('Bootstrap error:', err);\n }\n };\n\n bootstrap();\n }, [endpoint, isOpen, isInitialized, history, eagerInit]);\n\n const sendMessage = async () => {\n if (!input.trim() || isLoading || isStreaming) return;\n\n const userMessage: Message = {\n id: generateId(),\n role: 'user',\n content: input.trim(),\n timestamp: new Date(),\n };\n\n setMessages(prev => [...prev, userMessage]);\n setInput('');\n setIsLoading(true);\n setError(null);\n\n const assistantMessageId = generateId();\n\n try {\n const res = await fetch(`${endpoint}/chat`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ message: userMessage.content }),\n });\n\n if (!res.ok) throw new Error('Failed to send message');\n if (!res.body) throw new Error('No response body');\n\n setIsLoading(false);\n setIsStreaming(true);\n\n const assistantMessage: Message = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n };\n setMessages(prev => [...prev, assistantMessage]);\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') continue;\n\n try {\n const parsed = JSON.parse(data);\n const content = parsed.choices?.[0]?.delta?.content;\n if (content) {\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantMessageId\n ? { ...m, content: m.content + content }\n : m\n )\n );\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n if (buffer.startsWith('data: ')) {\n const data = buffer.slice(6);\n if (data !== '[DONE]') {\n try {\n const parsed = JSON.parse(data);\n const content = parsed.choices?.[0]?.delta?.content;\n if (content) {\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantMessageId\n ? { ...m, content: m.content + content }\n : m\n )\n );\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n } catch (err) {\n setError('Failed to send message');\n console.error('Chat error:', err);\n setMessages(prev => prev.filter(m => m.id !== assistantMessageId));\n } finally {\n setIsLoading(false);\n setIsStreaming(false);\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n sendMessage();\n }\n };\n\n const startNewChat = async () => {\n try {\n const res = await fetch(`${endpoint}/new-chat`, { method: 'POST' });\n if (res.ok) {\n setMessages([]);\n }\n } catch {\n // Fallback: just clear messages locally\n setMessages([]);\n }\n };\n\n const positionStyles = position === 'bottom-right' \n ? { right: '20px', bottom: '20px' }\n : { left: '20px', bottom: '20px' };\n\n const chatPositionStyles = position === 'bottom-right'\n ? { right: '0', bottom: '60px' }\n : { left: '0', bottom: '60px' };\n\n return (\n <>\n <style>{`\n @keyframes mnx-typing {\n 0%, 80%, 100% { transform: scale(0.8); opacity: 0.5; }\n 40% { transform: scale(1); opacity: 1; }\n }\n @keyframes mnx-fade-in {\n from { opacity: 0; transform: translateY(10px) scale(0.95); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n }\n @keyframes mnx-fade-out {\n from { opacity: 1; transform: translateY(0) scale(1); }\n to { opacity: 0; transform: translateY(10px) scale(0.95); }\n }\n @keyframes mnx-pulse {\n 0% { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); }\n 50% { box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4); }\n 100% { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); }\n }\n .mnx-typing-dot:nth-child(1) { animation-delay: 0s; }\n .mnx-typing-dot:nth-child(2) { animation-delay: 0.2s; }\n .mnx-typing-dot:nth-child(3) { animation-delay: 0.4s; }\n .mnx-btn-icon {\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n `}</style>\n\n <div style={{\n position: 'fixed',\n zIndex: 9999,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n ...positionStyles,\n }}>\n {isOpen && (\n <div style={{\n position: 'absolute',\n ...chatPositionStyles,\n width: '380px',\n height: '500px',\n backgroundColor: theme === 'dark' ? 'rgba(26, 26, 26, 0.9)' : 'rgba(255, 255, 255, 0.9)',\n backdropFilter: 'blur(8px) saturate(180%)',\n WebkitBackdropFilter: 'blur(16px) saturate(180%)',\n borderRadius: '16px',\n border: `1px solid ${primaryColor}33`,\n boxShadow: theme === 'dark' ? '0 25px 50px -12px rgba(0, 0, 0, 0.5)' : '0 25px 50px -12px rgba(0, 0, 0, 0.15)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n animation: 'mnx-fade-in 0.2s ease-out',\n transform: 'translateZ(0)',\n isolation: 'isolate',\n }}>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '8px 8px',\n borderBottom: `1px solid ${t.border}`,\n backgroundColor: theme === 'dark' ? 'rgba(26, 26, 26, 0.7)' : 'rgba(255, 255, 255, 0.7)',\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>\n <div style={{\n width: '32px',\n height: '32px',\n backgroundColor: primaryColor,\n borderRadius: '8px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n }}>\n {logo ? (\n <img src={logo} alt=\"\" style={{ width: '100%', height: '100%', objectFit: 'cover' }} />\n ) : (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#000\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\"/>\n <path d=\"M2 17l10 5 10-5\"/>\n <path d=\"M2 12l10 5 10-5\"/>\n </svg>\n )}\n </div>\n <span style={{ color: t.text, fontWeight: 600, fontSize: '15px' }}>{title}</span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n <button\n onClick={startNewChat}\n style={{\n background: 'none',\n border: 'none',\n color: t.textMuted,\n cursor: 'pointer',\n padding: '6px',\n borderRadius: '6px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n title=\"New chat\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/>\n </svg>\n </button>\n <button\n onClick={() => setIsOpen(false)}\n style={{\n background: 'none',\n border: 'none',\n color: t.textMuted,\n cursor: 'pointer',\n padding: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <div style={{\n flex: 1,\n overflowY: 'auto',\n padding: '8px 8px',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n }}>\n {!isInitialized && !error && (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%', color: t.textMuted }}>\n Initializing...\n </div>\n )}\n {error && (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%', color: '#ef4444' }}>\n {error}\n </div>\n )}\n {isInitialized && messages.length === 0 && !error && (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%', color: t.textMuted, textAlign: 'center' }}>\n <div>\n <div style={{ fontSize: '24px', marginBottom: '8px' }}>{welcomeIcon}</div>\n <div>{welcomeMessage}</div>\n </div>\n </div>\n )}\n {messages.map(message => (\n <div\n key={message.id}\n style={{\n maxWidth: '85%',\n padding: '10px 14px',\n borderRadius: '12px',\n fontSize: '14px',\n lineHeight: 1.5,\n wordBreak: 'break-word',\n ...(message.role === 'user' \n ? { \n alignSelf: 'flex-end',\n backgroundColor: `${primaryColor}cc`,\n color: textColor,\n borderBottomRightRadius: '4px',\n }\n : {\n alignSelf: 'flex-start',\n backgroundColor: theme === 'dark' ? 'rgba(42, 42, 42, 0.7)' : 'rgba(243, 244, 246, 0.7)',\n color: t.textSecondary,\n borderBottomLeftRadius: '4px',\n }\n ),\n }}\n >\n {message.role === 'assistant' ? renderMarkdown(message.content, { codeBg: t.codeBg, codeBlockBg: t.codeBlockBg }) : message.content}\n </div>\n ))}\n {isLoading && (\n <div style={{\n display: 'flex',\n gap: '4px',\n padding: '10px 14px',\n alignSelf: 'flex-start',\n backgroundColor: theme === 'dark' ? 'rgba(42, 42, 42, 0.7)' : 'rgba(243, 244, 246, 0.7)',\n borderRadius: '12px',\n borderBottomLeftRadius: '4px',\n }}>\n <div className=\"mnx-typing-dot\" style={{ width: '6px', height: '6px', backgroundColor: t.textMuted, borderRadius: '50%', animation: 'mnx-typing 1.4s infinite ease-in-out' }} />\n <div className=\"mnx-typing-dot\" style={{ width: '6px', height: '6px', backgroundColor: t.textMuted, borderRadius: '50%', animation: 'mnx-typing 1.4s infinite ease-in-out' }} />\n <div className=\"mnx-typing-dot\" style={{ width: '6px', height: '6px', backgroundColor: t.textMuted, borderRadius: '50%', animation: 'mnx-typing 1.4s infinite ease-in-out' }} />\n </div>\n )}\n <div ref={messagesEndRef} />\n </div>\n\n <div style={{\n display: 'flex',\n gap: '8px',\n padding: '8px 8px',\n borderTop: `1px solid ${t.border}`,\n backgroundColor: theme === 'dark' ? 'rgba(26, 26, 26, 0.5)' : 'rgba(255, 255, 255, 0.5)',\n }}>\n <input\n ref={inputRef}\n type=\"text\"\n value={input}\n onChange={e => setInput(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={!isInitialized || isLoading || isStreaming}\n style={{\n flex: 1,\n padding: '10px 14px',\n backgroundColor: theme === 'dark' ? 'rgba(42, 42, 42, 0.6)' : 'rgba(249, 250, 251, 0.6)',\n border: 'none',\n borderRadius: '8px',\n fontSize: '14px',\n color: t.text,\n outline: 'none',\n transition: 'box-shadow 0.15s ease',\n }}\n onFocus={e => {\n e.currentTarget.style.boxShadow = `0 0 0 2px ${primaryColor}`;\n }}\n onBlur={e => {\n e.currentTarget.style.boxShadow = 'none';\n }}\n />\n <button\n onClick={sendMessage}\n disabled={!isInitialized || !input.trim() || isLoading || isStreaming}\n style={{\n padding: '10px 16px',\n backgroundColor: !isInitialized || !input.trim() || isLoading || isStreaming ? t.inputBorder : primaryColor,\n color: '#000',\n border: 'none',\n borderRadius: '8px',\n fontSize: '14px',\n fontWeight: 500,\n cursor: !isInitialized || !input.trim() || isLoading || isStreaming ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"/>\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"/>\n </svg>\n </button>\n </div>\n </div>\n )}\n\n <button\n onClick={() => setIsOpen(!isOpen)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '12px 16px',\n backgroundColor: primaryColor,\n color: textColor,\n border: 'none',\n borderRadius: '12px',\n fontSize: '14px',\n fontWeight: 600,\n cursor: 'pointer',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.3)',\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n }}\n onMouseEnter={e => {\n e.currentTarget.style.transform = 'scale(1.05)';\n e.currentTarget.style.boxShadow = '0 6px 20px rgba(0, 0, 0, 0.4)';\n }}\n onMouseLeave={e => {\n e.currentTarget.style.transform = 'scale(1)';\n e.currentTarget.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.3)';\n }}\n >\n <span \n className={`mnx-btn-icon ${isOpen ? 'open' : ''}`}\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n >\n {isOpen ? (\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n ) : logo ? (\n <img src={logo} alt=\"\" style={{ height: '28px', width: 'auto', objectFit: 'contain' }} />\n ) : (\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\"/>\n <path d=\"M2 17l10 5 10-5\"/>\n <path d=\"M2 12l10 5 10-5\"/>\n </svg>\n )}\n </span>\n <span style={{ \n display: 'inline-flex',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n position: 'relative',\n height: '1.2em',\n alignItems: 'center',\n }}>\n <span style={{\n display: 'inline-block',\n transition: 'transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s, max-width 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n transform: isOpen ? 'translateY(-100%)' : 'translateY(0)',\n opacity: isOpen ? 0 : 1,\n maxWidth: isOpen ? '0' : '300px',\n }}>\n {buttonLabel}\n </span>\n <span style={{\n display: 'inline-block',\n transition: 'transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s, max-width 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n transform: isOpen ? 'translateY(0)' : 'translateY(100%)',\n opacity: isOpen ? 1 : 0,\n maxWidth: isOpen ? '50px' : '0',\n overflow: 'hidden',\n }}>\n Close\n </span>\n </span>\n </button>\n </div>\n </>\n );\n}\n\nexport default MnexiumChat;\n"],"mappings":"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","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -121,6 +121,7 @@ function MnexiumChat({
|
|
|
121
121
|
buttonLabel = "Ask AI",
|
|
122
122
|
position = "bottom-right",
|
|
123
123
|
primaryColor = "#facc15",
|
|
124
|
+
textColor = "#000",
|
|
124
125
|
defaultOpen = false,
|
|
125
126
|
logo,
|
|
126
127
|
theme = "dark",
|
|
@@ -313,9 +314,6 @@ function MnexiumChat({
|
|
|
313
314
|
.mnx-btn-icon {
|
|
314
315
|
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
315
316
|
}
|
|
316
|
-
.mnx-btn-icon.open {
|
|
317
|
-
transform: rotate(45deg);
|
|
318
|
-
}
|
|
319
317
|
` }),
|
|
320
318
|
/* @__PURE__ */ jsxs("div", { style: {
|
|
321
319
|
position: "fixed",
|
|
@@ -438,7 +436,7 @@ function MnexiumChat({
|
|
|
438
436
|
...message.role === "user" ? {
|
|
439
437
|
alignSelf: "flex-end",
|
|
440
438
|
backgroundColor: `${primaryColor}cc`,
|
|
441
|
-
color:
|
|
439
|
+
color: textColor,
|
|
442
440
|
borderBottomRightRadius: "4px"
|
|
443
441
|
} : {
|
|
444
442
|
alignSelf: "flex-start",
|
|
@@ -538,7 +536,7 @@ function MnexiumChat({
|
|
|
538
536
|
gap: "8px",
|
|
539
537
|
padding: "12px 16px",
|
|
540
538
|
backgroundColor: primaryColor,
|
|
541
|
-
color:
|
|
539
|
+
color: textColor,
|
|
542
540
|
border: "none",
|
|
543
541
|
borderRadius: "12px",
|
|
544
542
|
fontSize: "14px",
|
|
@@ -571,11 +569,30 @@ function MnexiumChat({
|
|
|
571
569
|
] })
|
|
572
570
|
}
|
|
573
571
|
),
|
|
574
|
-
/* @__PURE__ */
|
|
575
|
-
|
|
572
|
+
/* @__PURE__ */ jsxs("span", { style: {
|
|
573
|
+
display: "inline-flex",
|
|
576
574
|
overflow: "hidden",
|
|
577
|
-
whiteSpace: "nowrap"
|
|
578
|
-
|
|
575
|
+
whiteSpace: "nowrap",
|
|
576
|
+
position: "relative",
|
|
577
|
+
height: "1.2em",
|
|
578
|
+
alignItems: "center"
|
|
579
|
+
}, children: [
|
|
580
|
+
/* @__PURE__ */ jsx("span", { style: {
|
|
581
|
+
display: "inline-block",
|
|
582
|
+
transition: "transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s, max-width 0.3s cubic-bezier(0.4, 0, 0.2, 1)",
|
|
583
|
+
transform: isOpen ? "translateY(-100%)" : "translateY(0)",
|
|
584
|
+
opacity: isOpen ? 0 : 1,
|
|
585
|
+
maxWidth: isOpen ? "0" : "300px"
|
|
586
|
+
}, children: buttonLabel }),
|
|
587
|
+
/* @__PURE__ */ jsx("span", { style: {
|
|
588
|
+
display: "inline-block",
|
|
589
|
+
transition: "transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s, max-width 0.3s cubic-bezier(0.4, 0, 0.2, 1)",
|
|
590
|
+
transform: isOpen ? "translateY(0)" : "translateY(100%)",
|
|
591
|
+
opacity: isOpen ? 1 : 0,
|
|
592
|
+
maxWidth: isOpen ? "50px" : "0",
|
|
593
|
+
overflow: "hidden"
|
|
594
|
+
}, children: "Close" })
|
|
595
|
+
] })
|
|
579
596
|
]
|
|
580
597
|
}
|
|
581
598
|
)
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/MnexiumChat.tsx"],"sourcesContent":["'use client';\n\nimport React, { useState, useEffect, useRef, useCallback } from 'react';\n\nexport interface Message {\n id: string;\n role: 'user' | 'assistant';\n content: string;\n timestamp: Date;\n}\n\nexport interface MnexiumChatProps {\n endpoint?: string;\n placeholder?: string;\n title?: string;\n buttonLabel?: string;\n position?: 'bottom-right' | 'bottom-left';\n primaryColor?: string;\n defaultOpen?: boolean;\n logo?: string;\n theme?: 'light' | 'dark';\n welcomeIcon?: string;\n welcomeMessage?: string;\n history?: boolean;\n eagerInit?: boolean;\n}\n\nconst themes = {\n dark: {\n bg: '#1a1a1a',\n bgSecondary: '#2a2a2a',\n border: '#333',\n text: '#fff',\n textSecondary: '#e5e5e5',\n textMuted: '#888',\n inputBg: '#2a2a2a',\n inputBorder: '#444',\n codeBg: '#374151',\n codeBlockBg: '#1f2937',\n },\n light: {\n bg: '#ffffff',\n bgSecondary: '#f3f4f6',\n border: '#e5e7eb',\n text: '#111827',\n textSecondary: '#374151',\n textMuted: '#6b7280',\n inputBg: '#f9fafb',\n inputBorder: '#d1d5db',\n codeBg: '#e5e7eb',\n codeBlockBg: '#f3f4f6',\n },\n};\n\nfunction generateId(): string {\n return Math.random().toString(36).substring(2, 15);\n}\n\nfunction renderMarkdown(text: string, themeColors: { codeBg: string; codeBlockBg: string }): React.ReactNode {\n if (!text) return null;\n const lines = text.split('\\n');\n const elements: React.ReactNode[] = [];\n let inCodeBlock = false;\n let codeContent: string[] = [];\n\n const processInline = (line: string): React.ReactNode => {\n const parts: React.ReactNode[] = [];\n let remaining = line;\n let key = 0;\n\n while (remaining.length > 0) {\n const codeMatch = remaining.match(/`([^`]+)`/);\n const boldMatch = remaining.match(/\\*\\*([^*]+)\\*\\*/);\n const italicMatch = remaining.match(/\\*([^*]+)\\*/);\n\n const matches = [\n codeMatch ? { type: 'code', match: codeMatch, index: codeMatch.index! } : null,\n boldMatch ? { type: 'bold', match: boldMatch, index: boldMatch.index! } : null,\n italicMatch ? { type: 'italic', match: italicMatch, index: italicMatch.index! } : null,\n ].filter(Boolean).sort((a, b) => a!.index - b!.index);\n\n if (matches.length === 0) {\n parts.push(remaining);\n break;\n }\n\n const first = matches[0]!;\n if (first.index > 0) {\n parts.push(remaining.substring(0, first.index));\n }\n\n if (first.type === 'code') {\n parts.push(\n <code key={key++} style={{ backgroundColor: themeColors.codeBg, padding: '2px 6px', borderRadius: '4px', fontSize: '13px' }}>\n {first.match![1]}\n </code>\n );\n } else if (first.type === 'bold') {\n parts.push(<strong key={key++}>{first.match![1]}</strong>);\n } else if (first.type === 'italic') {\n parts.push(<em key={key++}>{first.match![1]}</em>);\n }\n\n remaining = remaining.substring(first.index + first.match![0].length);\n }\n\n return parts.length === 1 ? parts[0] : parts;\n };\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n if (line.startsWith('```')) {\n if (!inCodeBlock) {\n inCodeBlock = true;\n codeContent = [];\n } else {\n elements.push(\n <pre key={i} style={{ backgroundColor: themeColors.codeBlockBg, padding: '12px', borderRadius: '8px', overflow: 'auto', fontSize: '13px', margin: '8px 0' }}>\n <code>{codeContent.join('\\n')}</code>\n </pre>\n );\n inCodeBlock = false;\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeContent.push(line);\n continue;\n }\n\n if (line.startsWith('### ')) {\n elements.push(<h4 key={i} style={{ margin: '12px 0 8px', fontSize: '14px', fontWeight: 600 }}>{processInline(line.slice(4))}</h4>);\n } else if (line.startsWith('## ')) {\n elements.push(<h3 key={i} style={{ margin: '12px 0 8px', fontSize: '15px', fontWeight: 600 }}>{processInline(line.slice(3))}</h3>);\n } else if (line.startsWith('# ')) {\n elements.push(<h2 key={i} style={{ margin: '12px 0 8px', fontSize: '16px', fontWeight: 600 }}>{processInline(line.slice(2))}</h2>);\n } else if (line.startsWith('- ') || line.startsWith('* ')) {\n elements.push(<li key={i} style={{ marginLeft: '16px', listStyleType: 'disc' }}>{processInline(line.slice(2))}</li>);\n } else if (/^\\d+\\.\\s/.test(line)) {\n const content = line.replace(/^\\d+\\.\\s/, '');\n elements.push(<li key={i} style={{ marginLeft: '16px', listStyleType: 'decimal' }}>{processInline(content)}</li>);\n } else if (line.trim() === '') {\n elements.push(<br key={i} />);\n } else {\n elements.push(<p key={i} style={{ margin: '4px 0' }}>{processInline(line)}</p>);\n }\n }\n\n if (inCodeBlock && codeContent.length > 0) {\n elements.push(\n <pre key=\"final-code\" style={{ backgroundColor: themeColors.codeBlockBg, padding: '12px', borderRadius: '8px', overflow: 'auto', fontSize: '13px', margin: '8px 0' }}>\n <code>{codeContent.join('\\n')}</code>\n </pre>\n );\n }\n\n return <div>{elements}</div>;\n}\n\nexport function MnexiumChat({\n endpoint = '/api/mnx',\n placeholder = 'Type a message...',\n title = 'Ask AI',\n buttonLabel = 'Ask AI',\n position = 'bottom-right',\n primaryColor = '#facc15',\n defaultOpen = false,\n logo,\n theme = 'dark',\n welcomeIcon = '👋',\n welcomeMessage = 'How can I help you today?',\n history = false,\n eagerInit = true,\n}: MnexiumChatProps) {\n const t = themes[theme];\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const [messages, setMessages] = useState<Message[]>([]);\n const [input, setInput] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [isInitialized, setIsInitialized] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const scrollToBottom = useCallback(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, []);\n\n useEffect(() => {\n scrollToBottom();\n }, [messages, scrollToBottom]);\n\n useEffect(() => {\n if (isOpen && inputRef.current) {\n inputRef.current.focus();\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (!eagerInit && !isOpen) return;\n \n const bootstrap = async () => {\n if (isInitialized) return;\n \n try {\n const res = await fetch(`${endpoint}/bootstrap`);\n if (!res.ok) throw new Error('Failed to bootstrap');\n \n const data = await res.json();\n \n if (history && data.chat_id) {\n try {\n const historyRes = await fetch(`${endpoint}/conversations/${data.chat_id}`);\n if (historyRes.ok) {\n const historyData = await historyRes.json();\n if (historyData.messages && Array.isArray(historyData.messages)) {\n setMessages(historyData.messages.map((m: { role: string; content: string }) => ({\n id: generateId(),\n role: m.role as 'user' | 'assistant',\n content: m.content,\n timestamp: new Date(),\n })));\n }\n }\n } catch {\n // History endpoint is optional\n }\n }\n \n setIsInitialized(true);\n } catch (err) {\n setError('Failed to initialize chat');\n console.error('Bootstrap error:', err);\n }\n };\n\n bootstrap();\n }, [endpoint, isOpen, isInitialized, history, eagerInit]);\n\n const sendMessage = async () => {\n if (!input.trim() || isLoading || isStreaming) return;\n\n const userMessage: Message = {\n id: generateId(),\n role: 'user',\n content: input.trim(),\n timestamp: new Date(),\n };\n\n setMessages(prev => [...prev, userMessage]);\n setInput('');\n setIsLoading(true);\n setError(null);\n\n const assistantMessageId = generateId();\n\n try {\n const res = await fetch(`${endpoint}/chat`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ message: userMessage.content }),\n });\n\n if (!res.ok) throw new Error('Failed to send message');\n if (!res.body) throw new Error('No response body');\n\n setIsLoading(false);\n setIsStreaming(true);\n\n const assistantMessage: Message = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n };\n setMessages(prev => [...prev, assistantMessage]);\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') continue;\n\n try {\n const parsed = JSON.parse(data);\n const content = parsed.choices?.[0]?.delta?.content;\n if (content) {\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantMessageId\n ? { ...m, content: m.content + content }\n : m\n )\n );\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n if (buffer.startsWith('data: ')) {\n const data = buffer.slice(6);\n if (data !== '[DONE]') {\n try {\n const parsed = JSON.parse(data);\n const content = parsed.choices?.[0]?.delta?.content;\n if (content) {\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantMessageId\n ? { ...m, content: m.content + content }\n : m\n )\n );\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n } catch (err) {\n setError('Failed to send message');\n console.error('Chat error:', err);\n setMessages(prev => prev.filter(m => m.id !== assistantMessageId));\n } finally {\n setIsLoading(false);\n setIsStreaming(false);\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n sendMessage();\n }\n };\n\n const startNewChat = async () => {\n try {\n const res = await fetch(`${endpoint}/new-chat`, { method: 'POST' });\n if (res.ok) {\n setMessages([]);\n }\n } catch {\n // Fallback: just clear messages locally\n setMessages([]);\n }\n };\n\n const positionStyles = position === 'bottom-right' \n ? { right: '20px', bottom: '20px' }\n : { left: '20px', bottom: '20px' };\n\n const chatPositionStyles = position === 'bottom-right'\n ? { right: '0', bottom: '60px' }\n : { left: '0', bottom: '60px' };\n\n return (\n <>\n <style>{`\n @keyframes mnx-typing {\n 0%, 80%, 100% { transform: scale(0.8); opacity: 0.5; }\n 40% { transform: scale(1); opacity: 1; }\n }\n @keyframes mnx-fade-in {\n from { opacity: 0; transform: translateY(10px) scale(0.95); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n }\n @keyframes mnx-fade-out {\n from { opacity: 1; transform: translateY(0) scale(1); }\n to { opacity: 0; transform: translateY(10px) scale(0.95); }\n }\n @keyframes mnx-pulse {\n 0% { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); }\n 50% { box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4); }\n 100% { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); }\n }\n .mnx-typing-dot:nth-child(1) { animation-delay: 0s; }\n .mnx-typing-dot:nth-child(2) { animation-delay: 0.2s; }\n .mnx-typing-dot:nth-child(3) { animation-delay: 0.4s; }\n .mnx-btn-icon {\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .mnx-btn-icon.open {\n transform: rotate(45deg);\n }\n `}</style>\n\n <div style={{\n position: 'fixed',\n zIndex: 9999,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n ...positionStyles,\n }}>\n {isOpen && (\n <div style={{\n position: 'absolute',\n ...chatPositionStyles,\n width: '380px',\n height: '500px',\n backgroundColor: theme === 'dark' ? 'rgba(26, 26, 26, 0.9)' : 'rgba(255, 255, 255, 0.9)',\n backdropFilter: 'blur(8px) saturate(180%)',\n WebkitBackdropFilter: 'blur(16px) saturate(180%)',\n borderRadius: '16px',\n border: `1px solid ${primaryColor}33`,\n boxShadow: theme === 'dark' ? '0 25px 50px -12px rgba(0, 0, 0, 0.5)' : '0 25px 50px -12px rgba(0, 0, 0, 0.15)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n animation: 'mnx-fade-in 0.2s ease-out',\n transform: 'translateZ(0)',\n isolation: 'isolate',\n }}>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '8px 8px',\n borderBottom: `1px solid ${t.border}`,\n backgroundColor: theme === 'dark' ? 'rgba(26, 26, 26, 0.7)' : 'rgba(255, 255, 255, 0.7)',\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>\n <div style={{\n width: '32px',\n height: '32px',\n backgroundColor: primaryColor,\n borderRadius: '8px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n }}>\n {logo ? (\n <img src={logo} alt=\"\" style={{ width: '100%', height: '100%', objectFit: 'cover' }} />\n ) : (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#000\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\"/>\n <path d=\"M2 17l10 5 10-5\"/>\n <path d=\"M2 12l10 5 10-5\"/>\n </svg>\n )}\n </div>\n <span style={{ color: t.text, fontWeight: 600, fontSize: '15px' }}>{title}</span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n <button\n onClick={startNewChat}\n style={{\n background: 'none',\n border: 'none',\n color: t.textMuted,\n cursor: 'pointer',\n padding: '6px',\n borderRadius: '6px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n title=\"New chat\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/>\n </svg>\n </button>\n <button\n onClick={() => setIsOpen(false)}\n style={{\n background: 'none',\n border: 'none',\n color: t.textMuted,\n cursor: 'pointer',\n padding: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <div style={{\n flex: 1,\n overflowY: 'auto',\n padding: '8px 8px',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n }}>\n {!isInitialized && !error && (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%', color: t.textMuted }}>\n Initializing...\n </div>\n )}\n {error && (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%', color: '#ef4444' }}>\n {error}\n </div>\n )}\n {isInitialized && messages.length === 0 && !error && (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%', color: t.textMuted, textAlign: 'center' }}>\n <div>\n <div style={{ fontSize: '24px', marginBottom: '8px' }}>{welcomeIcon}</div>\n <div>{welcomeMessage}</div>\n </div>\n </div>\n )}\n {messages.map(message => (\n <div\n key={message.id}\n style={{\n maxWidth: '85%',\n padding: '10px 14px',\n borderRadius: '12px',\n fontSize: '14px',\n lineHeight: 1.5,\n wordBreak: 'break-word',\n ...(message.role === 'user' \n ? { \n alignSelf: 'flex-end',\n backgroundColor: `${primaryColor}cc`,\n color: '#000',\n borderBottomRightRadius: '4px',\n }\n : {\n alignSelf: 'flex-start',\n backgroundColor: theme === 'dark' ? 'rgba(42, 42, 42, 0.7)' : 'rgba(243, 244, 246, 0.7)',\n color: t.textSecondary,\n borderBottomLeftRadius: '4px',\n }\n ),\n }}\n >\n {message.role === 'assistant' ? renderMarkdown(message.content, { codeBg: t.codeBg, codeBlockBg: t.codeBlockBg }) : message.content}\n </div>\n ))}\n {isLoading && (\n <div style={{\n display: 'flex',\n gap: '4px',\n padding: '10px 14px',\n alignSelf: 'flex-start',\n backgroundColor: theme === 'dark' ? 'rgba(42, 42, 42, 0.7)' : 'rgba(243, 244, 246, 0.7)',\n borderRadius: '12px',\n borderBottomLeftRadius: '4px',\n }}>\n <div className=\"mnx-typing-dot\" style={{ width: '6px', height: '6px', backgroundColor: t.textMuted, borderRadius: '50%', animation: 'mnx-typing 1.4s infinite ease-in-out' }} />\n <div className=\"mnx-typing-dot\" style={{ width: '6px', height: '6px', backgroundColor: t.textMuted, borderRadius: '50%', animation: 'mnx-typing 1.4s infinite ease-in-out' }} />\n <div className=\"mnx-typing-dot\" style={{ width: '6px', height: '6px', backgroundColor: t.textMuted, borderRadius: '50%', animation: 'mnx-typing 1.4s infinite ease-in-out' }} />\n </div>\n )}\n <div ref={messagesEndRef} />\n </div>\n\n <div style={{\n display: 'flex',\n gap: '8px',\n padding: '8px 8px',\n borderTop: `1px solid ${t.border}`,\n backgroundColor: theme === 'dark' ? 'rgba(26, 26, 26, 0.5)' : 'rgba(255, 255, 255, 0.5)',\n }}>\n <input\n ref={inputRef}\n type=\"text\"\n value={input}\n onChange={e => setInput(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={!isInitialized || isLoading || isStreaming}\n style={{\n flex: 1,\n padding: '10px 14px',\n backgroundColor: theme === 'dark' ? 'rgba(42, 42, 42, 0.6)' : 'rgba(249, 250, 251, 0.6)',\n border: 'none',\n borderRadius: '8px',\n fontSize: '14px',\n color: t.text,\n outline: 'none',\n transition: 'box-shadow 0.15s ease',\n }}\n onFocus={e => {\n e.currentTarget.style.boxShadow = `0 0 0 2px ${primaryColor}`;\n }}\n onBlur={e => {\n e.currentTarget.style.boxShadow = 'none';\n }}\n />\n <button\n onClick={sendMessage}\n disabled={!isInitialized || !input.trim() || isLoading || isStreaming}\n style={{\n padding: '10px 16px',\n backgroundColor: !isInitialized || !input.trim() || isLoading || isStreaming ? t.inputBorder : primaryColor,\n color: '#000',\n border: 'none',\n borderRadius: '8px',\n fontSize: '14px',\n fontWeight: 500,\n cursor: !isInitialized || !input.trim() || isLoading || isStreaming ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"/>\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"/>\n </svg>\n </button>\n </div>\n </div>\n )}\n\n <button\n onClick={() => setIsOpen(!isOpen)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '12px 16px',\n backgroundColor: primaryColor,\n color: '#000',\n border: 'none',\n borderRadius: '12px',\n fontSize: '14px',\n fontWeight: 600,\n cursor: 'pointer',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.3)',\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n }}\n onMouseEnter={e => {\n e.currentTarget.style.transform = 'scale(1.05)';\n e.currentTarget.style.boxShadow = '0 6px 20px rgba(0, 0, 0, 0.4)';\n }}\n onMouseLeave={e => {\n e.currentTarget.style.transform = 'scale(1)';\n e.currentTarget.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.3)';\n }}\n >\n <span \n className={`mnx-btn-icon ${isOpen ? 'open' : ''}`}\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n >\n {isOpen ? (\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n ) : logo ? (\n <img src={logo} alt=\"\" style={{ height: '28px', width: 'auto', objectFit: 'contain' }} />\n ) : (\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\"/>\n <path d=\"M2 17l10 5 10-5\"/>\n <path d=\"M2 12l10 5 10-5\"/>\n </svg>\n )}\n </span>\n <span style={{ \n transition: 'opacity 0.2s, width 0.3s',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n }}>\n {isOpen ? 'Close' : buttonLabel}\n </span>\n </button>\n </div>\n </>\n );\n}\n\nexport default MnexiumChat;\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/client/MnexiumChat.tsx"],"sourcesContent":["'use client';\n\nimport React, { useState, useEffect, useRef, useCallback } from 'react';\n\nexport interface Message {\n id: string;\n role: 'user' | 'assistant';\n content: string;\n timestamp: Date;\n}\n\nexport interface MnexiumChatProps {\n endpoint?: string;\n placeholder?: string;\n title?: string;\n buttonLabel?: string;\n position?: 'bottom-right' | 'bottom-left';\n primaryColor?: string;\n textColor?: string;\n defaultOpen?: boolean;\n logo?: string;\n theme?: 'light' | 'dark';\n welcomeIcon?: string;\n welcomeMessage?: string;\n history?: boolean;\n eagerInit?: boolean;\n}\n\nconst themes = {\n dark: {\n bg: '#1a1a1a',\n bgSecondary: '#2a2a2a',\n border: '#333',\n text: '#fff',\n textSecondary: '#e5e5e5',\n textMuted: '#888',\n inputBg: '#2a2a2a',\n inputBorder: '#444',\n codeBg: '#374151',\n codeBlockBg: '#1f2937',\n },\n light: {\n bg: '#ffffff',\n bgSecondary: '#f3f4f6',\n border: '#e5e7eb',\n text: '#111827',\n textSecondary: '#374151',\n textMuted: '#6b7280',\n inputBg: '#f9fafb',\n inputBorder: '#d1d5db',\n codeBg: '#e5e7eb',\n codeBlockBg: '#f3f4f6',\n },\n};\n\nfunction generateId(): string {\n return Math.random().toString(36).substring(2, 15);\n}\n\nfunction renderMarkdown(text: string, themeColors: { codeBg: string; codeBlockBg: string }): React.ReactNode {\n if (!text) return null;\n const lines = text.split('\\n');\n const elements: React.ReactNode[] = [];\n let inCodeBlock = false;\n let codeContent: string[] = [];\n\n const processInline = (line: string): React.ReactNode => {\n const parts: React.ReactNode[] = [];\n let remaining = line;\n let key = 0;\n\n while (remaining.length > 0) {\n const codeMatch = remaining.match(/`([^`]+)`/);\n const boldMatch = remaining.match(/\\*\\*([^*]+)\\*\\*/);\n const italicMatch = remaining.match(/\\*([^*]+)\\*/);\n\n const matches = [\n codeMatch ? { type: 'code', match: codeMatch, index: codeMatch.index! } : null,\n boldMatch ? { type: 'bold', match: boldMatch, index: boldMatch.index! } : null,\n italicMatch ? { type: 'italic', match: italicMatch, index: italicMatch.index! } : null,\n ].filter(Boolean).sort((a, b) => a!.index - b!.index);\n\n if (matches.length === 0) {\n parts.push(remaining);\n break;\n }\n\n const first = matches[0]!;\n if (first.index > 0) {\n parts.push(remaining.substring(0, first.index));\n }\n\n if (first.type === 'code') {\n parts.push(\n <code key={key++} style={{ backgroundColor: themeColors.codeBg, padding: '2px 6px', borderRadius: '4px', fontSize: '13px' }}>\n {first.match![1]}\n </code>\n );\n } else if (first.type === 'bold') {\n parts.push(<strong key={key++}>{first.match![1]}</strong>);\n } else if (first.type === 'italic') {\n parts.push(<em key={key++}>{first.match![1]}</em>);\n }\n\n remaining = remaining.substring(first.index + first.match![0].length);\n }\n\n return parts.length === 1 ? parts[0] : parts;\n };\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n if (line.startsWith('```')) {\n if (!inCodeBlock) {\n inCodeBlock = true;\n codeContent = [];\n } else {\n elements.push(\n <pre key={i} style={{ backgroundColor: themeColors.codeBlockBg, padding: '12px', borderRadius: '8px', overflow: 'auto', fontSize: '13px', margin: '8px 0' }}>\n <code>{codeContent.join('\\n')}</code>\n </pre>\n );\n inCodeBlock = false;\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeContent.push(line);\n continue;\n }\n\n if (line.startsWith('### ')) {\n elements.push(<h4 key={i} style={{ margin: '12px 0 8px', fontSize: '14px', fontWeight: 600 }}>{processInline(line.slice(4))}</h4>);\n } else if (line.startsWith('## ')) {\n elements.push(<h3 key={i} style={{ margin: '12px 0 8px', fontSize: '15px', fontWeight: 600 }}>{processInline(line.slice(3))}</h3>);\n } else if (line.startsWith('# ')) {\n elements.push(<h2 key={i} style={{ margin: '12px 0 8px', fontSize: '16px', fontWeight: 600 }}>{processInline(line.slice(2))}</h2>);\n } else if (line.startsWith('- ') || line.startsWith('* ')) {\n elements.push(<li key={i} style={{ marginLeft: '16px', listStyleType: 'disc' }}>{processInline(line.slice(2))}</li>);\n } else if (/^\\d+\\.\\s/.test(line)) {\n const content = line.replace(/^\\d+\\.\\s/, '');\n elements.push(<li key={i} style={{ marginLeft: '16px', listStyleType: 'decimal' }}>{processInline(content)}</li>);\n } else if (line.trim() === '') {\n elements.push(<br key={i} />);\n } else {\n elements.push(<p key={i} style={{ margin: '4px 0' }}>{processInline(line)}</p>);\n }\n }\n\n if (inCodeBlock && codeContent.length > 0) {\n elements.push(\n <pre key=\"final-code\" style={{ backgroundColor: themeColors.codeBlockBg, padding: '12px', borderRadius: '8px', overflow: 'auto', fontSize: '13px', margin: '8px 0' }}>\n <code>{codeContent.join('\\n')}</code>\n </pre>\n );\n }\n\n return <div>{elements}</div>;\n}\n\nexport function MnexiumChat({\n endpoint = '/api/mnx',\n placeholder = 'Type a message...',\n title = 'Ask AI',\n buttonLabel = 'Ask AI',\n position = 'bottom-right',\n primaryColor = '#facc15',\n textColor = '#000',\n defaultOpen = false,\n logo,\n theme = 'dark',\n welcomeIcon = '👋',\n welcomeMessage = 'How can I help you today?',\n history = false,\n eagerInit = true,\n}: MnexiumChatProps) {\n const t = themes[theme];\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const [messages, setMessages] = useState<Message[]>([]);\n const [input, setInput] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [isInitialized, setIsInitialized] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const scrollToBottom = useCallback(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, []);\n\n useEffect(() => {\n scrollToBottom();\n }, [messages, scrollToBottom]);\n\n useEffect(() => {\n if (isOpen && inputRef.current) {\n inputRef.current.focus();\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (!eagerInit && !isOpen) return;\n \n const bootstrap = async () => {\n if (isInitialized) return;\n \n try {\n const res = await fetch(`${endpoint}/bootstrap`);\n if (!res.ok) throw new Error('Failed to bootstrap');\n \n const data = await res.json();\n \n if (history && data.chat_id) {\n try {\n const historyRes = await fetch(`${endpoint}/conversations/${data.chat_id}`);\n if (historyRes.ok) {\n const historyData = await historyRes.json();\n if (historyData.messages && Array.isArray(historyData.messages)) {\n setMessages(historyData.messages.map((m: { role: string; content: string }) => ({\n id: generateId(),\n role: m.role as 'user' | 'assistant',\n content: m.content,\n timestamp: new Date(),\n })));\n }\n }\n } catch {\n // History endpoint is optional\n }\n }\n \n setIsInitialized(true);\n } catch (err) {\n setError('Failed to initialize chat');\n console.error('Bootstrap error:', err);\n }\n };\n\n bootstrap();\n }, [endpoint, isOpen, isInitialized, history, eagerInit]);\n\n const sendMessage = async () => {\n if (!input.trim() || isLoading || isStreaming) return;\n\n const userMessage: Message = {\n id: generateId(),\n role: 'user',\n content: input.trim(),\n timestamp: new Date(),\n };\n\n setMessages(prev => [...prev, userMessage]);\n setInput('');\n setIsLoading(true);\n setError(null);\n\n const assistantMessageId = generateId();\n\n try {\n const res = await fetch(`${endpoint}/chat`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ message: userMessage.content }),\n });\n\n if (!res.ok) throw new Error('Failed to send message');\n if (!res.body) throw new Error('No response body');\n\n setIsLoading(false);\n setIsStreaming(true);\n\n const assistantMessage: Message = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n };\n setMessages(prev => [...prev, assistantMessage]);\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') continue;\n\n try {\n const parsed = JSON.parse(data);\n const content = parsed.choices?.[0]?.delta?.content;\n if (content) {\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantMessageId\n ? { ...m, content: m.content + content }\n : m\n )\n );\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n if (buffer.startsWith('data: ')) {\n const data = buffer.slice(6);\n if (data !== '[DONE]') {\n try {\n const parsed = JSON.parse(data);\n const content = parsed.choices?.[0]?.delta?.content;\n if (content) {\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantMessageId\n ? { ...m, content: m.content + content }\n : m\n )\n );\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n } catch (err) {\n setError('Failed to send message');\n console.error('Chat error:', err);\n setMessages(prev => prev.filter(m => m.id !== assistantMessageId));\n } finally {\n setIsLoading(false);\n setIsStreaming(false);\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n sendMessage();\n }\n };\n\n const startNewChat = async () => {\n try {\n const res = await fetch(`${endpoint}/new-chat`, { method: 'POST' });\n if (res.ok) {\n setMessages([]);\n }\n } catch {\n // Fallback: just clear messages locally\n setMessages([]);\n }\n };\n\n const positionStyles = position === 'bottom-right' \n ? { right: '20px', bottom: '20px' }\n : { left: '20px', bottom: '20px' };\n\n const chatPositionStyles = position === 'bottom-right'\n ? { right: '0', bottom: '60px' }\n : { left: '0', bottom: '60px' };\n\n return (\n <>\n <style>{`\n @keyframes mnx-typing {\n 0%, 80%, 100% { transform: scale(0.8); opacity: 0.5; }\n 40% { transform: scale(1); opacity: 1; }\n }\n @keyframes mnx-fade-in {\n from { opacity: 0; transform: translateY(10px) scale(0.95); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n }\n @keyframes mnx-fade-out {\n from { opacity: 1; transform: translateY(0) scale(1); }\n to { opacity: 0; transform: translateY(10px) scale(0.95); }\n }\n @keyframes mnx-pulse {\n 0% { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); }\n 50% { box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4); }\n 100% { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); }\n }\n .mnx-typing-dot:nth-child(1) { animation-delay: 0s; }\n .mnx-typing-dot:nth-child(2) { animation-delay: 0.2s; }\n .mnx-typing-dot:nth-child(3) { animation-delay: 0.4s; }\n .mnx-btn-icon {\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n `}</style>\n\n <div style={{\n position: 'fixed',\n zIndex: 9999,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n ...positionStyles,\n }}>\n {isOpen && (\n <div style={{\n position: 'absolute',\n ...chatPositionStyles,\n width: '380px',\n height: '500px',\n backgroundColor: theme === 'dark' ? 'rgba(26, 26, 26, 0.9)' : 'rgba(255, 255, 255, 0.9)',\n backdropFilter: 'blur(8px) saturate(180%)',\n WebkitBackdropFilter: 'blur(16px) saturate(180%)',\n borderRadius: '16px',\n border: `1px solid ${primaryColor}33`,\n boxShadow: theme === 'dark' ? '0 25px 50px -12px rgba(0, 0, 0, 0.5)' : '0 25px 50px -12px rgba(0, 0, 0, 0.15)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n animation: 'mnx-fade-in 0.2s ease-out',\n transform: 'translateZ(0)',\n isolation: 'isolate',\n }}>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '8px 8px',\n borderBottom: `1px solid ${t.border}`,\n backgroundColor: theme === 'dark' ? 'rgba(26, 26, 26, 0.7)' : 'rgba(255, 255, 255, 0.7)',\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>\n <div style={{\n width: '32px',\n height: '32px',\n backgroundColor: primaryColor,\n borderRadius: '8px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n }}>\n {logo ? (\n <img src={logo} alt=\"\" style={{ width: '100%', height: '100%', objectFit: 'cover' }} />\n ) : (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#000\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\"/>\n <path d=\"M2 17l10 5 10-5\"/>\n <path d=\"M2 12l10 5 10-5\"/>\n </svg>\n )}\n </div>\n <span style={{ color: t.text, fontWeight: 600, fontSize: '15px' }}>{title}</span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n <button\n onClick={startNewChat}\n style={{\n background: 'none',\n border: 'none',\n color: t.textMuted,\n cursor: 'pointer',\n padding: '6px',\n borderRadius: '6px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n title=\"New chat\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/>\n </svg>\n </button>\n <button\n onClick={() => setIsOpen(false)}\n style={{\n background: 'none',\n border: 'none',\n color: t.textMuted,\n cursor: 'pointer',\n padding: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <div style={{\n flex: 1,\n overflowY: 'auto',\n padding: '8px 8px',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n }}>\n {!isInitialized && !error && (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%', color: t.textMuted }}>\n Initializing...\n </div>\n )}\n {error && (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%', color: '#ef4444' }}>\n {error}\n </div>\n )}\n {isInitialized && messages.length === 0 && !error && (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%', color: t.textMuted, textAlign: 'center' }}>\n <div>\n <div style={{ fontSize: '24px', marginBottom: '8px' }}>{welcomeIcon}</div>\n <div>{welcomeMessage}</div>\n </div>\n </div>\n )}\n {messages.map(message => (\n <div\n key={message.id}\n style={{\n maxWidth: '85%',\n padding: '10px 14px',\n borderRadius: '12px',\n fontSize: '14px',\n lineHeight: 1.5,\n wordBreak: 'break-word',\n ...(message.role === 'user' \n ? { \n alignSelf: 'flex-end',\n backgroundColor: `${primaryColor}cc`,\n color: textColor,\n borderBottomRightRadius: '4px',\n }\n : {\n alignSelf: 'flex-start',\n backgroundColor: theme === 'dark' ? 'rgba(42, 42, 42, 0.7)' : 'rgba(243, 244, 246, 0.7)',\n color: t.textSecondary,\n borderBottomLeftRadius: '4px',\n }\n ),\n }}\n >\n {message.role === 'assistant' ? renderMarkdown(message.content, { codeBg: t.codeBg, codeBlockBg: t.codeBlockBg }) : message.content}\n </div>\n ))}\n {isLoading && (\n <div style={{\n display: 'flex',\n gap: '4px',\n padding: '10px 14px',\n alignSelf: 'flex-start',\n backgroundColor: theme === 'dark' ? 'rgba(42, 42, 42, 0.7)' : 'rgba(243, 244, 246, 0.7)',\n borderRadius: '12px',\n borderBottomLeftRadius: '4px',\n }}>\n <div className=\"mnx-typing-dot\" style={{ width: '6px', height: '6px', backgroundColor: t.textMuted, borderRadius: '50%', animation: 'mnx-typing 1.4s infinite ease-in-out' }} />\n <div className=\"mnx-typing-dot\" style={{ width: '6px', height: '6px', backgroundColor: t.textMuted, borderRadius: '50%', animation: 'mnx-typing 1.4s infinite ease-in-out' }} />\n <div className=\"mnx-typing-dot\" style={{ width: '6px', height: '6px', backgroundColor: t.textMuted, borderRadius: '50%', animation: 'mnx-typing 1.4s infinite ease-in-out' }} />\n </div>\n )}\n <div ref={messagesEndRef} />\n </div>\n\n <div style={{\n display: 'flex',\n gap: '8px',\n padding: '8px 8px',\n borderTop: `1px solid ${t.border}`,\n backgroundColor: theme === 'dark' ? 'rgba(26, 26, 26, 0.5)' : 'rgba(255, 255, 255, 0.5)',\n }}>\n <input\n ref={inputRef}\n type=\"text\"\n value={input}\n onChange={e => setInput(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={!isInitialized || isLoading || isStreaming}\n style={{\n flex: 1,\n padding: '10px 14px',\n backgroundColor: theme === 'dark' ? 'rgba(42, 42, 42, 0.6)' : 'rgba(249, 250, 251, 0.6)',\n border: 'none',\n borderRadius: '8px',\n fontSize: '14px',\n color: t.text,\n outline: 'none',\n transition: 'box-shadow 0.15s ease',\n }}\n onFocus={e => {\n e.currentTarget.style.boxShadow = `0 0 0 2px ${primaryColor}`;\n }}\n onBlur={e => {\n e.currentTarget.style.boxShadow = 'none';\n }}\n />\n <button\n onClick={sendMessage}\n disabled={!isInitialized || !input.trim() || isLoading || isStreaming}\n style={{\n padding: '10px 16px',\n backgroundColor: !isInitialized || !input.trim() || isLoading || isStreaming ? t.inputBorder : primaryColor,\n color: '#000',\n border: 'none',\n borderRadius: '8px',\n fontSize: '14px',\n fontWeight: 500,\n cursor: !isInitialized || !input.trim() || isLoading || isStreaming ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"/>\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"/>\n </svg>\n </button>\n </div>\n </div>\n )}\n\n <button\n onClick={() => setIsOpen(!isOpen)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '12px 16px',\n backgroundColor: primaryColor,\n color: textColor,\n border: 'none',\n borderRadius: '12px',\n fontSize: '14px',\n fontWeight: 600,\n cursor: 'pointer',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.3)',\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n }}\n onMouseEnter={e => {\n e.currentTarget.style.transform = 'scale(1.05)';\n e.currentTarget.style.boxShadow = '0 6px 20px rgba(0, 0, 0, 0.4)';\n }}\n onMouseLeave={e => {\n e.currentTarget.style.transform = 'scale(1)';\n e.currentTarget.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.3)';\n }}\n >\n <span \n className={`mnx-btn-icon ${isOpen ? 'open' : ''}`}\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n >\n {isOpen ? (\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n ) : logo ? (\n <img src={logo} alt=\"\" style={{ height: '28px', width: 'auto', objectFit: 'contain' }} />\n ) : (\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\"/>\n <path d=\"M2 17l10 5 10-5\"/>\n <path d=\"M2 12l10 5 10-5\"/>\n </svg>\n )}\n </span>\n <span style={{ \n display: 'inline-flex',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n position: 'relative',\n height: '1.2em',\n alignItems: 'center',\n }}>\n <span style={{\n display: 'inline-block',\n transition: 'transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s, max-width 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n transform: isOpen ? 'translateY(-100%)' : 'translateY(0)',\n opacity: isOpen ? 0 : 1,\n maxWidth: isOpen ? '0' : '300px',\n }}>\n {buttonLabel}\n </span>\n <span style={{\n display: 'inline-block',\n transition: 'transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s, max-width 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n transform: isOpen ? 'translateY(0)' : 'translateY(100%)',\n opacity: isOpen ? 1 : 0,\n maxWidth: isOpen ? '50px' : '0',\n overflow: 'hidden',\n }}>\n Close\n </span>\n </span>\n </button>\n </div>\n </>\n );\n}\n\nexport default MnexiumChat;\n"],"mappings":"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","names":[]}
|