@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 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: "#000",
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: "#000",
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.jsx)("span", { style: {
601
- transition: "opacity 0.2s, width 0.3s",
598
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: {
599
+ display: "inline-flex",
602
600
  overflow: "hidden",
603
- whiteSpace: "nowrap"
604
- }, children: isOpen ? "Close" : buttonLabel })
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: "#000",
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: "#000",
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__ */ jsx("span", { style: {
575
- transition: "opacity 0.2s, width 0.3s",
572
+ /* @__PURE__ */ jsxs("span", { style: {
573
+ display: "inline-flex",
576
574
  overflow: "hidden",
577
- whiteSpace: "nowrap"
578
- }, children: isOpen ? "Close" : buttonLabel })
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
  )
@@ -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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mnexium/chat-react",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Drop-in React chat widget with AI memory powered by Mnexium",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",