@dmanikanta17/chat-ui-react 0.1.0 → 0.1.1

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.js CHANGED
@@ -334,7 +334,7 @@ var ExpandableChat = ({
334
334
  return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
335
335
  "div",
336
336
  {
337
- className: cn(`fixed ${chatConfig.positions[position]} z-50`, className),
337
+ className: cn(`fixed ${chatConfig.positions[position]} z-[9999]`, className),
338
338
  ...props,
339
339
  children: [
340
340
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
@@ -342,7 +342,9 @@ var ExpandableChat = ({
342
342
  {
343
343
  ref: chatRef,
344
344
  className: cn(
345
- "flex flex-col bg-background dark:bg-zinc-900 sm:rounded-lg shadow-md overflow-hidden transition-all duration-250 ease-out sm:absolute sm:w-[90vw] sm:h-[80vh] fixed inset-0 w-full h-full sm:inset-auto",
345
+ "flex flex-col bg-background dark:bg-zinc-900 shadow-md overflow-hidden transition-all duration-250 ease-out",
346
+ "fixed inset-0 w-full h-full",
347
+ "sm:absolute sm:rounded-lg sm:w-[90vw] sm:h-[80vh] sm:inset-auto",
346
348
  chatConfig.chatPositions[position],
347
349
  chatConfig.dimensions[size],
348
350
  isOpen ? chatConfig.states.open : chatConfig.states.closed,
@@ -409,8 +411,9 @@ var ExpandableChatToggle = ({
409
411
  variant: "default",
410
412
  onClick: toggleChat,
411
413
  className: cn(
412
- "w-16 h-16 rounded-full shadow-md flex items-center justify-center hover:shadow-lg hover:shadow-black/30 transition-all duration-300 p-0 ring-0",
414
+ "w-16 h-16 rounded-full shadow-md flex items-center justify-center hover:shadow-lg hover:shadow-black/30 transition-all duration-300 p-0 ring-0 shrink-0",
413
415
  !isOpen ? "!bg-transparent !border-0" : "",
416
+ isOpen ? "hidden sm:flex" : "flex",
414
417
  className
415
418
  ),
416
419
  ...props,
@@ -854,7 +857,7 @@ function ChatUI({
854
857
  }
855
858
  };
856
859
  return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_jsx_runtime11.Fragment, { children: [
857
- showNotification && !isChatOpen && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "fixed bottom-24 right-4 sm:right-5 z-50 animate-in fade-in slide-in-from-bottom-5 duration-300", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "relative", children: [
860
+ showNotification && !isChatOpen && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "fixed bottom-24 right-5 z-[9998] animate-in fade-in slide-in-from-bottom-5 duration-300", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "relative", children: [
858
861
  /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
859
862
  Button2,
860
863
  {
@@ -916,7 +919,6 @@ function ChatUI({
916
919
  isOpen: isChatOpen,
917
920
  onOpenChange: setIsChatOpen,
918
921
  icon: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "relative h-full w-full overflow-hidden rounded-full", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("img", { src: logoSrc, alt: "AI", className: "object-cover h-full w-full" }) }),
919
- className: "z-50",
920
922
  children: [
921
923
  /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(ExpandableChatHeader, { className: "bg-muted/40 flex-col text-center justify-center border-b p-4 relative", children: [
922
924
  /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("h1", { className: "text-xl font-semibold flex items-center justify-center gap-2", children: [
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/ChatUI.tsx","../src/components/ui/button.tsx","../src/lib/utils.ts","../src/components/ui/avatar.tsx","../src/components/ui/message-loading.tsx","../src/components/ui/chat-bubble.tsx","../src/components/ui/chat-input.tsx","../src/components/ui/textarea.tsx","../src/components/ui/expandable-chat.tsx","../src/components/ui/chat-message-list.tsx","../src/components/hooks/use-auto-scroll.ts","../src/components/ui/shining-text.tsx","../src/components/ui/moving-border.tsx"],"sourcesContent":["export { ChatUI, type ChatUIProps } from \"./ChatUI\";\r\n","\"use client\"\r\n\r\nimport { useState, FormEvent, useEffect } from \"react\"\r\nimport { Send, Sparkles, Loader2, User, RefreshCcw, X } from \"lucide-react\"\r\nimport { Button } from \"./components/ui/button\"\r\nimport {\r\n ChatBubble,\r\n ChatBubbleAvatar,\r\n ChatBubbleMessage,\r\n} from \"./components/ui/chat-bubble\"\r\nimport { ChatInput } from \"./components/ui/chat-input\"\r\nimport {\r\n ExpandableChat,\r\n ExpandableChatHeader,\r\n ExpandableChatBody,\r\n ExpandableChatFooter,\r\n} from \"./components/ui/expandable-chat\"\r\nimport { ChatMessageList } from \"./components/ui/chat-message-list\"\r\n\r\nimport { ShiningText } from \"./components/ui/shining-text\"\r\nimport { Button as MovingBorderButton } from \"./components/ui/moving-border\"\r\nimport ReactMarkdown from \"react-markdown\"\r\nimport remarkGfm from \"remark-gfm\"\r\nimport { cn } from \"./lib/utils\"\r\n\r\ninterface Message {\r\n id: string\r\n role: \"user\" | \"assistant\"\r\n content: string\r\n}\r\n\r\nexport interface ChatUIProps {\r\n endpoint: string;\r\n logoSrc?: string;\r\n soundSrc?: string;\r\n title?: string;\r\n welcomeMessage?: string;\r\n description?: string;\r\n}\r\n\r\nexport function ChatUI({ \r\n endpoint, \r\n logoSrc = \"/bot_logo.jpg\", \r\n soundSrc = \"/sound.mp3\",\r\n title = \"AI Assistant\",\r\n welcomeMessage = \"Welcome to Services! 👋\",\r\n description = \"I'm here to help you navigate our services. Feel free to ask me anything!\"\r\n}: ChatUIProps) {\r\n const [messages, setMessages] = useState<Message[]>([])\r\n const [input, setInput] = useState(\"\")\r\n const [isLoading, setIsLoading] = useState(false)\r\n const [isInitialized, setIsInitialized] = useState(false)\r\n\r\n useEffect(() => {\r\n const savedMessages = localStorage.getItem(\"chat-history\")\r\n if (savedMessages) {\r\n try {\r\n setMessages(JSON.parse(savedMessages))\r\n } catch (e) {\r\n console.error(\"Failed to parse chat history\", e)\r\n }\r\n }\r\n setIsInitialized(true)\r\n }, [])\r\n\r\n const [isChatOpen, setIsChatOpen] = useState(false)\r\n const [showNotification, setShowNotification] = useState(false)\r\n const [isDismissed, setIsDismissed] = useState(false)\r\n\r\n useEffect(() => {\r\n const timer = setTimeout(() => {\r\n if (!isDismissed && !isChatOpen) {\r\n setShowNotification(true)\r\n const audio = new Audio(soundSrc)\r\n audio.play().catch((error) => {\r\n if (error.name !== \"NotAllowedError\") {\r\n console.error(\"Error playing notification sound:\", error)\r\n }\r\n })\r\n }\r\n }, 2000)\r\n return () => clearTimeout(timer)\r\n }, [isChatOpen, isDismissed, soundSrc])\r\n\r\n useEffect(() => {\r\n if (isChatOpen) {\r\n setShowNotification(false)\r\n setIsDismissed(true)\r\n }\r\n }, [isChatOpen])\r\n\r\n const handleDismissNotification = () => {\r\n setShowNotification(false)\r\n setIsDismissed(true)\r\n }\r\n\r\n useEffect(() => {\r\n if (isInitialized) {\r\n localStorage.setItem(\"chat-history\", JSON.stringify(messages))\r\n }\r\n }, [messages, isInitialized])\r\n\r\n const handleReset = () => {\r\n setMessages([])\r\n localStorage.removeItem(\"chat-history\")\r\n }\r\n\r\n const handleSubmit = async (e: FormEvent) => {\r\n e.preventDefault()\r\n if (!input.trim() || isLoading) return\r\n\r\n const userQuestion = input.trim()\r\n\r\n const userMessage: Message = {\r\n id: Date.now().toString(),\r\n role: \"user\",\r\n content: userQuestion,\r\n }\r\n\r\n // Prepare history\r\n const history = messages.map((msg) => ({\r\n role: msg.role,\r\n content: msg.content,\r\n }))\r\n\r\n setMessages((prev) => [...prev, userMessage])\r\n setInput(\"\")\r\n setIsLoading(true)\r\n\r\n try {\r\n const response = await fetch(endpoint, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify({\r\n query: userQuestion,\r\n history: history,\r\n stream: true,\r\n }),\r\n })\r\n\r\n if (!response.body) {\r\n throw new Error(\"ReadableStream not supported.\")\r\n }\r\n\r\n const reader = response.body.getReader()\r\n const decoder = new TextDecoder()\r\n let aiResponse = \"\"\r\n let isFirstChunk = true\r\n\r\n while (true) {\r\n const { value, done } = await reader.read()\r\n if (done) break\r\n\r\n const chunk = decoder.decode(value, { stream: true })\r\n aiResponse += chunk\r\n\r\n if (isFirstChunk) {\r\n isFirstChunk = false;\r\n setIsLoading(false); // Hide \"Thinking...\" bubble\r\n \r\n // Add initial bot message\r\n const botMessageId = (Date.now() + 1).toString()\r\n const botMessage: Message = {\r\n id: botMessageId,\r\n role: \"assistant\",\r\n content: aiResponse,\r\n }\r\n setMessages((prev) => [...prev, botMessage])\r\n } else {\r\n // Update existing bot message\r\n setMessages((prev) => {\r\n const updated = [...prev]\r\n const lastMsgIndex = updated.length - 1\r\n if (lastMsgIndex >= 0 && updated[lastMsgIndex].role === \"assistant\") {\r\n updated[lastMsgIndex] = {\r\n ...updated[lastMsgIndex],\r\n content: aiResponse,\r\n }\r\n }\r\n return updated\r\n })\r\n }\r\n }\r\n\r\n // Play notification sound\r\n const audio = new Audio(soundSrc)\r\n audio.play().catch((e) => console.error(\"Error playing notification sound:\", e))\r\n \r\n } catch (error) {\r\n console.error(\"Chat error:\", error)\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n id: (Date.now() + 2).toString(),\r\n role: \"assistant\",\r\n content: \"I apologize, but I encountered an error. Please try again later.\",\r\n },\r\n ])\r\n } finally {\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n {showNotification && !isChatOpen && (\r\n <div className=\"fixed bottom-24 right-4 sm:right-5 z-50 animate-in fade-in slide-in-from-bottom-5 duration-300\">\r\n {/* Wrapper to position tail relative to the button */}\r\n <div className=\"relative\">\r\n <MovingBorderButton\r\n as=\"div\"\r\n borderRadius=\"0.75rem\"\r\n duration={3000}\r\n containerClassName=\"w-72 sm:w-80 h-auto overflow-hidden rounded-xl bg-transparent\"\r\n borderClassName=\"bg-[radial-gradient(#0ea5e9_40%,transparent_60%)]\"\r\n className=\"bg-background dark:bg-zinc-900 border dark:border-zinc-800 p-5 items-start justify-start flex-col w-full h-full text-foreground shadow-lg\"\r\n >\r\n <Button \r\n variant=\"ghost\" \r\n size=\"icon\" \r\n className=\"absolute top-3 right-3 h-6 w-6 text-muted-foreground hover:text-foreground z-10\"\r\n onClick={handleDismissNotification}\r\n >\r\n <X className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">Close</span>\r\n </Button>\r\n\r\n <div className=\"flex items-start gap-3 mb-4 w-full\">\r\n <div className=\"relative h-10 w-10 shrink-0 overflow-hidden rounded-full ring-2 ring-background dark:ring-zinc-800\">\r\n <img src={logoSrc} alt=\"AI\" className=\"object-cover h-full w-full\" />\r\n </div>\r\n <div className=\"flex flex-col pt-0.5\">\r\n <h3 className=\"font-bold text-sm leading-tight text-foreground\">{title}</h3>\r\n <div className=\"flex items-center gap-1.5 mt-0.5\">\r\n <span className=\"relative flex h-2 w-2\">\r\n <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75\"></span>\r\n <span className=\"relative inline-flex rounded-full h-2 w-2 bg-green-500\"></span>\r\n </span>\r\n <span className=\"text-xs text-muted-foreground font-medium\">Online</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"w-full text-left\">\r\n <p className=\"text-sm font-medium text-foreground leading-snug\">\r\n {welcomeMessage}\r\n </p>\r\n <p className=\"text-sm text-muted-foreground leading-relaxed mt-2\">\r\n {description}\r\n </p>\r\n <Button \r\n className=\"w-full mt-4 h-10 rounded-lg bg-[#535bf2] hover:bg-[#464ec9] text-white shadow-sm transition-all duration-200 font-medium\"\r\n onClick={() => setIsChatOpen(true)}\r\n >\r\n Start chatting\r\n </Button>\r\n </div>\r\n </MovingBorderButton>\r\n \r\n {/* Triangle Tail */}\r\n <div className=\"absolute -bottom-2 right-6 w-4 h-4 bg-background dark:bg-zinc-900 border-b border-r dark:border-zinc-800 transform rotate-45 z-0\"></div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <ExpandableChat\r\n size=\"lg\"\r\n position=\"bottom-right\"\r\n isOpen={isChatOpen}\r\n onOpenChange={setIsChatOpen}\r\n icon={<div className=\"relative h-full w-full overflow-hidden rounded-full\"><img src={logoSrc} alt=\"AI\" className=\"object-cover h-full w-full\" /></div>}\r\n className=\"z-50\"\r\n >\r\n <ExpandableChatHeader className=\"bg-muted/40 flex-col text-center justify-center border-b p-4 relative\">\r\n <h1 className=\"text-xl font-semibold flex items-center justify-center gap-2\"> \r\n {title} \r\n <Sparkles className=\"h-4 w-4 text-yellow-500 fill-yellow-500\" />\r\n </h1>\r\n <p className=\"text-sm text-muted-foreground flex items-center justify-center gap-1.5 pt-1\">\r\n <span className=\"flex h-2 w-2 rounded-full bg-green-500 animate-pulse\"></span>\r\n Online and ready to help\r\n </p>\r\n <Button \r\n variant=\"ghost\" \r\n size=\"icon\" \r\n className=\"absolute top-3 left-3 h-8 w-8 text-muted-foreground hover:text-foreground hover:bg-muted/50 sm:top-5 sm:right-5 sm:left-auto\"\r\n onClick={handleReset}\r\n title=\"Reset Chat\"\r\n >\r\n <RefreshCcw className=\"h-4 w-4\" />\r\n </Button>\r\n </ExpandableChatHeader>\r\n\r\n <ExpandableChatBody className=\"bg-background/50\">\r\n {messages.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center h-full p-6 text-center animate-in fade-in duration-500\">\r\n <div className=\"bg-background rounded-full p-4 mb-6 shadow-md ring-1 ring-border/50\">\r\n <div className=\"relative w-16 h-16 overflow-hidden rounded-full\">\r\n <img src={logoSrc} alt=\"AI Logo\" className=\"object-cover w-full h-full\" />\r\n </div>\r\n </div>\r\n <h2 className=\"text-2xl font-bold mb-2 tracking-tight\">{title}</h2>\r\n <p className=\"text-muted-foreground text-sm\">Welcome to {title} 💛</p>\r\n </div>\r\n ) : (\r\n <ChatMessageList>\r\n {messages.map((message) => (\r\n <ChatBubble\r\n key={message.id}\r\n variant={message.role === \"user\" ? \"sent\" : \"received\"}\r\n >\r\n <ChatBubbleAvatar\r\n className=\"h-8 w-8 shrink-0\"\r\n src={\r\n message.role === \"user\"\r\n ? undefined\r\n : logoSrc\r\n }\r\n fallback={message.role === \"user\" ? <User className=\"h-4 w-4\" /> : \"AI\"}\r\n />\r\n <ChatBubbleMessage\r\n variant={message.role === \"user\" ? \"sent\" : \"received\"}\r\n >\r\n {message.role === \"user\" ? (\r\n message.content\r\n ) : (\r\n <div className={cn(\r\n \"prose dark:prose-invert text-sm break-words leading-normal max-w-none\",\r\n \"prose-p:m-0 prose-ul:m-0 prose-ol:m-0 prose-li:m-0\"\r\n )}>\r\n <ReactMarkdown \r\n remarkPlugins={[remarkGfm]}\r\n components={{\r\n ul: ({node, ...props}: any) => <ul className=\"list-disc pl-4 my-1\" {...props} />,\r\n ol: ({node, ...props}: any) => <ol className=\"list-decimal pl-4 my-1\" {...props} />,\r\n li: ({node, ...props}: any) => <li className=\"my-0.5 pl-1\" {...props} />,\r\n p: ({node, ...props}: any) => <p className=\"mb-2 last:mb-0\" {...props} />,\r\n strong: ({node, ...props}: any) => <span className=\"font-bold text-foreground\" {...props} />,\r\n a: ({node, href, children, ...props}: any) => (\r\n <a \r\n href={href}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"font-semibold text-blue-600 hover:text-blue-500 dark:text-blue-400 dark:hover:text-blue-300 hover:underline transition-colors break-all\"\r\n {...props}\r\n >\r\n {children}\r\n </a>\r\n ),\r\n }}\r\n >\r\n {message.content}\r\n </ReactMarkdown>\r\n </div>\r\n )}\r\n </ChatBubbleMessage>\r\n </ChatBubble>\r\n ))}\r\n\r\n\r\n {isLoading && (\r\n <ChatBubble variant=\"received\">\r\n <ChatBubbleAvatar\r\n className=\"h-8 w-8 shrink-0\"\r\n src={logoSrc}\r\n fallback=\"AI\"\r\n />\r\n <ChatBubbleMessage className=\"bg-transparent p-0 flex items-center gap-2\">\r\n <Sparkles className=\"h-4 w-4 text-foreground/50\" />\r\n <ShiningText text=\"AI Assistant thinking...\" />\r\n </ChatBubbleMessage>\r\n </ChatBubble>\r\n )}\r\n </ChatMessageList>\r\n )}\r\n </ExpandableChatBody>\r\n\r\n <ExpandableChatFooter className=\"bg-muted/40 p-3\">\r\n <form\r\n onSubmit={handleSubmit}\r\n className=\"relative rounded-3xl border bg-background focus-within:ring-1 focus-within:ring-ring p-1 shadow-sm\"\r\n >\r\n <ChatInput\r\n value={input}\r\n onChange={(e) => setInput(e.target.value)}\r\n placeholder=\"Message...\"\r\n rows={1}\r\n className=\"min-h-0 h-auto max-h-32 resize-none rounded-2xl bg-background border-0 px-3 py-2.5 shadow-none focus-visible:ring-0 text-base sm:text-sm\"\r\n onKeyDown={(e) => {\r\n if(e.key === \"Enter\" && !e.shiftKey) {\r\n e.preventDefault();\r\n handleSubmit(e as unknown as FormEvent);\r\n }\r\n }}\r\n />\r\n <div className=\"flex items-center justify-between px-2 pb-1\">\r\n <div className=\"flex items-center gap-2\">\r\n {/* Tools or other actions can go here */}\r\n </div>\r\n <Button \r\n type=\"submit\" \r\n size=\"icon\" \r\n className=\"h-8 w-8 rounded-full transition-all duration-200\" \r\n disabled={!input.trim() || isLoading}\r\n >\r\n {isLoading ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Send className=\"h-4 w-4\" />}\r\n <span className=\"sr-only\">Send</span>\r\n </Button>\r\n </div>\r\n </form>\r\n <div className=\"mt-2 text-center flex flex-col items-center justify-center gap-0.5\">\r\n <span className=\"text-[10px] text-muted-foreground/60\">\r\n Powered by <a href=\"#\" className=\"hover:underline hover:text-primary transition-colors\">ChatUI</a>\r\n </span>\r\n </div>\r\n </ExpandableChatFooter>\r\n </ExpandableChat>\r\n </>\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { Slot } from '@radix-ui/react-slot'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\n\r\nimport { cn } from '../../lib/utils'\r\n\r\nconst buttonVariants = cva(\r\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all cursor-pointer disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\r\n {\r\n variants: {\r\n variant: {\r\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\r\n destructive:\r\n 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\r\n outline:\r\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\r\n secondary:\r\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\r\n ghost:\r\n 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\r\n link: 'text-primary underline-offset-4 hover:underline',\r\n },\r\n size: {\r\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\r\n sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\r\n lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\r\n icon: 'size-9',\r\n 'icon-sm': 'size-8',\r\n 'icon-lg': 'size-10',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n },\r\n)\r\n\r\nfunction Button({\r\n className,\r\n variant,\r\n size,\r\n asChild = false,\r\n ...props\r\n}: React.ComponentProps<'button'> &\r\n VariantProps<typeof buttonVariants> & {\r\n asChild?: boolean\r\n }) {\r\n const Comp = asChild ? Slot : 'button'\r\n\r\n return (\r\n <Comp\r\n data-slot=\"button\"\r\n className={cn(buttonVariants({ variant, size, className }))}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Button, buttonVariants }\r\n","import { clsx, type ClassValue } from 'clsx'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs))\r\n}\r\n","'use client'\r\n\r\nimport * as React from 'react'\r\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\r\n\r\nimport { cn } from '../../lib/utils'\r\n\r\nfunction Avatar({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof AvatarPrimitive.Root>) {\r\n return (\r\n <AvatarPrimitive.Root\r\n data-slot=\"avatar\"\r\n className={cn(\r\n 'relative flex size-8 shrink-0 overflow-hidden rounded-full',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction AvatarImage({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\r\n return (\r\n <AvatarPrimitive.Image\r\n data-slot=\"avatar-image\"\r\n className={cn('aspect-square size-full', className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction AvatarFallback({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\r\n return (\r\n <AvatarPrimitive.Fallback\r\n data-slot=\"avatar-fallback\"\r\n className={cn(\r\n 'bg-muted flex size-full items-center justify-center rounded-full',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Avatar, AvatarImage, AvatarFallback }\r\n","\r\nfunction MessageLoading() {\r\n return (\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n className=\"text-foreground\"\r\n >\r\n <circle cx=\"4\" cy=\"12\" r=\"2\" fill=\"currentColor\">\r\n <animate\r\n id=\"spinner_qFRN\"\r\n begin=\"0;spinner_OcgL.end+0.25s\"\r\n attributeName=\"cy\"\r\n calcMode=\"spline\"\r\n dur=\"0.6s\"\r\n values=\"12;6;12\"\r\n keySplines=\".33,.66,.66,1;.33,0,.66,.33\"\r\n />\r\n </circle>\r\n <circle cx=\"12\" cy=\"12\" r=\"2\" fill=\"currentColor\">\r\n <animate\r\n begin=\"spinner_qFRN.begin+0.1s\"\r\n attributeName=\"cy\"\r\n calcMode=\"spline\"\r\n dur=\"0.6s\"\r\n values=\"12;6;12\"\r\n keySplines=\".33,.66,.66,1;.33,0,.66,.33\"\r\n />\r\n </circle>\r\n <circle cx=\"20\" cy=\"12\" r=\"2\" fill=\"currentColor\">\r\n <animate\r\n id=\"spinner_OcgL\"\r\n begin=\"spinner_qFRN.begin+0.2s\"\r\n attributeName=\"cy\"\r\n calcMode=\"spline\"\r\n dur=\"0.6s\"\r\n values=\"12;6;12\"\r\n keySplines=\".33,.66,.66,1;.33,0,.66,.33\"\r\n />\r\n </circle>\r\n </svg>\r\n );\r\n}\r\n\r\nexport { MessageLoading };\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { cn } from \"../../lib/utils\"\r\nimport { Avatar, AvatarFallback, AvatarImage } from \"./avatar\"\r\nimport { Button } from \"./button\"\r\nimport { MessageLoading } from \"./message-loading\";\r\n\r\ninterface ChatBubbleProps {\r\n variant?: \"sent\" | \"received\"\r\n layout?: \"default\" | \"ai\"\r\n className?: string\r\n children: React.ReactNode\r\n}\r\n\r\nexport function ChatBubble({\r\n variant = \"received\",\r\n layout = \"default\",\r\n className,\r\n children,\r\n}: ChatBubbleProps) {\r\n return (\r\n <div\r\n className={cn(\r\n \"flex items-start gap-2 mb-4\",\r\n variant === \"sent\" && \"flex-row-reverse\",\r\n className,\r\n )}\r\n >\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\ninterface ChatBubbleMessageProps {\r\n variant?: \"sent\" | \"received\"\r\n isLoading?: boolean\r\n className?: string\r\n children?: React.ReactNode\r\n}\r\n\r\nexport function ChatBubbleMessage({\r\n variant = \"received\",\r\n isLoading,\r\n className,\r\n children,\r\n}: ChatBubbleMessageProps) {\r\n return (\r\n <div\r\n className={cn(\r\n \"rounded-[1.25rem] px-4 py-2 text-sm max-w-[85%]\",\r\n variant === \"sent\" ? \"bg-primary text-primary-foreground\" : \"bg-muted\",\r\n className\r\n )}\r\n >\r\n {isLoading ? (\r\n <div className=\"flex items-center space-x-2\">\r\n <MessageLoading />\r\n </div>\r\n ) : (\r\n children\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\ninterface ChatBubbleAvatarProps {\r\n src?: string\r\n fallback?: React.ReactNode\r\n className?: string\r\n}\r\n\r\nexport function ChatBubbleAvatar({\r\n src,\r\n fallback = \"AI\",\r\n className,\r\n}: ChatBubbleAvatarProps) {\r\n return (\r\n <Avatar className={cn(\"h-8 w-8\", className)}>\r\n {src && <AvatarImage src={src} />}\r\n <AvatarFallback>{fallback}</AvatarFallback>\r\n </Avatar>\r\n )\r\n}\r\n\r\ninterface ChatBubbleActionProps {\r\n icon?: React.ReactNode\r\n onClick?: () => void\r\n className?: string\r\n}\r\n\r\nexport function ChatBubbleAction({\r\n icon,\r\n onClick,\r\n className,\r\n}: ChatBubbleActionProps) {\r\n return (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className={cn(\"h-6 w-6\", className)}\r\n onClick={onClick}\r\n >\r\n {icon}\r\n </Button>\r\n )\r\n}\r\n\r\nexport function ChatBubbleActionWrapper({\r\n className,\r\n children,\r\n}: {\r\n className?: string\r\n children: React.ReactNode\r\n}) {\r\n return (\r\n <div className={cn(\"flex items-center gap-1 mt-2\", className)}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n","import * as React from \"react\";\r\nimport { Textarea } from \"./textarea\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ninterface ChatInputProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement>{}\r\n\r\nconst ChatInput = React.forwardRef<HTMLTextAreaElement, ChatInputProps>(\r\n ({ className, ...props }, ref) => (\r\n <Textarea\r\n autoComplete=\"off\"\r\n ref={ref}\r\n name=\"message\"\r\n className={cn(\r\n \"max-h-12 px-4 py-3 bg-background text-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 w-full rounded-md flex items-center h-16 resize-none\",\r\n className,\r\n )}\r\n {...props}\r\n />\r\n ),\r\n);\r\nChatInput.displayName = \"ChatInput\";\r\n\r\nexport { ChatInput };\r\n","import * as React from 'react'\r\n\r\nimport { cn } from '../../lib/utils'\r\n\r\nfunction Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {\r\n return (\r\n <textarea\r\n data-slot=\"textarea\"\r\n className={cn(\r\n 'border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Textarea }\r\n","\"use client\";\r\n\r\nimport React, { useRef, useState } from \"react\";\r\nimport { X, MessageCircle } from \"lucide-react\";\r\nimport { cn } from \"../../lib/utils\";\r\nimport { Button } from \"./button\";\r\n\r\nexport type ChatPosition = \"bottom-right\" | \"bottom-left\";\r\nexport type ChatSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\r\n\r\nconst chatConfig = {\r\n dimensions: {\r\n sm: \"sm:max-w-sm sm:max-h-[500px]\",\r\n md: \"sm:max-w-md sm:max-h-[600px]\",\r\n lg: \"sm:max-w-lg sm:max-h-[700px]\",\r\n xl: \"sm:max-w-xl sm:max-h-[800px]\",\r\n full: \"sm:w-full sm:h-full\",\r\n },\r\n positions: {\r\n \"bottom-right\": \"bottom-5 right-5\",\r\n \"bottom-left\": \"bottom-5 left-5\",\r\n },\r\n chatPositions: {\r\n \"bottom-right\": \"sm:bottom-[calc(100%+10px)] sm:right-0\",\r\n \"bottom-left\": \"sm:bottom-[calc(100%+10px)] sm:left-0\",\r\n },\r\n states: {\r\n open: \"pointer-events-auto opacity-100 visible scale-100 translate-y-0\",\r\n closed:\r\n \"pointer-events-none opacity-0 invisible scale-100 sm:translate-y-5\",\r\n },\r\n};\r\n\r\ninterface ExpandableChatProps extends React.HTMLAttributes<HTMLDivElement> {\r\n position?: ChatPosition;\r\n size?: ChatSize;\r\n icon?: React.ReactNode;\r\n isOpen?: boolean;\r\n onOpenChange?: (isOpen: boolean) => void;\r\n}\r\n\r\nconst ExpandableChat: React.FC<ExpandableChatProps> = ({\r\n className,\r\n position = \"bottom-right\",\r\n size = \"md\",\r\n icon,\r\n children,\r\n isOpen: controlledIsOpen,\r\n onOpenChange,\r\n ...props\r\n}) => {\r\n const [internalIsOpen, setInternalIsOpen] = useState(false);\r\n const isControlled = controlledIsOpen !== undefined;\r\n const isOpen = isControlled ? controlledIsOpen : internalIsOpen;\r\n const chatRef = useRef<HTMLDivElement>(null);\r\n\r\n const toggleChat = () => {\r\n const newState = !isOpen;\r\n if (isControlled && onOpenChange) {\r\n onOpenChange(newState);\r\n } else {\r\n setInternalIsOpen(newState);\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n className={cn(`fixed ${chatConfig.positions[position]} z-50`, className)}\r\n {...props}\r\n >\r\n <div\r\n ref={chatRef}\r\n className={cn(\r\n \"flex flex-col bg-background dark:bg-zinc-900 sm:rounded-lg shadow-md overflow-hidden transition-all duration-250 ease-out sm:absolute sm:w-[90vw] sm:h-[80vh] fixed inset-0 w-full h-full sm:inset-auto\",\r\n chatConfig.chatPositions[position],\r\n chatConfig.dimensions[size],\r\n isOpen ? chatConfig.states.open : chatConfig.states.closed,\r\n className,\r\n )}\r\n >\r\n {children}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"absolute top-2 right-2 sm:hidden\"\r\n onClick={toggleChat}\r\n >\r\n <X className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n <ExpandableChatToggle\r\n icon={icon}\r\n isOpen={isOpen}\r\n toggleChat={toggleChat}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nExpandableChat.displayName = \"ExpandableChat\";\r\n\r\nconst ExpandableChatHeader: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\r\n className,\r\n ...props\r\n}) => (\r\n <div\r\n className={cn(\"flex items-center justify-between p-4 border-b\", className)}\r\n {...props}\r\n />\r\n);\r\n\r\nExpandableChatHeader.displayName = \"ExpandableChatHeader\";\r\n\r\nconst ExpandableChatBody: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\r\n className,\r\n ...props\r\n}) => <div className={cn(\"flex-grow overflow-y-auto\", className)} {...props} />;\r\n\r\nExpandableChatBody.displayName = \"ExpandableChatBody\";\r\n\r\nconst ExpandableChatFooter: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\r\n className,\r\n ...props\r\n}) => <div className={cn(\"border-t p-4\", className)} {...props} />;\r\n\r\nExpandableChatFooter.displayName = \"ExpandableChatFooter\";\r\n\r\ninterface ExpandableChatToggleProps\r\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n icon?: React.ReactNode;\r\n isOpen: boolean;\r\n toggleChat: () => void;\r\n}\r\n\r\nconst ExpandableChatToggle: React.FC<ExpandableChatToggleProps> = ({\r\n className,\r\n icon,\r\n isOpen,\r\n toggleChat,\r\n ...props\r\n}) => (\r\n <Button\r\n variant=\"default\"\r\n onClick={toggleChat}\r\n className={cn(\r\n \"w-16 h-16 rounded-full shadow-md flex items-center justify-center hover:shadow-lg hover:shadow-black/30 transition-all duration-300 p-0 ring-0\",\r\n !isOpen ? \"!bg-transparent !border-0\" : \"\",\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {isOpen ? (\r\n <X className=\"h-6 w-6\" />\r\n ) : (\r\n icon || <MessageCircle className=\"h-6 w-6\" />\r\n )}\r\n </Button>\r\n);\r\n\r\nExpandableChatToggle.displayName = \"ExpandableChatToggle\";\r\n\r\nexport {\r\n ExpandableChat,\r\n ExpandableChatHeader,\r\n ExpandableChatBody,\r\n ExpandableChatFooter,\r\n};\r\n","import * as React from \"react\";\r\nimport { ArrowDown } from \"lucide-react\";\r\nimport { Button } from \"./button\";\r\nimport { useAutoScroll } from \"../hooks/use-auto-scroll\";\r\n\r\ninterface ChatMessageListProps extends React.HTMLAttributes<HTMLDivElement> {\r\n smooth?: boolean;\r\n}\r\n\r\nconst ChatMessageList = React.forwardRef<HTMLDivElement, ChatMessageListProps>(\r\n ({ className, children, smooth = false, ...props }, _ref) => {\r\n const {\r\n scrollRef,\r\n isAtBottom,\r\n autoScrollEnabled,\r\n scrollToBottom,\r\n disableAutoScroll,\r\n } = useAutoScroll({\r\n smooth,\r\n content: children,\r\n });\r\n\r\n return (\r\n <div className=\"relative w-full h-full\">\r\n <div\r\n className={`flex flex-col w-full h-full p-4 overflow-y-auto ${className}`}\r\n ref={scrollRef}\r\n onWheel={disableAutoScroll}\r\n onTouchMove={disableAutoScroll}\r\n {...props}\r\n >\r\n <div className=\"flex flex-col gap-6\">{children}</div>\r\n </div>\r\n\r\n {!isAtBottom && (\r\n <Button\r\n onClick={() => {\r\n scrollToBottom();\r\n }}\r\n size=\"icon\"\r\n variant=\"outline\"\r\n className=\"absolute bottom-2 left-1/2 transform -translate-x-1/2 inline-flex rounded-full shadow-md\"\r\n aria-label=\"Scroll to bottom\"\r\n >\r\n <ArrowDown className=\"h-4 w-4\" />\r\n </Button>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nChatMessageList.displayName = \"ChatMessageList\";\r\n\r\nexport { ChatMessageList };\r\n","// @hidden\r\nimport { useCallback, useEffect, useRef, useState } from \"react\";\r\n\r\ninterface ScrollState {\r\n isAtBottom: boolean;\r\n autoScrollEnabled: boolean;\r\n}\r\n\r\ninterface UseAutoScrollOptions {\r\n offset?: number;\r\n smooth?: boolean;\r\n content?: React.ReactNode;\r\n}\r\n\r\nexport function useAutoScroll(options: UseAutoScrollOptions = {}) {\r\n const { offset = 20, smooth = false, content } = options;\r\n const scrollRef = useRef<HTMLDivElement>(null);\r\n const lastContentHeight = useRef(0);\r\n const userHasScrolled = useRef(false);\r\n\r\n const [scrollState, setScrollState] = useState<ScrollState>({\r\n isAtBottom: true,\r\n autoScrollEnabled: true,\r\n });\r\n\r\n const checkIsAtBottom = useCallback(\r\n (element: HTMLElement) => {\r\n const { scrollTop, scrollHeight, clientHeight } = element;\r\n const distanceToBottom = Math.abs(\r\n scrollHeight - scrollTop - clientHeight\r\n );\r\n return distanceToBottom <= offset;\r\n },\r\n [offset]\r\n );\r\n\r\n const scrollToBottom = useCallback(\r\n (instant?: boolean) => {\r\n if (!scrollRef.current) return;\r\n\r\n const targetScrollTop =\r\n scrollRef.current.scrollHeight - scrollRef.current.clientHeight;\r\n\r\n if (instant) {\r\n scrollRef.current.scrollTop = targetScrollTop;\r\n } else {\r\n scrollRef.current.scrollTo({\r\n top: targetScrollTop,\r\n behavior: smooth ? \"smooth\" : \"auto\",\r\n });\r\n }\r\n\r\n setScrollState({\r\n isAtBottom: true,\r\n autoScrollEnabled: true,\r\n });\r\n userHasScrolled.current = false;\r\n },\r\n [smooth]\r\n );\r\n\r\n const handleScroll = useCallback(() => {\r\n if (!scrollRef.current) return;\r\n\r\n const atBottom = checkIsAtBottom(scrollRef.current);\r\n\r\n setScrollState((prev) => ({\r\n isAtBottom: atBottom,\r\n // Re-enable auto-scroll if at the bottom\r\n autoScrollEnabled: atBottom ? true : prev.autoScrollEnabled,\r\n }));\r\n }, [checkIsAtBottom]);\r\n\r\n useEffect(() => {\r\n const element = scrollRef.current;\r\n if (!element) return;\r\n\r\n element.addEventListener(\"scroll\", handleScroll, { passive: true });\r\n return () => element.removeEventListener(\"scroll\", handleScroll);\r\n }, [handleScroll]);\r\n\r\n useEffect(() => {\r\n const scrollElement = scrollRef.current;\r\n if (!scrollElement) return;\r\n\r\n const currentHeight = scrollElement.scrollHeight;\r\n const hasNewContent = currentHeight !== lastContentHeight.current;\r\n\r\n if (hasNewContent) {\r\n if (scrollState.autoScrollEnabled) {\r\n requestAnimationFrame(() => {\r\n scrollToBottom(lastContentHeight.current === 0);\r\n });\r\n }\r\n lastContentHeight.current = currentHeight;\r\n }\r\n }, [content, scrollState.autoScrollEnabled, scrollToBottom]);\r\n\r\n useEffect(() => {\r\n const element = scrollRef.current;\r\n if (!element) return;\r\n\r\n const resizeObserver = new ResizeObserver(() => {\r\n if (scrollState.autoScrollEnabled) {\r\n scrollToBottom(true);\r\n }\r\n });\r\n\r\n resizeObserver.observe(element);\r\n return () => resizeObserver.disconnect();\r\n }, [scrollState.autoScrollEnabled, scrollToBottom]);\r\n\r\n const disableAutoScroll = useCallback(() => {\r\n const atBottom = scrollRef.current\r\n ? checkIsAtBottom(scrollRef.current)\r\n : false;\r\n\r\n // Only disable if not at bottom\r\n if (!atBottom) {\r\n userHasScrolled.current = true;\r\n setScrollState((prev) => ({\r\n ...prev,\r\n autoScrollEnabled: false,\r\n }));\r\n }\r\n }, [checkIsAtBottom]);\r\n\r\n return {\r\n scrollRef,\r\n isAtBottom: scrollState.isAtBottom,\r\n autoScrollEnabled: scrollState.autoScrollEnabled,\r\n scrollToBottom: () => scrollToBottom(false),\r\n disableAutoScroll,\r\n };\r\n}\r\n","\"use client\" \r\n\r\nimport * as React from \"react\"\r\nimport { motion } from \"framer-motion\";\r\n \r\ninterface ShiningTextProps {\r\n text: string;\r\n}\r\n\r\nexport function ShiningText({text}: ShiningTextProps) {\r\n return (\r\n <motion.div\r\n className=\"bg-[linear-gradient(110deg,#9ca3af,35%,#fff,50%,#9ca3af,75%,#9ca3af)] bg-[length:200%_100%] bg-clip-text text-sm text-transparent m-0 inline-block\"\r\n initial={{ backgroundPosition: \"200% 0\" }}\r\n animate={{ backgroundPosition: \"-200% 0\" }}\r\n transition={{\r\n repeat: Infinity,\r\n duration: 2,\r\n ease: \"linear\",\r\n }}\r\n >\r\n {text}\r\n </motion.div>\r\n );\r\n}\r\n","\"use client\";\r\nimport React from \"react\";\r\nimport {\r\n motion,\r\n useAnimationFrame,\r\n useMotionTemplate,\r\n useMotionValue,\r\n useTransform,\r\n} from \"framer-motion\";\r\nimport { useRef } from \"react\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\nexport function Button({\r\n borderRadius = \"1.75rem\",\r\n children,\r\n as: Component = \"button\",\r\n containerClassName,\r\n borderClassName,\r\n duration,\r\n className,\r\n ...otherProps\r\n}: {\r\n borderRadius?: string;\r\n children: React.ReactNode;\r\n as?: any;\r\n containerClassName?: string;\r\n borderClassName?: string;\r\n duration?: number;\r\n className?: string;\r\n [key: string]: any;\r\n}) {\r\n return (\r\n <Component\r\n className={cn(\r\n \"bg-transparent relative text-xl h-16 w-40 p-[1px] overflow-hidden \",\r\n containerClassName\r\n )}\r\n style={{\r\n borderRadius: borderRadius,\r\n }}\r\n {...otherProps}\r\n >\r\n <div\r\n className=\"absolute inset-0\"\r\n style={{ borderRadius: `calc(${borderRadius} * 0.96)` }}\r\n >\r\n <MovingBorder duration={duration} rx=\"30%\" ry=\"30%\">\r\n <div\r\n className={cn(\r\n \"h-20 w-20 opacity-[0.8] bg-[radial-gradient(#0ea5e9_40%,transparent_60%)]\",\r\n borderClassName\r\n )}\r\n />\r\n </MovingBorder>\r\n </div>\r\n\r\n <div\r\n className={cn(\r\n \"relative bg-background border border-border backdrop-blur-xl text-foreground flex items-center justify-center w-full h-full text-sm antialiased\",\r\n className\r\n )}\r\n style={{\r\n borderRadius: `calc(${borderRadius} * 0.96)`,\r\n }}\r\n >\r\n {children}\r\n </div>\r\n </Component>\r\n );\r\n}\r\n\r\nexport const MovingBorder = ({\r\n children,\r\n duration = 2000,\r\n rx,\r\n ry,\r\n ...otherProps\r\n}: {\r\n children: React.ReactNode;\r\n duration?: number;\r\n rx?: string;\r\n ry?: string;\r\n [key: string]: any;\r\n}) => {\r\n const pathRef = useRef<SVGRectElement>(null);\r\n const progress = useMotionValue<number>(0);\r\n\r\n useAnimationFrame((time) => {\r\n const length = pathRef.current?.getTotalLength();\r\n if (length) {\r\n const pxPerMillisecond = length / duration;\r\n progress.set((time * pxPerMillisecond) % length);\r\n }\r\n });\r\n\r\n const x = useTransform(\r\n progress,\r\n (val) => pathRef.current?.getPointAtLength(val).x\r\n );\r\n const y = useTransform(\r\n progress,\r\n (val) => pathRef.current?.getPointAtLength(val).y\r\n );\r\n\r\n const transform = useMotionTemplate`translateX(${x}px) translateY(${y}px) translateX(-50%) translateY(-50%)`;\r\n\r\n return (\r\n <>\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n preserveAspectRatio=\"none\"\r\n className=\"absolute h-full w-full\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n {...otherProps}\r\n >\r\n <rect\r\n fill=\"none\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n rx={rx}\r\n ry={ry}\r\n ref={pathRef}\r\n />\r\n </svg>\r\n <motion.div\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n display: \"inline-block\",\r\n transform,\r\n }}\r\n >\r\n {children}\r\n </motion.div>\r\n </>\r\n );\r\n};\r\n"],"mappings":"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","names":["import_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","import_lucide_react","import_react","import_jsx_runtime","import_jsx_runtime","import_framer_motion","import_react","import_jsx_runtime","Button","import_jsx_runtime","e","Button","ReactMarkdown","remarkGfm"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/ChatUI.tsx","../src/components/ui/button.tsx","../src/lib/utils.ts","../src/components/ui/avatar.tsx","../src/components/ui/message-loading.tsx","../src/components/ui/chat-bubble.tsx","../src/components/ui/chat-input.tsx","../src/components/ui/textarea.tsx","../src/components/ui/expandable-chat.tsx","../src/components/ui/chat-message-list.tsx","../src/components/hooks/use-auto-scroll.ts","../src/components/ui/shining-text.tsx","../src/components/ui/moving-border.tsx"],"sourcesContent":["export { ChatUI, type ChatUIProps } from \"./ChatUI\";\r\n","\"use client\"\r\n\r\nimport { useState, FormEvent, useEffect } from \"react\"\r\nimport { Send, Sparkles, Loader2, User, RefreshCcw, X } from \"lucide-react\"\r\nimport { Button } from \"./components/ui/button\"\r\nimport {\r\n ChatBubble,\r\n ChatBubbleAvatar,\r\n ChatBubbleMessage,\r\n} from \"./components/ui/chat-bubble\"\r\nimport { ChatInput } from \"./components/ui/chat-input\"\r\nimport {\r\n ExpandableChat,\r\n ExpandableChatHeader,\r\n ExpandableChatBody,\r\n ExpandableChatFooter,\r\n} from \"./components/ui/expandable-chat\"\r\nimport { ChatMessageList } from \"./components/ui/chat-message-list\"\r\n\r\nimport { ShiningText } from \"./components/ui/shining-text\"\r\nimport { Button as MovingBorderButton } from \"./components/ui/moving-border\"\r\nimport ReactMarkdown from \"react-markdown\"\r\nimport remarkGfm from \"remark-gfm\"\r\nimport { cn } from \"./lib/utils\"\r\n\r\ninterface Message {\r\n id: string\r\n role: \"user\" | \"assistant\"\r\n content: string\r\n}\r\n\r\nexport interface ChatUIProps {\r\n endpoint: string;\r\n logoSrc?: string;\r\n soundSrc?: string;\r\n title?: string;\r\n welcomeMessage?: string;\r\n description?: string;\r\n}\r\n\r\nexport function ChatUI({ \r\n endpoint, \r\n logoSrc = \"/bot_logo.jpg\", \r\n soundSrc = \"/sound.mp3\",\r\n title = \"AI Assistant\",\r\n welcomeMessage = \"Welcome to Services! 👋\",\r\n description = \"I'm here to help you navigate our services. Feel free to ask me anything!\"\r\n}: ChatUIProps) {\r\n const [messages, setMessages] = useState<Message[]>([])\r\n const [input, setInput] = useState(\"\")\r\n const [isLoading, setIsLoading] = useState(false)\r\n const [isInitialized, setIsInitialized] = useState(false)\r\n\r\n useEffect(() => {\r\n const savedMessages = localStorage.getItem(\"chat-history\")\r\n if (savedMessages) {\r\n try {\r\n setMessages(JSON.parse(savedMessages))\r\n } catch (e) {\r\n console.error(\"Failed to parse chat history\", e)\r\n }\r\n }\r\n setIsInitialized(true)\r\n }, [])\r\n\r\n const [isChatOpen, setIsChatOpen] = useState(false)\r\n const [showNotification, setShowNotification] = useState(false)\r\n const [isDismissed, setIsDismissed] = useState(false)\r\n\r\n useEffect(() => {\r\n const timer = setTimeout(() => {\r\n if (!isDismissed && !isChatOpen) {\r\n setShowNotification(true)\r\n const audio = new Audio(soundSrc)\r\n audio.play().catch((error) => {\r\n if (error.name !== \"NotAllowedError\") {\r\n console.error(\"Error playing notification sound:\", error)\r\n }\r\n })\r\n }\r\n }, 2000)\r\n return () => clearTimeout(timer)\r\n }, [isChatOpen, isDismissed, soundSrc])\r\n\r\n useEffect(() => {\r\n if (isChatOpen) {\r\n setShowNotification(false)\r\n setIsDismissed(true)\r\n }\r\n }, [isChatOpen])\r\n\r\n const handleDismissNotification = () => {\r\n setShowNotification(false)\r\n setIsDismissed(true)\r\n }\r\n\r\n useEffect(() => {\r\n if (isInitialized) {\r\n localStorage.setItem(\"chat-history\", JSON.stringify(messages))\r\n }\r\n }, [messages, isInitialized])\r\n\r\n const handleReset = () => {\r\n setMessages([])\r\n localStorage.removeItem(\"chat-history\")\r\n }\r\n\r\n const handleSubmit = async (e: FormEvent) => {\r\n e.preventDefault()\r\n if (!input.trim() || isLoading) return\r\n\r\n const userQuestion = input.trim()\r\n\r\n const userMessage: Message = {\r\n id: Date.now().toString(),\r\n role: \"user\",\r\n content: userQuestion,\r\n }\r\n\r\n // Prepare history\r\n const history = messages.map((msg) => ({\r\n role: msg.role,\r\n content: msg.content,\r\n }))\r\n\r\n setMessages((prev) => [...prev, userMessage])\r\n setInput(\"\")\r\n setIsLoading(true)\r\n\r\n try {\r\n const response = await fetch(endpoint, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify({\r\n query: userQuestion,\r\n history: history,\r\n stream: true,\r\n }),\r\n })\r\n\r\n if (!response.body) {\r\n throw new Error(\"ReadableStream not supported.\")\r\n }\r\n\r\n const reader = response.body.getReader()\r\n const decoder = new TextDecoder()\r\n let aiResponse = \"\"\r\n let isFirstChunk = true\r\n\r\n while (true) {\r\n const { value, done } = await reader.read()\r\n if (done) break\r\n\r\n const chunk = decoder.decode(value, { stream: true })\r\n aiResponse += chunk\r\n\r\n if (isFirstChunk) {\r\n isFirstChunk = false;\r\n setIsLoading(false); // Hide \"Thinking...\" bubble\r\n \r\n // Add initial bot message\r\n const botMessageId = (Date.now() + 1).toString()\r\n const botMessage: Message = {\r\n id: botMessageId,\r\n role: \"assistant\",\r\n content: aiResponse,\r\n }\r\n setMessages((prev) => [...prev, botMessage])\r\n } else {\r\n // Update existing bot message\r\n setMessages((prev) => {\r\n const updated = [...prev]\r\n const lastMsgIndex = updated.length - 1\r\n if (lastMsgIndex >= 0 && updated[lastMsgIndex].role === \"assistant\") {\r\n updated[lastMsgIndex] = {\r\n ...updated[lastMsgIndex],\r\n content: aiResponse,\r\n }\r\n }\r\n return updated\r\n })\r\n }\r\n }\r\n\r\n // Play notification sound\r\n const audio = new Audio(soundSrc)\r\n audio.play().catch((e) => console.error(\"Error playing notification sound:\", e))\r\n \r\n } catch (error) {\r\n console.error(\"Chat error:\", error)\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n id: (Date.now() + 2).toString(),\r\n role: \"assistant\",\r\n content: \"I apologize, but I encountered an error. Please try again later.\",\r\n },\r\n ])\r\n } finally {\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n {showNotification && !isChatOpen && (\r\n <div className=\"fixed bottom-24 right-5 z-[9998] animate-in fade-in slide-in-from-bottom-5 duration-300\">\r\n {/* Wrapper to position tail relative to the button */}\r\n <div className=\"relative\">\r\n <MovingBorderButton\r\n as=\"div\"\r\n borderRadius=\"0.75rem\"\r\n duration={3000}\r\n containerClassName=\"w-72 sm:w-80 h-auto overflow-hidden rounded-xl bg-transparent\"\r\n borderClassName=\"bg-[radial-gradient(#0ea5e9_40%,transparent_60%)]\"\r\n className=\"bg-background dark:bg-zinc-900 border dark:border-zinc-800 p-5 items-start justify-start flex-col w-full h-full text-foreground shadow-lg\"\r\n >\r\n <Button \r\n variant=\"ghost\" \r\n size=\"icon\" \r\n className=\"absolute top-3 right-3 h-6 w-6 text-muted-foreground hover:text-foreground z-10\"\r\n onClick={handleDismissNotification}\r\n >\r\n <X className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">Close</span>\r\n </Button>\r\n\r\n <div className=\"flex items-start gap-3 mb-4 w-full\">\r\n <div className=\"relative h-10 w-10 shrink-0 overflow-hidden rounded-full ring-2 ring-background dark:ring-zinc-800\">\r\n <img src={logoSrc} alt=\"AI\" className=\"object-cover h-full w-full\" />\r\n </div>\r\n <div className=\"flex flex-col pt-0.5\">\r\n <h3 className=\"font-bold text-sm leading-tight text-foreground\">{title}</h3>\r\n <div className=\"flex items-center gap-1.5 mt-0.5\">\r\n <span className=\"relative flex h-2 w-2\">\r\n <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75\"></span>\r\n <span className=\"relative inline-flex rounded-full h-2 w-2 bg-green-500\"></span>\r\n </span>\r\n <span className=\"text-xs text-muted-foreground font-medium\">Online</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"w-full text-left\">\r\n <p className=\"text-sm font-medium text-foreground leading-snug\">\r\n {welcomeMessage}\r\n </p>\r\n <p className=\"text-sm text-muted-foreground leading-relaxed mt-2\">\r\n {description}\r\n </p>\r\n <Button \r\n className=\"w-full mt-4 h-10 rounded-lg bg-[#535bf2] hover:bg-[#464ec9] text-white shadow-sm transition-all duration-200 font-medium\"\r\n onClick={() => setIsChatOpen(true)}\r\n >\r\n Start chatting\r\n </Button>\r\n </div>\r\n </MovingBorderButton>\r\n \r\n {/* Triangle Tail */}\r\n <div className=\"absolute -bottom-2 right-6 w-4 h-4 bg-background dark:bg-zinc-900 border-b border-r dark:border-zinc-800 transform rotate-45 z-0\"></div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <ExpandableChat\r\n size=\"lg\"\r\n position=\"bottom-right\"\r\n isOpen={isChatOpen}\r\n onOpenChange={setIsChatOpen}\r\n icon={<div className=\"relative h-full w-full overflow-hidden rounded-full\"><img src={logoSrc} alt=\"AI\" className=\"object-cover h-full w-full\" /></div>}\r\n >\r\n <ExpandableChatHeader className=\"bg-muted/40 flex-col text-center justify-center border-b p-4 relative\">\r\n <h1 className=\"text-xl font-semibold flex items-center justify-center gap-2\"> \r\n {title} \r\n <Sparkles className=\"h-4 w-4 text-yellow-500 fill-yellow-500\" />\r\n </h1>\r\n <p className=\"text-sm text-muted-foreground flex items-center justify-center gap-1.5 pt-1\">\r\n <span className=\"flex h-2 w-2 rounded-full bg-green-500 animate-pulse\"></span>\r\n Online and ready to help\r\n </p>\r\n <Button \r\n variant=\"ghost\" \r\n size=\"icon\" \r\n className=\"absolute top-3 left-3 h-8 w-8 text-muted-foreground hover:text-foreground hover:bg-muted/50 sm:top-5 sm:right-5 sm:left-auto\"\r\n onClick={handleReset}\r\n title=\"Reset Chat\"\r\n >\r\n <RefreshCcw className=\"h-4 w-4\" />\r\n </Button>\r\n </ExpandableChatHeader>\r\n\r\n <ExpandableChatBody className=\"bg-background/50\">\r\n {messages.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center h-full p-6 text-center animate-in fade-in duration-500\">\r\n <div className=\"bg-background rounded-full p-4 mb-6 shadow-md ring-1 ring-border/50\">\r\n <div className=\"relative w-16 h-16 overflow-hidden rounded-full\">\r\n <img src={logoSrc} alt=\"AI Logo\" className=\"object-cover w-full h-full\" />\r\n </div>\r\n </div>\r\n <h2 className=\"text-2xl font-bold mb-2 tracking-tight\">{title}</h2>\r\n <p className=\"text-muted-foreground text-sm\">Welcome to {title} 💛</p>\r\n </div>\r\n ) : (\r\n <ChatMessageList>\r\n {messages.map((message) => (\r\n <ChatBubble\r\n key={message.id}\r\n variant={message.role === \"user\" ? \"sent\" : \"received\"}\r\n >\r\n <ChatBubbleAvatar\r\n className=\"h-8 w-8 shrink-0\"\r\n src={\r\n message.role === \"user\"\r\n ? undefined\r\n : logoSrc\r\n }\r\n fallback={message.role === \"user\" ? <User className=\"h-4 w-4\" /> : \"AI\"}\r\n />\r\n <ChatBubbleMessage\r\n variant={message.role === \"user\" ? \"sent\" : \"received\"}\r\n >\r\n {message.role === \"user\" ? (\r\n message.content\r\n ) : (\r\n <div className={cn(\r\n \"prose dark:prose-invert text-sm break-words leading-normal max-w-none\",\r\n \"prose-p:m-0 prose-ul:m-0 prose-ol:m-0 prose-li:m-0\"\r\n )}>\r\n <ReactMarkdown \r\n remarkPlugins={[remarkGfm]}\r\n components={{\r\n ul: ({node, ...props}: any) => <ul className=\"list-disc pl-4 my-1\" {...props} />,\r\n ol: ({node, ...props}: any) => <ol className=\"list-decimal pl-4 my-1\" {...props} />,\r\n li: ({node, ...props}: any) => <li className=\"my-0.5 pl-1\" {...props} />,\r\n p: ({node, ...props}: any) => <p className=\"mb-2 last:mb-0\" {...props} />,\r\n strong: ({node, ...props}: any) => <span className=\"font-bold text-foreground\" {...props} />,\r\n a: ({node, href, children, ...props}: any) => (\r\n <a \r\n href={href}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"font-semibold text-blue-600 hover:text-blue-500 dark:text-blue-400 dark:hover:text-blue-300 hover:underline transition-colors break-all\"\r\n {...props}\r\n >\r\n {children}\r\n </a>\r\n ),\r\n }}\r\n >\r\n {message.content}\r\n </ReactMarkdown>\r\n </div>\r\n )}\r\n </ChatBubbleMessage>\r\n </ChatBubble>\r\n ))}\r\n\r\n\r\n {isLoading && (\r\n <ChatBubble variant=\"received\">\r\n <ChatBubbleAvatar\r\n className=\"h-8 w-8 shrink-0\"\r\n src={logoSrc}\r\n fallback=\"AI\"\r\n />\r\n <ChatBubbleMessage className=\"bg-transparent p-0 flex items-center gap-2\">\r\n <Sparkles className=\"h-4 w-4 text-foreground/50\" />\r\n <ShiningText text=\"AI Assistant thinking...\" />\r\n </ChatBubbleMessage>\r\n </ChatBubble>\r\n )}\r\n </ChatMessageList>\r\n )}\r\n </ExpandableChatBody>\r\n\r\n <ExpandableChatFooter className=\"bg-muted/40 p-3\">\r\n <form\r\n onSubmit={handleSubmit}\r\n className=\"relative rounded-3xl border bg-background focus-within:ring-1 focus-within:ring-ring p-1 shadow-sm\"\r\n >\r\n <ChatInput\r\n value={input}\r\n onChange={(e) => setInput(e.target.value)}\r\n placeholder=\"Message...\"\r\n rows={1}\r\n className=\"min-h-0 h-auto max-h-32 resize-none rounded-2xl bg-background border-0 px-3 py-2.5 shadow-none focus-visible:ring-0 text-base sm:text-sm\"\r\n onKeyDown={(e) => {\r\n if(e.key === \"Enter\" && !e.shiftKey) {\r\n e.preventDefault();\r\n handleSubmit(e as unknown as FormEvent);\r\n }\r\n }}\r\n />\r\n <div className=\"flex items-center justify-between px-2 pb-1\">\r\n <div className=\"flex items-center gap-2\">\r\n {/* Tools or other actions can go here */}\r\n </div>\r\n <Button \r\n type=\"submit\" \r\n size=\"icon\" \r\n className=\"h-8 w-8 rounded-full transition-all duration-200\" \r\n disabled={!input.trim() || isLoading}\r\n >\r\n {isLoading ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Send className=\"h-4 w-4\" />}\r\n <span className=\"sr-only\">Send</span>\r\n </Button>\r\n </div>\r\n </form>\r\n <div className=\"mt-2 text-center flex flex-col items-center justify-center gap-0.5\">\r\n <span className=\"text-[10px] text-muted-foreground/60\">\r\n Powered by <a href=\"#\" className=\"hover:underline hover:text-primary transition-colors\">ChatUI</a>\r\n </span>\r\n </div>\r\n </ExpandableChatFooter>\r\n </ExpandableChat>\r\n </>\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { Slot } from '@radix-ui/react-slot'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\n\r\nimport { cn } from '../../lib/utils'\r\n\r\nconst buttonVariants = cva(\r\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all cursor-pointer disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\r\n {\r\n variants: {\r\n variant: {\r\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\r\n destructive:\r\n 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\r\n outline:\r\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\r\n secondary:\r\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\r\n ghost:\r\n 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\r\n link: 'text-primary underline-offset-4 hover:underline',\r\n },\r\n size: {\r\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\r\n sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\r\n lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\r\n icon: 'size-9',\r\n 'icon-sm': 'size-8',\r\n 'icon-lg': 'size-10',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n },\r\n)\r\n\r\nfunction Button({\r\n className,\r\n variant,\r\n size,\r\n asChild = false,\r\n ...props\r\n}: React.ComponentProps<'button'> &\r\n VariantProps<typeof buttonVariants> & {\r\n asChild?: boolean\r\n }) {\r\n const Comp = asChild ? Slot : 'button'\r\n\r\n return (\r\n <Comp\r\n data-slot=\"button\"\r\n className={cn(buttonVariants({ variant, size, className }))}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Button, buttonVariants }\r\n","import { clsx, type ClassValue } from 'clsx'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs))\r\n}\r\n","'use client'\r\n\r\nimport * as React from 'react'\r\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\r\n\r\nimport { cn } from '../../lib/utils'\r\n\r\nfunction Avatar({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof AvatarPrimitive.Root>) {\r\n return (\r\n <AvatarPrimitive.Root\r\n data-slot=\"avatar\"\r\n className={cn(\r\n 'relative flex size-8 shrink-0 overflow-hidden rounded-full',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction AvatarImage({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\r\n return (\r\n <AvatarPrimitive.Image\r\n data-slot=\"avatar-image\"\r\n className={cn('aspect-square size-full', className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction AvatarFallback({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\r\n return (\r\n <AvatarPrimitive.Fallback\r\n data-slot=\"avatar-fallback\"\r\n className={cn(\r\n 'bg-muted flex size-full items-center justify-center rounded-full',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Avatar, AvatarImage, AvatarFallback }\r\n","\r\nfunction MessageLoading() {\r\n return (\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n className=\"text-foreground\"\r\n >\r\n <circle cx=\"4\" cy=\"12\" r=\"2\" fill=\"currentColor\">\r\n <animate\r\n id=\"spinner_qFRN\"\r\n begin=\"0;spinner_OcgL.end+0.25s\"\r\n attributeName=\"cy\"\r\n calcMode=\"spline\"\r\n dur=\"0.6s\"\r\n values=\"12;6;12\"\r\n keySplines=\".33,.66,.66,1;.33,0,.66,.33\"\r\n />\r\n </circle>\r\n <circle cx=\"12\" cy=\"12\" r=\"2\" fill=\"currentColor\">\r\n <animate\r\n begin=\"spinner_qFRN.begin+0.1s\"\r\n attributeName=\"cy\"\r\n calcMode=\"spline\"\r\n dur=\"0.6s\"\r\n values=\"12;6;12\"\r\n keySplines=\".33,.66,.66,1;.33,0,.66,.33\"\r\n />\r\n </circle>\r\n <circle cx=\"20\" cy=\"12\" r=\"2\" fill=\"currentColor\">\r\n <animate\r\n id=\"spinner_OcgL\"\r\n begin=\"spinner_qFRN.begin+0.2s\"\r\n attributeName=\"cy\"\r\n calcMode=\"spline\"\r\n dur=\"0.6s\"\r\n values=\"12;6;12\"\r\n keySplines=\".33,.66,.66,1;.33,0,.66,.33\"\r\n />\r\n </circle>\r\n </svg>\r\n );\r\n}\r\n\r\nexport { MessageLoading };\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { cn } from \"../../lib/utils\"\r\nimport { Avatar, AvatarFallback, AvatarImage } from \"./avatar\"\r\nimport { Button } from \"./button\"\r\nimport { MessageLoading } from \"./message-loading\";\r\n\r\ninterface ChatBubbleProps {\r\n variant?: \"sent\" | \"received\"\r\n layout?: \"default\" | \"ai\"\r\n className?: string\r\n children: React.ReactNode\r\n}\r\n\r\nexport function ChatBubble({\r\n variant = \"received\",\r\n layout = \"default\",\r\n className,\r\n children,\r\n}: ChatBubbleProps) {\r\n return (\r\n <div\r\n className={cn(\r\n \"flex items-start gap-2 mb-4\",\r\n variant === \"sent\" && \"flex-row-reverse\",\r\n className,\r\n )}\r\n >\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\ninterface ChatBubbleMessageProps {\r\n variant?: \"sent\" | \"received\"\r\n isLoading?: boolean\r\n className?: string\r\n children?: React.ReactNode\r\n}\r\n\r\nexport function ChatBubbleMessage({\r\n variant = \"received\",\r\n isLoading,\r\n className,\r\n children,\r\n}: ChatBubbleMessageProps) {\r\n return (\r\n <div\r\n className={cn(\r\n \"rounded-[1.25rem] px-4 py-2 text-sm max-w-[85%]\",\r\n variant === \"sent\" ? \"bg-primary text-primary-foreground\" : \"bg-muted\",\r\n className\r\n )}\r\n >\r\n {isLoading ? (\r\n <div className=\"flex items-center space-x-2\">\r\n <MessageLoading />\r\n </div>\r\n ) : (\r\n children\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\ninterface ChatBubbleAvatarProps {\r\n src?: string\r\n fallback?: React.ReactNode\r\n className?: string\r\n}\r\n\r\nexport function ChatBubbleAvatar({\r\n src,\r\n fallback = \"AI\",\r\n className,\r\n}: ChatBubbleAvatarProps) {\r\n return (\r\n <Avatar className={cn(\"h-8 w-8\", className)}>\r\n {src && <AvatarImage src={src} />}\r\n <AvatarFallback>{fallback}</AvatarFallback>\r\n </Avatar>\r\n )\r\n}\r\n\r\ninterface ChatBubbleActionProps {\r\n icon?: React.ReactNode\r\n onClick?: () => void\r\n className?: string\r\n}\r\n\r\nexport function ChatBubbleAction({\r\n icon,\r\n onClick,\r\n className,\r\n}: ChatBubbleActionProps) {\r\n return (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className={cn(\"h-6 w-6\", className)}\r\n onClick={onClick}\r\n >\r\n {icon}\r\n </Button>\r\n )\r\n}\r\n\r\nexport function ChatBubbleActionWrapper({\r\n className,\r\n children,\r\n}: {\r\n className?: string\r\n children: React.ReactNode\r\n}) {\r\n return (\r\n <div className={cn(\"flex items-center gap-1 mt-2\", className)}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n","import * as React from \"react\";\r\nimport { Textarea } from \"./textarea\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ninterface ChatInputProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement>{}\r\n\r\nconst ChatInput = React.forwardRef<HTMLTextAreaElement, ChatInputProps>(\r\n ({ className, ...props }, ref) => (\r\n <Textarea\r\n autoComplete=\"off\"\r\n ref={ref}\r\n name=\"message\"\r\n className={cn(\r\n \"max-h-12 px-4 py-3 bg-background text-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 w-full rounded-md flex items-center h-16 resize-none\",\r\n className,\r\n )}\r\n {...props}\r\n />\r\n ),\r\n);\r\nChatInput.displayName = \"ChatInput\";\r\n\r\nexport { ChatInput };\r\n","import * as React from 'react'\r\n\r\nimport { cn } from '../../lib/utils'\r\n\r\nfunction Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {\r\n return (\r\n <textarea\r\n data-slot=\"textarea\"\r\n className={cn(\r\n 'border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Textarea }\r\n","\"use client\";\r\n\r\nimport React, { useRef, useState } from \"react\";\r\nimport { X, MessageCircle } from \"lucide-react\";\r\nimport { cn } from \"../../lib/utils\";\r\nimport { Button } from \"./button\";\r\n\r\nexport type ChatPosition = \"bottom-right\" | \"bottom-left\";\r\nexport type ChatSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\r\n\r\nconst chatConfig = {\r\n dimensions: {\r\n sm: \"sm:max-w-sm sm:max-h-[500px]\",\r\n md: \"sm:max-w-md sm:max-h-[600px]\",\r\n lg: \"sm:max-w-lg sm:max-h-[700px]\",\r\n xl: \"sm:max-w-xl sm:max-h-[800px]\",\r\n full: \"sm:w-full sm:h-full\",\r\n },\r\n positions: {\r\n \"bottom-right\": \"bottom-5 right-5\",\r\n \"bottom-left\": \"bottom-5 left-5\",\r\n },\r\n chatPositions: {\r\n \"bottom-right\": \"sm:bottom-[calc(100%+10px)] sm:right-0\",\r\n \"bottom-left\": \"sm:bottom-[calc(100%+10px)] sm:left-0\",\r\n },\r\n states: {\r\n open: \"pointer-events-auto opacity-100 visible scale-100 translate-y-0\",\r\n closed:\r\n \"pointer-events-none opacity-0 invisible scale-100 sm:translate-y-5\",\r\n },\r\n};\r\n\r\ninterface ExpandableChatProps extends React.HTMLAttributes<HTMLDivElement> {\r\n position?: ChatPosition;\r\n size?: ChatSize;\r\n icon?: React.ReactNode;\r\n isOpen?: boolean;\r\n onOpenChange?: (isOpen: boolean) => void;\r\n}\r\n\r\nconst ExpandableChat: React.FC<ExpandableChatProps> = ({\r\n className,\r\n position = \"bottom-right\",\r\n size = \"md\",\r\n icon,\r\n children,\r\n isOpen: controlledIsOpen,\r\n onOpenChange,\r\n ...props\r\n}) => {\r\n const [internalIsOpen, setInternalIsOpen] = useState(false);\r\n const isControlled = controlledIsOpen !== undefined;\r\n const isOpen = isControlled ? controlledIsOpen : internalIsOpen;\r\n const chatRef = useRef<HTMLDivElement>(null);\r\n\r\n const toggleChat = () => {\r\n const newState = !isOpen;\r\n if (isControlled && onOpenChange) {\r\n onOpenChange(newState);\r\n } else {\r\n setInternalIsOpen(newState);\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n className={cn(`fixed ${chatConfig.positions[position]} z-[9999]`, className)}\r\n {...props}\r\n >\r\n <div\r\n ref={chatRef}\r\n className={cn(\r\n \"flex flex-col bg-background dark:bg-zinc-900 shadow-md overflow-hidden transition-all duration-250 ease-out\",\r\n \"fixed inset-0 w-full h-full\",\r\n \"sm:absolute sm:rounded-lg sm:w-[90vw] sm:h-[80vh] sm:inset-auto\",\r\n chatConfig.chatPositions[position],\r\n chatConfig.dimensions[size],\r\n isOpen ? chatConfig.states.open : chatConfig.states.closed,\r\n className,\r\n )}\r\n >\r\n {children}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"absolute top-2 right-2 sm:hidden\"\r\n onClick={toggleChat}\r\n >\r\n <X className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n <ExpandableChatToggle\r\n icon={icon}\r\n isOpen={isOpen}\r\n toggleChat={toggleChat}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nExpandableChat.displayName = \"ExpandableChat\";\r\n\r\nconst ExpandableChatHeader: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\r\n className,\r\n ...props\r\n}) => (\r\n <div\r\n className={cn(\"flex items-center justify-between p-4 border-b\", className)}\r\n {...props}\r\n />\r\n);\r\n\r\nExpandableChatHeader.displayName = \"ExpandableChatHeader\";\r\n\r\nconst ExpandableChatBody: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\r\n className,\r\n ...props\r\n}) => <div className={cn(\"flex-grow overflow-y-auto\", className)} {...props} />;\r\n\r\nExpandableChatBody.displayName = \"ExpandableChatBody\";\r\n\r\nconst ExpandableChatFooter: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\r\n className,\r\n ...props\r\n}) => <div className={cn(\"border-t p-4\", className)} {...props} />;\r\n\r\nExpandableChatFooter.displayName = \"ExpandableChatFooter\";\r\n\r\ninterface ExpandableChatToggleProps\r\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n icon?: React.ReactNode;\r\n isOpen: boolean;\r\n toggleChat: () => void;\r\n}\r\n\r\nconst ExpandableChatToggle: React.FC<ExpandableChatToggleProps> = ({\r\n className,\r\n icon,\r\n isOpen,\r\n toggleChat,\r\n ...props\r\n}) => (\r\n <Button\r\n variant=\"default\"\r\n onClick={toggleChat}\r\n className={cn(\r\n \"w-16 h-16 rounded-full shadow-md flex items-center justify-center hover:shadow-lg hover:shadow-black/30 transition-all duration-300 p-0 ring-0 shrink-0\",\r\n !isOpen ? \"!bg-transparent !border-0\" : \"\",\r\n isOpen ? \"hidden sm:flex\" : \"flex\",\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {isOpen ? (\r\n <X className=\"h-6 w-6\" />\r\n ) : (\r\n icon || <MessageCircle className=\"h-6 w-6\" />\r\n )}\r\n </Button>\r\n);\r\n\r\nExpandableChatToggle.displayName = \"ExpandableChatToggle\";\r\n\r\nexport {\r\n ExpandableChat,\r\n ExpandableChatHeader,\r\n ExpandableChatBody,\r\n ExpandableChatFooter,\r\n};\r\n","import * as React from \"react\";\r\nimport { ArrowDown } from \"lucide-react\";\r\nimport { Button } from \"./button\";\r\nimport { useAutoScroll } from \"../hooks/use-auto-scroll\";\r\n\r\ninterface ChatMessageListProps extends React.HTMLAttributes<HTMLDivElement> {\r\n smooth?: boolean;\r\n}\r\n\r\nconst ChatMessageList = React.forwardRef<HTMLDivElement, ChatMessageListProps>(\r\n ({ className, children, smooth = false, ...props }, _ref) => {\r\n const {\r\n scrollRef,\r\n isAtBottom,\r\n autoScrollEnabled,\r\n scrollToBottom,\r\n disableAutoScroll,\r\n } = useAutoScroll({\r\n smooth,\r\n content: children,\r\n });\r\n\r\n return (\r\n <div className=\"relative w-full h-full\">\r\n <div\r\n className={`flex flex-col w-full h-full p-4 overflow-y-auto ${className}`}\r\n ref={scrollRef}\r\n onWheel={disableAutoScroll}\r\n onTouchMove={disableAutoScroll}\r\n {...props}\r\n >\r\n <div className=\"flex flex-col gap-6\">{children}</div>\r\n </div>\r\n\r\n {!isAtBottom && (\r\n <Button\r\n onClick={() => {\r\n scrollToBottom();\r\n }}\r\n size=\"icon\"\r\n variant=\"outline\"\r\n className=\"absolute bottom-2 left-1/2 transform -translate-x-1/2 inline-flex rounded-full shadow-md\"\r\n aria-label=\"Scroll to bottom\"\r\n >\r\n <ArrowDown className=\"h-4 w-4\" />\r\n </Button>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nChatMessageList.displayName = \"ChatMessageList\";\r\n\r\nexport { ChatMessageList };\r\n","// @hidden\r\nimport { useCallback, useEffect, useRef, useState } from \"react\";\r\n\r\ninterface ScrollState {\r\n isAtBottom: boolean;\r\n autoScrollEnabled: boolean;\r\n}\r\n\r\ninterface UseAutoScrollOptions {\r\n offset?: number;\r\n smooth?: boolean;\r\n content?: React.ReactNode;\r\n}\r\n\r\nexport function useAutoScroll(options: UseAutoScrollOptions = {}) {\r\n const { offset = 20, smooth = false, content } = options;\r\n const scrollRef = useRef<HTMLDivElement>(null);\r\n const lastContentHeight = useRef(0);\r\n const userHasScrolled = useRef(false);\r\n\r\n const [scrollState, setScrollState] = useState<ScrollState>({\r\n isAtBottom: true,\r\n autoScrollEnabled: true,\r\n });\r\n\r\n const checkIsAtBottom = useCallback(\r\n (element: HTMLElement) => {\r\n const { scrollTop, scrollHeight, clientHeight } = element;\r\n const distanceToBottom = Math.abs(\r\n scrollHeight - scrollTop - clientHeight\r\n );\r\n return distanceToBottom <= offset;\r\n },\r\n [offset]\r\n );\r\n\r\n const scrollToBottom = useCallback(\r\n (instant?: boolean) => {\r\n if (!scrollRef.current) return;\r\n\r\n const targetScrollTop =\r\n scrollRef.current.scrollHeight - scrollRef.current.clientHeight;\r\n\r\n if (instant) {\r\n scrollRef.current.scrollTop = targetScrollTop;\r\n } else {\r\n scrollRef.current.scrollTo({\r\n top: targetScrollTop,\r\n behavior: smooth ? \"smooth\" : \"auto\",\r\n });\r\n }\r\n\r\n setScrollState({\r\n isAtBottom: true,\r\n autoScrollEnabled: true,\r\n });\r\n userHasScrolled.current = false;\r\n },\r\n [smooth]\r\n );\r\n\r\n const handleScroll = useCallback(() => {\r\n if (!scrollRef.current) return;\r\n\r\n const atBottom = checkIsAtBottom(scrollRef.current);\r\n\r\n setScrollState((prev) => ({\r\n isAtBottom: atBottom,\r\n // Re-enable auto-scroll if at the bottom\r\n autoScrollEnabled: atBottom ? true : prev.autoScrollEnabled,\r\n }));\r\n }, [checkIsAtBottom]);\r\n\r\n useEffect(() => {\r\n const element = scrollRef.current;\r\n if (!element) return;\r\n\r\n element.addEventListener(\"scroll\", handleScroll, { passive: true });\r\n return () => element.removeEventListener(\"scroll\", handleScroll);\r\n }, [handleScroll]);\r\n\r\n useEffect(() => {\r\n const scrollElement = scrollRef.current;\r\n if (!scrollElement) return;\r\n\r\n const currentHeight = scrollElement.scrollHeight;\r\n const hasNewContent = currentHeight !== lastContentHeight.current;\r\n\r\n if (hasNewContent) {\r\n if (scrollState.autoScrollEnabled) {\r\n requestAnimationFrame(() => {\r\n scrollToBottom(lastContentHeight.current === 0);\r\n });\r\n }\r\n lastContentHeight.current = currentHeight;\r\n }\r\n }, [content, scrollState.autoScrollEnabled, scrollToBottom]);\r\n\r\n useEffect(() => {\r\n const element = scrollRef.current;\r\n if (!element) return;\r\n\r\n const resizeObserver = new ResizeObserver(() => {\r\n if (scrollState.autoScrollEnabled) {\r\n scrollToBottom(true);\r\n }\r\n });\r\n\r\n resizeObserver.observe(element);\r\n return () => resizeObserver.disconnect();\r\n }, [scrollState.autoScrollEnabled, scrollToBottom]);\r\n\r\n const disableAutoScroll = useCallback(() => {\r\n const atBottom = scrollRef.current\r\n ? checkIsAtBottom(scrollRef.current)\r\n : false;\r\n\r\n // Only disable if not at bottom\r\n if (!atBottom) {\r\n userHasScrolled.current = true;\r\n setScrollState((prev) => ({\r\n ...prev,\r\n autoScrollEnabled: false,\r\n }));\r\n }\r\n }, [checkIsAtBottom]);\r\n\r\n return {\r\n scrollRef,\r\n isAtBottom: scrollState.isAtBottom,\r\n autoScrollEnabled: scrollState.autoScrollEnabled,\r\n scrollToBottom: () => scrollToBottom(false),\r\n disableAutoScroll,\r\n };\r\n}\r\n","\"use client\" \r\n\r\nimport * as React from \"react\"\r\nimport { motion } from \"framer-motion\";\r\n \r\ninterface ShiningTextProps {\r\n text: string;\r\n}\r\n\r\nexport function ShiningText({text}: ShiningTextProps) {\r\n return (\r\n <motion.div\r\n className=\"bg-[linear-gradient(110deg,#9ca3af,35%,#fff,50%,#9ca3af,75%,#9ca3af)] bg-[length:200%_100%] bg-clip-text text-sm text-transparent m-0 inline-block\"\r\n initial={{ backgroundPosition: \"200% 0\" }}\r\n animate={{ backgroundPosition: \"-200% 0\" }}\r\n transition={{\r\n repeat: Infinity,\r\n duration: 2,\r\n ease: \"linear\",\r\n }}\r\n >\r\n {text}\r\n </motion.div>\r\n );\r\n}\r\n","\"use client\";\r\nimport React from \"react\";\r\nimport {\r\n motion,\r\n useAnimationFrame,\r\n useMotionTemplate,\r\n useMotionValue,\r\n useTransform,\r\n} from \"framer-motion\";\r\nimport { useRef } from \"react\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\nexport function Button({\r\n borderRadius = \"1.75rem\",\r\n children,\r\n as: Component = \"button\",\r\n containerClassName,\r\n borderClassName,\r\n duration,\r\n className,\r\n ...otherProps\r\n}: {\r\n borderRadius?: string;\r\n children: React.ReactNode;\r\n as?: any;\r\n containerClassName?: string;\r\n borderClassName?: string;\r\n duration?: number;\r\n className?: string;\r\n [key: string]: any;\r\n}) {\r\n return (\r\n <Component\r\n className={cn(\r\n \"bg-transparent relative text-xl h-16 w-40 p-[1px] overflow-hidden \",\r\n containerClassName\r\n )}\r\n style={{\r\n borderRadius: borderRadius,\r\n }}\r\n {...otherProps}\r\n >\r\n <div\r\n className=\"absolute inset-0\"\r\n style={{ borderRadius: `calc(${borderRadius} * 0.96)` }}\r\n >\r\n <MovingBorder duration={duration} rx=\"30%\" ry=\"30%\">\r\n <div\r\n className={cn(\r\n \"h-20 w-20 opacity-[0.8] bg-[radial-gradient(#0ea5e9_40%,transparent_60%)]\",\r\n borderClassName\r\n )}\r\n />\r\n </MovingBorder>\r\n </div>\r\n\r\n <div\r\n className={cn(\r\n \"relative bg-background border border-border backdrop-blur-xl text-foreground flex items-center justify-center w-full h-full text-sm antialiased\",\r\n className\r\n )}\r\n style={{\r\n borderRadius: `calc(${borderRadius} * 0.96)`,\r\n }}\r\n >\r\n {children}\r\n </div>\r\n </Component>\r\n );\r\n}\r\n\r\nexport const MovingBorder = ({\r\n children,\r\n duration = 2000,\r\n rx,\r\n ry,\r\n ...otherProps\r\n}: {\r\n children: React.ReactNode;\r\n duration?: number;\r\n rx?: string;\r\n ry?: string;\r\n [key: string]: any;\r\n}) => {\r\n const pathRef = useRef<SVGRectElement>(null);\r\n const progress = useMotionValue<number>(0);\r\n\r\n useAnimationFrame((time) => {\r\n const length = pathRef.current?.getTotalLength();\r\n if (length) {\r\n const pxPerMillisecond = length / duration;\r\n progress.set((time * pxPerMillisecond) % length);\r\n }\r\n });\r\n\r\n const x = useTransform(\r\n progress,\r\n (val) => pathRef.current?.getPointAtLength(val).x\r\n );\r\n const y = useTransform(\r\n progress,\r\n (val) => pathRef.current?.getPointAtLength(val).y\r\n );\r\n\r\n const transform = useMotionTemplate`translateX(${x}px) translateY(${y}px) translateX(-50%) translateY(-50%)`;\r\n\r\n return (\r\n <>\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n preserveAspectRatio=\"none\"\r\n className=\"absolute h-full w-full\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n {...otherProps}\r\n >\r\n <rect\r\n fill=\"none\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n rx={rx}\r\n ry={ry}\r\n ref={pathRef}\r\n />\r\n </svg>\r\n <motion.div\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n display: \"inline-block\",\r\n transform,\r\n }}\r\n >\r\n {children}\r\n </motion.div>\r\n </>\r\n );\r\n};\r\n"],"mappings":"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","names":["import_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","import_lucide_react","import_react","import_jsx_runtime","import_jsx_runtime","import_framer_motion","import_react","import_jsx_runtime","Button","import_jsx_runtime","e","Button","ReactMarkdown","remarkGfm"]}
package/dist/index.mjs CHANGED
@@ -298,7 +298,7 @@ var ExpandableChat = ({
298
298
  return /* @__PURE__ */ jsxs3(
299
299
  "div",
300
300
  {
301
- className: cn(`fixed ${chatConfig.positions[position]} z-50`, className),
301
+ className: cn(`fixed ${chatConfig.positions[position]} z-[9999]`, className),
302
302
  ...props,
303
303
  children: [
304
304
  /* @__PURE__ */ jsxs3(
@@ -306,7 +306,9 @@ var ExpandableChat = ({
306
306
  {
307
307
  ref: chatRef,
308
308
  className: cn(
309
- "flex flex-col bg-background dark:bg-zinc-900 sm:rounded-lg shadow-md overflow-hidden transition-all duration-250 ease-out sm:absolute sm:w-[90vw] sm:h-[80vh] fixed inset-0 w-full h-full sm:inset-auto",
309
+ "flex flex-col bg-background dark:bg-zinc-900 shadow-md overflow-hidden transition-all duration-250 ease-out",
310
+ "fixed inset-0 w-full h-full",
311
+ "sm:absolute sm:rounded-lg sm:w-[90vw] sm:h-[80vh] sm:inset-auto",
310
312
  chatConfig.chatPositions[position],
311
313
  chatConfig.dimensions[size],
312
314
  isOpen ? chatConfig.states.open : chatConfig.states.closed,
@@ -373,8 +375,9 @@ var ExpandableChatToggle = ({
373
375
  variant: "default",
374
376
  onClick: toggleChat,
375
377
  className: cn(
376
- "w-16 h-16 rounded-full shadow-md flex items-center justify-center hover:shadow-lg hover:shadow-black/30 transition-all duration-300 p-0 ring-0",
378
+ "w-16 h-16 rounded-full shadow-md flex items-center justify-center hover:shadow-lg hover:shadow-black/30 transition-all duration-300 p-0 ring-0 shrink-0",
377
379
  !isOpen ? "!bg-transparent !border-0" : "",
380
+ isOpen ? "hidden sm:flex" : "flex",
378
381
  className
379
382
  ),
380
383
  ...props,
@@ -824,7 +827,7 @@ function ChatUI({
824
827
  }
825
828
  };
826
829
  return /* @__PURE__ */ jsxs6(Fragment2, { children: [
827
- showNotification && !isChatOpen && /* @__PURE__ */ jsx11("div", { className: "fixed bottom-24 right-4 sm:right-5 z-50 animate-in fade-in slide-in-from-bottom-5 duration-300", children: /* @__PURE__ */ jsxs6("div", { className: "relative", children: [
830
+ showNotification && !isChatOpen && /* @__PURE__ */ jsx11("div", { className: "fixed bottom-24 right-5 z-[9998] animate-in fade-in slide-in-from-bottom-5 duration-300", children: /* @__PURE__ */ jsxs6("div", { className: "relative", children: [
828
831
  /* @__PURE__ */ jsxs6(
829
832
  Button2,
830
833
  {
@@ -886,7 +889,6 @@ function ChatUI({
886
889
  isOpen: isChatOpen,
887
890
  onOpenChange: setIsChatOpen,
888
891
  icon: /* @__PURE__ */ jsx11("div", { className: "relative h-full w-full overflow-hidden rounded-full", children: /* @__PURE__ */ jsx11("img", { src: logoSrc, alt: "AI", className: "object-cover h-full w-full" }) }),
889
- className: "z-50",
890
892
  children: [
891
893
  /* @__PURE__ */ jsxs6(ExpandableChatHeader, { className: "bg-muted/40 flex-col text-center justify-center border-b p-4 relative", children: [
892
894
  /* @__PURE__ */ jsxs6("h1", { className: "text-xl font-semibold flex items-center justify-center gap-2", children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ChatUI.tsx","../src/components/ui/button.tsx","../src/lib/utils.ts","../src/components/ui/avatar.tsx","../src/components/ui/message-loading.tsx","../src/components/ui/chat-bubble.tsx","../src/components/ui/chat-input.tsx","../src/components/ui/textarea.tsx","../src/components/ui/expandable-chat.tsx","../src/components/ui/chat-message-list.tsx","../src/components/hooks/use-auto-scroll.ts","../src/components/ui/shining-text.tsx","../src/components/ui/moving-border.tsx"],"sourcesContent":["\"use client\"\r\n\r\nimport { useState, FormEvent, useEffect } from \"react\"\r\nimport { Send, Sparkles, Loader2, User, RefreshCcw, X } from \"lucide-react\"\r\nimport { Button } from \"./components/ui/button\"\r\nimport {\r\n ChatBubble,\r\n ChatBubbleAvatar,\r\n ChatBubbleMessage,\r\n} from \"./components/ui/chat-bubble\"\r\nimport { ChatInput } from \"./components/ui/chat-input\"\r\nimport {\r\n ExpandableChat,\r\n ExpandableChatHeader,\r\n ExpandableChatBody,\r\n ExpandableChatFooter,\r\n} from \"./components/ui/expandable-chat\"\r\nimport { ChatMessageList } from \"./components/ui/chat-message-list\"\r\n\r\nimport { ShiningText } from \"./components/ui/shining-text\"\r\nimport { Button as MovingBorderButton } from \"./components/ui/moving-border\"\r\nimport ReactMarkdown from \"react-markdown\"\r\nimport remarkGfm from \"remark-gfm\"\r\nimport { cn } from \"./lib/utils\"\r\n\r\ninterface Message {\r\n id: string\r\n role: \"user\" | \"assistant\"\r\n content: string\r\n}\r\n\r\nexport interface ChatUIProps {\r\n endpoint: string;\r\n logoSrc?: string;\r\n soundSrc?: string;\r\n title?: string;\r\n welcomeMessage?: string;\r\n description?: string;\r\n}\r\n\r\nexport function ChatUI({ \r\n endpoint, \r\n logoSrc = \"/bot_logo.jpg\", \r\n soundSrc = \"/sound.mp3\",\r\n title = \"AI Assistant\",\r\n welcomeMessage = \"Welcome to Services! 👋\",\r\n description = \"I'm here to help you navigate our services. Feel free to ask me anything!\"\r\n}: ChatUIProps) {\r\n const [messages, setMessages] = useState<Message[]>([])\r\n const [input, setInput] = useState(\"\")\r\n const [isLoading, setIsLoading] = useState(false)\r\n const [isInitialized, setIsInitialized] = useState(false)\r\n\r\n useEffect(() => {\r\n const savedMessages = localStorage.getItem(\"chat-history\")\r\n if (savedMessages) {\r\n try {\r\n setMessages(JSON.parse(savedMessages))\r\n } catch (e) {\r\n console.error(\"Failed to parse chat history\", e)\r\n }\r\n }\r\n setIsInitialized(true)\r\n }, [])\r\n\r\n const [isChatOpen, setIsChatOpen] = useState(false)\r\n const [showNotification, setShowNotification] = useState(false)\r\n const [isDismissed, setIsDismissed] = useState(false)\r\n\r\n useEffect(() => {\r\n const timer = setTimeout(() => {\r\n if (!isDismissed && !isChatOpen) {\r\n setShowNotification(true)\r\n const audio = new Audio(soundSrc)\r\n audio.play().catch((error) => {\r\n if (error.name !== \"NotAllowedError\") {\r\n console.error(\"Error playing notification sound:\", error)\r\n }\r\n })\r\n }\r\n }, 2000)\r\n return () => clearTimeout(timer)\r\n }, [isChatOpen, isDismissed, soundSrc])\r\n\r\n useEffect(() => {\r\n if (isChatOpen) {\r\n setShowNotification(false)\r\n setIsDismissed(true)\r\n }\r\n }, [isChatOpen])\r\n\r\n const handleDismissNotification = () => {\r\n setShowNotification(false)\r\n setIsDismissed(true)\r\n }\r\n\r\n useEffect(() => {\r\n if (isInitialized) {\r\n localStorage.setItem(\"chat-history\", JSON.stringify(messages))\r\n }\r\n }, [messages, isInitialized])\r\n\r\n const handleReset = () => {\r\n setMessages([])\r\n localStorage.removeItem(\"chat-history\")\r\n }\r\n\r\n const handleSubmit = async (e: FormEvent) => {\r\n e.preventDefault()\r\n if (!input.trim() || isLoading) return\r\n\r\n const userQuestion = input.trim()\r\n\r\n const userMessage: Message = {\r\n id: Date.now().toString(),\r\n role: \"user\",\r\n content: userQuestion,\r\n }\r\n\r\n // Prepare history\r\n const history = messages.map((msg) => ({\r\n role: msg.role,\r\n content: msg.content,\r\n }))\r\n\r\n setMessages((prev) => [...prev, userMessage])\r\n setInput(\"\")\r\n setIsLoading(true)\r\n\r\n try {\r\n const response = await fetch(endpoint, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify({\r\n query: userQuestion,\r\n history: history,\r\n stream: true,\r\n }),\r\n })\r\n\r\n if (!response.body) {\r\n throw new Error(\"ReadableStream not supported.\")\r\n }\r\n\r\n const reader = response.body.getReader()\r\n const decoder = new TextDecoder()\r\n let aiResponse = \"\"\r\n let isFirstChunk = true\r\n\r\n while (true) {\r\n const { value, done } = await reader.read()\r\n if (done) break\r\n\r\n const chunk = decoder.decode(value, { stream: true })\r\n aiResponse += chunk\r\n\r\n if (isFirstChunk) {\r\n isFirstChunk = false;\r\n setIsLoading(false); // Hide \"Thinking...\" bubble\r\n \r\n // Add initial bot message\r\n const botMessageId = (Date.now() + 1).toString()\r\n const botMessage: Message = {\r\n id: botMessageId,\r\n role: \"assistant\",\r\n content: aiResponse,\r\n }\r\n setMessages((prev) => [...prev, botMessage])\r\n } else {\r\n // Update existing bot message\r\n setMessages((prev) => {\r\n const updated = [...prev]\r\n const lastMsgIndex = updated.length - 1\r\n if (lastMsgIndex >= 0 && updated[lastMsgIndex].role === \"assistant\") {\r\n updated[lastMsgIndex] = {\r\n ...updated[lastMsgIndex],\r\n content: aiResponse,\r\n }\r\n }\r\n return updated\r\n })\r\n }\r\n }\r\n\r\n // Play notification sound\r\n const audio = new Audio(soundSrc)\r\n audio.play().catch((e) => console.error(\"Error playing notification sound:\", e))\r\n \r\n } catch (error) {\r\n console.error(\"Chat error:\", error)\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n id: (Date.now() + 2).toString(),\r\n role: \"assistant\",\r\n content: \"I apologize, but I encountered an error. Please try again later.\",\r\n },\r\n ])\r\n } finally {\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n {showNotification && !isChatOpen && (\r\n <div className=\"fixed bottom-24 right-4 sm:right-5 z-50 animate-in fade-in slide-in-from-bottom-5 duration-300\">\r\n {/* Wrapper to position tail relative to the button */}\r\n <div className=\"relative\">\r\n <MovingBorderButton\r\n as=\"div\"\r\n borderRadius=\"0.75rem\"\r\n duration={3000}\r\n containerClassName=\"w-72 sm:w-80 h-auto overflow-hidden rounded-xl bg-transparent\"\r\n borderClassName=\"bg-[radial-gradient(#0ea5e9_40%,transparent_60%)]\"\r\n className=\"bg-background dark:bg-zinc-900 border dark:border-zinc-800 p-5 items-start justify-start flex-col w-full h-full text-foreground shadow-lg\"\r\n >\r\n <Button \r\n variant=\"ghost\" \r\n size=\"icon\" \r\n className=\"absolute top-3 right-3 h-6 w-6 text-muted-foreground hover:text-foreground z-10\"\r\n onClick={handleDismissNotification}\r\n >\r\n <X className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">Close</span>\r\n </Button>\r\n\r\n <div className=\"flex items-start gap-3 mb-4 w-full\">\r\n <div className=\"relative h-10 w-10 shrink-0 overflow-hidden rounded-full ring-2 ring-background dark:ring-zinc-800\">\r\n <img src={logoSrc} alt=\"AI\" className=\"object-cover h-full w-full\" />\r\n </div>\r\n <div className=\"flex flex-col pt-0.5\">\r\n <h3 className=\"font-bold text-sm leading-tight text-foreground\">{title}</h3>\r\n <div className=\"flex items-center gap-1.5 mt-0.5\">\r\n <span className=\"relative flex h-2 w-2\">\r\n <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75\"></span>\r\n <span className=\"relative inline-flex rounded-full h-2 w-2 bg-green-500\"></span>\r\n </span>\r\n <span className=\"text-xs text-muted-foreground font-medium\">Online</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"w-full text-left\">\r\n <p className=\"text-sm font-medium text-foreground leading-snug\">\r\n {welcomeMessage}\r\n </p>\r\n <p className=\"text-sm text-muted-foreground leading-relaxed mt-2\">\r\n {description}\r\n </p>\r\n <Button \r\n className=\"w-full mt-4 h-10 rounded-lg bg-[#535bf2] hover:bg-[#464ec9] text-white shadow-sm transition-all duration-200 font-medium\"\r\n onClick={() => setIsChatOpen(true)}\r\n >\r\n Start chatting\r\n </Button>\r\n </div>\r\n </MovingBorderButton>\r\n \r\n {/* Triangle Tail */}\r\n <div className=\"absolute -bottom-2 right-6 w-4 h-4 bg-background dark:bg-zinc-900 border-b border-r dark:border-zinc-800 transform rotate-45 z-0\"></div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <ExpandableChat\r\n size=\"lg\"\r\n position=\"bottom-right\"\r\n isOpen={isChatOpen}\r\n onOpenChange={setIsChatOpen}\r\n icon={<div className=\"relative h-full w-full overflow-hidden rounded-full\"><img src={logoSrc} alt=\"AI\" className=\"object-cover h-full w-full\" /></div>}\r\n className=\"z-50\"\r\n >\r\n <ExpandableChatHeader className=\"bg-muted/40 flex-col text-center justify-center border-b p-4 relative\">\r\n <h1 className=\"text-xl font-semibold flex items-center justify-center gap-2\"> \r\n {title} \r\n <Sparkles className=\"h-4 w-4 text-yellow-500 fill-yellow-500\" />\r\n </h1>\r\n <p className=\"text-sm text-muted-foreground flex items-center justify-center gap-1.5 pt-1\">\r\n <span className=\"flex h-2 w-2 rounded-full bg-green-500 animate-pulse\"></span>\r\n Online and ready to help\r\n </p>\r\n <Button \r\n variant=\"ghost\" \r\n size=\"icon\" \r\n className=\"absolute top-3 left-3 h-8 w-8 text-muted-foreground hover:text-foreground hover:bg-muted/50 sm:top-5 sm:right-5 sm:left-auto\"\r\n onClick={handleReset}\r\n title=\"Reset Chat\"\r\n >\r\n <RefreshCcw className=\"h-4 w-4\" />\r\n </Button>\r\n </ExpandableChatHeader>\r\n\r\n <ExpandableChatBody className=\"bg-background/50\">\r\n {messages.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center h-full p-6 text-center animate-in fade-in duration-500\">\r\n <div className=\"bg-background rounded-full p-4 mb-6 shadow-md ring-1 ring-border/50\">\r\n <div className=\"relative w-16 h-16 overflow-hidden rounded-full\">\r\n <img src={logoSrc} alt=\"AI Logo\" className=\"object-cover w-full h-full\" />\r\n </div>\r\n </div>\r\n <h2 className=\"text-2xl font-bold mb-2 tracking-tight\">{title}</h2>\r\n <p className=\"text-muted-foreground text-sm\">Welcome to {title} 💛</p>\r\n </div>\r\n ) : (\r\n <ChatMessageList>\r\n {messages.map((message) => (\r\n <ChatBubble\r\n key={message.id}\r\n variant={message.role === \"user\" ? \"sent\" : \"received\"}\r\n >\r\n <ChatBubbleAvatar\r\n className=\"h-8 w-8 shrink-0\"\r\n src={\r\n message.role === \"user\"\r\n ? undefined\r\n : logoSrc\r\n }\r\n fallback={message.role === \"user\" ? <User className=\"h-4 w-4\" /> : \"AI\"}\r\n />\r\n <ChatBubbleMessage\r\n variant={message.role === \"user\" ? \"sent\" : \"received\"}\r\n >\r\n {message.role === \"user\" ? (\r\n message.content\r\n ) : (\r\n <div className={cn(\r\n \"prose dark:prose-invert text-sm break-words leading-normal max-w-none\",\r\n \"prose-p:m-0 prose-ul:m-0 prose-ol:m-0 prose-li:m-0\"\r\n )}>\r\n <ReactMarkdown \r\n remarkPlugins={[remarkGfm]}\r\n components={{\r\n ul: ({node, ...props}: any) => <ul className=\"list-disc pl-4 my-1\" {...props} />,\r\n ol: ({node, ...props}: any) => <ol className=\"list-decimal pl-4 my-1\" {...props} />,\r\n li: ({node, ...props}: any) => <li className=\"my-0.5 pl-1\" {...props} />,\r\n p: ({node, ...props}: any) => <p className=\"mb-2 last:mb-0\" {...props} />,\r\n strong: ({node, ...props}: any) => <span className=\"font-bold text-foreground\" {...props} />,\r\n a: ({node, href, children, ...props}: any) => (\r\n <a \r\n href={href}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"font-semibold text-blue-600 hover:text-blue-500 dark:text-blue-400 dark:hover:text-blue-300 hover:underline transition-colors break-all\"\r\n {...props}\r\n >\r\n {children}\r\n </a>\r\n ),\r\n }}\r\n >\r\n {message.content}\r\n </ReactMarkdown>\r\n </div>\r\n )}\r\n </ChatBubbleMessage>\r\n </ChatBubble>\r\n ))}\r\n\r\n\r\n {isLoading && (\r\n <ChatBubble variant=\"received\">\r\n <ChatBubbleAvatar\r\n className=\"h-8 w-8 shrink-0\"\r\n src={logoSrc}\r\n fallback=\"AI\"\r\n />\r\n <ChatBubbleMessage className=\"bg-transparent p-0 flex items-center gap-2\">\r\n <Sparkles className=\"h-4 w-4 text-foreground/50\" />\r\n <ShiningText text=\"AI Assistant thinking...\" />\r\n </ChatBubbleMessage>\r\n </ChatBubble>\r\n )}\r\n </ChatMessageList>\r\n )}\r\n </ExpandableChatBody>\r\n\r\n <ExpandableChatFooter className=\"bg-muted/40 p-3\">\r\n <form\r\n onSubmit={handleSubmit}\r\n className=\"relative rounded-3xl border bg-background focus-within:ring-1 focus-within:ring-ring p-1 shadow-sm\"\r\n >\r\n <ChatInput\r\n value={input}\r\n onChange={(e) => setInput(e.target.value)}\r\n placeholder=\"Message...\"\r\n rows={1}\r\n className=\"min-h-0 h-auto max-h-32 resize-none rounded-2xl bg-background border-0 px-3 py-2.5 shadow-none focus-visible:ring-0 text-base sm:text-sm\"\r\n onKeyDown={(e) => {\r\n if(e.key === \"Enter\" && !e.shiftKey) {\r\n e.preventDefault();\r\n handleSubmit(e as unknown as FormEvent);\r\n }\r\n }}\r\n />\r\n <div className=\"flex items-center justify-between px-2 pb-1\">\r\n <div className=\"flex items-center gap-2\">\r\n {/* Tools or other actions can go here */}\r\n </div>\r\n <Button \r\n type=\"submit\" \r\n size=\"icon\" \r\n className=\"h-8 w-8 rounded-full transition-all duration-200\" \r\n disabled={!input.trim() || isLoading}\r\n >\r\n {isLoading ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Send className=\"h-4 w-4\" />}\r\n <span className=\"sr-only\">Send</span>\r\n </Button>\r\n </div>\r\n </form>\r\n <div className=\"mt-2 text-center flex flex-col items-center justify-center gap-0.5\">\r\n <span className=\"text-[10px] text-muted-foreground/60\">\r\n Powered by <a href=\"#\" className=\"hover:underline hover:text-primary transition-colors\">ChatUI</a>\r\n </span>\r\n </div>\r\n </ExpandableChatFooter>\r\n </ExpandableChat>\r\n </>\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { Slot } from '@radix-ui/react-slot'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\n\r\nimport { cn } from '../../lib/utils'\r\n\r\nconst buttonVariants = cva(\r\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all cursor-pointer disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\r\n {\r\n variants: {\r\n variant: {\r\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\r\n destructive:\r\n 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\r\n outline:\r\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\r\n secondary:\r\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\r\n ghost:\r\n 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\r\n link: 'text-primary underline-offset-4 hover:underline',\r\n },\r\n size: {\r\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\r\n sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\r\n lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\r\n icon: 'size-9',\r\n 'icon-sm': 'size-8',\r\n 'icon-lg': 'size-10',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n },\r\n)\r\n\r\nfunction Button({\r\n className,\r\n variant,\r\n size,\r\n asChild = false,\r\n ...props\r\n}: React.ComponentProps<'button'> &\r\n VariantProps<typeof buttonVariants> & {\r\n asChild?: boolean\r\n }) {\r\n const Comp = asChild ? Slot : 'button'\r\n\r\n return (\r\n <Comp\r\n data-slot=\"button\"\r\n className={cn(buttonVariants({ variant, size, className }))}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Button, buttonVariants }\r\n","import { clsx, type ClassValue } from 'clsx'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs))\r\n}\r\n","'use client'\r\n\r\nimport * as React from 'react'\r\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\r\n\r\nimport { cn } from '../../lib/utils'\r\n\r\nfunction Avatar({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof AvatarPrimitive.Root>) {\r\n return (\r\n <AvatarPrimitive.Root\r\n data-slot=\"avatar\"\r\n className={cn(\r\n 'relative flex size-8 shrink-0 overflow-hidden rounded-full',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction AvatarImage({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\r\n return (\r\n <AvatarPrimitive.Image\r\n data-slot=\"avatar-image\"\r\n className={cn('aspect-square size-full', className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction AvatarFallback({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\r\n return (\r\n <AvatarPrimitive.Fallback\r\n data-slot=\"avatar-fallback\"\r\n className={cn(\r\n 'bg-muted flex size-full items-center justify-center rounded-full',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Avatar, AvatarImage, AvatarFallback }\r\n","\r\nfunction MessageLoading() {\r\n return (\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n className=\"text-foreground\"\r\n >\r\n <circle cx=\"4\" cy=\"12\" r=\"2\" fill=\"currentColor\">\r\n <animate\r\n id=\"spinner_qFRN\"\r\n begin=\"0;spinner_OcgL.end+0.25s\"\r\n attributeName=\"cy\"\r\n calcMode=\"spline\"\r\n dur=\"0.6s\"\r\n values=\"12;6;12\"\r\n keySplines=\".33,.66,.66,1;.33,0,.66,.33\"\r\n />\r\n </circle>\r\n <circle cx=\"12\" cy=\"12\" r=\"2\" fill=\"currentColor\">\r\n <animate\r\n begin=\"spinner_qFRN.begin+0.1s\"\r\n attributeName=\"cy\"\r\n calcMode=\"spline\"\r\n dur=\"0.6s\"\r\n values=\"12;6;12\"\r\n keySplines=\".33,.66,.66,1;.33,0,.66,.33\"\r\n />\r\n </circle>\r\n <circle cx=\"20\" cy=\"12\" r=\"2\" fill=\"currentColor\">\r\n <animate\r\n id=\"spinner_OcgL\"\r\n begin=\"spinner_qFRN.begin+0.2s\"\r\n attributeName=\"cy\"\r\n calcMode=\"spline\"\r\n dur=\"0.6s\"\r\n values=\"12;6;12\"\r\n keySplines=\".33,.66,.66,1;.33,0,.66,.33\"\r\n />\r\n </circle>\r\n </svg>\r\n );\r\n}\r\n\r\nexport { MessageLoading };\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { cn } from \"../../lib/utils\"\r\nimport { Avatar, AvatarFallback, AvatarImage } from \"./avatar\"\r\nimport { Button } from \"./button\"\r\nimport { MessageLoading } from \"./message-loading\";\r\n\r\ninterface ChatBubbleProps {\r\n variant?: \"sent\" | \"received\"\r\n layout?: \"default\" | \"ai\"\r\n className?: string\r\n children: React.ReactNode\r\n}\r\n\r\nexport function ChatBubble({\r\n variant = \"received\",\r\n layout = \"default\",\r\n className,\r\n children,\r\n}: ChatBubbleProps) {\r\n return (\r\n <div\r\n className={cn(\r\n \"flex items-start gap-2 mb-4\",\r\n variant === \"sent\" && \"flex-row-reverse\",\r\n className,\r\n )}\r\n >\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\ninterface ChatBubbleMessageProps {\r\n variant?: \"sent\" | \"received\"\r\n isLoading?: boolean\r\n className?: string\r\n children?: React.ReactNode\r\n}\r\n\r\nexport function ChatBubbleMessage({\r\n variant = \"received\",\r\n isLoading,\r\n className,\r\n children,\r\n}: ChatBubbleMessageProps) {\r\n return (\r\n <div\r\n className={cn(\r\n \"rounded-[1.25rem] px-4 py-2 text-sm max-w-[85%]\",\r\n variant === \"sent\" ? \"bg-primary text-primary-foreground\" : \"bg-muted\",\r\n className\r\n )}\r\n >\r\n {isLoading ? (\r\n <div className=\"flex items-center space-x-2\">\r\n <MessageLoading />\r\n </div>\r\n ) : (\r\n children\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\ninterface ChatBubbleAvatarProps {\r\n src?: string\r\n fallback?: React.ReactNode\r\n className?: string\r\n}\r\n\r\nexport function ChatBubbleAvatar({\r\n src,\r\n fallback = \"AI\",\r\n className,\r\n}: ChatBubbleAvatarProps) {\r\n return (\r\n <Avatar className={cn(\"h-8 w-8\", className)}>\r\n {src && <AvatarImage src={src} />}\r\n <AvatarFallback>{fallback}</AvatarFallback>\r\n </Avatar>\r\n )\r\n}\r\n\r\ninterface ChatBubbleActionProps {\r\n icon?: React.ReactNode\r\n onClick?: () => void\r\n className?: string\r\n}\r\n\r\nexport function ChatBubbleAction({\r\n icon,\r\n onClick,\r\n className,\r\n}: ChatBubbleActionProps) {\r\n return (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className={cn(\"h-6 w-6\", className)}\r\n onClick={onClick}\r\n >\r\n {icon}\r\n </Button>\r\n )\r\n}\r\n\r\nexport function ChatBubbleActionWrapper({\r\n className,\r\n children,\r\n}: {\r\n className?: string\r\n children: React.ReactNode\r\n}) {\r\n return (\r\n <div className={cn(\"flex items-center gap-1 mt-2\", className)}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n","import * as React from \"react\";\r\nimport { Textarea } from \"./textarea\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ninterface ChatInputProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement>{}\r\n\r\nconst ChatInput = React.forwardRef<HTMLTextAreaElement, ChatInputProps>(\r\n ({ className, ...props }, ref) => (\r\n <Textarea\r\n autoComplete=\"off\"\r\n ref={ref}\r\n name=\"message\"\r\n className={cn(\r\n \"max-h-12 px-4 py-3 bg-background text-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 w-full rounded-md flex items-center h-16 resize-none\",\r\n className,\r\n )}\r\n {...props}\r\n />\r\n ),\r\n);\r\nChatInput.displayName = \"ChatInput\";\r\n\r\nexport { ChatInput };\r\n","import * as React from 'react'\r\n\r\nimport { cn } from '../../lib/utils'\r\n\r\nfunction Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {\r\n return (\r\n <textarea\r\n data-slot=\"textarea\"\r\n className={cn(\r\n 'border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Textarea }\r\n","\"use client\";\r\n\r\nimport React, { useRef, useState } from \"react\";\r\nimport { X, MessageCircle } from \"lucide-react\";\r\nimport { cn } from \"../../lib/utils\";\r\nimport { Button } from \"./button\";\r\n\r\nexport type ChatPosition = \"bottom-right\" | \"bottom-left\";\r\nexport type ChatSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\r\n\r\nconst chatConfig = {\r\n dimensions: {\r\n sm: \"sm:max-w-sm sm:max-h-[500px]\",\r\n md: \"sm:max-w-md sm:max-h-[600px]\",\r\n lg: \"sm:max-w-lg sm:max-h-[700px]\",\r\n xl: \"sm:max-w-xl sm:max-h-[800px]\",\r\n full: \"sm:w-full sm:h-full\",\r\n },\r\n positions: {\r\n \"bottom-right\": \"bottom-5 right-5\",\r\n \"bottom-left\": \"bottom-5 left-5\",\r\n },\r\n chatPositions: {\r\n \"bottom-right\": \"sm:bottom-[calc(100%+10px)] sm:right-0\",\r\n \"bottom-left\": \"sm:bottom-[calc(100%+10px)] sm:left-0\",\r\n },\r\n states: {\r\n open: \"pointer-events-auto opacity-100 visible scale-100 translate-y-0\",\r\n closed:\r\n \"pointer-events-none opacity-0 invisible scale-100 sm:translate-y-5\",\r\n },\r\n};\r\n\r\ninterface ExpandableChatProps extends React.HTMLAttributes<HTMLDivElement> {\r\n position?: ChatPosition;\r\n size?: ChatSize;\r\n icon?: React.ReactNode;\r\n isOpen?: boolean;\r\n onOpenChange?: (isOpen: boolean) => void;\r\n}\r\n\r\nconst ExpandableChat: React.FC<ExpandableChatProps> = ({\r\n className,\r\n position = \"bottom-right\",\r\n size = \"md\",\r\n icon,\r\n children,\r\n isOpen: controlledIsOpen,\r\n onOpenChange,\r\n ...props\r\n}) => {\r\n const [internalIsOpen, setInternalIsOpen] = useState(false);\r\n const isControlled = controlledIsOpen !== undefined;\r\n const isOpen = isControlled ? controlledIsOpen : internalIsOpen;\r\n const chatRef = useRef<HTMLDivElement>(null);\r\n\r\n const toggleChat = () => {\r\n const newState = !isOpen;\r\n if (isControlled && onOpenChange) {\r\n onOpenChange(newState);\r\n } else {\r\n setInternalIsOpen(newState);\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n className={cn(`fixed ${chatConfig.positions[position]} z-50`, className)}\r\n {...props}\r\n >\r\n <div\r\n ref={chatRef}\r\n className={cn(\r\n \"flex flex-col bg-background dark:bg-zinc-900 sm:rounded-lg shadow-md overflow-hidden transition-all duration-250 ease-out sm:absolute sm:w-[90vw] sm:h-[80vh] fixed inset-0 w-full h-full sm:inset-auto\",\r\n chatConfig.chatPositions[position],\r\n chatConfig.dimensions[size],\r\n isOpen ? chatConfig.states.open : chatConfig.states.closed,\r\n className,\r\n )}\r\n >\r\n {children}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"absolute top-2 right-2 sm:hidden\"\r\n onClick={toggleChat}\r\n >\r\n <X className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n <ExpandableChatToggle\r\n icon={icon}\r\n isOpen={isOpen}\r\n toggleChat={toggleChat}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nExpandableChat.displayName = \"ExpandableChat\";\r\n\r\nconst ExpandableChatHeader: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\r\n className,\r\n ...props\r\n}) => (\r\n <div\r\n className={cn(\"flex items-center justify-between p-4 border-b\", className)}\r\n {...props}\r\n />\r\n);\r\n\r\nExpandableChatHeader.displayName = \"ExpandableChatHeader\";\r\n\r\nconst ExpandableChatBody: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\r\n className,\r\n ...props\r\n}) => <div className={cn(\"flex-grow overflow-y-auto\", className)} {...props} />;\r\n\r\nExpandableChatBody.displayName = \"ExpandableChatBody\";\r\n\r\nconst ExpandableChatFooter: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\r\n className,\r\n ...props\r\n}) => <div className={cn(\"border-t p-4\", className)} {...props} />;\r\n\r\nExpandableChatFooter.displayName = \"ExpandableChatFooter\";\r\n\r\ninterface ExpandableChatToggleProps\r\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n icon?: React.ReactNode;\r\n isOpen: boolean;\r\n toggleChat: () => void;\r\n}\r\n\r\nconst ExpandableChatToggle: React.FC<ExpandableChatToggleProps> = ({\r\n className,\r\n icon,\r\n isOpen,\r\n toggleChat,\r\n ...props\r\n}) => (\r\n <Button\r\n variant=\"default\"\r\n onClick={toggleChat}\r\n className={cn(\r\n \"w-16 h-16 rounded-full shadow-md flex items-center justify-center hover:shadow-lg hover:shadow-black/30 transition-all duration-300 p-0 ring-0\",\r\n !isOpen ? \"!bg-transparent !border-0\" : \"\",\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {isOpen ? (\r\n <X className=\"h-6 w-6\" />\r\n ) : (\r\n icon || <MessageCircle className=\"h-6 w-6\" />\r\n )}\r\n </Button>\r\n);\r\n\r\nExpandableChatToggle.displayName = \"ExpandableChatToggle\";\r\n\r\nexport {\r\n ExpandableChat,\r\n ExpandableChatHeader,\r\n ExpandableChatBody,\r\n ExpandableChatFooter,\r\n};\r\n","import * as React from \"react\";\r\nimport { ArrowDown } from \"lucide-react\";\r\nimport { Button } from \"./button\";\r\nimport { useAutoScroll } from \"../hooks/use-auto-scroll\";\r\n\r\ninterface ChatMessageListProps extends React.HTMLAttributes<HTMLDivElement> {\r\n smooth?: boolean;\r\n}\r\n\r\nconst ChatMessageList = React.forwardRef<HTMLDivElement, ChatMessageListProps>(\r\n ({ className, children, smooth = false, ...props }, _ref) => {\r\n const {\r\n scrollRef,\r\n isAtBottom,\r\n autoScrollEnabled,\r\n scrollToBottom,\r\n disableAutoScroll,\r\n } = useAutoScroll({\r\n smooth,\r\n content: children,\r\n });\r\n\r\n return (\r\n <div className=\"relative w-full h-full\">\r\n <div\r\n className={`flex flex-col w-full h-full p-4 overflow-y-auto ${className}`}\r\n ref={scrollRef}\r\n onWheel={disableAutoScroll}\r\n onTouchMove={disableAutoScroll}\r\n {...props}\r\n >\r\n <div className=\"flex flex-col gap-6\">{children}</div>\r\n </div>\r\n\r\n {!isAtBottom && (\r\n <Button\r\n onClick={() => {\r\n scrollToBottom();\r\n }}\r\n size=\"icon\"\r\n variant=\"outline\"\r\n className=\"absolute bottom-2 left-1/2 transform -translate-x-1/2 inline-flex rounded-full shadow-md\"\r\n aria-label=\"Scroll to bottom\"\r\n >\r\n <ArrowDown className=\"h-4 w-4\" />\r\n </Button>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nChatMessageList.displayName = \"ChatMessageList\";\r\n\r\nexport { ChatMessageList };\r\n","// @hidden\r\nimport { useCallback, useEffect, useRef, useState } from \"react\";\r\n\r\ninterface ScrollState {\r\n isAtBottom: boolean;\r\n autoScrollEnabled: boolean;\r\n}\r\n\r\ninterface UseAutoScrollOptions {\r\n offset?: number;\r\n smooth?: boolean;\r\n content?: React.ReactNode;\r\n}\r\n\r\nexport function useAutoScroll(options: UseAutoScrollOptions = {}) {\r\n const { offset = 20, smooth = false, content } = options;\r\n const scrollRef = useRef<HTMLDivElement>(null);\r\n const lastContentHeight = useRef(0);\r\n const userHasScrolled = useRef(false);\r\n\r\n const [scrollState, setScrollState] = useState<ScrollState>({\r\n isAtBottom: true,\r\n autoScrollEnabled: true,\r\n });\r\n\r\n const checkIsAtBottom = useCallback(\r\n (element: HTMLElement) => {\r\n const { scrollTop, scrollHeight, clientHeight } = element;\r\n const distanceToBottom = Math.abs(\r\n scrollHeight - scrollTop - clientHeight\r\n );\r\n return distanceToBottom <= offset;\r\n },\r\n [offset]\r\n );\r\n\r\n const scrollToBottom = useCallback(\r\n (instant?: boolean) => {\r\n if (!scrollRef.current) return;\r\n\r\n const targetScrollTop =\r\n scrollRef.current.scrollHeight - scrollRef.current.clientHeight;\r\n\r\n if (instant) {\r\n scrollRef.current.scrollTop = targetScrollTop;\r\n } else {\r\n scrollRef.current.scrollTo({\r\n top: targetScrollTop,\r\n behavior: smooth ? \"smooth\" : \"auto\",\r\n });\r\n }\r\n\r\n setScrollState({\r\n isAtBottom: true,\r\n autoScrollEnabled: true,\r\n });\r\n userHasScrolled.current = false;\r\n },\r\n [smooth]\r\n );\r\n\r\n const handleScroll = useCallback(() => {\r\n if (!scrollRef.current) return;\r\n\r\n const atBottom = checkIsAtBottom(scrollRef.current);\r\n\r\n setScrollState((prev) => ({\r\n isAtBottom: atBottom,\r\n // Re-enable auto-scroll if at the bottom\r\n autoScrollEnabled: atBottom ? true : prev.autoScrollEnabled,\r\n }));\r\n }, [checkIsAtBottom]);\r\n\r\n useEffect(() => {\r\n const element = scrollRef.current;\r\n if (!element) return;\r\n\r\n element.addEventListener(\"scroll\", handleScroll, { passive: true });\r\n return () => element.removeEventListener(\"scroll\", handleScroll);\r\n }, [handleScroll]);\r\n\r\n useEffect(() => {\r\n const scrollElement = scrollRef.current;\r\n if (!scrollElement) return;\r\n\r\n const currentHeight = scrollElement.scrollHeight;\r\n const hasNewContent = currentHeight !== lastContentHeight.current;\r\n\r\n if (hasNewContent) {\r\n if (scrollState.autoScrollEnabled) {\r\n requestAnimationFrame(() => {\r\n scrollToBottom(lastContentHeight.current === 0);\r\n });\r\n }\r\n lastContentHeight.current = currentHeight;\r\n }\r\n }, [content, scrollState.autoScrollEnabled, scrollToBottom]);\r\n\r\n useEffect(() => {\r\n const element = scrollRef.current;\r\n if (!element) return;\r\n\r\n const resizeObserver = new ResizeObserver(() => {\r\n if (scrollState.autoScrollEnabled) {\r\n scrollToBottom(true);\r\n }\r\n });\r\n\r\n resizeObserver.observe(element);\r\n return () => resizeObserver.disconnect();\r\n }, [scrollState.autoScrollEnabled, scrollToBottom]);\r\n\r\n const disableAutoScroll = useCallback(() => {\r\n const atBottom = scrollRef.current\r\n ? checkIsAtBottom(scrollRef.current)\r\n : false;\r\n\r\n // Only disable if not at bottom\r\n if (!atBottom) {\r\n userHasScrolled.current = true;\r\n setScrollState((prev) => ({\r\n ...prev,\r\n autoScrollEnabled: false,\r\n }));\r\n }\r\n }, [checkIsAtBottom]);\r\n\r\n return {\r\n scrollRef,\r\n isAtBottom: scrollState.isAtBottom,\r\n autoScrollEnabled: scrollState.autoScrollEnabled,\r\n scrollToBottom: () => scrollToBottom(false),\r\n disableAutoScroll,\r\n };\r\n}\r\n","\"use client\" \r\n\r\nimport * as React from \"react\"\r\nimport { motion } from \"framer-motion\";\r\n \r\ninterface ShiningTextProps {\r\n text: string;\r\n}\r\n\r\nexport function ShiningText({text}: ShiningTextProps) {\r\n return (\r\n <motion.div\r\n className=\"bg-[linear-gradient(110deg,#9ca3af,35%,#fff,50%,#9ca3af,75%,#9ca3af)] bg-[length:200%_100%] bg-clip-text text-sm text-transparent m-0 inline-block\"\r\n initial={{ backgroundPosition: \"200% 0\" }}\r\n animate={{ backgroundPosition: \"-200% 0\" }}\r\n transition={{\r\n repeat: Infinity,\r\n duration: 2,\r\n ease: \"linear\",\r\n }}\r\n >\r\n {text}\r\n </motion.div>\r\n );\r\n}\r\n","\"use client\";\r\nimport React from \"react\";\r\nimport {\r\n motion,\r\n useAnimationFrame,\r\n useMotionTemplate,\r\n useMotionValue,\r\n useTransform,\r\n} from \"framer-motion\";\r\nimport { useRef } from \"react\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\nexport function Button({\r\n borderRadius = \"1.75rem\",\r\n children,\r\n as: Component = \"button\",\r\n containerClassName,\r\n borderClassName,\r\n duration,\r\n className,\r\n ...otherProps\r\n}: {\r\n borderRadius?: string;\r\n children: React.ReactNode;\r\n as?: any;\r\n containerClassName?: string;\r\n borderClassName?: string;\r\n duration?: number;\r\n className?: string;\r\n [key: string]: any;\r\n}) {\r\n return (\r\n <Component\r\n className={cn(\r\n \"bg-transparent relative text-xl h-16 w-40 p-[1px] overflow-hidden \",\r\n containerClassName\r\n )}\r\n style={{\r\n borderRadius: borderRadius,\r\n }}\r\n {...otherProps}\r\n >\r\n <div\r\n className=\"absolute inset-0\"\r\n style={{ borderRadius: `calc(${borderRadius} * 0.96)` }}\r\n >\r\n <MovingBorder duration={duration} rx=\"30%\" ry=\"30%\">\r\n <div\r\n className={cn(\r\n \"h-20 w-20 opacity-[0.8] bg-[radial-gradient(#0ea5e9_40%,transparent_60%)]\",\r\n borderClassName\r\n )}\r\n />\r\n </MovingBorder>\r\n </div>\r\n\r\n <div\r\n className={cn(\r\n \"relative bg-background border border-border backdrop-blur-xl text-foreground flex items-center justify-center w-full h-full text-sm antialiased\",\r\n className\r\n )}\r\n style={{\r\n borderRadius: `calc(${borderRadius} * 0.96)`,\r\n }}\r\n >\r\n {children}\r\n </div>\r\n </Component>\r\n );\r\n}\r\n\r\nexport const MovingBorder = ({\r\n children,\r\n duration = 2000,\r\n rx,\r\n ry,\r\n ...otherProps\r\n}: {\r\n children: React.ReactNode;\r\n duration?: number;\r\n rx?: string;\r\n ry?: string;\r\n [key: string]: any;\r\n}) => {\r\n const pathRef = useRef<SVGRectElement>(null);\r\n const progress = useMotionValue<number>(0);\r\n\r\n useAnimationFrame((time) => {\r\n const length = pathRef.current?.getTotalLength();\r\n if (length) {\r\n const pxPerMillisecond = length / duration;\r\n progress.set((time * pxPerMillisecond) % length);\r\n }\r\n });\r\n\r\n const x = useTransform(\r\n progress,\r\n (val) => pathRef.current?.getPointAtLength(val).x\r\n );\r\n const y = useTransform(\r\n progress,\r\n (val) => pathRef.current?.getPointAtLength(val).y\r\n );\r\n\r\n const transform = useMotionTemplate`translateX(${x}px) translateY(${y}px) translateX(-50%) translateY(-50%)`;\r\n\r\n return (\r\n <>\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n preserveAspectRatio=\"none\"\r\n className=\"absolute h-full w-full\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n {...otherProps}\r\n >\r\n <rect\r\n fill=\"none\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n rx={rx}\r\n ry={ry}\r\n ref={pathRef}\r\n />\r\n </svg>\r\n <motion.div\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n display: \"inline-block\",\r\n transform,\r\n }}\r\n >\r\n {children}\r\n </motion.div>\r\n </>\r\n );\r\n};\r\n"],"mappings":"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","names":["useState","useEffect","X","jsx","jsx","jsx","jsxs","jsx","jsx","jsx","jsxs","React","useRef","useState","jsx","jsxs","jsx","motion","useRef","jsx","jsxs","Button","useRef","motion","Fragment","jsx","jsxs","useState","useEffect","e","Button","X"]}
1
+ {"version":3,"sources":["../src/ChatUI.tsx","../src/components/ui/button.tsx","../src/lib/utils.ts","../src/components/ui/avatar.tsx","../src/components/ui/message-loading.tsx","../src/components/ui/chat-bubble.tsx","../src/components/ui/chat-input.tsx","../src/components/ui/textarea.tsx","../src/components/ui/expandable-chat.tsx","../src/components/ui/chat-message-list.tsx","../src/components/hooks/use-auto-scroll.ts","../src/components/ui/shining-text.tsx","../src/components/ui/moving-border.tsx"],"sourcesContent":["\"use client\"\r\n\r\nimport { useState, FormEvent, useEffect } from \"react\"\r\nimport { Send, Sparkles, Loader2, User, RefreshCcw, X } from \"lucide-react\"\r\nimport { Button } from \"./components/ui/button\"\r\nimport {\r\n ChatBubble,\r\n ChatBubbleAvatar,\r\n ChatBubbleMessage,\r\n} from \"./components/ui/chat-bubble\"\r\nimport { ChatInput } from \"./components/ui/chat-input\"\r\nimport {\r\n ExpandableChat,\r\n ExpandableChatHeader,\r\n ExpandableChatBody,\r\n ExpandableChatFooter,\r\n} from \"./components/ui/expandable-chat\"\r\nimport { ChatMessageList } from \"./components/ui/chat-message-list\"\r\n\r\nimport { ShiningText } from \"./components/ui/shining-text\"\r\nimport { Button as MovingBorderButton } from \"./components/ui/moving-border\"\r\nimport ReactMarkdown from \"react-markdown\"\r\nimport remarkGfm from \"remark-gfm\"\r\nimport { cn } from \"./lib/utils\"\r\n\r\ninterface Message {\r\n id: string\r\n role: \"user\" | \"assistant\"\r\n content: string\r\n}\r\n\r\nexport interface ChatUIProps {\r\n endpoint: string;\r\n logoSrc?: string;\r\n soundSrc?: string;\r\n title?: string;\r\n welcomeMessage?: string;\r\n description?: string;\r\n}\r\n\r\nexport function ChatUI({ \r\n endpoint, \r\n logoSrc = \"/bot_logo.jpg\", \r\n soundSrc = \"/sound.mp3\",\r\n title = \"AI Assistant\",\r\n welcomeMessage = \"Welcome to Services! 👋\",\r\n description = \"I'm here to help you navigate our services. Feel free to ask me anything!\"\r\n}: ChatUIProps) {\r\n const [messages, setMessages] = useState<Message[]>([])\r\n const [input, setInput] = useState(\"\")\r\n const [isLoading, setIsLoading] = useState(false)\r\n const [isInitialized, setIsInitialized] = useState(false)\r\n\r\n useEffect(() => {\r\n const savedMessages = localStorage.getItem(\"chat-history\")\r\n if (savedMessages) {\r\n try {\r\n setMessages(JSON.parse(savedMessages))\r\n } catch (e) {\r\n console.error(\"Failed to parse chat history\", e)\r\n }\r\n }\r\n setIsInitialized(true)\r\n }, [])\r\n\r\n const [isChatOpen, setIsChatOpen] = useState(false)\r\n const [showNotification, setShowNotification] = useState(false)\r\n const [isDismissed, setIsDismissed] = useState(false)\r\n\r\n useEffect(() => {\r\n const timer = setTimeout(() => {\r\n if (!isDismissed && !isChatOpen) {\r\n setShowNotification(true)\r\n const audio = new Audio(soundSrc)\r\n audio.play().catch((error) => {\r\n if (error.name !== \"NotAllowedError\") {\r\n console.error(\"Error playing notification sound:\", error)\r\n }\r\n })\r\n }\r\n }, 2000)\r\n return () => clearTimeout(timer)\r\n }, [isChatOpen, isDismissed, soundSrc])\r\n\r\n useEffect(() => {\r\n if (isChatOpen) {\r\n setShowNotification(false)\r\n setIsDismissed(true)\r\n }\r\n }, [isChatOpen])\r\n\r\n const handleDismissNotification = () => {\r\n setShowNotification(false)\r\n setIsDismissed(true)\r\n }\r\n\r\n useEffect(() => {\r\n if (isInitialized) {\r\n localStorage.setItem(\"chat-history\", JSON.stringify(messages))\r\n }\r\n }, [messages, isInitialized])\r\n\r\n const handleReset = () => {\r\n setMessages([])\r\n localStorage.removeItem(\"chat-history\")\r\n }\r\n\r\n const handleSubmit = async (e: FormEvent) => {\r\n e.preventDefault()\r\n if (!input.trim() || isLoading) return\r\n\r\n const userQuestion = input.trim()\r\n\r\n const userMessage: Message = {\r\n id: Date.now().toString(),\r\n role: \"user\",\r\n content: userQuestion,\r\n }\r\n\r\n // Prepare history\r\n const history = messages.map((msg) => ({\r\n role: msg.role,\r\n content: msg.content,\r\n }))\r\n\r\n setMessages((prev) => [...prev, userMessage])\r\n setInput(\"\")\r\n setIsLoading(true)\r\n\r\n try {\r\n const response = await fetch(endpoint, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify({\r\n query: userQuestion,\r\n history: history,\r\n stream: true,\r\n }),\r\n })\r\n\r\n if (!response.body) {\r\n throw new Error(\"ReadableStream not supported.\")\r\n }\r\n\r\n const reader = response.body.getReader()\r\n const decoder = new TextDecoder()\r\n let aiResponse = \"\"\r\n let isFirstChunk = true\r\n\r\n while (true) {\r\n const { value, done } = await reader.read()\r\n if (done) break\r\n\r\n const chunk = decoder.decode(value, { stream: true })\r\n aiResponse += chunk\r\n\r\n if (isFirstChunk) {\r\n isFirstChunk = false;\r\n setIsLoading(false); // Hide \"Thinking...\" bubble\r\n \r\n // Add initial bot message\r\n const botMessageId = (Date.now() + 1).toString()\r\n const botMessage: Message = {\r\n id: botMessageId,\r\n role: \"assistant\",\r\n content: aiResponse,\r\n }\r\n setMessages((prev) => [...prev, botMessage])\r\n } else {\r\n // Update existing bot message\r\n setMessages((prev) => {\r\n const updated = [...prev]\r\n const lastMsgIndex = updated.length - 1\r\n if (lastMsgIndex >= 0 && updated[lastMsgIndex].role === \"assistant\") {\r\n updated[lastMsgIndex] = {\r\n ...updated[lastMsgIndex],\r\n content: aiResponse,\r\n }\r\n }\r\n return updated\r\n })\r\n }\r\n }\r\n\r\n // Play notification sound\r\n const audio = new Audio(soundSrc)\r\n audio.play().catch((e) => console.error(\"Error playing notification sound:\", e))\r\n \r\n } catch (error) {\r\n console.error(\"Chat error:\", error)\r\n setMessages((prev) => [\r\n ...prev,\r\n {\r\n id: (Date.now() + 2).toString(),\r\n role: \"assistant\",\r\n content: \"I apologize, but I encountered an error. Please try again later.\",\r\n },\r\n ])\r\n } finally {\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n {showNotification && !isChatOpen && (\r\n <div className=\"fixed bottom-24 right-5 z-[9998] animate-in fade-in slide-in-from-bottom-5 duration-300\">\r\n {/* Wrapper to position tail relative to the button */}\r\n <div className=\"relative\">\r\n <MovingBorderButton\r\n as=\"div\"\r\n borderRadius=\"0.75rem\"\r\n duration={3000}\r\n containerClassName=\"w-72 sm:w-80 h-auto overflow-hidden rounded-xl bg-transparent\"\r\n borderClassName=\"bg-[radial-gradient(#0ea5e9_40%,transparent_60%)]\"\r\n className=\"bg-background dark:bg-zinc-900 border dark:border-zinc-800 p-5 items-start justify-start flex-col w-full h-full text-foreground shadow-lg\"\r\n >\r\n <Button \r\n variant=\"ghost\" \r\n size=\"icon\" \r\n className=\"absolute top-3 right-3 h-6 w-6 text-muted-foreground hover:text-foreground z-10\"\r\n onClick={handleDismissNotification}\r\n >\r\n <X className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">Close</span>\r\n </Button>\r\n\r\n <div className=\"flex items-start gap-3 mb-4 w-full\">\r\n <div className=\"relative h-10 w-10 shrink-0 overflow-hidden rounded-full ring-2 ring-background dark:ring-zinc-800\">\r\n <img src={logoSrc} alt=\"AI\" className=\"object-cover h-full w-full\" />\r\n </div>\r\n <div className=\"flex flex-col pt-0.5\">\r\n <h3 className=\"font-bold text-sm leading-tight text-foreground\">{title}</h3>\r\n <div className=\"flex items-center gap-1.5 mt-0.5\">\r\n <span className=\"relative flex h-2 w-2\">\r\n <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75\"></span>\r\n <span className=\"relative inline-flex rounded-full h-2 w-2 bg-green-500\"></span>\r\n </span>\r\n <span className=\"text-xs text-muted-foreground font-medium\">Online</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"w-full text-left\">\r\n <p className=\"text-sm font-medium text-foreground leading-snug\">\r\n {welcomeMessage}\r\n </p>\r\n <p className=\"text-sm text-muted-foreground leading-relaxed mt-2\">\r\n {description}\r\n </p>\r\n <Button \r\n className=\"w-full mt-4 h-10 rounded-lg bg-[#535bf2] hover:bg-[#464ec9] text-white shadow-sm transition-all duration-200 font-medium\"\r\n onClick={() => setIsChatOpen(true)}\r\n >\r\n Start chatting\r\n </Button>\r\n </div>\r\n </MovingBorderButton>\r\n \r\n {/* Triangle Tail */}\r\n <div className=\"absolute -bottom-2 right-6 w-4 h-4 bg-background dark:bg-zinc-900 border-b border-r dark:border-zinc-800 transform rotate-45 z-0\"></div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <ExpandableChat\r\n size=\"lg\"\r\n position=\"bottom-right\"\r\n isOpen={isChatOpen}\r\n onOpenChange={setIsChatOpen}\r\n icon={<div className=\"relative h-full w-full overflow-hidden rounded-full\"><img src={logoSrc} alt=\"AI\" className=\"object-cover h-full w-full\" /></div>}\r\n >\r\n <ExpandableChatHeader className=\"bg-muted/40 flex-col text-center justify-center border-b p-4 relative\">\r\n <h1 className=\"text-xl font-semibold flex items-center justify-center gap-2\"> \r\n {title} \r\n <Sparkles className=\"h-4 w-4 text-yellow-500 fill-yellow-500\" />\r\n </h1>\r\n <p className=\"text-sm text-muted-foreground flex items-center justify-center gap-1.5 pt-1\">\r\n <span className=\"flex h-2 w-2 rounded-full bg-green-500 animate-pulse\"></span>\r\n Online and ready to help\r\n </p>\r\n <Button \r\n variant=\"ghost\" \r\n size=\"icon\" \r\n className=\"absolute top-3 left-3 h-8 w-8 text-muted-foreground hover:text-foreground hover:bg-muted/50 sm:top-5 sm:right-5 sm:left-auto\"\r\n onClick={handleReset}\r\n title=\"Reset Chat\"\r\n >\r\n <RefreshCcw className=\"h-4 w-4\" />\r\n </Button>\r\n </ExpandableChatHeader>\r\n\r\n <ExpandableChatBody className=\"bg-background/50\">\r\n {messages.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center h-full p-6 text-center animate-in fade-in duration-500\">\r\n <div className=\"bg-background rounded-full p-4 mb-6 shadow-md ring-1 ring-border/50\">\r\n <div className=\"relative w-16 h-16 overflow-hidden rounded-full\">\r\n <img src={logoSrc} alt=\"AI Logo\" className=\"object-cover w-full h-full\" />\r\n </div>\r\n </div>\r\n <h2 className=\"text-2xl font-bold mb-2 tracking-tight\">{title}</h2>\r\n <p className=\"text-muted-foreground text-sm\">Welcome to {title} 💛</p>\r\n </div>\r\n ) : (\r\n <ChatMessageList>\r\n {messages.map((message) => (\r\n <ChatBubble\r\n key={message.id}\r\n variant={message.role === \"user\" ? \"sent\" : \"received\"}\r\n >\r\n <ChatBubbleAvatar\r\n className=\"h-8 w-8 shrink-0\"\r\n src={\r\n message.role === \"user\"\r\n ? undefined\r\n : logoSrc\r\n }\r\n fallback={message.role === \"user\" ? <User className=\"h-4 w-4\" /> : \"AI\"}\r\n />\r\n <ChatBubbleMessage\r\n variant={message.role === \"user\" ? \"sent\" : \"received\"}\r\n >\r\n {message.role === \"user\" ? (\r\n message.content\r\n ) : (\r\n <div className={cn(\r\n \"prose dark:prose-invert text-sm break-words leading-normal max-w-none\",\r\n \"prose-p:m-0 prose-ul:m-0 prose-ol:m-0 prose-li:m-0\"\r\n )}>\r\n <ReactMarkdown \r\n remarkPlugins={[remarkGfm]}\r\n components={{\r\n ul: ({node, ...props}: any) => <ul className=\"list-disc pl-4 my-1\" {...props} />,\r\n ol: ({node, ...props}: any) => <ol className=\"list-decimal pl-4 my-1\" {...props} />,\r\n li: ({node, ...props}: any) => <li className=\"my-0.5 pl-1\" {...props} />,\r\n p: ({node, ...props}: any) => <p className=\"mb-2 last:mb-0\" {...props} />,\r\n strong: ({node, ...props}: any) => <span className=\"font-bold text-foreground\" {...props} />,\r\n a: ({node, href, children, ...props}: any) => (\r\n <a \r\n href={href}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"font-semibold text-blue-600 hover:text-blue-500 dark:text-blue-400 dark:hover:text-blue-300 hover:underline transition-colors break-all\"\r\n {...props}\r\n >\r\n {children}\r\n </a>\r\n ),\r\n }}\r\n >\r\n {message.content}\r\n </ReactMarkdown>\r\n </div>\r\n )}\r\n </ChatBubbleMessage>\r\n </ChatBubble>\r\n ))}\r\n\r\n\r\n {isLoading && (\r\n <ChatBubble variant=\"received\">\r\n <ChatBubbleAvatar\r\n className=\"h-8 w-8 shrink-0\"\r\n src={logoSrc}\r\n fallback=\"AI\"\r\n />\r\n <ChatBubbleMessage className=\"bg-transparent p-0 flex items-center gap-2\">\r\n <Sparkles className=\"h-4 w-4 text-foreground/50\" />\r\n <ShiningText text=\"AI Assistant thinking...\" />\r\n </ChatBubbleMessage>\r\n </ChatBubble>\r\n )}\r\n </ChatMessageList>\r\n )}\r\n </ExpandableChatBody>\r\n\r\n <ExpandableChatFooter className=\"bg-muted/40 p-3\">\r\n <form\r\n onSubmit={handleSubmit}\r\n className=\"relative rounded-3xl border bg-background focus-within:ring-1 focus-within:ring-ring p-1 shadow-sm\"\r\n >\r\n <ChatInput\r\n value={input}\r\n onChange={(e) => setInput(e.target.value)}\r\n placeholder=\"Message...\"\r\n rows={1}\r\n className=\"min-h-0 h-auto max-h-32 resize-none rounded-2xl bg-background border-0 px-3 py-2.5 shadow-none focus-visible:ring-0 text-base sm:text-sm\"\r\n onKeyDown={(e) => {\r\n if(e.key === \"Enter\" && !e.shiftKey) {\r\n e.preventDefault();\r\n handleSubmit(e as unknown as FormEvent);\r\n }\r\n }}\r\n />\r\n <div className=\"flex items-center justify-between px-2 pb-1\">\r\n <div className=\"flex items-center gap-2\">\r\n {/* Tools or other actions can go here */}\r\n </div>\r\n <Button \r\n type=\"submit\" \r\n size=\"icon\" \r\n className=\"h-8 w-8 rounded-full transition-all duration-200\" \r\n disabled={!input.trim() || isLoading}\r\n >\r\n {isLoading ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Send className=\"h-4 w-4\" />}\r\n <span className=\"sr-only\">Send</span>\r\n </Button>\r\n </div>\r\n </form>\r\n <div className=\"mt-2 text-center flex flex-col items-center justify-center gap-0.5\">\r\n <span className=\"text-[10px] text-muted-foreground/60\">\r\n Powered by <a href=\"#\" className=\"hover:underline hover:text-primary transition-colors\">ChatUI</a>\r\n </span>\r\n </div>\r\n </ExpandableChatFooter>\r\n </ExpandableChat>\r\n </>\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { Slot } from '@radix-ui/react-slot'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\n\r\nimport { cn } from '../../lib/utils'\r\n\r\nconst buttonVariants = cva(\r\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all cursor-pointer disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\r\n {\r\n variants: {\r\n variant: {\r\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\r\n destructive:\r\n 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\r\n outline:\r\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\r\n secondary:\r\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\r\n ghost:\r\n 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\r\n link: 'text-primary underline-offset-4 hover:underline',\r\n },\r\n size: {\r\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\r\n sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\r\n lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\r\n icon: 'size-9',\r\n 'icon-sm': 'size-8',\r\n 'icon-lg': 'size-10',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n },\r\n)\r\n\r\nfunction Button({\r\n className,\r\n variant,\r\n size,\r\n asChild = false,\r\n ...props\r\n}: React.ComponentProps<'button'> &\r\n VariantProps<typeof buttonVariants> & {\r\n asChild?: boolean\r\n }) {\r\n const Comp = asChild ? Slot : 'button'\r\n\r\n return (\r\n <Comp\r\n data-slot=\"button\"\r\n className={cn(buttonVariants({ variant, size, className }))}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Button, buttonVariants }\r\n","import { clsx, type ClassValue } from 'clsx'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs))\r\n}\r\n","'use client'\r\n\r\nimport * as React from 'react'\r\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\r\n\r\nimport { cn } from '../../lib/utils'\r\n\r\nfunction Avatar({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof AvatarPrimitive.Root>) {\r\n return (\r\n <AvatarPrimitive.Root\r\n data-slot=\"avatar\"\r\n className={cn(\r\n 'relative flex size-8 shrink-0 overflow-hidden rounded-full',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction AvatarImage({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\r\n return (\r\n <AvatarPrimitive.Image\r\n data-slot=\"avatar-image\"\r\n className={cn('aspect-square size-full', className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nfunction AvatarFallback({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\r\n return (\r\n <AvatarPrimitive.Fallback\r\n data-slot=\"avatar-fallback\"\r\n className={cn(\r\n 'bg-muted flex size-full items-center justify-center rounded-full',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Avatar, AvatarImage, AvatarFallback }\r\n","\r\nfunction MessageLoading() {\r\n return (\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n className=\"text-foreground\"\r\n >\r\n <circle cx=\"4\" cy=\"12\" r=\"2\" fill=\"currentColor\">\r\n <animate\r\n id=\"spinner_qFRN\"\r\n begin=\"0;spinner_OcgL.end+0.25s\"\r\n attributeName=\"cy\"\r\n calcMode=\"spline\"\r\n dur=\"0.6s\"\r\n values=\"12;6;12\"\r\n keySplines=\".33,.66,.66,1;.33,0,.66,.33\"\r\n />\r\n </circle>\r\n <circle cx=\"12\" cy=\"12\" r=\"2\" fill=\"currentColor\">\r\n <animate\r\n begin=\"spinner_qFRN.begin+0.1s\"\r\n attributeName=\"cy\"\r\n calcMode=\"spline\"\r\n dur=\"0.6s\"\r\n values=\"12;6;12\"\r\n keySplines=\".33,.66,.66,1;.33,0,.66,.33\"\r\n />\r\n </circle>\r\n <circle cx=\"20\" cy=\"12\" r=\"2\" fill=\"currentColor\">\r\n <animate\r\n id=\"spinner_OcgL\"\r\n begin=\"spinner_qFRN.begin+0.2s\"\r\n attributeName=\"cy\"\r\n calcMode=\"spline\"\r\n dur=\"0.6s\"\r\n values=\"12;6;12\"\r\n keySplines=\".33,.66,.66,1;.33,0,.66,.33\"\r\n />\r\n </circle>\r\n </svg>\r\n );\r\n}\r\n\r\nexport { MessageLoading };\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { cn } from \"../../lib/utils\"\r\nimport { Avatar, AvatarFallback, AvatarImage } from \"./avatar\"\r\nimport { Button } from \"./button\"\r\nimport { MessageLoading } from \"./message-loading\";\r\n\r\ninterface ChatBubbleProps {\r\n variant?: \"sent\" | \"received\"\r\n layout?: \"default\" | \"ai\"\r\n className?: string\r\n children: React.ReactNode\r\n}\r\n\r\nexport function ChatBubble({\r\n variant = \"received\",\r\n layout = \"default\",\r\n className,\r\n children,\r\n}: ChatBubbleProps) {\r\n return (\r\n <div\r\n className={cn(\r\n \"flex items-start gap-2 mb-4\",\r\n variant === \"sent\" && \"flex-row-reverse\",\r\n className,\r\n )}\r\n >\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\ninterface ChatBubbleMessageProps {\r\n variant?: \"sent\" | \"received\"\r\n isLoading?: boolean\r\n className?: string\r\n children?: React.ReactNode\r\n}\r\n\r\nexport function ChatBubbleMessage({\r\n variant = \"received\",\r\n isLoading,\r\n className,\r\n children,\r\n}: ChatBubbleMessageProps) {\r\n return (\r\n <div\r\n className={cn(\r\n \"rounded-[1.25rem] px-4 py-2 text-sm max-w-[85%]\",\r\n variant === \"sent\" ? \"bg-primary text-primary-foreground\" : \"bg-muted\",\r\n className\r\n )}\r\n >\r\n {isLoading ? (\r\n <div className=\"flex items-center space-x-2\">\r\n <MessageLoading />\r\n </div>\r\n ) : (\r\n children\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\ninterface ChatBubbleAvatarProps {\r\n src?: string\r\n fallback?: React.ReactNode\r\n className?: string\r\n}\r\n\r\nexport function ChatBubbleAvatar({\r\n src,\r\n fallback = \"AI\",\r\n className,\r\n}: ChatBubbleAvatarProps) {\r\n return (\r\n <Avatar className={cn(\"h-8 w-8\", className)}>\r\n {src && <AvatarImage src={src} />}\r\n <AvatarFallback>{fallback}</AvatarFallback>\r\n </Avatar>\r\n )\r\n}\r\n\r\ninterface ChatBubbleActionProps {\r\n icon?: React.ReactNode\r\n onClick?: () => void\r\n className?: string\r\n}\r\n\r\nexport function ChatBubbleAction({\r\n icon,\r\n onClick,\r\n className,\r\n}: ChatBubbleActionProps) {\r\n return (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className={cn(\"h-6 w-6\", className)}\r\n onClick={onClick}\r\n >\r\n {icon}\r\n </Button>\r\n )\r\n}\r\n\r\nexport function ChatBubbleActionWrapper({\r\n className,\r\n children,\r\n}: {\r\n className?: string\r\n children: React.ReactNode\r\n}) {\r\n return (\r\n <div className={cn(\"flex items-center gap-1 mt-2\", className)}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n","import * as React from \"react\";\r\nimport { Textarea } from \"./textarea\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\ninterface ChatInputProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement>{}\r\n\r\nconst ChatInput = React.forwardRef<HTMLTextAreaElement, ChatInputProps>(\r\n ({ className, ...props }, ref) => (\r\n <Textarea\r\n autoComplete=\"off\"\r\n ref={ref}\r\n name=\"message\"\r\n className={cn(\r\n \"max-h-12 px-4 py-3 bg-background text-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 w-full rounded-md flex items-center h-16 resize-none\",\r\n className,\r\n )}\r\n {...props}\r\n />\r\n ),\r\n);\r\nChatInput.displayName = \"ChatInput\";\r\n\r\nexport { ChatInput };\r\n","import * as React from 'react'\r\n\r\nimport { cn } from '../../lib/utils'\r\n\r\nfunction Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {\r\n return (\r\n <textarea\r\n data-slot=\"textarea\"\r\n className={cn(\r\n 'border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Textarea }\r\n","\"use client\";\r\n\r\nimport React, { useRef, useState } from \"react\";\r\nimport { X, MessageCircle } from \"lucide-react\";\r\nimport { cn } from \"../../lib/utils\";\r\nimport { Button } from \"./button\";\r\n\r\nexport type ChatPosition = \"bottom-right\" | \"bottom-left\";\r\nexport type ChatSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\r\n\r\nconst chatConfig = {\r\n dimensions: {\r\n sm: \"sm:max-w-sm sm:max-h-[500px]\",\r\n md: \"sm:max-w-md sm:max-h-[600px]\",\r\n lg: \"sm:max-w-lg sm:max-h-[700px]\",\r\n xl: \"sm:max-w-xl sm:max-h-[800px]\",\r\n full: \"sm:w-full sm:h-full\",\r\n },\r\n positions: {\r\n \"bottom-right\": \"bottom-5 right-5\",\r\n \"bottom-left\": \"bottom-5 left-5\",\r\n },\r\n chatPositions: {\r\n \"bottom-right\": \"sm:bottom-[calc(100%+10px)] sm:right-0\",\r\n \"bottom-left\": \"sm:bottom-[calc(100%+10px)] sm:left-0\",\r\n },\r\n states: {\r\n open: \"pointer-events-auto opacity-100 visible scale-100 translate-y-0\",\r\n closed:\r\n \"pointer-events-none opacity-0 invisible scale-100 sm:translate-y-5\",\r\n },\r\n};\r\n\r\ninterface ExpandableChatProps extends React.HTMLAttributes<HTMLDivElement> {\r\n position?: ChatPosition;\r\n size?: ChatSize;\r\n icon?: React.ReactNode;\r\n isOpen?: boolean;\r\n onOpenChange?: (isOpen: boolean) => void;\r\n}\r\n\r\nconst ExpandableChat: React.FC<ExpandableChatProps> = ({\r\n className,\r\n position = \"bottom-right\",\r\n size = \"md\",\r\n icon,\r\n children,\r\n isOpen: controlledIsOpen,\r\n onOpenChange,\r\n ...props\r\n}) => {\r\n const [internalIsOpen, setInternalIsOpen] = useState(false);\r\n const isControlled = controlledIsOpen !== undefined;\r\n const isOpen = isControlled ? controlledIsOpen : internalIsOpen;\r\n const chatRef = useRef<HTMLDivElement>(null);\r\n\r\n const toggleChat = () => {\r\n const newState = !isOpen;\r\n if (isControlled && onOpenChange) {\r\n onOpenChange(newState);\r\n } else {\r\n setInternalIsOpen(newState);\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n className={cn(`fixed ${chatConfig.positions[position]} z-[9999]`, className)}\r\n {...props}\r\n >\r\n <div\r\n ref={chatRef}\r\n className={cn(\r\n \"flex flex-col bg-background dark:bg-zinc-900 shadow-md overflow-hidden transition-all duration-250 ease-out\",\r\n \"fixed inset-0 w-full h-full\",\r\n \"sm:absolute sm:rounded-lg sm:w-[90vw] sm:h-[80vh] sm:inset-auto\",\r\n chatConfig.chatPositions[position],\r\n chatConfig.dimensions[size],\r\n isOpen ? chatConfig.states.open : chatConfig.states.closed,\r\n className,\r\n )}\r\n >\r\n {children}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"absolute top-2 right-2 sm:hidden\"\r\n onClick={toggleChat}\r\n >\r\n <X className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n <ExpandableChatToggle\r\n icon={icon}\r\n isOpen={isOpen}\r\n toggleChat={toggleChat}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nExpandableChat.displayName = \"ExpandableChat\";\r\n\r\nconst ExpandableChatHeader: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\r\n className,\r\n ...props\r\n}) => (\r\n <div\r\n className={cn(\"flex items-center justify-between p-4 border-b\", className)}\r\n {...props}\r\n />\r\n);\r\n\r\nExpandableChatHeader.displayName = \"ExpandableChatHeader\";\r\n\r\nconst ExpandableChatBody: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\r\n className,\r\n ...props\r\n}) => <div className={cn(\"flex-grow overflow-y-auto\", className)} {...props} />;\r\n\r\nExpandableChatBody.displayName = \"ExpandableChatBody\";\r\n\r\nconst ExpandableChatFooter: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\r\n className,\r\n ...props\r\n}) => <div className={cn(\"border-t p-4\", className)} {...props} />;\r\n\r\nExpandableChatFooter.displayName = \"ExpandableChatFooter\";\r\n\r\ninterface ExpandableChatToggleProps\r\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n icon?: React.ReactNode;\r\n isOpen: boolean;\r\n toggleChat: () => void;\r\n}\r\n\r\nconst ExpandableChatToggle: React.FC<ExpandableChatToggleProps> = ({\r\n className,\r\n icon,\r\n isOpen,\r\n toggleChat,\r\n ...props\r\n}) => (\r\n <Button\r\n variant=\"default\"\r\n onClick={toggleChat}\r\n className={cn(\r\n \"w-16 h-16 rounded-full shadow-md flex items-center justify-center hover:shadow-lg hover:shadow-black/30 transition-all duration-300 p-0 ring-0 shrink-0\",\r\n !isOpen ? \"!bg-transparent !border-0\" : \"\",\r\n isOpen ? \"hidden sm:flex\" : \"flex\",\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {isOpen ? (\r\n <X className=\"h-6 w-6\" />\r\n ) : (\r\n icon || <MessageCircle className=\"h-6 w-6\" />\r\n )}\r\n </Button>\r\n);\r\n\r\nExpandableChatToggle.displayName = \"ExpandableChatToggle\";\r\n\r\nexport {\r\n ExpandableChat,\r\n ExpandableChatHeader,\r\n ExpandableChatBody,\r\n ExpandableChatFooter,\r\n};\r\n","import * as React from \"react\";\r\nimport { ArrowDown } from \"lucide-react\";\r\nimport { Button } from \"./button\";\r\nimport { useAutoScroll } from \"../hooks/use-auto-scroll\";\r\n\r\ninterface ChatMessageListProps extends React.HTMLAttributes<HTMLDivElement> {\r\n smooth?: boolean;\r\n}\r\n\r\nconst ChatMessageList = React.forwardRef<HTMLDivElement, ChatMessageListProps>(\r\n ({ className, children, smooth = false, ...props }, _ref) => {\r\n const {\r\n scrollRef,\r\n isAtBottom,\r\n autoScrollEnabled,\r\n scrollToBottom,\r\n disableAutoScroll,\r\n } = useAutoScroll({\r\n smooth,\r\n content: children,\r\n });\r\n\r\n return (\r\n <div className=\"relative w-full h-full\">\r\n <div\r\n className={`flex flex-col w-full h-full p-4 overflow-y-auto ${className}`}\r\n ref={scrollRef}\r\n onWheel={disableAutoScroll}\r\n onTouchMove={disableAutoScroll}\r\n {...props}\r\n >\r\n <div className=\"flex flex-col gap-6\">{children}</div>\r\n </div>\r\n\r\n {!isAtBottom && (\r\n <Button\r\n onClick={() => {\r\n scrollToBottom();\r\n }}\r\n size=\"icon\"\r\n variant=\"outline\"\r\n className=\"absolute bottom-2 left-1/2 transform -translate-x-1/2 inline-flex rounded-full shadow-md\"\r\n aria-label=\"Scroll to bottom\"\r\n >\r\n <ArrowDown className=\"h-4 w-4\" />\r\n </Button>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nChatMessageList.displayName = \"ChatMessageList\";\r\n\r\nexport { ChatMessageList };\r\n","// @hidden\r\nimport { useCallback, useEffect, useRef, useState } from \"react\";\r\n\r\ninterface ScrollState {\r\n isAtBottom: boolean;\r\n autoScrollEnabled: boolean;\r\n}\r\n\r\ninterface UseAutoScrollOptions {\r\n offset?: number;\r\n smooth?: boolean;\r\n content?: React.ReactNode;\r\n}\r\n\r\nexport function useAutoScroll(options: UseAutoScrollOptions = {}) {\r\n const { offset = 20, smooth = false, content } = options;\r\n const scrollRef = useRef<HTMLDivElement>(null);\r\n const lastContentHeight = useRef(0);\r\n const userHasScrolled = useRef(false);\r\n\r\n const [scrollState, setScrollState] = useState<ScrollState>({\r\n isAtBottom: true,\r\n autoScrollEnabled: true,\r\n });\r\n\r\n const checkIsAtBottom = useCallback(\r\n (element: HTMLElement) => {\r\n const { scrollTop, scrollHeight, clientHeight } = element;\r\n const distanceToBottom = Math.abs(\r\n scrollHeight - scrollTop - clientHeight\r\n );\r\n return distanceToBottom <= offset;\r\n },\r\n [offset]\r\n );\r\n\r\n const scrollToBottom = useCallback(\r\n (instant?: boolean) => {\r\n if (!scrollRef.current) return;\r\n\r\n const targetScrollTop =\r\n scrollRef.current.scrollHeight - scrollRef.current.clientHeight;\r\n\r\n if (instant) {\r\n scrollRef.current.scrollTop = targetScrollTop;\r\n } else {\r\n scrollRef.current.scrollTo({\r\n top: targetScrollTop,\r\n behavior: smooth ? \"smooth\" : \"auto\",\r\n });\r\n }\r\n\r\n setScrollState({\r\n isAtBottom: true,\r\n autoScrollEnabled: true,\r\n });\r\n userHasScrolled.current = false;\r\n },\r\n [smooth]\r\n );\r\n\r\n const handleScroll = useCallback(() => {\r\n if (!scrollRef.current) return;\r\n\r\n const atBottom = checkIsAtBottom(scrollRef.current);\r\n\r\n setScrollState((prev) => ({\r\n isAtBottom: atBottom,\r\n // Re-enable auto-scroll if at the bottom\r\n autoScrollEnabled: atBottom ? true : prev.autoScrollEnabled,\r\n }));\r\n }, [checkIsAtBottom]);\r\n\r\n useEffect(() => {\r\n const element = scrollRef.current;\r\n if (!element) return;\r\n\r\n element.addEventListener(\"scroll\", handleScroll, { passive: true });\r\n return () => element.removeEventListener(\"scroll\", handleScroll);\r\n }, [handleScroll]);\r\n\r\n useEffect(() => {\r\n const scrollElement = scrollRef.current;\r\n if (!scrollElement) return;\r\n\r\n const currentHeight = scrollElement.scrollHeight;\r\n const hasNewContent = currentHeight !== lastContentHeight.current;\r\n\r\n if (hasNewContent) {\r\n if (scrollState.autoScrollEnabled) {\r\n requestAnimationFrame(() => {\r\n scrollToBottom(lastContentHeight.current === 0);\r\n });\r\n }\r\n lastContentHeight.current = currentHeight;\r\n }\r\n }, [content, scrollState.autoScrollEnabled, scrollToBottom]);\r\n\r\n useEffect(() => {\r\n const element = scrollRef.current;\r\n if (!element) return;\r\n\r\n const resizeObserver = new ResizeObserver(() => {\r\n if (scrollState.autoScrollEnabled) {\r\n scrollToBottom(true);\r\n }\r\n });\r\n\r\n resizeObserver.observe(element);\r\n return () => resizeObserver.disconnect();\r\n }, [scrollState.autoScrollEnabled, scrollToBottom]);\r\n\r\n const disableAutoScroll = useCallback(() => {\r\n const atBottom = scrollRef.current\r\n ? checkIsAtBottom(scrollRef.current)\r\n : false;\r\n\r\n // Only disable if not at bottom\r\n if (!atBottom) {\r\n userHasScrolled.current = true;\r\n setScrollState((prev) => ({\r\n ...prev,\r\n autoScrollEnabled: false,\r\n }));\r\n }\r\n }, [checkIsAtBottom]);\r\n\r\n return {\r\n scrollRef,\r\n isAtBottom: scrollState.isAtBottom,\r\n autoScrollEnabled: scrollState.autoScrollEnabled,\r\n scrollToBottom: () => scrollToBottom(false),\r\n disableAutoScroll,\r\n };\r\n}\r\n","\"use client\" \r\n\r\nimport * as React from \"react\"\r\nimport { motion } from \"framer-motion\";\r\n \r\ninterface ShiningTextProps {\r\n text: string;\r\n}\r\n\r\nexport function ShiningText({text}: ShiningTextProps) {\r\n return (\r\n <motion.div\r\n className=\"bg-[linear-gradient(110deg,#9ca3af,35%,#fff,50%,#9ca3af,75%,#9ca3af)] bg-[length:200%_100%] bg-clip-text text-sm text-transparent m-0 inline-block\"\r\n initial={{ backgroundPosition: \"200% 0\" }}\r\n animate={{ backgroundPosition: \"-200% 0\" }}\r\n transition={{\r\n repeat: Infinity,\r\n duration: 2,\r\n ease: \"linear\",\r\n }}\r\n >\r\n {text}\r\n </motion.div>\r\n );\r\n}\r\n","\"use client\";\r\nimport React from \"react\";\r\nimport {\r\n motion,\r\n useAnimationFrame,\r\n useMotionTemplate,\r\n useMotionValue,\r\n useTransform,\r\n} from \"framer-motion\";\r\nimport { useRef } from \"react\";\r\nimport { cn } from \"../../lib/utils\";\r\n\r\nexport function Button({\r\n borderRadius = \"1.75rem\",\r\n children,\r\n as: Component = \"button\",\r\n containerClassName,\r\n borderClassName,\r\n duration,\r\n className,\r\n ...otherProps\r\n}: {\r\n borderRadius?: string;\r\n children: React.ReactNode;\r\n as?: any;\r\n containerClassName?: string;\r\n borderClassName?: string;\r\n duration?: number;\r\n className?: string;\r\n [key: string]: any;\r\n}) {\r\n return (\r\n <Component\r\n className={cn(\r\n \"bg-transparent relative text-xl h-16 w-40 p-[1px] overflow-hidden \",\r\n containerClassName\r\n )}\r\n style={{\r\n borderRadius: borderRadius,\r\n }}\r\n {...otherProps}\r\n >\r\n <div\r\n className=\"absolute inset-0\"\r\n style={{ borderRadius: `calc(${borderRadius} * 0.96)` }}\r\n >\r\n <MovingBorder duration={duration} rx=\"30%\" ry=\"30%\">\r\n <div\r\n className={cn(\r\n \"h-20 w-20 opacity-[0.8] bg-[radial-gradient(#0ea5e9_40%,transparent_60%)]\",\r\n borderClassName\r\n )}\r\n />\r\n </MovingBorder>\r\n </div>\r\n\r\n <div\r\n className={cn(\r\n \"relative bg-background border border-border backdrop-blur-xl text-foreground flex items-center justify-center w-full h-full text-sm antialiased\",\r\n className\r\n )}\r\n style={{\r\n borderRadius: `calc(${borderRadius} * 0.96)`,\r\n }}\r\n >\r\n {children}\r\n </div>\r\n </Component>\r\n );\r\n}\r\n\r\nexport const MovingBorder = ({\r\n children,\r\n duration = 2000,\r\n rx,\r\n ry,\r\n ...otherProps\r\n}: {\r\n children: React.ReactNode;\r\n duration?: number;\r\n rx?: string;\r\n ry?: string;\r\n [key: string]: any;\r\n}) => {\r\n const pathRef = useRef<SVGRectElement>(null);\r\n const progress = useMotionValue<number>(0);\r\n\r\n useAnimationFrame((time) => {\r\n const length = pathRef.current?.getTotalLength();\r\n if (length) {\r\n const pxPerMillisecond = length / duration;\r\n progress.set((time * pxPerMillisecond) % length);\r\n }\r\n });\r\n\r\n const x = useTransform(\r\n progress,\r\n (val) => pathRef.current?.getPointAtLength(val).x\r\n );\r\n const y = useTransform(\r\n progress,\r\n (val) => pathRef.current?.getPointAtLength(val).y\r\n );\r\n\r\n const transform = useMotionTemplate`translateX(${x}px) translateY(${y}px) translateX(-50%) translateY(-50%)`;\r\n\r\n return (\r\n <>\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n preserveAspectRatio=\"none\"\r\n className=\"absolute h-full w-full\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n {...otherProps}\r\n >\r\n <rect\r\n fill=\"none\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n rx={rx}\r\n ry={ry}\r\n ref={pathRef}\r\n />\r\n </svg>\r\n <motion.div\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n display: \"inline-block\",\r\n transform,\r\n }}\r\n >\r\n {children}\r\n </motion.div>\r\n </>\r\n );\r\n};\r\n"],"mappings":"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","names":["useState","useEffect","X","jsx","jsx","jsx","jsxs","jsx","jsx","jsx","jsxs","React","useRef","useState","jsx","jsxs","jsx","motion","useRef","jsx","jsxs","Button","useRef","motion","Fragment","jsx","jsxs","useState","useEffect","e","Button","X"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dmanikanta17/chat-ui-react",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Reusable Chat UI React Component",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",