@shaimaababiker/embed 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +31 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
type AssistlyChatProps = {
|
|
4
|
+
chatbotId: number;
|
|
5
|
+
/** Origin of the Assistly deployment that hosts the chat API, e.g. https://chatbot-xi-rose-68.vercel.app */
|
|
6
|
+
origin: string;
|
|
7
|
+
/** Optional brand color for accents (tints the brass accent + online dot) */
|
|
8
|
+
primaryColor?: string;
|
|
9
|
+
/** Fires when the chat panel has mounted and is ready to receive input */
|
|
10
|
+
onReady?: () => void;
|
|
11
|
+
/** Fires if the chat fails to mount */
|
|
12
|
+
onError?: (err: Error) => void;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Embeddable Assistly chat panel. Renders the full chat UI (intake form +
|
|
16
|
+
* active chat) inside whatever container the customer places it in. Talks
|
|
17
|
+
* directly to the Assistly API at `${origin}/api/...` — no iframe, no
|
|
18
|
+
* cross-origin cookie issues.
|
|
19
|
+
*
|
|
20
|
+
* Styling is inlined into the published JS bundle (esbuild `text` loader
|
|
21
|
+
* at build time, injected into <head> on mount). Consumers only need:
|
|
22
|
+
*
|
|
23
|
+
* import { AssistlyChat } from '@shaimaababiker/embed';
|
|
24
|
+
*
|
|
25
|
+
* Theme tokens are exposed as CSS variables on the root wrapper, e.g.
|
|
26
|
+
* `--assistly-brass`, `--assistly-ink`, `--assistly-paper`, so the host
|
|
27
|
+
* page can override them at any ancestor level.
|
|
28
|
+
*/
|
|
29
|
+
declare function AssistlyChat({ chatbotId, origin, primaryColor, onReady, onError, }: AssistlyChatProps): React.JSX.Element | null;
|
|
30
|
+
|
|
31
|
+
export { AssistlyChat, type AssistlyChatProps };
|
package/dist/index.js
CHANGED
|
@@ -879,7 +879,7 @@ function ChatbotClient({ id, chatbotName, origin }) {
|
|
|
879
879
|
},
|
|
880
880
|
children: [
|
|
881
881
|
/* @__PURE__ */ jsx5(ArrowUpRight, { size: 10, strokeWidth: 1.8, style: { verticalAlign: "-1px", marginRight: 4 } }),
|
|
882
|
-
"Powered by
|
|
882
|
+
"Powered by SMOEDESIGN"
|
|
883
883
|
]
|
|
884
884
|
}
|
|
885
885
|
),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/widget.tsx","../src/ApolloProvider.tsx","../src/ChatbotClient.tsx","../src/lib/startNewChat.ts","../src/graphql/queries.ts","../src/ui/Messages.tsx","../src/ui/form.tsx","../src/lib/utils.ts","../src/ui/label.tsx","../src/ui/input.tsx","../src/lib/injectStyles.ts","../src/styles.tokens","../src/lib/styles.ts"],"sourcesContent":["'use client';\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { ApolloProvider } from '@apollo/client';\nimport { createApolloClient } from './ApolloProvider';\nimport ChatbotClient from './ChatbotClient';\nimport { ensureAssistlyFonts, ensureAssistlyStyles } from './lib/injectStyles';\nimport assistlyCss from './lib/styles';\n\nexport type AssistlyChatProps = {\n chatbotId: number;\n /** Origin of the Assistly deployment that hosts the chat API, e.g. https://chatbot-xi-rose-68.vercel.app */\n origin: string;\n /** Optional brand color for accents (tints the brass accent + online dot) */\n primaryColor?: string;\n /** Fires when the chat panel has mounted and is ready to receive input */\n onReady?: () => void;\n /** Fires if the chat fails to mount */\n onError?: (err: Error) => void;\n};\n\n/**\n * Embeddable Assistly chat panel. Renders the full chat UI (intake form +\n * active chat) inside whatever container the customer places it in. Talks\n * directly to the Assistly API at `${origin}/api/...` — no iframe, no\n * cross-origin cookie issues.\n *\n * Styling is inlined into the published JS bundle (esbuild `text` loader\n * at build time, injected into <head> on mount). Consumers only need:\n *\n * import { AssistlyChat } from '@shaimaababiker/embed';\n *\n * Theme tokens are exposed as CSS variables on the root wrapper, e.g.\n * `--assistly-brass`, `--assistly-ink`, `--assistly-paper`, so the host\n * page can override them at any ancestor level.\n */\nexport default function AssistlyChat({\n chatbotId,\n origin,\n primaryColor,\n onReady,\n onError,\n}: AssistlyChatProps) {\n const client = useMemo(() => createApolloClient(origin), [origin]);\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n try {\n ensureAssistlyStyles(assistlyCss);\n ensureAssistlyFonts();\n setMounted(true);\n onReady?.();\n } catch (err) {\n onError?.(err as Error);\n }\n }, [onReady, onError]);\n\n if (!mounted) return null;\n\n const themeVars: React.CSSProperties = primaryColor\n ? ({\n ['--assistly-brass' as any]: primaryColor,\n ['--assistly-primary' as any]: primaryColor,\n } as React.CSSProperties)\n : {};\n\n return (\n <ApolloProvider client={client}>\n <div\n className=\"assistly-root\"\n style={{\n width: '100%',\n height: '100%',\n minHeight: 520,\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n background: 'var(--assistly-paper)',\n color: 'var(--assistly-ink)',\n ...themeVars,\n }}\n >\n <ChatbotClient id={String(chatbotId)} chatbotName=\"Assistant\" origin={origin} />\n </div>\n </ApolloProvider>\n );\n}\n","'use client';\n\nimport { ApolloClient, InMemoryCache, createHttpLink, type DefaultOptions } from '@apollo/client';\n\nconst defaultOptions: DefaultOptions = {\n watchQuery: { fetchPolicy: 'no-cache', errorPolicy: 'all' },\n query: { fetchPolicy: 'no-cache', errorPolicy: 'all' },\n mutate: { fetchPolicy: 'no-cache', errorPolicy: 'all' },\n};\n\nexport function createApolloClient(origin: string): ApolloClient<unknown> {\n const baseUrl = origin.replace(/\\/$/, '');\n return new ApolloClient({\n link: createHttpLink({ uri: `${baseUrl}/api/graphql` }),\n cache: new InMemoryCache(),\n defaultOptions,\n });\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { useQuery } from \"@apollo/client\";\nimport { z } from \"zod\";\nimport { useForm } from \"react-hook-form\";\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { Send, ShieldCheck, ArrowUpRight } from \"lucide-react\";\n\nimport {\n Message,\n MessagesbyChatSessionIdResponse,\n MessagesbyChatSessionIdResponseVariables,\n} from \"./types\";\nimport startNewChat from \"./lib/startNewChat\";\nimport { GET_MESSEGES_BY_CHAT_SESSION_ID } from \"./graphql/queries\";\nimport Messages from \"./ui/Messages\";\nimport { FormControl, FormField, FormItem, Form } from \"./ui/form\";\nimport { Input } from \"./ui/input\";\n\ntype ChatbotClientProps = {\n id: string;\n chatbotName: string;\n origin: string;\n};\n\nconst formSchema = z.object({\n message: z.string().min(3, 'Your Message is too short!'),\n});\n\nfunction ChatbotClient({ id, chatbotName, origin }: ChatbotClientProps) {\n const [name, setName] = useState('');\n const [email, setEmail] = useState('');\n const [onboardingStep, setOnboardingStep] = useState(1);\n const [chatId, setChatId] = useState(0);\n const [loading, setLoading] = useState(false);\n const [message, setMessage] = useState<Message[]>([\n {\n id: -1,\n content: `Hi there — I'm ${chatbotName}. I'd love to help, but first, what's your name?`,\n sender: 'ai',\n created_at: new Date().toISOString(),\n chat_session_id: 0,\n }\n ]);\n\n const form = useForm<z.infer<typeof formSchema>>({\n resolver: zodResolver(formSchema),\n defaultValues: { message: '' },\n mode: 'onChange',\n });\n\n const { data } = useQuery<MessagesbyChatSessionIdResponse, MessagesbyChatSessionIdResponseVariables>(\n GET_MESSEGES_BY_CHAT_SESSION_ID,\n { variables: { chat_session_id: chatId }, skip: !chatId }\n );\n\n useEffect(() => {\n if (data && onboardingStep === 3) {\n const chatSession = data.chat_sessions as any;\n const dbMessages = chatSession.messages || [];\n setMessage((prev) => {\n const existingIds = new Set(prev.map((m) => m.id));\n const newMessages = dbMessages.filter((m: Message) => !existingIds.has(m.id));\n return [...prev, ...newMessages];\n });\n }\n }, [data, onboardingStep]);\n\n async function onsubmit(values: z.infer<typeof formSchema>) {\n const { message: formMessage } = values;\n form.reset();\n\n if (onboardingStep === 1) {\n if (!formMessage.trim()) return;\n const userMsg: Message = {\n id: Date.now(),\n content: formMessage,\n chat_session_id: 0,\n sender: 'user',\n created_at: new Date().toISOString(),\n };\n const aiMsg: Message = {\n id: Date.now() + 1,\n content: `Lovely to meet you, ${formMessage}. One more thing — what's your email so we can stay in touch?`,\n chat_session_id: 0,\n sender: 'ai',\n created_at: new Date().toISOString(),\n };\n setName(formMessage);\n setOnboardingStep(2);\n setMessage((prev) => [...prev, userMsg, aiMsg]);\n return;\n }\n\n if (onboardingStep === 2) {\n if (!formMessage.trim()) return;\n const isValidEmail = (email: string) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n if (!isValidEmail(formMessage.trim())) {\n setMessage((prev) => [\n ...prev,\n {\n id: Date.now() + 1,\n content: \"That email doesn't look quite right — could you double-check it?\",\n chat_session_id: 0,\n sender: 'ai',\n created_at: new Date().toISOString(),\n },\n ]);\n return;\n }\n const userMsg: Message = {\n id: Date.now(),\n content: formMessage,\n chat_session_id: 0,\n sender: 'user',\n created_at: new Date().toISOString(),\n };\n setMessage((prev) => [...prev, userMsg]);\n setLoading(true);\n try {\n const newChatId = await startNewChat(origin, name, formMessage, Number(id));\n setEmail(formMessage);\n setChatId(newChatId);\n setOnboardingStep(3);\n } catch (error) {\n console.error('Error starting chat:', error);\n setMessage((prev) => [...prev, {\n id: Date.now() + 1,\n content: \"Sorry — I had trouble setting up your session. Mind entering your email again?\",\n chat_session_id: 0,\n sender: 'ai',\n created_at: new Date().toISOString(),\n }]);\n } finally {\n setLoading(false);\n }\n return;\n }\n\n if (!chatId) return;\n const userMessage: Message = {\n id: Date.now(),\n content: formMessage,\n chat_session_id: chatId,\n sender: 'user',\n created_at: new Date().toISOString(),\n };\n const loadingMessage: Message = {\n id: Date.now() + 1,\n content: 'Thinking...',\n chat_session_id: chatId,\n created_at: new Date().toISOString(),\n sender: 'ai',\n };\n setMessage((prevMessages) => [...prevMessages, userMessage, loadingMessage]);\n\n try {\n const baseUrl = origin.replace(/\\/$/, '');\n const response = await fetch(`${baseUrl}/api/send-message`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name,\n chat_session_id: chatId,\n chabot_id: Number(id),\n content: formMessage,\n created_at: new Date().toISOString(),\n }),\n });\n const result = await response.json();\n setMessage((prevMessages) =>\n prevMessages.map((msg) =>\n msg.id === loadingMessage.id ? { ...msg, content: result.content, id: result.id } : msg\n )\n );\n } catch (error) {\n console.error('Error Sending Message:', error);\n }\n }\n\n /* ------------------------------------------------------------------ */\n /* Layout */\n /* ------------------------------------------------------------------ */\n return (\n <div\n style={{\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n height: '100%',\n minHeight: 520,\n background: 'var(--assistly-paper)',\n color: 'var(--assistly-ink)',\n overflow: 'hidden',\n }}\n >\n <div className=\"assistly-grain\" />\n\n {/* ======================= HEADER ======================= */}\n <header\n style={{\n position: 'relative',\n zIndex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '18px 24px',\n background: 'var(--assistly-paper)',\n borderBottom: '1px solid var(--assistly-hairline)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 14, minWidth: 0 }}>\n <div\n style={{\n position: 'relative',\n width: 44,\n height: 44,\n borderRadius: '50%',\n background: 'var(--assistly-paper-2)',\n border: '1px solid var(--assistly-hairline-strong)',\n display: 'grid',\n placeItems: 'center',\n flexShrink: 0,\n }}\n aria-hidden\n >\n <span\n style={{\n fontFamily: 'Fraunces, Georgia, serif',\n fontSize: 19,\n fontWeight: 500,\n color: 'var(--assistly-ink)',\n letterSpacing: '-0.02em',\n }}\n >\n {chatbotName.charAt(0).toUpperCase()}\n </span>\n <span\n style={{\n position: 'absolute',\n right: -1,\n bottom: -1,\n width: 12,\n height: 12,\n borderRadius: '50%',\n background: '#5a8c5a',\n border: '2px solid var(--assistly-paper)',\n }}\n />\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', minWidth: 0 }}>\n <span\n className=\"assistly-font-display\"\n style={{\n fontSize: 17,\n lineHeight: 1.1,\n color: 'var(--assistly-ink)',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {chatbotName}\n </span>\n <span\n className=\"assistly-font-mono\"\n style={{\n fontSize: 10,\n marginTop: 4,\n letterSpacing: '0.18em',\n textTransform: 'uppercase',\n color: 'var(--assistly-ink-mute)',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n }}\n >\n <span\n style={{\n width: 6,\n height: 6,\n borderRadius: '50%',\n background: '#5a8c5a',\n display: 'inline-block',\n }}\n />\n Online · replies in seconds\n </span>\n </div>\n </div>\n\n <div\n className=\"assistly-font-mono\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n padding: '6px 10px',\n fontSize: 10,\n letterSpacing: '0.16em',\n textTransform: 'uppercase',\n color: 'var(--assistly-ink-soft)',\n background: 'var(--assistly-paper-2)',\n border: '1px solid var(--assistly-hairline)',\n borderRadius: 999,\n }}\n >\n <ShieldCheck size={12} strokeWidth={1.6} style={{ color: 'var(--assistly-brass)' }} />\n Secure\n </div>\n </header>\n\n {/* ======================= MESSAGES ======================= */}\n <main\n className=\"assistly-scroll\"\n style={{\n position: 'relative',\n zIndex: 1,\n flex: 1,\n overflowY: 'auto',\n padding: '28px 20px 24px',\n background: 'transparent',\n }}\n >\n <div\n style={{\n maxWidth: 760,\n margin: '0 auto',\n display: 'flex',\n flexDirection: 'column',\n gap: 18,\n }}\n >\n <Messages messages={message} chatbotName={chatbotName} />\n </div>\n </main>\n\n {/* ======================= INPUT ======================= */}\n <footer\n style={{\n position: 'relative',\n zIndex: 1,\n padding: '16px 20px 22px',\n background: 'linear-gradient(180deg, rgba(245,241,232,0) 0%, var(--assistly-paper) 30%)',\n borderTop: '1px solid var(--assistly-hairline)',\n }}\n >\n <Form {...form}>\n <form\n onSubmit={form.handleSubmit(onsubmit)}\n style={{\n maxWidth: 760,\n margin: '0 auto',\n display: 'flex',\n alignItems: 'flex-end',\n gap: 10,\n }}\n >\n <FormField\n control={form.control}\n name=\"message\"\n render={({ field }) => (\n <FormItem style={{ flex: 1, margin: 0 }}>\n <FormControl>\n <div\n style={{\n position: 'relative',\n background: '#fffefb',\n border: '1px solid var(--assistly-hairline-strong)',\n borderRadius: 14,\n boxShadow: '0 1px 0 rgba(26,20,15,0.02), 0 6px 18px rgba(26,20,15,0.04)',\n transition: 'border-color 180ms ease, box-shadow 180ms ease',\n }}\n >\n <Input\n {...field}\n placeholder={\n onboardingStep === 1\n ? 'Your name…'\n : onboardingStep === 2\n ? 'Your email…'\n : 'Write a message…'\n }\n style={{\n width: '100%',\n padding: '14px 16px',\n fontSize: 15,\n lineHeight: 1.5,\n color: 'var(--assistly-ink)',\n background: 'transparent',\n border: 'none',\n outline: 'none',\n fontFamily: 'inherit',\n borderRadius: 14,\n }}\n onFocus={(e) => {\n const wrap = e.currentTarget.parentElement as HTMLElement;\n wrap.style.borderColor = 'var(--assistly-brass)';\n wrap.style.boxShadow = '0 0 0 3px rgba(184,137,58,0.18), 0 6px 18px rgba(26,20,15,0.04)';\n }}\n onBlur={(e) => {\n const wrap = e.currentTarget.parentElement as HTMLElement;\n wrap.style.borderColor = 'var(--assistly-hairline-strong)';\n wrap.style.boxShadow = '0 1px 0 rgba(26,20,15,0.02), 0 6px 18px rgba(26,20,15,0.04)';\n }}\n />\n </div>\n </FormControl>\n </FormItem>\n )}\n />\n\n <button\n type=\"submit\"\n disabled={form.formState.isSubmitting || !form.formState.isValid || loading}\n className=\"assistly-send\"\n aria-label=\"Send message\"\n style={{\n width: 52,\n height: 52,\n borderRadius: 14,\n border: 'none',\n cursor: 'pointer',\n display: 'grid',\n placeItems: 'center',\n flexShrink: 0,\n }}\n >\n {loading ? (\n <span\n style={{\n width: 18,\n height: 18,\n border: '2px solid rgba(245,241,232,0.35)',\n borderTopColor: 'var(--assistly-paper)',\n borderRadius: '50%',\n animation: 'assistly-spin 0.9s linear infinite',\n display: 'inline-block',\n }}\n />\n ) : (\n <Send size={18} strokeWidth={2} />\n )}\n </button>\n </form>\n </Form>\n <span\n className=\"assistly-font-mono\"\n style={{\n display: 'block',\n maxWidth: 760,\n margin: '10px auto 0',\n fontSize: 10,\n letterSpacing: '0.16em',\n textTransform: 'uppercase',\n color: 'var(--assistly-ink-mute)',\n textAlign: 'center',\n }}\n >\n <ArrowUpRight size={10} strokeWidth={1.8} style={{ verticalAlign: '-1px', marginRight: 4 }} />\n Powered by Assistly\n </span>\n <style>{`@keyframes assistly-spin { to { transform: rotate(360deg); } }`}</style>\n </footer>\n </div>\n );\n}\n\nexport default ChatbotClient;\n","async function startNewChat(\n origin: string,\n guestName: string,\n guestEmail: string,\n chatbotId: number,\n): Promise<number> {\n const baseUrl = origin.replace(/\\/$/, '');\n const response = await fetch(`${baseUrl}/api/start-chat`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: guestName,\n email: guestEmail,\n chatbot_id: chatbotId,\n }),\n });\n\n if (!response.ok) {\n const payload = await response.json().catch(() => null);\n const message =\n payload?.error ?? `Failed to start chat (${response.status})`;\n throw new Error(message);\n }\n\n const data = await response.json();\n if (typeof data?.chat_session_id !== 'number') {\n throw new Error('Server returned an invalid response');\n }\n return data.chat_session_id;\n}\n\nexport default startNewChat;\n","import { gql } from \"@apollo/client\";\n\nexport const GET_MESSEGES_BY_CHAT_SESSION_ID = gql`\n query GetMessagesByChatSessionId($chat_session_id: Int!) {\n chat_sessions(id: $chat_session_id) {\n created_at\n id\n messages {\n id\n sender\n content\n created_at\n }\n }\n }\n`;\n","'use client';\n\nimport { Message } from \"../types\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport { UserCircle } from \"lucide-react\";\nimport React, { useEffect, useRef, useState } from \"react\";\n\n/* -------------------------------------------------------------------------- */\n/* Small helpers */\n/* -------------------------------------------------------------------------- */\n\nfunction formatTime(iso: string) {\n try {\n const d = new Date(iso);\n return d.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\n } catch {\n return \"\";\n }\n}\n\nfunction TypewriterMarkdown({\n text,\n isFresh,\n components,\n onType,\n}: {\n text: string;\n isFresh: boolean;\n components: any;\n onType?: () => void;\n}) {\n const [displayedText, setDisplayedText] = useState(\"\");\n const [index, setIndex] = useState(0);\n\n useEffect(() => {\n setDisplayedText(\"\");\n setIndex(0);\n }, [text]);\n\n useEffect(() => {\n if (isFresh && text && index < text.length) {\n const timeout = setTimeout(() => {\n setDisplayedText((prev) => prev + text[index]);\n setIndex((prev) => prev + 1);\n if (onType) onType();\n }, 14);\n return () => clearTimeout(timeout);\n } else if (!isFresh) {\n setDisplayedText(text || \"\");\n }\n }, [index, text, isFresh]);\n\n const showCaret = isFresh && index < text.length;\n return (\n <span className={showCaret ? 'assistly-caret' : undefined}>\n <ReactMarkdown remarkPlugins={[remarkGfm]} components={components}>\n {isFresh ? displayedText : text}\n </ReactMarkdown>\n </span>\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------------- */\n\nfunction Messages({\n messages,\n chatbotName,\n isReviewPage = false,\n}: {\n messages: Message[];\n chatbotName: string;\n isReviewPage?: boolean;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const [hoveredId, setHoveredId] = useState<number | string | null>(null);\n\n const scrollToBottom = (smooth = true) => {\n if (ref.current) {\n ref.current.scrollIntoView({ behavior: smooth ? \"smooth\" : \"auto\", block: \"end\" });\n }\n };\n\n useEffect(() => {\n scrollToBottom();\n }, [messages]);\n\n const markdownComponents = {\n ul: ({ node, ...props }: any) => <ul {...props} />,\n ol: ({ node, ...props }: any) => <ol {...props} />,\n a: ({ node, ...props }: any) => <a rel=\"noopener noreferrer\" target=\"_blank\" {...props} />,\n };\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 22 }}>\n {messages.map((message, index) => {\n const isSender = message.sender !== \"user\";\n const isThinking = message.content === \"\" || message.content === \"Thinking...\";\n const isFresh = index === messages.length - 1;\n const showMeta = hoveredId === message.id || isReviewPage;\n\n return (\n <div\n key={message.id || index}\n onMouseEnter={() => setHoveredId(message.id)}\n onMouseLeave={() => setHoveredId(null)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: isSender ? 'flex-start' : 'flex-end',\n maxWidth: '100%',\n }}\n >\n {/* ----- Header row: avatar + name + meta ----- */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n marginBottom: 8,\n padding: isSender ? '0 4px' : '0 4px',\n flexDirection: isSender ? 'row' : 'row-reverse',\n }}\n >\n <div\n style={{\n width: 26,\n height: 26,\n borderRadius: '50%',\n background: isSender\n ? 'var(--assistly-paper-2)'\n : 'var(--assistly-ink)',\n color: isSender ? 'var(--assistly-ink)' : 'var(--assistly-paper)',\n border: '1px solid var(--assistly-hairline-strong)',\n display: 'grid',\n placeItems: 'center',\n flexShrink: 0,\n }}\n aria-hidden\n >\n {isSender ? (\n <span\n style={{\n fontFamily: 'Fraunces, Georgia, serif',\n fontSize: 13,\n fontWeight: 600,\n lineHeight: 1,\n }}\n >\n {chatbotName.charAt(0).toUpperCase()}\n </span>\n ) : (\n <UserCircle size={14} strokeWidth={1.6} />\n )}\n </div>\n <div\n className=\"assistly-font-mono\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n fontSize: 10,\n letterSpacing: '0.18em',\n textTransform: 'uppercase',\n color: 'var(--assistly-ink-mute)',\n }}\n >\n <span style={{ color: 'var(--assistly-ink-soft)', fontWeight: 500 }}>\n {isSender ? chatbotName || 'assistant' : 'you'}\n </span>\n <span\n style={{\n width: 3,\n height: 3,\n borderRadius: '50%',\n background: 'var(--assistly-ink-mute)',\n opacity: showMeta ? 1 : 0,\n transition: 'opacity 200ms',\n }}\n />\n <span style={{ opacity: showMeta ? 1 : 0, transition: 'opacity 200ms' }}>\n {formatTime(message.created_at)}\n </span>\n </div>\n </div>\n\n {/* ----- Bubble ----- */}\n <div\n className={`${isSender ? 'assistly-bubble-in' : ''}`}\n style={{\n position: 'relative',\n maxWidth: 'min(82%, 640px)',\n padding: '12px 16px',\n borderRadius: isSender ? '4px 16px 16px 16px' : '16px 4px 16px 16px',\n background: isSender ? '#fffefb' : 'var(--assistly-ink)',\n color: isSender ? 'var(--assistly-ink)' : 'var(--assistly-paper)',\n border: isSender\n ? '1px solid var(--assistly-hairline-strong)'\n : '1px solid var(--assistly-ink)',\n boxShadow: isSender\n ? '0 1px 0 rgba(26,20,15,0.02), 0 8px 24px rgba(26,20,15,0.05)'\n : '0 1px 0 rgba(255,255,255,0.04) inset, 0 8px 24px rgba(26,20,15,0.18)',\n fontSize: 15,\n lineHeight: 1.6,\n }}\n >\n {isThinking ? (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n padding: '2px 0',\n minHeight: 22,\n }}\n >\n <span className=\"assistly-dot\" />\n <span className=\"assistly-dot\" />\n <span className=\"assistly-dot\" />\n <span className=\"assistly-dot\" />\n <span\n className=\"assistly-font-mono\"\n style={{\n marginLeft: 4,\n fontSize: 10,\n letterSpacing: '0.22em',\n textTransform: 'uppercase',\n color: 'var(--assistly-ink-mute)',\n }}\n >\n Thinking…\n </span>\n </div>\n ) : isSender ? (\n <div className=\"assistly-prose\">\n <TypewriterMarkdown\n text={message.content}\n isFresh={isFresh}\n components={markdownComponents}\n onType={() => scrollToBottom(false)}\n />\n </div>\n ) : (\n <div className=\"assistly-prose\">\n <ReactMarkdown remarkPlugins={[remarkGfm]} components={markdownComponents}>\n {message.content}\n </ReactMarkdown>\n </div>\n )}\n </div>\n </div>\n );\n })}\n <div ref={ref} />\n </div>\n );\n}\n\nexport default Messages;\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport {\n Controller,\n FormProvider,\n useFormContext,\n useFormState,\n type ControllerProps,\n type FieldPath,\n type FieldValues,\n} from \"react-hook-form\"\n\nimport { cn } from \"../lib/utils\"\nimport { Label } from \"./label\"\n\nconst Form = FormProvider\n\ntype FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n name: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>(\n {} as FormFieldContextValue\n)\n\nconst FormField = <\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n ...props\n}: ControllerProps<TFieldValues, TName>) => {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n )\n}\n\nconst useFormField = () => {\n const fieldContext = React.useContext(FormFieldContext)\n const itemContext = React.useContext(FormItemContext)\n const { getFieldState } = useFormContext()\n const formState = useFormState({ name: fieldContext.name })\n const fieldState = getFieldState(fieldContext.name, formState)\n\n if (!fieldContext) {\n throw new Error(\"useFormField should be used within <FormField>\")\n }\n\n const { id } = itemContext\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n }\n}\n\ntype FormItemContextValue = {\n id: string\n}\n\nconst FormItemContext = React.createContext<FormItemContextValue>(\n {} as FormItemContextValue\n)\n\nfunction FormItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const id = React.useId()\n\n return (\n <FormItemContext.Provider value={{ id }}>\n <div\n data-slot=\"form-item\"\n className={cn(\"grid gap-2\", className)}\n {...props}\n />\n </FormItemContext.Provider>\n )\n}\n\nfunction FormLabel({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n const { error, formItemId } = useFormField()\n\n return (\n <Label\n data-slot=\"form-label\"\n data-error={!!error}\n className={cn(\"data-[error=true]:text-destructive\", className)}\n htmlFor={formItemId}\n {...props}\n />\n )\n}\n\nfunction FormControl({ ...props }: React.ComponentProps<typeof Slot>) {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n\n return (\n <Slot\n data-slot=\"form-control\"\n id={formItemId}\n aria-describedby={\n !error\n ? `${formDescriptionId}`\n : `${formDescriptionId} ${formMessageId}`\n }\n aria-invalid={!!error}\n {...props}\n />\n )\n}\n\nfunction FormDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n const { formDescriptionId } = useFormField()\n\n return (\n <p\n data-slot=\"form-description\"\n id={formDescriptionId}\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction FormMessage({ className, ...props }: React.ComponentProps<\"p\">) {\n const { error, formMessageId } = useFormField()\n const body = error ? String(error?.message ?? \"\") : props.children\n\n if (!body) {\n return null\n }\n\n return (\n <p\n data-slot=\"form-message\"\n id={formMessageId}\n className={cn(\"text-destructive text-sm\", className)}\n {...props}\n >\n {body}\n </p>\n )\n}\n\nexport {\n useFormField,\n Form,\n FormItem,\n FormLabel,\n FormControl,\n FormDescription,\n FormMessage,\n FormField,\n}\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\n\nimport { cn } from \"../lib/utils\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","import * as React from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"border-input file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","/* Styles are injected once per page. We hash the CSS string and key the\n * <style> tag with `data-assistly-style=\"<hash>\"` so HMR and multiple\n * mounts don't duplicate it. */\n\nlet injected = false;\nlet injectedHash: string | null = null;\n\nfunction hashCss(css: string): string {\n let h = 5381;\n for (let i = 0; i < css.length; i++) {\n h = ((h << 5) + h) ^ css.charCodeAt(i);\n }\n return (h >>> 0).toString(36);\n}\n\nexport function ensureAssistlyStyles(css: string): void {\n if (typeof document === 'undefined') return;\n const h = hashCss(css);\n if (injected && injectedHash === h) return;\n injected = true;\n injectedHash = h;\n\n document.querySelectorAll('style[data-assistly-style]').forEach((el) => el.remove());\n\n const style = document.createElement('style');\n style.setAttribute('data-assistly-style', h);\n style.textContent = css;\n document.head.appendChild(style);\n}\n\n/** Test-only: clear the dedup state so a fresh <style> tag is created\n * on the next call. Do not use in production. */\nexport function __resetAssistlyStylesForTests(): void {\n injected = false;\n injectedHash = null;\n}\n\nlet fontsInjected = false;\nconst FONT_HREF =\n 'https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,500;9..144,600&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap';\n\nexport function ensureAssistlyFonts(): void {\n if (typeof document === 'undefined') return;\n if (fontsInjected) return;\n if (document.querySelector('link[data-assistly-fonts]')) {\n fontsInjected = true;\n return;\n }\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = FONT_HREF;\n link.setAttribute('data-assistly-fonts', 'true');\n document.head.appendChild(link);\n fontsInjected = true;\n}\n","/* Assistly embed — base styles\n * ------------------------------------------------------------\n * This file is compiled at build time and injected into the\n * consumer page on mount. It defines the design tokens the\n * React components reference (shadcn-style + custom palette)\n * so the widget renders identically regardless of the host\n * app's Tailwind/theme configuration.\n */\n\n:root {\n /* --- Paper & ink palette --------------------------------- */\n --assistly-paper: #f5f1e8; /* warm bone */\n --assistly-paper-2: #efe9dc; /* slightly deeper bone */\n --assistly-ink: #1a140f; /* near-black, warm */\n --assistly-ink-soft: #3a322a; /* secondary text */\n --assistly-ink-mute: #7a7166; /* tertiary / meta */\n --assistly-hairline: rgba(26, 20, 15, 0.12);\n --assistly-hairline-strong: rgba(26, 20, 15, 0.22);\n\n /* --- Brass accent --------------------------------------- */\n --assistly-brass: #b8893a;\n --assistly-brass-soft: #d4ad6a;\n\n /* --- shadcn aliases consumed by button/input ------------- */\n --background: var(--assistly-paper);\n --foreground: var(--assistly-ink);\n --primary: var(--assistly-ink);\n --primary-foreground: #f5f1e8;\n --secondary: var(--assistly-paper-2);\n --secondary-foreground: var(--assistly-ink);\n --muted: var(--assistly-paper-2);\n --muted-foreground: var(--assistly-ink-mute);\n --accent: var(--assistly-brass-soft);\n --accent-foreground: var(--assistly-ink);\n --destructive: #8a2a2a;\n --border: var(--assistly-hairline-strong);\n --input: var(--assistly-hairline-strong);\n --ring: var(--assistly-brass);\n\n /* --- Component-specific aliases ------------------------- */\n --hairline: var(--assistly-hairline);\n --brass-2: var(--assistly-brass);\n --muted-2: var(--assistly-ink-mute);\n --assistly-primary: var(--assistly-ink);\n}\n\n/* --- Reset inside the widget ----------------------------- */\n.assistly-root,\n.assistly-root * {\n box-sizing: border-box;\n}\n\n.assistly-root {\n font-family: 'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif;\n color: var(--assistly-ink);\n line-height: 1.55;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n text-rendering: optimizeLegibility;\n}\n\n.assistly-font-display {\n font-family: 'Fraunces', 'Cormorant Garamond', 'Playfair Display', Georgia, serif;\n font-weight: 500;\n letter-spacing: -0.01em;\n font-feature-settings: \"ss01\", \"ss02\";\n}\n\n.assistly-font-mono {\n font-family: 'JetBrains Mono', 'SF Mono', ui-monospace, Menlo, monospace;\n font-feature-settings: \"ss01\", \"cv11\";\n}\n\n/* --- Paper grain overlay --------------------------------- */\n.assistly-grain {\n position: absolute;\n inset: 0;\n pointer-events: none;\n opacity: 0.35;\n mix-blend-mode: multiply;\n background-image: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0.10 0 0 0 0 0.08 0 0 0 0 0.06 0 0 0 0.08 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>\");\n}\n\n/* --- Scrollbar ------------------------------------------- */\n.assistly-scroll::-webkit-scrollbar {\n width: 6px;\n}\n.assistly-scroll::-webkit-scrollbar-track {\n background: transparent;\n}\n.assistly-scroll::-webkit-scrollbar-thumb {\n background: var(--assistly-hairline-strong);\n border-radius: 999px;\n}\n.assistly-scroll::-webkit-scrollbar-thumb:hover {\n background: var(--assistly-ink-mute);\n}\n\n/* --- Typing indicator ------------------------------------ */\n.assistly-dot {\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 999px;\n background: var(--assistly-brass);\n animation: assistly-bounce 1.1s cubic-bezier(0.45, 0, 0.55, 1) infinite;\n}\n.assistly-dot:nth-child(2) { animation-delay: 0.12s; background: var(--assistly-ink-soft); }\n.assistly-dot:nth-child(3) { animation-delay: 0.24s; background: var(--assistly-brass-soft); }\n.assistly-dot:nth-child(4) { animation-delay: 0.36s; background: var(--assistly-ink-mute); }\n\n@keyframes assistly-bounce {\n 0%, 60%, 100% { transform: translate3d(0, 0, 0); }\n 30% { transform: translate3d(0, -5px, 0); }\n}\n\n/* --- Bubble entrance ------------------------------------- */\n.assistly-bubble-in {\n animation: assistly-spring 520ms cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n}\n@keyframes assistly-spring {\n 0% { transform: scale(0.94) translate3d(0, 6px, 0); opacity: 0; }\n 60% { transform: scale(1.015) translate3d(0, -1px, 0); opacity: 1; }\n 100% { transform: scale(1) translate3d(0, 0, 0); opacity: 1; }\n}\n\n/* --- Status pulse ---------------------------------------- */\n.assistly-pulse {\n position: relative;\n}\n.assistly-pulse::after {\n content: '';\n position: absolute;\n inset: -3px;\n border-radius: 999px;\n background: #5a8c5a;\n opacity: 0.35;\n animation: assistly-pulse 2.4s ease-out infinite;\n}\n@keyframes assistly-pulse {\n 0% { transform: scale(0.6); opacity: 0.45; }\n 100% { transform: scale(2.2); opacity: 0; }\n}\n\n/* --- Send button hover ----------------------------------- */\n.assistly-send {\n position: relative;\n background: var(--assistly-ink);\n color: var(--assistly-paper);\n transition: transform 180ms ease, background 180ms ease, box-shadow 180ms ease;\n box-shadow: 0 1px 0 rgba(255,255,255,0.04) inset, 0 4px 14px rgba(26,20,15,0.18);\n}\n.assistly-send:hover:not(:disabled) {\n background: var(--assistly-ink-soft);\n transform: translateY(-1px);\n box-shadow: 0 1px 0 rgba(255,255,255,0.04) inset, 0 8px 22px rgba(26,20,15,0.24);\n}\n.assistly-send:active:not(:disabled) {\n transform: translateY(0);\n box-shadow: 0 1px 0 rgba(255,255,255,0.04) inset, 0 2px 8px rgba(26,20,15,0.18);\n}\n.assistly-send:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n/* --- Markdown content ------------------------------------ */\n.assistly-prose p {\n margin: 0 0 0.6em 0;\n white-space: pre-wrap;\n}\n.assistly-prose p:last-child { margin-bottom: 0; }\n.assistly-prose ul, .assistly-prose ol {\n margin: 0.4em 0 0.6em 1.1em;\n}\n.assistly-prose li { margin-bottom: 0.25em; }\n.assistly-prose code {\n font-family: 'JetBrains Mono', ui-monospace, monospace;\n font-size: 0.88em;\n padding: 0.1em 0.35em;\n background: rgba(26, 20, 15, 0.07);\n border-radius: 3px;\n}\n.assistly-prose a {\n color: var(--assistly-brass);\n text-decoration: underline;\n text-underline-offset: 2px;\n font-weight: 500;\n}\n.assistly-prose a:hover { color: var(--assistly-ink); }\n.assistly-prose h1, .assistly-prose h2, .assistly-prose h3 {\n font-family: 'Fraunces', Georgia, serif;\n font-weight: 600;\n margin: 0.6em 0 0.3em 0;\n letter-spacing: -0.01em;\n}\n.assistly-prose h1 { font-size: 1.25em; }\n.assistly-prose h2 { font-size: 1.1em; }\n.assistly-prose h3 { font-size: 1em; }\n.assistly-prose strong { font-weight: 600; }\n\n/* --- Caret for streaming --------------------------------- */\n.assistly-caret::after {\n content: '▍';\n display: inline-block;\n margin-left: 1px;\n color: var(--assistly-brass);\n animation: assistly-blink 1s steps(1) infinite;\n}\n@keyframes assistly-blink {\n 50% { opacity: 0; }\n}\n","/* Imports the raw CSS text as a string at build time. The file uses a\n * custom .tokens extension (not .css) so tsup's postcss plugin never\n * sees it, and esbuild's `text` loader (configured in tsup.config.ts)\n * inlines the file contents as a default-exported string. The CSS is\n * then injected at runtime by `ensureAssistlyStyles` in injectStyles.ts. */\nimport styles from '../styles.tokens';\nexport default styles as string;\n"],"mappings":"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","names":["useEffect","useState","useEffect","useState","React","jsx","jsx","jsx","jsx","jsx","jsxs","useState","useEffect","email","styles_default","jsx","useState","useEffect","styles_default"]}
|
|
1
|
+
{"version":3,"sources":["../src/widget.tsx","../src/ApolloProvider.tsx","../src/ChatbotClient.tsx","../src/lib/startNewChat.ts","../src/graphql/queries.ts","../src/ui/Messages.tsx","../src/ui/form.tsx","../src/lib/utils.ts","../src/ui/label.tsx","../src/ui/input.tsx","../src/lib/injectStyles.ts","../src/styles.tokens","../src/lib/styles.ts"],"sourcesContent":["'use client';\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { ApolloProvider } from '@apollo/client';\nimport { createApolloClient } from './ApolloProvider';\nimport ChatbotClient from './ChatbotClient';\nimport { ensureAssistlyFonts, ensureAssistlyStyles } from './lib/injectStyles';\nimport assistlyCss from './lib/styles';\n\nexport type AssistlyChatProps = {\n chatbotId: number;\n /** Origin of the Assistly deployment that hosts the chat API, e.g. https://chatbot-xi-rose-68.vercel.app */\n origin: string;\n /** Optional brand color for accents (tints the brass accent + online dot) */\n primaryColor?: string;\n /** Fires when the chat panel has mounted and is ready to receive input */\n onReady?: () => void;\n /** Fires if the chat fails to mount */\n onError?: (err: Error) => void;\n};\n\n/**\n * Embeddable Assistly chat panel. Renders the full chat UI (intake form +\n * active chat) inside whatever container the customer places it in. Talks\n * directly to the Assistly API at `${origin}/api/...` — no iframe, no\n * cross-origin cookie issues.\n *\n * Styling is inlined into the published JS bundle (esbuild `text` loader\n * at build time, injected into <head> on mount). Consumers only need:\n *\n * import { AssistlyChat } from '@shaimaababiker/embed';\n *\n * Theme tokens are exposed as CSS variables on the root wrapper, e.g.\n * `--assistly-brass`, `--assistly-ink`, `--assistly-paper`, so the host\n * page can override them at any ancestor level.\n */\nexport default function AssistlyChat({\n chatbotId,\n origin,\n primaryColor,\n onReady,\n onError,\n}: AssistlyChatProps) {\n const client = useMemo(() => createApolloClient(origin), [origin]);\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n try {\n ensureAssistlyStyles(assistlyCss);\n ensureAssistlyFonts();\n setMounted(true);\n onReady?.();\n } catch (err) {\n onError?.(err as Error);\n }\n }, [onReady, onError]);\n\n if (!mounted) return null;\n\n const themeVars: React.CSSProperties = primaryColor\n ? ({\n ['--assistly-brass' as any]: primaryColor,\n ['--assistly-primary' as any]: primaryColor,\n } as React.CSSProperties)\n : {};\n\n return (\n <ApolloProvider client={client}>\n <div\n className=\"assistly-root\"\n style={{\n width: '100%',\n height: '100%',\n minHeight: 520,\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n background: 'var(--assistly-paper)',\n color: 'var(--assistly-ink)',\n ...themeVars,\n }}\n >\n <ChatbotClient id={String(chatbotId)} chatbotName=\"Assistant\" origin={origin} />\n </div>\n </ApolloProvider>\n );\n}\n","'use client';\n\nimport { ApolloClient, InMemoryCache, createHttpLink, type DefaultOptions } from '@apollo/client';\n\nconst defaultOptions: DefaultOptions = {\n watchQuery: { fetchPolicy: 'no-cache', errorPolicy: 'all' },\n query: { fetchPolicy: 'no-cache', errorPolicy: 'all' },\n mutate: { fetchPolicy: 'no-cache', errorPolicy: 'all' },\n};\n\nexport function createApolloClient(origin: string): ApolloClient<unknown> {\n const baseUrl = origin.replace(/\\/$/, '');\n return new ApolloClient({\n link: createHttpLink({ uri: `${baseUrl}/api/graphql` }),\n cache: new InMemoryCache(),\n defaultOptions,\n });\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { useQuery } from \"@apollo/client\";\nimport { z } from \"zod\";\nimport { useForm } from \"react-hook-form\";\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { Send, ShieldCheck, ArrowUpRight } from \"lucide-react\";\n\nimport {\n Message,\n MessagesbyChatSessionIdResponse,\n MessagesbyChatSessionIdResponseVariables,\n} from \"./types\";\nimport startNewChat from \"./lib/startNewChat\";\nimport { GET_MESSEGES_BY_CHAT_SESSION_ID } from \"./graphql/queries\";\nimport Messages from \"./ui/Messages\";\nimport { FormControl, FormField, FormItem, Form } from \"./ui/form\";\nimport { Input } from \"./ui/input\";\n\ntype ChatbotClientProps = {\n id: string;\n chatbotName: string;\n origin: string;\n};\n\nconst formSchema = z.object({\n message: z.string().min(3, 'Your Message is too short!'),\n});\n\nfunction ChatbotClient({ id, chatbotName, origin }: ChatbotClientProps) {\n const [name, setName] = useState('');\n const [email, setEmail] = useState('');\n const [onboardingStep, setOnboardingStep] = useState(1);\n const [chatId, setChatId] = useState(0);\n const [loading, setLoading] = useState(false);\n const [message, setMessage] = useState<Message[]>([\n {\n id: -1,\n content: `Hi there — I'm ${chatbotName}. I'd love to help, but first, what's your name?`,\n sender: 'ai',\n created_at: new Date().toISOString(),\n chat_session_id: 0,\n }\n ]);\n\n const form = useForm<z.infer<typeof formSchema>>({\n resolver: zodResolver(formSchema),\n defaultValues: { message: '' },\n mode: 'onChange',\n });\n\n const { data } = useQuery<MessagesbyChatSessionIdResponse, MessagesbyChatSessionIdResponseVariables>(\n GET_MESSEGES_BY_CHAT_SESSION_ID,\n { variables: { chat_session_id: chatId }, skip: !chatId }\n );\n\n useEffect(() => {\n if (data && onboardingStep === 3) {\n const chatSession = data.chat_sessions as any;\n const dbMessages = chatSession.messages || [];\n setMessage((prev) => {\n const existingIds = new Set(prev.map((m) => m.id));\n const newMessages = dbMessages.filter((m: Message) => !existingIds.has(m.id));\n return [...prev, ...newMessages];\n });\n }\n }, [data, onboardingStep]);\n\n async function onsubmit(values: z.infer<typeof formSchema>) {\n const { message: formMessage } = values;\n form.reset();\n\n if (onboardingStep === 1) {\n if (!formMessage.trim()) return;\n const userMsg: Message = {\n id: Date.now(),\n content: formMessage,\n chat_session_id: 0,\n sender: 'user',\n created_at: new Date().toISOString(),\n };\n const aiMsg: Message = {\n id: Date.now() + 1,\n content: `Lovely to meet you, ${formMessage}. One more thing — what's your email so we can stay in touch?`,\n chat_session_id: 0,\n sender: 'ai',\n created_at: new Date().toISOString(),\n };\n setName(formMessage);\n setOnboardingStep(2);\n setMessage((prev) => [...prev, userMsg, aiMsg]);\n return;\n }\n\n if (onboardingStep === 2) {\n if (!formMessage.trim()) return;\n const isValidEmail = (email: string) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n if (!isValidEmail(formMessage.trim())) {\n setMessage((prev) => [\n ...prev,\n {\n id: Date.now() + 1,\n content: \"That email doesn't look quite right — could you double-check it?\",\n chat_session_id: 0,\n sender: 'ai',\n created_at: new Date().toISOString(),\n },\n ]);\n return;\n }\n const userMsg: Message = {\n id: Date.now(),\n content: formMessage,\n chat_session_id: 0,\n sender: 'user',\n created_at: new Date().toISOString(),\n };\n setMessage((prev) => [...prev, userMsg]);\n setLoading(true);\n try {\n const newChatId = await startNewChat(origin, name, formMessage, Number(id));\n setEmail(formMessage);\n setChatId(newChatId);\n setOnboardingStep(3);\n } catch (error) {\n console.error('Error starting chat:', error);\n setMessage((prev) => [...prev, {\n id: Date.now() + 1,\n content: \"Sorry — I had trouble setting up your session. Mind entering your email again?\",\n chat_session_id: 0,\n sender: 'ai',\n created_at: new Date().toISOString(),\n }]);\n } finally {\n setLoading(false);\n }\n return;\n }\n\n if (!chatId) return;\n const userMessage: Message = {\n id: Date.now(),\n content: formMessage,\n chat_session_id: chatId,\n sender: 'user',\n created_at: new Date().toISOString(),\n };\n const loadingMessage: Message = {\n id: Date.now() + 1,\n content: 'Thinking...',\n chat_session_id: chatId,\n created_at: new Date().toISOString(),\n sender: 'ai',\n };\n setMessage((prevMessages) => [...prevMessages, userMessage, loadingMessage]);\n\n try {\n const baseUrl = origin.replace(/\\/$/, '');\n const response = await fetch(`${baseUrl}/api/send-message`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name,\n chat_session_id: chatId,\n chabot_id: Number(id),\n content: formMessage,\n created_at: new Date().toISOString(),\n }),\n });\n const result = await response.json();\n setMessage((prevMessages) =>\n prevMessages.map((msg) =>\n msg.id === loadingMessage.id ? { ...msg, content: result.content, id: result.id } : msg\n )\n );\n } catch (error) {\n console.error('Error Sending Message:', error);\n }\n }\n\n /* ------------------------------------------------------------------ */\n /* Layout */\n /* ------------------------------------------------------------------ */\n return (\n <div\n style={{\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n height: '100%',\n minHeight: 520,\n background: 'var(--assistly-paper)',\n color: 'var(--assistly-ink)',\n overflow: 'hidden',\n }}\n >\n <div className=\"assistly-grain\" />\n\n {/* ======================= HEADER ======================= */}\n <header\n style={{\n position: 'relative',\n zIndex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '18px 24px',\n background: 'var(--assistly-paper)',\n borderBottom: '1px solid var(--assistly-hairline)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 14, minWidth: 0 }}>\n <div\n style={{\n position: 'relative',\n width: 44,\n height: 44,\n borderRadius: '50%',\n background: 'var(--assistly-paper-2)',\n border: '1px solid var(--assistly-hairline-strong)',\n display: 'grid',\n placeItems: 'center',\n flexShrink: 0,\n }}\n aria-hidden\n >\n <span\n style={{\n fontFamily: 'Fraunces, Georgia, serif',\n fontSize: 19,\n fontWeight: 500,\n color: 'var(--assistly-ink)',\n letterSpacing: '-0.02em',\n }}\n >\n {chatbotName.charAt(0).toUpperCase()}\n </span>\n <span\n style={{\n position: 'absolute',\n right: -1,\n bottom: -1,\n width: 12,\n height: 12,\n borderRadius: '50%',\n background: '#5a8c5a',\n border: '2px solid var(--assistly-paper)',\n }}\n />\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', minWidth: 0 }}>\n <span\n className=\"assistly-font-display\"\n style={{\n fontSize: 17,\n lineHeight: 1.1,\n color: 'var(--assistly-ink)',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {chatbotName}\n </span>\n <span\n className=\"assistly-font-mono\"\n style={{\n fontSize: 10,\n marginTop: 4,\n letterSpacing: '0.18em',\n textTransform: 'uppercase',\n color: 'var(--assistly-ink-mute)',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n }}\n >\n <span\n style={{\n width: 6,\n height: 6,\n borderRadius: '50%',\n background: '#5a8c5a',\n display: 'inline-block',\n }}\n />\n Online · replies in seconds\n </span>\n </div>\n </div>\n\n <div\n className=\"assistly-font-mono\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n padding: '6px 10px',\n fontSize: 10,\n letterSpacing: '0.16em',\n textTransform: 'uppercase',\n color: 'var(--assistly-ink-soft)',\n background: 'var(--assistly-paper-2)',\n border: '1px solid var(--assistly-hairline)',\n borderRadius: 999,\n }}\n >\n <ShieldCheck size={12} strokeWidth={1.6} style={{ color: 'var(--assistly-brass)' }} />\n Secure\n </div>\n </header>\n\n {/* ======================= MESSAGES ======================= */}\n <main\n className=\"assistly-scroll\"\n style={{\n position: 'relative',\n zIndex: 1,\n flex: 1,\n overflowY: 'auto',\n padding: '28px 20px 24px',\n background: 'transparent',\n }}\n >\n <div\n style={{\n maxWidth: 760,\n margin: '0 auto',\n display: 'flex',\n flexDirection: 'column',\n gap: 18,\n }}\n >\n <Messages messages={message} chatbotName={chatbotName} />\n </div>\n </main>\n\n {/* ======================= INPUT ======================= */}\n <footer\n style={{\n position: 'relative',\n zIndex: 1,\n padding: '16px 20px 22px',\n background: 'linear-gradient(180deg, rgba(245,241,232,0) 0%, var(--assistly-paper) 30%)',\n borderTop: '1px solid var(--assistly-hairline)',\n }}\n >\n <Form {...form}>\n <form\n onSubmit={form.handleSubmit(onsubmit)}\n style={{\n maxWidth: 760,\n margin: '0 auto',\n display: 'flex',\n alignItems: 'flex-end',\n gap: 10,\n }}\n >\n <FormField\n control={form.control}\n name=\"message\"\n render={({ field }) => (\n <FormItem style={{ flex: 1, margin: 0 }}>\n <FormControl>\n <div\n style={{\n position: 'relative',\n background: '#fffefb',\n border: '1px solid var(--assistly-hairline-strong)',\n borderRadius: 14,\n boxShadow: '0 1px 0 rgba(26,20,15,0.02), 0 6px 18px rgba(26,20,15,0.04)',\n transition: 'border-color 180ms ease, box-shadow 180ms ease',\n }}\n >\n <Input\n {...field}\n placeholder={\n onboardingStep === 1\n ? 'Your name…'\n : onboardingStep === 2\n ? 'Your email…'\n : 'Write a message…'\n }\n style={{\n width: '100%',\n padding: '14px 16px',\n fontSize: 15,\n lineHeight: 1.5,\n color: 'var(--assistly-ink)',\n background: 'transparent',\n border: 'none',\n outline: 'none',\n fontFamily: 'inherit',\n borderRadius: 14,\n }}\n onFocus={(e) => {\n const wrap = e.currentTarget.parentElement as HTMLElement;\n wrap.style.borderColor = 'var(--assistly-brass)';\n wrap.style.boxShadow = '0 0 0 3px rgba(184,137,58,0.18), 0 6px 18px rgba(26,20,15,0.04)';\n }}\n onBlur={(e) => {\n const wrap = e.currentTarget.parentElement as HTMLElement;\n wrap.style.borderColor = 'var(--assistly-hairline-strong)';\n wrap.style.boxShadow = '0 1px 0 rgba(26,20,15,0.02), 0 6px 18px rgba(26,20,15,0.04)';\n }}\n />\n </div>\n </FormControl>\n </FormItem>\n )}\n />\n\n <button\n type=\"submit\"\n disabled={form.formState.isSubmitting || !form.formState.isValid || loading}\n className=\"assistly-send\"\n aria-label=\"Send message\"\n style={{\n width: 52,\n height: 52,\n borderRadius: 14,\n border: 'none',\n cursor: 'pointer',\n display: 'grid',\n placeItems: 'center',\n flexShrink: 0,\n }}\n >\n {loading ? (\n <span\n style={{\n width: 18,\n height: 18,\n border: '2px solid rgba(245,241,232,0.35)',\n borderTopColor: 'var(--assistly-paper)',\n borderRadius: '50%',\n animation: 'assistly-spin 0.9s linear infinite',\n display: 'inline-block',\n }}\n />\n ) : (\n <Send size={18} strokeWidth={2} />\n )}\n </button>\n </form>\n </Form>\n <span\n className=\"assistly-font-mono\"\n style={{\n display: 'block',\n maxWidth: 760,\n margin: '10px auto 0',\n fontSize: 10,\n letterSpacing: '0.16em',\n textTransform: 'uppercase',\n color: 'var(--assistly-ink-mute)',\n textAlign: 'center',\n }}\n >\n <ArrowUpRight size={10} strokeWidth={1.8} style={{ verticalAlign: '-1px', marginRight: 4 }} />\n Powered by SMOEDESIGN\n </span>\n <style>{`@keyframes assistly-spin { to { transform: rotate(360deg); } }`}</style>\n </footer>\n </div>\n );\n}\n\nexport default ChatbotClient;\n","async function startNewChat(\n origin: string,\n guestName: string,\n guestEmail: string,\n chatbotId: number,\n): Promise<number> {\n const baseUrl = origin.replace(/\\/$/, '');\n const response = await fetch(`${baseUrl}/api/start-chat`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: guestName,\n email: guestEmail,\n chatbot_id: chatbotId,\n }),\n });\n\n if (!response.ok) {\n const payload = await response.json().catch(() => null);\n const message =\n payload?.error ?? `Failed to start chat (${response.status})`;\n throw new Error(message);\n }\n\n const data = await response.json();\n if (typeof data?.chat_session_id !== 'number') {\n throw new Error('Server returned an invalid response');\n }\n return data.chat_session_id;\n}\n\nexport default startNewChat;\n","import { gql } from \"@apollo/client\";\n\nexport const GET_MESSEGES_BY_CHAT_SESSION_ID = gql`\n query GetMessagesByChatSessionId($chat_session_id: Int!) {\n chat_sessions(id: $chat_session_id) {\n created_at\n id\n messages {\n id\n sender\n content\n created_at\n }\n }\n }\n`;\n","'use client';\n\nimport { Message } from \"../types\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport { UserCircle } from \"lucide-react\";\nimport React, { useEffect, useRef, useState } from \"react\";\n\n/* -------------------------------------------------------------------------- */\n/* Small helpers */\n/* -------------------------------------------------------------------------- */\n\nfunction formatTime(iso: string) {\n try {\n const d = new Date(iso);\n return d.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\n } catch {\n return \"\";\n }\n}\n\nfunction TypewriterMarkdown({\n text,\n isFresh,\n components,\n onType,\n}: {\n text: string;\n isFresh: boolean;\n components: any;\n onType?: () => void;\n}) {\n const [displayedText, setDisplayedText] = useState(\"\");\n const [index, setIndex] = useState(0);\n\n useEffect(() => {\n setDisplayedText(\"\");\n setIndex(0);\n }, [text]);\n\n useEffect(() => {\n if (isFresh && text && index < text.length) {\n const timeout = setTimeout(() => {\n setDisplayedText((prev) => prev + text[index]);\n setIndex((prev) => prev + 1);\n if (onType) onType();\n }, 14);\n return () => clearTimeout(timeout);\n } else if (!isFresh) {\n setDisplayedText(text || \"\");\n }\n }, [index, text, isFresh]);\n\n const showCaret = isFresh && index < text.length;\n return (\n <span className={showCaret ? 'assistly-caret' : undefined}>\n <ReactMarkdown remarkPlugins={[remarkGfm]} components={components}>\n {isFresh ? displayedText : text}\n </ReactMarkdown>\n </span>\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------------- */\n\nfunction Messages({\n messages,\n chatbotName,\n isReviewPage = false,\n}: {\n messages: Message[];\n chatbotName: string;\n isReviewPage?: boolean;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const [hoveredId, setHoveredId] = useState<number | string | null>(null);\n\n const scrollToBottom = (smooth = true) => {\n if (ref.current) {\n ref.current.scrollIntoView({ behavior: smooth ? \"smooth\" : \"auto\", block: \"end\" });\n }\n };\n\n useEffect(() => {\n scrollToBottom();\n }, [messages]);\n\n const markdownComponents = {\n ul: ({ node, ...props }: any) => <ul {...props} />,\n ol: ({ node, ...props }: any) => <ol {...props} />,\n a: ({ node, ...props }: any) => <a rel=\"noopener noreferrer\" target=\"_blank\" {...props} />,\n };\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 22 }}>\n {messages.map((message, index) => {\n const isSender = message.sender !== \"user\";\n const isThinking = message.content === \"\" || message.content === \"Thinking...\";\n const isFresh = index === messages.length - 1;\n const showMeta = hoveredId === message.id || isReviewPage;\n\n return (\n <div\n key={message.id || index}\n onMouseEnter={() => setHoveredId(message.id)}\n onMouseLeave={() => setHoveredId(null)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: isSender ? 'flex-start' : 'flex-end',\n maxWidth: '100%',\n }}\n >\n {/* ----- Header row: avatar + name + meta ----- */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n marginBottom: 8,\n padding: isSender ? '0 4px' : '0 4px',\n flexDirection: isSender ? 'row' : 'row-reverse',\n }}\n >\n <div\n style={{\n width: 26,\n height: 26,\n borderRadius: '50%',\n background: isSender\n ? 'var(--assistly-paper-2)'\n : 'var(--assistly-ink)',\n color: isSender ? 'var(--assistly-ink)' : 'var(--assistly-paper)',\n border: '1px solid var(--assistly-hairline-strong)',\n display: 'grid',\n placeItems: 'center',\n flexShrink: 0,\n }}\n aria-hidden\n >\n {isSender ? (\n <span\n style={{\n fontFamily: 'Fraunces, Georgia, serif',\n fontSize: 13,\n fontWeight: 600,\n lineHeight: 1,\n }}\n >\n {chatbotName.charAt(0).toUpperCase()}\n </span>\n ) : (\n <UserCircle size={14} strokeWidth={1.6} />\n )}\n </div>\n <div\n className=\"assistly-font-mono\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n fontSize: 10,\n letterSpacing: '0.18em',\n textTransform: 'uppercase',\n color: 'var(--assistly-ink-mute)',\n }}\n >\n <span style={{ color: 'var(--assistly-ink-soft)', fontWeight: 500 }}>\n {isSender ? chatbotName || 'assistant' : 'you'}\n </span>\n <span\n style={{\n width: 3,\n height: 3,\n borderRadius: '50%',\n background: 'var(--assistly-ink-mute)',\n opacity: showMeta ? 1 : 0,\n transition: 'opacity 200ms',\n }}\n />\n <span style={{ opacity: showMeta ? 1 : 0, transition: 'opacity 200ms' }}>\n {formatTime(message.created_at)}\n </span>\n </div>\n </div>\n\n {/* ----- Bubble ----- */}\n <div\n className={`${isSender ? 'assistly-bubble-in' : ''}`}\n style={{\n position: 'relative',\n maxWidth: 'min(82%, 640px)',\n padding: '12px 16px',\n borderRadius: isSender ? '4px 16px 16px 16px' : '16px 4px 16px 16px',\n background: isSender ? '#fffefb' : 'var(--assistly-ink)',\n color: isSender ? 'var(--assistly-ink)' : 'var(--assistly-paper)',\n border: isSender\n ? '1px solid var(--assistly-hairline-strong)'\n : '1px solid var(--assistly-ink)',\n boxShadow: isSender\n ? '0 1px 0 rgba(26,20,15,0.02), 0 8px 24px rgba(26,20,15,0.05)'\n : '0 1px 0 rgba(255,255,255,0.04) inset, 0 8px 24px rgba(26,20,15,0.18)',\n fontSize: 15,\n lineHeight: 1.6,\n }}\n >\n {isThinking ? (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n padding: '2px 0',\n minHeight: 22,\n }}\n >\n <span className=\"assistly-dot\" />\n <span className=\"assistly-dot\" />\n <span className=\"assistly-dot\" />\n <span className=\"assistly-dot\" />\n <span\n className=\"assistly-font-mono\"\n style={{\n marginLeft: 4,\n fontSize: 10,\n letterSpacing: '0.22em',\n textTransform: 'uppercase',\n color: 'var(--assistly-ink-mute)',\n }}\n >\n Thinking…\n </span>\n </div>\n ) : isSender ? (\n <div className=\"assistly-prose\">\n <TypewriterMarkdown\n text={message.content}\n isFresh={isFresh}\n components={markdownComponents}\n onType={() => scrollToBottom(false)}\n />\n </div>\n ) : (\n <div className=\"assistly-prose\">\n <ReactMarkdown remarkPlugins={[remarkGfm]} components={markdownComponents}>\n {message.content}\n </ReactMarkdown>\n </div>\n )}\n </div>\n </div>\n );\n })}\n <div ref={ref} />\n </div>\n );\n}\n\nexport default Messages;\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport {\n Controller,\n FormProvider,\n useFormContext,\n useFormState,\n type ControllerProps,\n type FieldPath,\n type FieldValues,\n} from \"react-hook-form\"\n\nimport { cn } from \"../lib/utils\"\nimport { Label } from \"./label\"\n\nconst Form = FormProvider\n\ntype FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n name: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>(\n {} as FormFieldContextValue\n)\n\nconst FormField = <\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n ...props\n}: ControllerProps<TFieldValues, TName>) => {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n )\n}\n\nconst useFormField = () => {\n const fieldContext = React.useContext(FormFieldContext)\n const itemContext = React.useContext(FormItemContext)\n const { getFieldState } = useFormContext()\n const formState = useFormState({ name: fieldContext.name })\n const fieldState = getFieldState(fieldContext.name, formState)\n\n if (!fieldContext) {\n throw new Error(\"useFormField should be used within <FormField>\")\n }\n\n const { id } = itemContext\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n }\n}\n\ntype FormItemContextValue = {\n id: string\n}\n\nconst FormItemContext = React.createContext<FormItemContextValue>(\n {} as FormItemContextValue\n)\n\nfunction FormItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const id = React.useId()\n\n return (\n <FormItemContext.Provider value={{ id }}>\n <div\n data-slot=\"form-item\"\n className={cn(\"grid gap-2\", className)}\n {...props}\n />\n </FormItemContext.Provider>\n )\n}\n\nfunction FormLabel({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n const { error, formItemId } = useFormField()\n\n return (\n <Label\n data-slot=\"form-label\"\n data-error={!!error}\n className={cn(\"data-[error=true]:text-destructive\", className)}\n htmlFor={formItemId}\n {...props}\n />\n )\n}\n\nfunction FormControl({ ...props }: React.ComponentProps<typeof Slot>) {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n\n return (\n <Slot\n data-slot=\"form-control\"\n id={formItemId}\n aria-describedby={\n !error\n ? `${formDescriptionId}`\n : `${formDescriptionId} ${formMessageId}`\n }\n aria-invalid={!!error}\n {...props}\n />\n )\n}\n\nfunction FormDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n const { formDescriptionId } = useFormField()\n\n return (\n <p\n data-slot=\"form-description\"\n id={formDescriptionId}\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction FormMessage({ className, ...props }: React.ComponentProps<\"p\">) {\n const { error, formMessageId } = useFormField()\n const body = error ? String(error?.message ?? \"\") : props.children\n\n if (!body) {\n return null\n }\n\n return (\n <p\n data-slot=\"form-message\"\n id={formMessageId}\n className={cn(\"text-destructive text-sm\", className)}\n {...props}\n >\n {body}\n </p>\n )\n}\n\nexport {\n useFormField,\n Form,\n FormItem,\n FormLabel,\n FormControl,\n FormDescription,\n FormMessage,\n FormField,\n}\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\n\nimport { cn } from \"../lib/utils\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","import * as React from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"border-input file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","/* Styles are injected once per page. We hash the CSS string and key the\n * <style> tag with `data-assistly-style=\"<hash>\"` so HMR and multiple\n * mounts don't duplicate it. */\n\nlet injected = false;\nlet injectedHash: string | null = null;\n\nfunction hashCss(css: string): string {\n let h = 5381;\n for (let i = 0; i < css.length; i++) {\n h = ((h << 5) + h) ^ css.charCodeAt(i);\n }\n return (h >>> 0).toString(36);\n}\n\nexport function ensureAssistlyStyles(css: string): void {\n if (typeof document === 'undefined') return;\n const h = hashCss(css);\n if (injected && injectedHash === h) return;\n injected = true;\n injectedHash = h;\n\n document.querySelectorAll('style[data-assistly-style]').forEach((el) => el.remove());\n\n const style = document.createElement('style');\n style.setAttribute('data-assistly-style', h);\n style.textContent = css;\n document.head.appendChild(style);\n}\n\n/** Test-only: clear the dedup state so a fresh <style> tag is created\n * on the next call. Do not use in production. */\nexport function __resetAssistlyStylesForTests(): void {\n injected = false;\n injectedHash = null;\n}\n\nlet fontsInjected = false;\nconst FONT_HREF =\n 'https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,500;9..144,600&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap';\n\nexport function ensureAssistlyFonts(): void {\n if (typeof document === 'undefined') return;\n if (fontsInjected) return;\n if (document.querySelector('link[data-assistly-fonts]')) {\n fontsInjected = true;\n return;\n }\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = FONT_HREF;\n link.setAttribute('data-assistly-fonts', 'true');\n document.head.appendChild(link);\n fontsInjected = true;\n}\n","/* Assistly embed — base styles\n * ------------------------------------------------------------\n * This file is compiled at build time and injected into the\n * consumer page on mount. It defines the design tokens the\n * React components reference (shadcn-style + custom palette)\n * so the widget renders identically regardless of the host\n * app's Tailwind/theme configuration.\n */\n\n:root {\n /* --- Paper & ink palette --------------------------------- */\n --assistly-paper: #f5f1e8; /* warm bone */\n --assistly-paper-2: #efe9dc; /* slightly deeper bone */\n --assistly-ink: #1a140f; /* near-black, warm */\n --assistly-ink-soft: #3a322a; /* secondary text */\n --assistly-ink-mute: #7a7166; /* tertiary / meta */\n --assistly-hairline: rgba(26, 20, 15, 0.12);\n --assistly-hairline-strong: rgba(26, 20, 15, 0.22);\n\n /* --- Brass accent --------------------------------------- */\n --assistly-brass: #b8893a;\n --assistly-brass-soft: #d4ad6a;\n\n /* --- shadcn aliases consumed by button/input ------------- */\n --background: var(--assistly-paper);\n --foreground: var(--assistly-ink);\n --primary: var(--assistly-ink);\n --primary-foreground: #f5f1e8;\n --secondary: var(--assistly-paper-2);\n --secondary-foreground: var(--assistly-ink);\n --muted: var(--assistly-paper-2);\n --muted-foreground: var(--assistly-ink-mute);\n --accent: var(--assistly-brass-soft);\n --accent-foreground: var(--assistly-ink);\n --destructive: #8a2a2a;\n --border: var(--assistly-hairline-strong);\n --input: var(--assistly-hairline-strong);\n --ring: var(--assistly-brass);\n\n /* --- Component-specific aliases ------------------------- */\n --hairline: var(--assistly-hairline);\n --brass-2: var(--assistly-brass);\n --muted-2: var(--assistly-ink-mute);\n --assistly-primary: var(--assistly-ink);\n}\n\n/* --- Reset inside the widget ----------------------------- */\n.assistly-root,\n.assistly-root * {\n box-sizing: border-box;\n}\n\n.assistly-root {\n font-family: 'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif;\n color: var(--assistly-ink);\n line-height: 1.55;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n text-rendering: optimizeLegibility;\n}\n\n.assistly-font-display {\n font-family: 'Fraunces', 'Cormorant Garamond', 'Playfair Display', Georgia, serif;\n font-weight: 500;\n letter-spacing: -0.01em;\n font-feature-settings: \"ss01\", \"ss02\";\n}\n\n.assistly-font-mono {\n font-family: 'JetBrains Mono', 'SF Mono', ui-monospace, Menlo, monospace;\n font-feature-settings: \"ss01\", \"cv11\";\n}\n\n/* --- Paper grain overlay --------------------------------- */\n.assistly-grain {\n position: absolute;\n inset: 0;\n pointer-events: none;\n opacity: 0.35;\n mix-blend-mode: multiply;\n background-image: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0.10 0 0 0 0 0.08 0 0 0 0 0.06 0 0 0 0.08 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>\");\n}\n\n/* --- Scrollbar ------------------------------------------- */\n.assistly-scroll::-webkit-scrollbar {\n width: 6px;\n}\n.assistly-scroll::-webkit-scrollbar-track {\n background: transparent;\n}\n.assistly-scroll::-webkit-scrollbar-thumb {\n background: var(--assistly-hairline-strong);\n border-radius: 999px;\n}\n.assistly-scroll::-webkit-scrollbar-thumb:hover {\n background: var(--assistly-ink-mute);\n}\n\n/* --- Typing indicator ------------------------------------ */\n.assistly-dot {\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 999px;\n background: var(--assistly-brass);\n animation: assistly-bounce 1.1s cubic-bezier(0.45, 0, 0.55, 1) infinite;\n}\n.assistly-dot:nth-child(2) { animation-delay: 0.12s; background: var(--assistly-ink-soft); }\n.assistly-dot:nth-child(3) { animation-delay: 0.24s; background: var(--assistly-brass-soft); }\n.assistly-dot:nth-child(4) { animation-delay: 0.36s; background: var(--assistly-ink-mute); }\n\n@keyframes assistly-bounce {\n 0%, 60%, 100% { transform: translate3d(0, 0, 0); }\n 30% { transform: translate3d(0, -5px, 0); }\n}\n\n/* --- Bubble entrance ------------------------------------- */\n.assistly-bubble-in {\n animation: assistly-spring 520ms cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n}\n@keyframes assistly-spring {\n 0% { transform: scale(0.94) translate3d(0, 6px, 0); opacity: 0; }\n 60% { transform: scale(1.015) translate3d(0, -1px, 0); opacity: 1; }\n 100% { transform: scale(1) translate3d(0, 0, 0); opacity: 1; }\n}\n\n/* --- Status pulse ---------------------------------------- */\n.assistly-pulse {\n position: relative;\n}\n.assistly-pulse::after {\n content: '';\n position: absolute;\n inset: -3px;\n border-radius: 999px;\n background: #5a8c5a;\n opacity: 0.35;\n animation: assistly-pulse 2.4s ease-out infinite;\n}\n@keyframes assistly-pulse {\n 0% { transform: scale(0.6); opacity: 0.45; }\n 100% { transform: scale(2.2); opacity: 0; }\n}\n\n/* --- Send button hover ----------------------------------- */\n.assistly-send {\n position: relative;\n background: var(--assistly-ink);\n color: var(--assistly-paper);\n transition: transform 180ms ease, background 180ms ease, box-shadow 180ms ease;\n box-shadow: 0 1px 0 rgba(255,255,255,0.04) inset, 0 4px 14px rgba(26,20,15,0.18);\n}\n.assistly-send:hover:not(:disabled) {\n background: var(--assistly-ink-soft);\n transform: translateY(-1px);\n box-shadow: 0 1px 0 rgba(255,255,255,0.04) inset, 0 8px 22px rgba(26,20,15,0.24);\n}\n.assistly-send:active:not(:disabled) {\n transform: translateY(0);\n box-shadow: 0 1px 0 rgba(255,255,255,0.04) inset, 0 2px 8px rgba(26,20,15,0.18);\n}\n.assistly-send:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n/* --- Markdown content ------------------------------------ */\n.assistly-prose p {\n margin: 0 0 0.6em 0;\n white-space: pre-wrap;\n}\n.assistly-prose p:last-child { margin-bottom: 0; }\n.assistly-prose ul, .assistly-prose ol {\n margin: 0.4em 0 0.6em 1.1em;\n}\n.assistly-prose li { margin-bottom: 0.25em; }\n.assistly-prose code {\n font-family: 'JetBrains Mono', ui-monospace, monospace;\n font-size: 0.88em;\n padding: 0.1em 0.35em;\n background: rgba(26, 20, 15, 0.07);\n border-radius: 3px;\n}\n.assistly-prose a {\n color: var(--assistly-brass);\n text-decoration: underline;\n text-underline-offset: 2px;\n font-weight: 500;\n}\n.assistly-prose a:hover { color: var(--assistly-ink); }\n.assistly-prose h1, .assistly-prose h2, .assistly-prose h3 {\n font-family: 'Fraunces', Georgia, serif;\n font-weight: 600;\n margin: 0.6em 0 0.3em 0;\n letter-spacing: -0.01em;\n}\n.assistly-prose h1 { font-size: 1.25em; }\n.assistly-prose h2 { font-size: 1.1em; }\n.assistly-prose h3 { font-size: 1em; }\n.assistly-prose strong { font-weight: 600; }\n\n/* --- Caret for streaming --------------------------------- */\n.assistly-caret::after {\n content: '▍';\n display: inline-block;\n margin-left: 1px;\n color: var(--assistly-brass);\n animation: assistly-blink 1s steps(1) infinite;\n}\n@keyframes assistly-blink {\n 50% { opacity: 0; }\n}\n","/* Imports the raw CSS text as a string at build time. The file uses a\n * custom .tokens extension (not .css) so tsup's postcss plugin never\n * sees it, and esbuild's `text` loader (configured in tsup.config.ts)\n * inlines the file contents as a default-exported string. The CSS is\n * then injected at runtime by `ensureAssistlyStyles` in injectStyles.ts. */\nimport styles from '../styles.tokens';\nexport default styles as string;\n"],"mappings":"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","names":["useEffect","useState","useEffect","useState","React","jsx","jsx","jsx","jsx","jsx","jsxs","useState","useEffect","email","styles_default","jsx","useState","useEffect","styles_default"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shaimaababiker/embed",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "Embeddable Assistly chatbot as a React component. Drop-in replacement for the iframe-based embed.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -44,13 +44,13 @@
|
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@testing-library/react": "^16.1.0",
|
|
47
|
-
"@types/react": "^19.2.
|
|
47
|
+
"@types/react": "^19.2.17",
|
|
48
48
|
"@types/react-dom": "^19.2.3",
|
|
49
49
|
"jsdom": "^25.0.1",
|
|
50
50
|
"react": "^19.2.4",
|
|
51
51
|
"react-dom": "^19.2.4",
|
|
52
|
-
"tsup": "^8.
|
|
52
|
+
"tsup": "^8.5.1",
|
|
53
53
|
"typescript": "^5.9.3",
|
|
54
|
-
"vitest": "^2.1.
|
|
54
|
+
"vitest": "^2.1.9"
|
|
55
55
|
}
|
|
56
56
|
}
|