@dmanikanta17/chat-ui-react 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +13 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +1073 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1042 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +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"]}
|