@mnexium/chat-react 1.0.3 → 1.0.5

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
@@ -167,7 +167,7 @@ const mnx = createHandlers({
167
167
  | `mnxOptions.recall` | `boolean` | `true` | Inject relevant memories |
168
168
  | `mnxOptions.profile` | `boolean` | `true` | Include user profile |
169
169
  | `mnxOptions.summarize` | `'light' \| 'balanced' \| 'aggressive' \| false` | `'balanced'` | Summarization mode |
170
- | `mnxOptions.system_prompt_id` | `string` | - | Use a saved Mnexium system prompt by ID |
170
+ | `mnxOptions.system_prompt` | `string` | - | System prompt text for the AI assistant |
171
171
 
172
172
  ### Individual Handlers
173
173
 
package/dist/index.js CHANGED
@@ -40,7 +40,8 @@ var themes = {
40
40
  inputBg: "#2a2a2a",
41
41
  inputBorder: "#444",
42
42
  codeBg: "#374151",
43
- codeBlockBg: "#1f2937"
43
+ codeBlockBg: "#1f2937",
44
+ tableBorderColor: "#444"
44
45
  },
45
46
  light: {
46
47
  bg: "#ffffff",
@@ -52,7 +53,8 @@ var themes = {
52
53
  inputBg: "#f9fafb",
53
54
  inputBorder: "#d1d5db",
54
55
  codeBg: "#e5e7eb",
55
- codeBlockBg: "#f3f4f6"
56
+ codeBlockBg: "#f3f4f6",
57
+ tableBorderColor: "#d1d5db"
56
58
  }
57
59
  };
58
60
  function generateId() {
@@ -64,6 +66,39 @@ function renderMarkdown(text, themeColors) {
64
66
  const elements = [];
65
67
  let inCodeBlock = false;
66
68
  let codeContent = [];
69
+ let inTable = false;
70
+ let tableRows = [];
71
+ let isHeaderRow = true;
72
+ const parseTableRow = (line) => {
73
+ return line.split("|").map((cell) => cell.trim()).filter((_, idx, arr) => idx > 0 && idx < arr.length - 1 || arr.length === 2 && idx === 0);
74
+ };
75
+ const isTableSeparator = (line) => {
76
+ return /^\|?[\s-:|]+\|?$/.test(line) && line.includes("-");
77
+ };
78
+ const renderTable = (rows, key) => {
79
+ if (rows.length === 0) return null;
80
+ const headerRow = rows[0];
81
+ const bodyRows = rows.slice(1);
82
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("table", { style: {
83
+ borderCollapse: "collapse",
84
+ width: "100%",
85
+ margin: "8px 0",
86
+ fontSize: "13px",
87
+ border: `1px solid ${themeColors.tableBorderColor}`
88
+ }, children: [
89
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("thead", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("tr", { children: headerRow.map((cell, idx) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { style: {
90
+ border: `1px solid ${themeColors.tableBorderColor}`,
91
+ padding: "8px",
92
+ textAlign: "left",
93
+ fontWeight: 600,
94
+ backgroundColor: themeColors.codeBlockBg
95
+ }, children: processInline(cell) }, idx)) }) }),
96
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("tbody", { children: bodyRows.map((row, rowIdx) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("tr", { children: row.map((cell, cellIdx) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { style: {
97
+ border: `1px solid ${themeColors.tableBorderColor}`,
98
+ padding: "8px"
99
+ }, children: processInline(cell) }, cellIdx)) }, rowIdx)) })
100
+ ] }, key);
101
+ };
67
102
  const processInline = (line) => {
68
103
  const parts = [];
69
104
  let remaining = line;
@@ -72,10 +107,12 @@ function renderMarkdown(text, themeColors) {
72
107
  const codeMatch = remaining.match(/`([^`]+)`/);
73
108
  const boldMatch = remaining.match(/\*\*([^*]+)\*\*/);
74
109
  const italicMatch = remaining.match(/\*([^*]+)\*/);
110
+ const linkMatch = remaining.match(/\[([^\]]+)\]\(([^)]+)\)/);
75
111
  const matches = [
76
112
  codeMatch ? { type: "code", match: codeMatch, index: codeMatch.index } : null,
77
113
  boldMatch ? { type: "bold", match: boldMatch, index: boldMatch.index } : null,
78
- italicMatch ? { type: "italic", match: italicMatch, index: italicMatch.index } : null
114
+ italicMatch ? { type: "italic", match: italicMatch, index: italicMatch.index } : null,
115
+ linkMatch ? { type: "link", match: linkMatch, index: linkMatch.index } : null
79
116
  ].filter(Boolean).sort((a, b) => a.index - b.index);
80
117
  if (matches.length === 0) {
81
118
  parts.push(remaining);
@@ -93,6 +130,10 @@ function renderMarkdown(text, themeColors) {
93
130
  parts.push(/* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: first.match[1] }, key++));
94
131
  } else if (first.type === "italic") {
95
132
  parts.push(/* @__PURE__ */ (0, import_jsx_runtime.jsx)("em", { children: first.match[1] }, key++));
133
+ } else if (first.type === "link") {
134
+ parts.push(
135
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", { href: first.match[2], target: "_blank", rel: "noopener noreferrer", style: { color: "inherit", textDecoration: "underline" }, children: first.match[1] }, key++)
136
+ );
96
137
  }
97
138
  remaining = remaining.substring(first.index + first.match[0].length);
98
139
  }
@@ -101,6 +142,11 @@ function renderMarkdown(text, themeColors) {
101
142
  for (let i = 0; i < lines.length; i++) {
102
143
  const line = lines[i];
103
144
  if (line.startsWith("```")) {
145
+ if (inTable) {
146
+ elements.push(renderTable(tableRows, i - tableRows.length));
147
+ inTable = false;
148
+ tableRows = [];
149
+ }
104
150
  if (!inCodeBlock) {
105
151
  inCodeBlock = true;
106
152
  codeContent = [];
@@ -116,6 +162,22 @@ function renderMarkdown(text, themeColors) {
116
162
  codeContent.push(line);
117
163
  continue;
118
164
  }
165
+ const isTableRow = line.includes("|") && line.trim().startsWith("|");
166
+ if (isTableRow) {
167
+ if (isTableSeparator(line)) {
168
+ continue;
169
+ }
170
+ if (!inTable) {
171
+ inTable = true;
172
+ tableRows = [];
173
+ }
174
+ tableRows.push(parseTableRow(line));
175
+ continue;
176
+ } else if (inTable) {
177
+ elements.push(renderTable(tableRows, i - tableRows.length));
178
+ inTable = false;
179
+ tableRows = [];
180
+ }
119
181
  if (line.startsWith("### ")) {
120
182
  elements.push(/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h4", { style: { margin: "12px 0 8px", fontSize: "14px", fontWeight: 600 }, children: processInline(line.slice(4)) }, i));
121
183
  } else if (line.startsWith("## ")) {
@@ -133,6 +195,9 @@ function renderMarkdown(text, themeColors) {
133
195
  elements.push(/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { style: { margin: "4px 0" }, children: processInline(line) }, i));
134
196
  }
135
197
  }
198
+ if (inTable && tableRows.length > 0) {
199
+ elements.push(renderTable(tableRows, lines.length));
200
+ }
136
201
  if (inCodeBlock && codeContent.length > 0) {
137
202
  elements.push(
138
203
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("pre", { style: { backgroundColor: themeColors.codeBlockBg, padding: "12px", borderRadius: "8px", overflow: "auto", fontSize: "13px", margin: "8px 0" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", { children: codeContent.join("\n") }) }, "final-code")
@@ -164,6 +229,7 @@ function MnexiumChat({
164
229
  const [isStreaming, setIsStreaming] = (0, import_react.useState)(false);
165
230
  const [isInitialized, setIsInitialized] = (0, import_react.useState)(false);
166
231
  const [error, setError] = (0, import_react.useState)(null);
232
+ const [chatSize, setChatSize] = (0, import_react.useState)("medium");
167
233
  const messagesEndRef = (0, import_react.useRef)(null);
168
234
  const inputRef = (0, import_react.useRef)(null);
169
235
  const scrollToBottom = (0, import_react.useCallback)(() => {
@@ -350,8 +416,8 @@ function MnexiumChat({
350
416
  isOpen && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: {
351
417
  position: "absolute",
352
418
  ...chatPositionStyles,
353
- width: "380px",
354
- height: "500px",
419
+ width: chatSize === "small" ? "320px" : chatSize === "large" ? "547px" : "380px",
420
+ height: chatSize === "small" ? "400px" : chatSize === "large" ? "600px" : "500px",
355
421
  backgroundColor: theme === "dark" ? "rgba(26, 26, 26, 0.9)" : "rgba(255, 255, 255, 0.9)",
356
422
  backdropFilter: "blur(8px) saturate(180%)",
357
423
  WebkitBackdropFilter: "blur(16px) saturate(180%)",
@@ -363,7 +429,8 @@ function MnexiumChat({
363
429
  overflow: "hidden",
364
430
  animation: "mnx-fade-in 0.2s ease-out",
365
431
  transform: "translateZ(0)",
366
- isolation: "isolate"
432
+ isolation: "isolate",
433
+ transition: "width 0.3s cubic-bezier(0.4, 0, 0.2, 1), height 0.3s cubic-bezier(0.4, 0, 0.2, 1)"
367
434
  }, children: [
368
435
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: {
369
436
  display: "flex",
@@ -413,6 +480,32 @@ function MnexiumChat({
413
480
  ] })
414
481
  }
415
482
  ),
483
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
484
+ "button",
485
+ {
486
+ onClick: () => setChatSize((prev) => prev === "small" ? "medium" : prev === "medium" ? "large" : "small"),
487
+ style: {
488
+ background: "none",
489
+ border: "none",
490
+ color: t.textMuted,
491
+ cursor: "pointer",
492
+ padding: "6px",
493
+ borderRadius: "6px",
494
+ display: "flex",
495
+ alignItems: "center",
496
+ justifyContent: "center",
497
+ transition: "transform 0.2s ease"
498
+ },
499
+ title: `Size: ${chatSize}`,
500
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: chatSize === "small" ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
501
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("polyline", { points: "15 3 21 3 21 9" }),
502
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("polyline", { points: "9 21 3 21 3 15" })
503
+ ] }) : chatSize === "large" ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
504
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("polyline", { points: "4 14 4 20 10 20" }),
505
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("polyline", { points: "20 10 20 4 14 4" })
506
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: "4", y: "4", width: "16", height: "16", rx: "2" }) }) })
507
+ }
508
+ ),
416
509
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
417
510
  "button",
418
511
  {
@@ -471,7 +564,7 @@ function MnexiumChat({
471
564
  borderBottomLeftRadius: "4px"
472
565
  }
473
566
  },
474
- children: message.role === "assistant" ? renderMarkdown(message.content, { codeBg: t.codeBg, codeBlockBg: t.codeBlockBg }) : message.content
567
+ children: message.role === "assistant" ? renderMarkdown(message.content, { codeBg: t.codeBg, codeBlockBg: t.codeBlockBg, tableBorderColor: t.tableBorderColor }) : message.content
475
568
  },
476
569
  message.id
477
570
  )),
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 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":[]}
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 tableBorderColor: '#444',\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 tableBorderColor: '#d1d5db',\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; tableBorderColor: 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 let inTable = false;\n let tableRows: string[][] = [];\n let isHeaderRow = true;\n\n const parseTableRow = (line: string): string[] => {\n return line.split('|').map(cell => cell.trim()).filter((_, idx, arr) => idx > 0 && idx < arr.length - 1 || (arr.length === 2 && idx === 0));\n };\n\n const isTableSeparator = (line: string): boolean => {\n return /^\\|?[\\s-:|]+\\|?$/.test(line) && line.includes('-');\n };\n\n const renderTable = (rows: string[][], key: number): React.ReactNode => {\n if (rows.length === 0) return null;\n const headerRow = rows[0];\n const bodyRows = rows.slice(1);\n \n return (\n <table key={key} style={{ \n borderCollapse: 'collapse', \n width: '100%', \n margin: '8px 0', \n fontSize: '13px',\n border: `1px solid ${themeColors.tableBorderColor}`,\n }}>\n <thead>\n <tr>\n {headerRow.map((cell, idx) => (\n <th key={idx} style={{ \n border: `1px solid ${themeColors.tableBorderColor}`, \n padding: '8px', \n textAlign: 'left',\n fontWeight: 600,\n backgroundColor: themeColors.codeBlockBg,\n }}>\n {processInline(cell)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {bodyRows.map((row, rowIdx) => (\n <tr key={rowIdx}>\n {row.map((cell, cellIdx) => (\n <td key={cellIdx} style={{ \n border: `1px solid ${themeColors.tableBorderColor}`, \n padding: '8px',\n }}>\n {processInline(cell)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n );\n };\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 const linkMatch = 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 linkMatch ? { type: 'link', match: linkMatch, index: linkMatch.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 } else if (first.type === 'link') {\n parts.push(\n <a key={key++} href={first.match![2]} target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: 'inherit', textDecoration: 'underline' }}>\n {first.match![1]}\n </a>\n );\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 (inTable) {\n elements.push(renderTable(tableRows, i - tableRows.length));\n inTable = false;\n tableRows = [];\n }\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 // Table handling\n const isTableRow = line.includes('|') && line.trim().startsWith('|');\n if (isTableRow) {\n if (isTableSeparator(line)) {\n // Skip separator row (e.g., |---|---|)\n continue;\n }\n if (!inTable) {\n inTable = true;\n tableRows = [];\n }\n tableRows.push(parseTableRow(line));\n continue;\n } else if (inTable) {\n // End of table\n elements.push(renderTable(tableRows, i - tableRows.length));\n inTable = false;\n tableRows = [];\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 // Handle unclosed table at end\n if (inTable && tableRows.length > 0) {\n elements.push(renderTable(tableRows, lines.length));\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 [chatSize, setChatSize] = useState<'small' | 'medium' | 'large'>('medium');\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: chatSize === 'small' ? '320px' : chatSize === 'large' ? '547px' : '380px',\n height: chatSize === 'small' ? '400px' : chatSize === 'large' ? '600px' : '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 transition: 'width 0.3s cubic-bezier(0.4, 0, 0.2, 1), height 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\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={() => setChatSize(prev => prev === 'small' ? 'medium' : prev === 'medium' ? 'large' : 'small')}\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 transition: 'transform 0.2s ease',\n }}\n title={`Size: ${chatSize}`}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {chatSize === 'small' ? (\n <>\n <polyline points=\"15 3 21 3 21 9\"/>\n <polyline points=\"9 21 3 21 3 15\"/>\n </>\n ) : chatSize === 'large' ? (\n <>\n <polyline points=\"4 14 4 20 10 20\"/>\n <polyline points=\"20 10 20 4 14 4\"/>\n </>\n ) : (\n <>\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\"/>\n </>\n )}\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, tableBorderColor: t.tableBorderColor }) : 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":[]}