@rodrigocoliveira/agno-react 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +363 -83
- package/dist/components/GenerativeUIRenderer.d.ts +21 -0
- package/dist/components/GenerativeUIRenderer.d.ts.map +1 -0
- package/dist/context/AgnoContext.d.ts +16 -0
- package/dist/context/AgnoContext.d.ts.map +1 -0
- package/dist/context/ToolHandlerContext.d.ts +44 -0
- package/dist/context/ToolHandlerContext.d.ts.map +1 -0
- package/dist/hooks/useAgnoActions.d.ts +25 -0
- package/dist/hooks/useAgnoActions.d.ts.map +1 -0
- package/dist/hooks/useAgnoChat.d.ts +22 -0
- package/dist/hooks/useAgnoChat.d.ts.map +1 -0
- package/dist/hooks/useAgnoCustomEvents.d.ts +38 -0
- package/dist/hooks/useAgnoCustomEvents.d.ts.map +1 -0
- package/dist/hooks/useAgnoEvals.d.ts +39 -0
- package/dist/hooks/useAgnoEvals.d.ts.map +1 -0
- package/dist/hooks/useAgnoKnowledge.d.ts +56 -0
- package/dist/hooks/useAgnoKnowledge.d.ts.map +1 -0
- package/dist/hooks/useAgnoMemory.d.ts +42 -0
- package/dist/hooks/useAgnoMemory.d.ts.map +1 -0
- package/dist/hooks/useAgnoMetrics.d.ts +51 -0
- package/dist/hooks/useAgnoMetrics.d.ts.map +1 -0
- package/dist/hooks/useAgnoSession.d.ts +38 -0
- package/dist/hooks/useAgnoSession.d.ts.map +1 -0
- package/dist/hooks/useAgnoToolExecution.d.ts +70 -0
- package/dist/hooks/useAgnoToolExecution.d.ts.map +1 -0
- package/dist/hooks/useAgnoTraces.d.ts +51 -0
- package/dist/hooks/useAgnoTraces.d.ts.map +1 -0
- package/dist/index.d.ts +27 -723
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +932 -1052
- package/dist/index.js.map +24 -0
- package/dist/index.mjs +816 -909
- package/dist/index.mjs.map +24 -0
- package/dist/ui/components/artifact.d.ts +24 -0
- package/dist/ui/components/artifact.d.ts.map +1 -0
- package/dist/ui/components/audio-recorder.d.ts +32 -0
- package/dist/ui/components/audio-recorder.d.ts.map +1 -0
- package/dist/ui/components/code-block.d.ts +15 -0
- package/dist/ui/components/code-block.d.ts.map +1 -0
- package/dist/ui/components/conversation.d.ts +17 -0
- package/dist/ui/components/conversation.d.ts.map +1 -0
- package/dist/ui/components/file-preview-card.d.ts +13 -0
- package/dist/ui/components/file-preview-card.d.ts.map +1 -0
- package/dist/ui/components/file-preview-modal.d.ts +8 -0
- package/dist/ui/components/file-preview-modal.d.ts.map +1 -0
- package/dist/ui/components/image-lightbox.d.ts +12 -0
- package/dist/ui/components/image-lightbox.d.ts.map +1 -0
- package/dist/ui/components/message.d.ts +19 -0
- package/dist/ui/components/message.d.ts.map +1 -0
- package/dist/ui/components/prompt-input/attachments.d.ts +21 -0
- package/dist/ui/components/prompt-input/attachments.d.ts.map +1 -0
- package/dist/ui/components/prompt-input/buttons.d.ts +19 -0
- package/dist/ui/components/prompt-input/buttons.d.ts.map +1 -0
- package/dist/ui/components/prompt-input/command.d.ts +17 -0
- package/dist/ui/components/prompt-input/command.d.ts.map +1 -0
- package/dist/ui/components/prompt-input/context.d.ts +36 -0
- package/dist/ui/components/prompt-input/context.d.ts.map +1 -0
- package/dist/ui/components/prompt-input/drop-zone.d.ts +7 -0
- package/dist/ui/components/prompt-input/drop-zone.d.ts.map +1 -0
- package/dist/ui/components/prompt-input/footer.d.ts +11 -0
- package/dist/ui/components/prompt-input/footer.d.ts.map +1 -0
- package/dist/ui/components/prompt-input/index.d.ts +25 -0
- package/dist/ui/components/prompt-input/index.d.ts.map +1 -0
- package/dist/ui/components/prompt-input/model-select.d.ts +13 -0
- package/dist/ui/components/prompt-input/model-select.d.ts.map +1 -0
- package/dist/ui/components/prompt-input/prompt-input.d.ts +22 -0
- package/dist/ui/components/prompt-input/prompt-input.d.ts.map +1 -0
- package/dist/ui/components/prompt-input/provider.d.ts +6 -0
- package/dist/ui/components/prompt-input/provider.d.ts.map +1 -0
- package/dist/ui/components/prompt-input/speech.d.ts +51 -0
- package/dist/ui/components/prompt-input/speech.d.ts.map +1 -0
- package/dist/ui/components/prompt-input/tabs.d.ts +12 -0
- package/dist/ui/components/prompt-input/tabs.d.ts.map +1 -0
- package/dist/ui/components/prompt-input/textarea.d.ts +5 -0
- package/dist/ui/components/prompt-input/textarea.d.ts.map +1 -0
- package/dist/ui/components/response.d.ts +5 -0
- package/dist/ui/components/response.d.ts.map +1 -0
- package/dist/ui/components/smart-timestamp.d.ts +8 -0
- package/dist/ui/components/smart-timestamp.d.ts.map +1 -0
- package/dist/ui/components/streaming-indicator.d.ts +8 -0
- package/dist/ui/components/streaming-indicator.d.ts.map +1 -0
- package/dist/ui/components/tool.d.ts +24 -0
- package/dist/ui/components/tool.d.ts.map +1 -0
- package/dist/ui/composed/AgnoChatInput.d.ts +44 -0
- package/dist/ui/composed/AgnoChatInput.d.ts.map +1 -0
- package/dist/ui/composed/AgnoChatInterface.d.ts +49 -0
- package/dist/ui/composed/AgnoChatInterface.d.ts.map +1 -0
- package/dist/ui/composed/AgnoMessageItem.d.ts +38 -0
- package/dist/ui/composed/AgnoMessageItem.d.ts.map +1 -0
- package/dist/ui/composed/agno-chat/agno-chat.d.ts +9 -0
- package/dist/ui/composed/agno-chat/agno-chat.d.ts.map +1 -0
- package/dist/ui/composed/agno-chat/context.d.ts +33 -0
- package/dist/ui/composed/agno-chat/context.d.ts.map +1 -0
- package/dist/ui/composed/agno-chat/empty-state.d.ts +6 -0
- package/dist/ui/composed/agno-chat/empty-state.d.ts.map +1 -0
- package/dist/ui/composed/agno-chat/error-bar.d.ts +5 -0
- package/dist/ui/composed/agno-chat/error-bar.d.ts.map +1 -0
- package/dist/ui/composed/agno-chat/index.d.ts +33 -0
- package/dist/ui/composed/agno-chat/index.d.ts.map +1 -0
- package/dist/ui/composed/agno-chat/input.d.ts +39 -0
- package/dist/ui/composed/agno-chat/input.d.ts.map +1 -0
- package/dist/ui/composed/agno-chat/messages.d.ts +21 -0
- package/dist/ui/composed/agno-chat/messages.d.ts.map +1 -0
- package/dist/ui/composed/agno-chat/suggested-prompts.d.ts +7 -0
- package/dist/ui/composed/agno-chat/suggested-prompts.d.ts.map +1 -0
- package/dist/ui/composed/agno-chat/tool-status.d.ts +5 -0
- package/dist/ui/composed/agno-chat/tool-status.d.ts.map +1 -0
- package/dist/ui/composed/index.d.ts +9 -0
- package/dist/ui/composed/index.d.ts.map +1 -0
- package/dist/ui/index.d.ts +59 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/lib/cn.d.ts +3 -0
- package/dist/ui/lib/cn.d.ts.map +1 -0
- package/dist/ui/lib/file-utils.d.ts +20 -0
- package/dist/ui/lib/file-utils.d.ts.map +1 -0
- package/dist/ui/lib/format-timestamp.d.ts +16 -0
- package/dist/ui/lib/format-timestamp.d.ts.map +1 -0
- package/dist/ui/primitives/accordion.d.ts +8 -0
- package/dist/ui/primitives/accordion.d.ts.map +1 -0
- package/dist/ui/primitives/avatar.d.ts +7 -0
- package/dist/ui/primitives/avatar.d.ts.map +1 -0
- package/dist/ui/primitives/badge.d.ts +10 -0
- package/dist/ui/primitives/badge.d.ts.map +1 -0
- package/dist/ui/primitives/button.d.ts +12 -0
- package/dist/ui/primitives/button.d.ts.map +1 -0
- package/dist/ui/primitives/collapsible.d.ts +6 -0
- package/dist/ui/primitives/collapsible.d.ts.map +1 -0
- package/dist/ui/primitives/command.d.ts +79 -0
- package/dist/ui/primitives/command.d.ts.map +1 -0
- package/dist/ui/primitives/dialog.d.ts +26 -0
- package/dist/ui/primitives/dialog.d.ts.map +1 -0
- package/dist/ui/primitives/dropdown-menu.d.ts +28 -0
- package/dist/ui/primitives/dropdown-menu.d.ts.map +1 -0
- package/dist/ui/primitives/hover-card.d.ts +7 -0
- package/dist/ui/primitives/hover-card.d.ts.map +1 -0
- package/dist/ui/primitives/index.d.ts +16 -0
- package/dist/ui/primitives/index.d.ts.map +1 -0
- package/dist/ui/primitives/input-group.d.ts +17 -0
- package/dist/ui/primitives/input-group.d.ts.map +1 -0
- package/dist/ui/primitives/select.d.ts +14 -0
- package/dist/ui/primitives/select.d.ts.map +1 -0
- package/dist/ui/primitives/tooltip.d.ts +8 -0
- package/dist/ui/primitives/tooltip.d.ts.map +1 -0
- package/dist/ui/types.d.ts +56 -0
- package/dist/ui/types.d.ts.map +1 -0
- package/dist/ui.d.ts +2 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +4059 -0
- package/dist/ui.js.map +60 -0
- package/dist/ui.mjs +4044 -0
- package/dist/ui.mjs.map +60 -0
- package/dist/utils/component-registry.d.ts +63 -0
- package/dist/utils/component-registry.d.ts.map +1 -0
- package/dist/utils/ui-helpers.d.ts +165 -0
- package/dist/utils/ui-helpers.d.ts.map +1 -0
- package/package.json +122 -17
- package/LICENSE +0 -21
- package/dist/index.d.mts +0 -724
package/dist/ui.js.map
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/ui/lib/cn.ts", "../src/ui/lib/format-timestamp.ts", "../src/ui/lib/file-utils.ts", "../src/ui/primitives/button.tsx", "../src/ui/primitives/badge.tsx", "../src/ui/primitives/avatar.tsx", "../src/ui/primitives/input-group.tsx", "../src/ui/primitives/collapsible.tsx", "../src/ui/primitives/tooltip.tsx", "../src/ui/primitives/accordion.tsx", "../src/ui/primitives/dropdown-menu.tsx", "../src/ui/primitives/hover-card.tsx", "../src/ui/primitives/select.tsx", "../src/ui/primitives/command.tsx", "../src/ui/primitives/dialog.tsx", "../src/ui/components/message.tsx", "../src/ui/components/conversation.tsx", "../src/ui/components/response.tsx", "../src/ui/components/tool.tsx", "../src/ui/components/code-block.tsx", "../src/ui/components/artifact.tsx", "../src/ui/components/streaming-indicator.tsx", "../src/ui/components/audio-recorder.tsx", "../src/ui/components/smart-timestamp.tsx", "../src/ui/components/file-preview-card.tsx", "../src/ui/components/file-preview-modal.tsx", "../src/ui/components/image-lightbox.tsx", "../src/ui/components/prompt-input/context.ts", "../src/ui/components/prompt-input/provider.tsx", "../src/ui/components/prompt-input/prompt-input.tsx", "../src/ui/components/prompt-input/textarea.tsx", "../src/ui/components/prompt-input/attachments.tsx", "../src/ui/components/prompt-input/footer.tsx", "../src/ui/components/prompt-input/buttons.tsx", "../src/ui/components/prompt-input/drop-zone.tsx", "../src/ui/components/prompt-input/speech.tsx", "../src/ui/components/prompt-input/model-select.tsx", "../src/ui/components/prompt-input/tabs.tsx", "../src/ui/components/prompt-input/command.tsx", "../src/ui/composed/agno-chat/agno-chat.tsx", "../src/ui/composed/agno-chat/context.ts", "../src/ui/composed/agno-chat/messages.tsx", "../src/ui/composed/AgnoMessageItem.tsx", "../src/ui/composed/agno-chat/suggested-prompts.tsx", "../src/ui/composed/agno-chat/empty-state.tsx", "../src/ui/composed/agno-chat/tool-status.tsx", "../src/ui/composed/agno-chat/error-bar.tsx", "../src/ui/composed/AgnoChatInput.tsx", "../src/ui/composed/agno-chat/input.tsx", "../src/ui/composed/agno-chat/index.ts", "../src/ui/composed/AgnoChatInterface.tsx"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n",
|
|
6
|
+
"/**\n * Smart timestamp formatting utilities using Intl.DateTimeFormat (zero deps).\n */\n\n/**\n * Formats a date with smart relative context:\n * - Today: \"09:06 AM\"\n * - This year: \"Feb 19\"\n * - Other year: \"Feb 18, 2025\"\n */\nexport function formatSmartTimestamp(date: Date): string {\n const now = new Date();\n const isToday =\n date.getFullYear() === now.getFullYear() &&\n date.getMonth() === now.getMonth() &&\n date.getDate() === now.getDate();\n\n if (isToday) {\n return new Intl.DateTimeFormat(undefined, {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n }).format(date);\n }\n\n const isSameYear = date.getFullYear() === now.getFullYear();\n\n if (isSameYear) {\n return new Intl.DateTimeFormat(undefined, {\n month: 'short',\n day: 'numeric',\n }).format(date);\n }\n\n return new Intl.DateTimeFormat(undefined, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n }).format(date);\n}\n\n/**\n * Formats a full timestamp for tooltip display.\n * Always shows: \"Feb 19, 2026, 09:50 AM\"\n */\nexport function formatFullTimestamp(date: Date): string {\n return new Intl.DateTimeFormat(undefined, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n }).format(date);\n}\n",
|
|
7
|
+
"export type FilePreviewType = 'image' | 'pdf' | 'text' | 'video' | 'audio' | 'none';\n\n/**\n * Determines the preview type for a given MIME type.\n */\nexport function getFilePreviewType(mimeType?: string): FilePreviewType {\n if (!mimeType) return 'none';\n if (mimeType.startsWith('image/')) return 'image';\n if (mimeType === 'application/pdf') return 'pdf';\n if (mimeType.startsWith('text/')) return 'text';\n if (mimeType.startsWith('video/')) return 'video';\n if (mimeType.startsWith('audio/')) return 'audio';\n return 'none';\n}\n\n/**\n * Formats bytes into a human-readable file size string.\n * e.g. 2457600 => \"2.4 MB\"\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const value = bytes / Math.pow(k, i);\n return `${value % 1 === 0 ? value : value.toFixed(1)} ${units[i]}`;\n}\n\n/**\n * Extracts the file extension from a filename.\n * Optionally falls back to deriving extension from MIME type.\n */\nexport function getFileExtension(filename: string, mimeType?: string): string {\n const lastDot = filename.lastIndexOf('.');\n if (lastDot !== -1 && lastDot !== 0) {\n return filename.slice(lastDot + 1).toLowerCase();\n }\n // Fallback: derive from MIME type\n if (mimeType) {\n return extensionFromMime(mimeType);\n }\n return '';\n}\n\nconst mimeToExt: Record<string, string> = {\n 'application/pdf': 'pdf',\n 'application/zip': 'zip',\n 'application/x-rar-compressed': 'rar',\n 'application/json': 'json',\n 'application/xml': 'xml',\n 'application/msword': 'doc',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'application/vnd.ms-excel': 'xls',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',\n 'application/vnd.ms-powerpoint': 'ppt',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'pptx',\n 'text/csv': 'csv',\n 'text/plain': 'txt',\n 'text/html': 'html',\n 'text/css': 'css',\n 'text/javascript': 'js',\n};\n\nfunction extensionFromMime(mimeType: string): string {\n if (mimeToExt[mimeType]) return mimeToExt[mimeType];\n // Generic fallback: \"image/png\" -> \"png\", \"audio/mp3\" -> \"mp3\"\n const subtype = mimeType.split('/')[1];\n if (subtype && !subtype.includes('.') && !subtype.includes('+')) {\n return subtype.toLowerCase();\n }\n return '';\n}\n\n/**\n * Returns true if the MIME type is previewable in the browser.\n */\nexport function isPreviewable(mimeType?: string): boolean {\n const type = getFilePreviewType(mimeType);\n return type === 'image' || type === 'pdf';\n}\n",
|
|
8
|
+
"import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/cn';\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground shadow hover:bg-primary/90',\n destructive: 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90',\n outline: 'border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground',\n secondary: 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-9 px-4 py-2',\n sm: 'h-8 rounded-md px-3 text-xs',\n lg: 'h-10 rounded-md px-8',\n icon: 'h-9 w-9',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n return <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />;\n },\n);\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n",
|
|
9
|
+
"import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/cn';\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n {\n variants: {\n variant: {\n default: 'border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80',\n secondary: 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\n destructive: 'border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80',\n outline: 'text-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return <div className={cn(badgeVariants({ variant }), className)} {...props} />;\n}\n\nexport { Badge, badgeVariants };\n",
|
|
10
|
+
"import * as React from 'react';\nimport * as AvatarPrimitive from '@radix-ui/react-avatar';\nimport { cn } from '../lib/cn';\n\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn('relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full', className)}\n {...props}\n />\n));\nAvatar.displayName = AvatarPrimitive.Root.displayName;\n\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image ref={ref} className={cn('aspect-square h-full w-full', className)} {...props} />\n));\nAvatarImage.displayName = AvatarPrimitive.Image.displayName;\n\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn('flex h-full w-full items-center justify-center rounded-full bg-muted', className)}\n {...props}\n />\n));\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;\n\nexport { Avatar, AvatarImage, AvatarFallback };\n",
|
|
11
|
+
"import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/cn';\nimport { Button } from './button';\n\n// Inline Input primitive (not exported separately - only used by InputGroup)\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<'input'>>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n 'flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = 'Input';\n\n// Inline Textarea primitive (not exported separately - only used by InputGroup)\nconst Textarea = React.forwardRef<HTMLTextAreaElement, React.ComponentProps<'textarea'>>(\n ({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n 'flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nTextarea.displayName = 'Textarea';\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n 'group/input-group border-input dark:bg-input/30 shadow-xs relative flex w-full items-center rounded-md border outline-none transition-[color,box-shadow]',\n 'h-9 has-[>textarea]:h-auto',\n 'has-[>[data-align=inline-start]]:[&>input]:pl-2',\n 'has-[>[data-align=inline-end]]:[&>input]:pr-2',\n 'has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3',\n 'has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-2.5',\n 'has-[[data-slot=input-group-control]:focus-visible]:ring-ring has-[[data-slot=input-group-control]:focus-visible]:ring-1',\n 'has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[[data-slot][aria-invalid=true]]:border-destructive dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40',\n className,\n )}\n {...props}\n />\n );\n}\n\nconst inputGroupAddonVariants = cva(\n \"text-muted-foreground flex h-auto cursor-text select-none items-center justify-center gap-2 py-1.5 text-sm font-medium group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n align: {\n 'inline-start': 'order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]',\n 'inline-end': 'order-last pr-3 has-[>button]:mr-[-0.4rem] has-[>kbd]:mr-[-0.35rem]',\n 'block-start': '[.border-b]:pb-3 order-first w-full justify-start px-3 pt-2 pb-0 group-has-[>input]/input-group:pt-2.5',\n 'block-end': '[.border-t]:pt-3 order-last w-full justify-start px-3 pb-1.5 group-has-[>input]/input-group:pb-1.5',\n },\n },\n defaultVariants: {\n align: 'inline-start',\n },\n },\n);\n\nfunction InputGroupAddon({\n className,\n align = 'inline-start',\n ...props\n}: React.ComponentProps<'div'> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest('button')) {\n return;\n }\n e.currentTarget.parentElement?.querySelector('input')?.focus();\n }}\n {...props}\n />\n );\n}\n\nconst inputGroupButtonVariants = cva('flex items-center gap-2 text-sm shadow-none', {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-2 has-[>svg]:px-2 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: 'h-8 gap-1.5 rounded-md px-2.5 has-[>svg]:px-2.5',\n 'icon-xs': \"size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0\",\n 'icon-sm': 'size-8 p-0 has-[>svg]:p-0',\n },\n },\n defaultVariants: {\n size: 'xs',\n },\n});\n\nfunction InputGroupButton({\n className,\n type = 'button',\n variant = 'ghost',\n size = 'xs',\n ...props\n}: Omit<React.ComponentProps<typeof Button>, 'size'> & VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n );\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n className={cn(\n \"text-muted-foreground flex items-center gap-2 text-sm [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupInput({ className, ...props }: React.ComponentProps<'input'>) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn('flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent', className)}\n {...props}\n />\n );\n}\n\nfunction InputGroupTextarea({ className, ...props }: React.ComponentProps<'textarea'>) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n 'flex-1 resize-none rounded-none border-0 bg-transparent min-h-0 pt-3.5 pb-1.5 pl-3.5 shadow-none focus-visible:ring-0 dark:bg-transparent',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { InputGroup, InputGroupAddon, InputGroupButton, InputGroupText, InputGroupInput, InputGroupTextarea };\n",
|
|
12
|
+
"import * as CollapsiblePrimitive from '@radix-ui/react-collapsible';\n\nconst Collapsible = CollapsiblePrimitive.Root;\nconst CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;\nconst CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n",
|
|
13
|
+
"import * as React from 'react';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport { cn } from '../lib/cn';\n\nconst TooltipProvider = TooltipPrimitive.Provider;\nconst Tooltip = TooltipPrimitive.Root;\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]',\n className,\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n));\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n",
|
|
14
|
+
"import * as React from 'react';\nimport * as AccordionPrimitive from '@radix-ui/react-accordion';\nimport { ChevronDown } from 'lucide-react';\nimport { cn } from '../lib/cn';\n\nconst Accordion = AccordionPrimitive.Root;\n\nconst AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <AccordionPrimitive.Item ref={ref} className={cn('border-b', className)} {...props} />\n));\nAccordionItem.displayName = 'AccordionItem';\n\nconst AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline text-left [&[data-state=open]>svg]:rotate-180',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDown className=\"h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n));\nAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;\n\nconst AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Content\n ref={ref}\n className=\"overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn('pb-4 pt-0', className)}>{children}</div>\n </AccordionPrimitive.Content>\n));\nAccordionContent.displayName = AccordionPrimitive.Content.displayName;\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent };\n",
|
|
15
|
+
"import * as React from 'react';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport { Check, ChevronRight, Circle } from 'lucide-react';\nimport { cn } from '../lib/cn';\n\nconst DropdownMenu = DropdownMenuPrimitive.Root;\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & { inset?: boolean }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n inset && 'pl-8',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]',\n className,\n )}\n {...props}\n />\n));\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]',\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n));\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & { inset?: boolean }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0',\n inset && 'pl-8',\n className,\n )}\n {...props}\n />\n));\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n));\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n));\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & { inset?: boolean }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn('px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', className)}\n {...props}\n />\n));\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator ref={ref} className={cn('-mx-1 my-1 h-px bg-muted', className)} {...props} />\n));\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\n\nconst DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {\n return <span className={cn('ml-auto text-xs tracking-widest opacity-60', className)} {...props} />;\n};\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut';\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n};\n",
|
|
16
|
+
"import * as React from 'react';\nimport * as HoverCardPrimitive from '@radix-ui/react-hover-card';\nimport { cn } from '../lib/cn';\n\nconst HoverCard = HoverCardPrimitive.Root;\nconst HoverCardTrigger = HoverCardPrimitive.Trigger;\n\nconst HoverCardContent = React.forwardRef<\n React.ElementRef<typeof HoverCardPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content>\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\n <HoverCardPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-hover-card-content-transform-origin]',\n className,\n )}\n {...props}\n />\n));\nHoverCardContent.displayName = HoverCardPrimitive.Content.displayName;\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent };\n",
|
|
17
|
+
"import * as React from 'react';\nimport * as SelectPrimitive from '@radix-ui/react-select';\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react';\nimport { cn } from '../lib/cn';\n\nconst Select = SelectPrimitive.Root;\nconst SelectGroup = SelectPrimitive.Group;\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n));\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n));\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]',\n position === 'popper' &&\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' && 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]',\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label ref={ref} className={cn('px-2 py-1.5 text-sm font-semibold', className)} {...props} />\n));\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator ref={ref} className={cn('-mx-1 my-1 h-px bg-muted', className)} {...props} />\n));\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n};\n",
|
|
18
|
+
"import * as React from 'react';\nimport { Command as CommandPrimitive } from 'cmdk';\nimport { Search } from 'lucide-react';\nimport { cn } from '../lib/cn';\n\nconst Command = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive\n ref={ref}\n className={cn('flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground', className)}\n {...props}\n />\n));\nCommand.displayName = CommandPrimitive.displayName;\n\nconst CommandInput = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, ...props }, ref) => (\n <div className=\"flex items-center border-b px-3\" cmdk-input-wrapper=\"\">\n <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n ref={ref}\n className={cn(\n 'flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n </div>\n));\nCommandInput.displayName = CommandPrimitive.Input.displayName;\n\nconst CommandList = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.List\n ref={ref}\n className={cn('max-h-[300px] overflow-y-auto overflow-x-hidden', className)}\n {...props}\n />\n));\nCommandList.displayName = CommandPrimitive.List.displayName;\n\nconst CommandEmpty = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Empty>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>((props, ref) => <CommandPrimitive.Empty ref={ref} className=\"py-6 text-center text-sm\" {...props} />);\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName;\n\nconst CommandGroup = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n className={cn(\n 'overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground',\n className,\n )}\n {...props}\n />\n));\nCommandGroup.displayName = CommandPrimitive.Group.displayName;\n\nconst CommandSeparator = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Separator ref={ref} className={cn('-mx-1 h-px bg-border', className)} {...props} />\n));\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName;\n\nconst CommandItem = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n className,\n )}\n {...props}\n />\n));\nCommandItem.displayName = CommandPrimitive.Item.displayName;\n\nconst CommandShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {\n return <span className={cn('ml-auto text-xs tracking-widest text-muted-foreground', className)} {...props} />;\n};\nCommandShortcut.displayName = 'CommandShortcut';\n\nexport { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandShortcut, CommandSeparator };\n",
|
|
19
|
+
"import * as React from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { X } from 'lucide-react';\nimport { cn } from '../lib/cn';\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst dialogContentVariants = cva(\n 'fixed left-[50%] top-[50%] z-50 grid translate-x-[-50%] translate-y-[-50%] gap-4 border shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg',\n {\n variants: {\n variant: {\n default: 'w-full max-w-lg bg-background p-6',\n lightbox: 'max-w-[90vw] max-h-[90vh] bg-background/95 backdrop-blur-sm p-2',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nexport interface DialogContentProps\n extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>,\n VariantProps<typeof dialogContentVariants> {}\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n DialogContentProps\n>(({ className, variant, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(dialogContentVariants({ variant }), className)}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col space-y-1.5 text-center sm:text-left', className)} {...props} />\n);\nDialogHeader.displayName = 'DialogHeader';\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)}\n {...props}\n />\n);\nDialogFooter.displayName = 'DialogFooter';\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n",
|
|
20
|
+
"import { Avatar, AvatarFallback, AvatarImage } from '../primitives/avatar';\nimport { cn } from '../lib/cn';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type { ComponentProps, HTMLAttributes } from 'react';\n\nexport type MessageProps = HTMLAttributes<HTMLDivElement> & {\n from: 'user' | 'assistant' | 'system' | 'tool';\n};\n\nexport const Message = ({ className, from, ...props }: MessageProps) => (\n <div\n className={cn(\n 'group flex w-full items-end justify-end gap-2 py-4',\n from === 'user' ? 'is-user' : 'is-assistant flex-row-reverse justify-end',\n className,\n )}\n {...props}\n />\n);\n\nconst messageContentVariants = cva(\n 'flex flex-col gap-2 overflow-hidden rounded-lg text-sm',\n {\n variants: {\n variant: {\n contained: [\n 'max-w-[80%] px-4 py-3',\n 'group-[.is-user]:bg-primary group-[.is-user]:text-primary-foreground',\n 'group-[.is-assistant]:bg-secondary group-[.is-assistant]:text-foreground',\n ],\n flat: [\n 'group-[.is-user]:max-w-[80%] group-[.is-user]:bg-secondary group-[.is-user]:px-4 group-[.is-user]:py-3 group-[.is-user]:text-foreground',\n 'group-[.is-assistant]:text-foreground',\n ],\n },\n },\n defaultVariants: {\n variant: 'contained',\n },\n },\n);\n\nexport type MessageContentProps = HTMLAttributes<HTMLDivElement> & VariantProps<typeof messageContentVariants>;\n\nexport const MessageContent = ({ children, className, variant, ...props }: MessageContentProps) => (\n <div className={cn(messageContentVariants({ variant, className }))} {...props}>\n {children}\n </div>\n);\n\nexport type MessageAvatarProps = ComponentProps<typeof Avatar> & {\n src: string;\n name?: string;\n};\n\nexport const MessageAvatar = ({ src, name, className, ...props }: MessageAvatarProps) => (\n <Avatar className={cn('size-8 ring-1 ring-border', className)} {...props}>\n <AvatarImage alt=\"\" className=\"mt-0 mb-0\" src={src} />\n <AvatarFallback>{name?.slice(0, 2) || 'ME'}</AvatarFallback>\n </Avatar>\n);\n",
|
|
21
|
+
"import { Button } from '../primitives/button';\nimport { cn } from '../lib/cn';\nimport { ArrowDownIcon } from 'lucide-react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport { useCallback } from 'react';\nimport { StickToBottom, useStickToBottomContext } from 'use-stick-to-bottom';\n\nexport type ConversationProps = ComponentProps<typeof StickToBottom>;\n\nexport const Conversation = ({ className, ...props }: ConversationProps) => (\n <StickToBottom\n className={cn('relative flex-1 overflow-y-auto', className)}\n initial=\"smooth\"\n role=\"log\"\n {...props}\n />\n);\n\nexport type ConversationContentProps = ComponentProps<typeof StickToBottom.Content>;\n\nexport const ConversationContent = ({ className, ...props }: ConversationContentProps) => (\n <StickToBottom.Content className={cn('p-4', className)} {...props} />\n);\n\nexport type ConversationEmptyStateProps = ComponentProps<'div'> & {\n title?: string;\n description?: string;\n icon?: ReactNode;\n};\n\nexport const ConversationEmptyState = ({\n className,\n title = 'No messages yet',\n description = 'Start a conversation to see messages here',\n icon,\n children,\n ...props\n}: ConversationEmptyStateProps) => (\n <div\n className={cn('flex size-full flex-col items-center justify-center gap-3 p-8 text-center', className)}\n {...props}\n >\n {children ?? (\n <>\n {icon && <div className=\"text-muted-foreground\">{icon}</div>}\n <div className=\"space-y-1\">\n <h3 className=\"font-medium text-sm\">{title}</h3>\n {description && <p className=\"text-muted-foreground text-sm\">{description}</p>}\n </div>\n </>\n )}\n </div>\n);\n\nexport { useStickToBottomContext } from 'use-stick-to-bottom';\n\nexport type ConversationScrollButtonProps = ComponentProps<typeof Button>;\n\nexport const ConversationScrollButton = ({ className, ...props }: ConversationScrollButtonProps) => {\n const { isAtBottom, scrollToBottom } = useStickToBottomContext();\n\n const handleScrollToBottom = useCallback(() => {\n scrollToBottom();\n }, [scrollToBottom]);\n\n return (\n !isAtBottom && (\n <Button\n className={cn('absolute bottom-4 left-[50%] translate-x-[-50%] rounded-full', className)}\n onClick={handleScrollToBottom}\n size=\"icon\"\n type=\"button\"\n variant=\"outline\"\n {...props}\n >\n <ArrowDownIcon className=\"size-4\" />\n </Button>\n )\n );\n};\n",
|
|
22
|
+
"import { cn } from '../lib/cn';\nimport { type ComponentProps, memo } from 'react';\nimport { Streamdown } from 'streamdown';\n\nexport type ResponseProps = ComponentProps<typeof Streamdown>;\n\nexport const Response = memo(\n ({ className, ...props }: ResponseProps) => (\n <Streamdown\n className={cn('size-full [&>*:first-child]:mt-0 [&>*:last-child]:mb-0', className)}\n {...props}\n />\n ),\n (prevProps, nextProps) => prevProps.children === nextProps.children,\n);\n\nResponse.displayName = 'Response';\n",
|
|
23
|
+
"import { Badge } from '../primitives/badge';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../primitives/collapsible';\nimport { cn } from '../lib/cn';\nimport type { ToolState } from '../types';\nimport {\n CheckCircleIcon,\n ChevronDownIcon,\n CircleIcon,\n ClockIcon,\n WrenchIcon,\n XCircleIcon,\n} from 'lucide-react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport { isValidElement } from 'react';\nimport { CodeBlock } from './code-block';\n\nexport type ToolProps = ComponentProps<typeof Collapsible>;\n\nexport const Tool = ({ className, ...props }: ToolProps) => (\n <Collapsible className={cn('not-prose mb-4 w-full rounded-md border', className)} {...props} />\n);\n\nexport type ToolHeaderProps = {\n title?: string;\n type?: string;\n state: ToolState;\n className?: string;\n};\n\nconst getStatusBadge = (status: ToolState) => {\n const labels: Record<string, string> = {\n 'input-streaming': 'Pending',\n 'input-available': 'Running',\n 'approval-requested': 'Awaiting Approval',\n 'approval-responded': 'Responded',\n 'output-available': 'Completed',\n 'output-error': 'Error',\n 'output-denied': 'Denied',\n };\n\n const icons: Record<string, ReactNode> = {\n 'input-streaming': <CircleIcon className=\"size-4\" />,\n 'input-available': <ClockIcon className=\"size-4 animate-pulse\" />,\n 'approval-requested': <ClockIcon className=\"size-4 text-yellow-600\" />,\n 'approval-responded': <CheckCircleIcon className=\"size-4 text-blue-600\" />,\n 'output-available': <CheckCircleIcon className=\"size-4 text-green-600\" />,\n 'output-error': <XCircleIcon className=\"size-4 text-red-600\" />,\n 'output-denied': <XCircleIcon className=\"size-4 text-orange-600\" />,\n };\n\n return (\n <Badge className=\"gap-1.5 rounded-full text-xs\" variant=\"secondary\">\n {icons[status]}\n {labels[status]}\n </Badge>\n );\n};\n\nexport const ToolHeader = ({ className, title, type, state, ...props }: ToolHeaderProps) => (\n <CollapsibleTrigger className={cn('group flex w-full items-center justify-between gap-4 p-3', className)} {...props}>\n <div className=\"flex items-center gap-2\">\n <WrenchIcon className=\"size-4 text-muted-foreground\" />\n <span className=\"font-medium text-sm\">{title ?? type?.split('-').slice(1).join('-') ?? 'Tool'}</span>\n {getStatusBadge(state)}\n </div>\n <ChevronDownIcon className=\"size-4 text-muted-foreground transition-transform group-data-[state=open]:rotate-180\" />\n </CollapsibleTrigger>\n);\n\nexport type ToolContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const ToolContent = ({ className, ...props }: ToolContentProps) => (\n <CollapsibleContent\n className={cn(\n 'data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 text-popover-foreground outline-none data-[state=closed]:animate-out data-[state=open]:animate-in',\n className,\n )}\n {...props}\n />\n);\n\nexport type ToolInputProps = ComponentProps<'div'> & {\n input: unknown;\n};\n\nexport const ToolInput = ({ className, input, ...props }: ToolInputProps) => (\n <div className={cn('space-y-2 overflow-hidden p-4', className)} {...props}>\n <h4 className=\"font-medium text-muted-foreground text-xs uppercase tracking-wide\">Parameters</h4>\n <div className=\"rounded-md bg-muted/50\">\n <CodeBlock code={JSON.stringify(input, null, 2)} language=\"json\" />\n </div>\n </div>\n);\n\nexport type ToolOutputProps = ComponentProps<'div'> & {\n output: unknown;\n errorText?: string;\n};\n\nexport const ToolOutput = ({ className, output, errorText, ...props }: ToolOutputProps) => {\n if (!(output || errorText)) {\n return null;\n }\n\n let Output = <div>{output as ReactNode}</div>;\n\n if (typeof output === 'object' && !isValidElement(output)) {\n Output = <CodeBlock code={JSON.stringify(output, null, 2)} language=\"json\" />;\n } else if (typeof output === 'string') {\n Output = <CodeBlock code={output} language=\"json\" />;\n }\n\n return (\n <div className={cn('space-y-2 p-4', className)} {...props}>\n <h4 className=\"font-medium text-muted-foreground text-xs uppercase tracking-wide\">\n {errorText ? 'Error' : 'Result'}\n </h4>\n <div\n className={cn(\n 'overflow-x-auto rounded-md text-xs [&_table]:w-full',\n errorText ? 'bg-destructive/10 text-destructive' : 'bg-muted/50 text-foreground',\n )}\n >\n {errorText && <div>{errorText}</div>}\n {Output}\n </div>\n </div>\n );\n};\n",
|
|
24
|
+
"import { Button } from '../primitives/button';\nimport { cn } from '../lib/cn';\nimport { CheckIcon, CopyIcon } from 'lucide-react';\nimport {\n type ComponentProps,\n createContext,\n type HTMLAttributes,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nexport type CodeBlockProps = HTMLAttributes<HTMLDivElement> & {\n code: string;\n language: string;\n showLineNumbers?: boolean;\n};\n\ntype CodeBlockContextType = {\n code: string;\n};\n\nconst CodeBlockContext = createContext<CodeBlockContextType>({\n code: '',\n});\n\n/**\n * Highlight code using shiki. Gracefully falls back to plain text if shiki is not installed.\n */\nasync function highlightCode(code: string, language: string, showLineNumbers = false): Promise<[string, string]> {\n try {\n const shiki = await import('shiki');\n const lineNumberTransformer = showLineNumbers\n ? [\n {\n name: 'line-numbers',\n line(node: any, line: number) {\n node.children.unshift({\n type: 'element',\n tagName: 'span',\n properties: {\n className: ['inline-block', 'min-w-10', 'mr-4', 'text-right', 'select-none', 'text-muted-foreground'],\n },\n children: [{ type: 'text', value: String(line) }],\n });\n },\n },\n ]\n : [];\n\n const [light, dark] = await Promise.all([\n shiki.codeToHtml(code, { lang: language as any, theme: 'one-light', transformers: lineNumberTransformer }),\n shiki.codeToHtml(code, { lang: language as any, theme: 'one-dark-pro', transformers: lineNumberTransformer }),\n ]);\n return [light, dark];\n } catch {\n // Shiki not installed - return empty to trigger fallback\n return ['', ''];\n }\n}\n\nexport const CodeBlock = ({\n code,\n language,\n showLineNumbers = false,\n className,\n children,\n ...props\n}: CodeBlockProps) => {\n const [html, setHtml] = useState<string>('');\n const [darkHtml, setDarkHtml] = useState<string>('');\n const effectIdRef = useRef(0);\n\n useEffect(() => {\n const id = ++effectIdRef.current;\n highlightCode(code, language, showLineNumbers).then(([light, dark]) => {\n if (id === effectIdRef.current) {\n setHtml(light);\n setDarkHtml(dark);\n }\n });\n }, [code, language, showLineNumbers]);\n\n const useFallback = !html && !darkHtml;\n\n return (\n <CodeBlockContext.Provider value={{ code }}>\n <div\n className={cn(\n 'group relative w-full overflow-hidden rounded-md border bg-background text-foreground',\n className,\n )}\n {...props}\n >\n <div className=\"relative\">\n {useFallback ? (\n <pre className=\"m-0 overflow-auto bg-background p-4 text-foreground text-sm\">\n <code className=\"font-mono text-sm\">{code}</code>\n </pre>\n ) : (\n <>\n <div\n className=\"overflow-hidden dark:hidden [&>pre]:m-0 [&>pre]:bg-background! [&>pre]:p-4 [&>pre]:text-foreground! [&>pre]:text-sm [&_code]:font-mono [&_code]:text-sm\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n <div\n className=\"hidden overflow-hidden dark:block [&>pre]:m-0 [&>pre]:bg-background! [&>pre]:p-4 [&>pre]:text-foreground! [&>pre]:text-sm [&_code]:font-mono [&_code]:text-sm\"\n dangerouslySetInnerHTML={{ __html: darkHtml }}\n />\n </>\n )}\n {children && <div className=\"absolute top-2 right-2 flex items-center gap-2\">{children}</div>}\n </div>\n </div>\n </CodeBlockContext.Provider>\n );\n};\n\nexport type CodeBlockCopyButtonProps = ComponentProps<typeof Button> & {\n onCopy?: () => void;\n onError?: (error: Error) => void;\n timeout?: number;\n};\n\nexport const CodeBlockCopyButton = ({\n onCopy,\n onError,\n timeout = 2000,\n children,\n className,\n ...props\n}: CodeBlockCopyButtonProps) => {\n const [isCopied, setIsCopied] = useState(false);\n const { code } = useContext(CodeBlockContext);\n\n const copyToClipboard = async () => {\n if (typeof window === 'undefined' || !navigator?.clipboard?.writeText) {\n onError?.(new Error('Clipboard API not available'));\n return;\n }\n\n try {\n await navigator.clipboard.writeText(code);\n setIsCopied(true);\n onCopy?.();\n setTimeout(() => setIsCopied(false), timeout);\n } catch (error) {\n onError?.(error as Error);\n }\n };\n\n const Icon = isCopied ? CheckIcon : CopyIcon;\n\n return (\n <Button className={cn('shrink-0', className)} onClick={copyToClipboard} size=\"icon\" variant=\"ghost\" {...props}>\n {children ?? <Icon size={14} />}\n </Button>\n );\n};\n",
|
|
25
|
+
"import { Button } from '../primitives/button';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../primitives/tooltip';\nimport { cn } from '../lib/cn';\nimport { type LucideIcon, XIcon } from 'lucide-react';\nimport type { ComponentProps, HTMLAttributes } from 'react';\n\nexport type ArtifactProps = HTMLAttributes<HTMLDivElement>;\n\nexport const Artifact = ({ className, ...props }: ArtifactProps) => (\n <div\n className={cn('flex flex-col overflow-hidden rounded-lg border bg-background shadow-sm', className)}\n {...props}\n />\n);\n\nexport type ArtifactHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport const ArtifactHeader = ({ className, ...props }: ArtifactHeaderProps) => (\n <div className={cn('flex items-center justify-between border-b bg-muted/50 px-4 py-3', className)} {...props} />\n);\n\nexport type ArtifactCloseProps = ComponentProps<typeof Button>;\n\nexport const ArtifactClose = ({\n className,\n children,\n size = 'sm',\n variant = 'ghost',\n ...props\n}: ArtifactCloseProps) => (\n <Button\n className={cn('size-8 p-0 text-muted-foreground hover:text-foreground', className)}\n size={size}\n type=\"button\"\n variant={variant}\n {...props}\n >\n {children ?? <XIcon className=\"size-4\" />}\n <span className=\"sr-only\">Close</span>\n </Button>\n);\n\nexport type ArtifactTitleProps = HTMLAttributes<HTMLParagraphElement>;\n\nexport const ArtifactTitle = ({ className, ...props }: ArtifactTitleProps) => (\n <p className={cn('font-medium text-foreground text-sm', className)} {...props} />\n);\n\nexport type ArtifactDescriptionProps = HTMLAttributes<HTMLParagraphElement>;\n\nexport const ArtifactDescription = ({ className, ...props }: ArtifactDescriptionProps) => (\n <p className={cn('text-muted-foreground text-sm', className)} {...props} />\n);\n\nexport type ArtifactActionsProps = HTMLAttributes<HTMLDivElement>;\n\nexport const ArtifactActions = ({ className, ...props }: ArtifactActionsProps) => (\n <div className={cn('flex items-center gap-1', className)} {...props} />\n);\n\nexport type ArtifactActionProps = ComponentProps<typeof Button> & {\n tooltip?: string;\n label?: string;\n icon?: LucideIcon;\n};\n\nexport const ArtifactAction = ({\n tooltip,\n label,\n icon: Icon,\n children,\n className,\n size = 'sm',\n variant = 'ghost',\n ...props\n}: ArtifactActionProps) => {\n const button = (\n <Button\n className={cn('size-8 p-0 text-muted-foreground hover:text-foreground', className)}\n size={size}\n type=\"button\"\n variant={variant}\n {...props}\n >\n {Icon ? <Icon className=\"size-4\" /> : children}\n <span className=\"sr-only\">{label || tooltip}</span>\n </Button>\n );\n\n if (tooltip) {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent>\n <p>{tooltip}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return button;\n};\n\nexport type ArtifactContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const ArtifactContent = ({ className, ...props }: ArtifactContentProps) => (\n <div className={cn('flex-1 overflow-auto p-4', className)} {...props} />\n);\n",
|
|
26
|
+
"import { cn } from '../lib/cn';\nimport { Bot } from 'lucide-react';\nimport type { HTMLAttributes, ReactNode } from 'react';\n\nexport type StreamingIndicatorProps = HTMLAttributes<HTMLDivElement> & {\n icon?: ReactNode;\n /** Full avatar element — overrides the default avatar container and icon */\n avatar?: ReactNode;\n};\n\nexport function StreamingIndicator({ className, icon, avatar, ...props }: StreamingIndicatorProps) {\n return (\n <div className={cn('flex items-start gap-3 px-1', className)} {...props}>\n {avatar ?? (\n <div className=\"h-8 w-8 rounded-full bg-primary/10 flex items-center justify-center flex-shrink-0 mt-0.5\">\n {icon ?? <Bot className=\"h-4 w-4 text-primary\" />}\n </div>\n )}\n <div className=\"flex items-center gap-1.5 pt-2.5\">\n <span className=\"h-2 w-2 rounded-full bg-primary/60 animate-pulse\" />\n <span className=\"h-2 w-2 rounded-full bg-primary/60 animate-pulse [animation-delay:150ms]\" />\n <span className=\"h-2 w-2 rounded-full bg-primary/60 animate-pulse [animation-delay:300ms]\" />\n </div>\n </div>\n );\n}\n",
|
|
27
|
+
"import { useCallback, useEffect, useRef, useState } from 'react';\nimport { Loader2, Mic, Square } from 'lucide-react';\nimport { Button } from '../primitives/button';\nimport { cn } from '../lib/cn';\n\nexport interface AudioRecorderLabels {\n recordAudio?: string;\n stopRecording?: string;\n transcribing?: string;\n}\n\nexport interface AudioRecorderProps {\n /** Called with WAV blob when recording completes in 'send' mode */\n onRecordingComplete: (blob: Blob) => void;\n disabled?: boolean;\n className?: string;\n /** Audio mode: 'send' sends blob immediately, 'transcribe' posts to endpoint and returns text */\n mode?: 'send' | 'transcribe';\n /** Transcription endpoint URL (required when mode='transcribe') */\n transcriptionEndpoint?: string;\n /** Extra headers for transcription request (e.g., Authorization) */\n transcriptionHeaders?: Record<string, string>;\n /** Called with transcribed text when transcription completes */\n onTranscriptionComplete?: (text: string) => void;\n /** Field name for the audio file in the FormData (default: 'file') */\n transcriptionFieldName?: string;\n /** Custom parser for the transcription response — receives the parsed JSON and returns the text.\n * Default: looks for data.text || data.transcript || data.transcription */\n parseTranscriptionResponse?: (data: unknown) => string;\n /** Optional async callback to request microphone permission before recording starts.\n * Useful in WebView environments (e.g., Expo) where you need to bridge to the native layer\n * via postMessage to request permissions. Return true to proceed, false to cancel. */\n onRequestPermission?: () => Promise<boolean>;\n /** Custom labels for the audio recorder button (useful for i18n) */\n labels?: AudioRecorderLabels;\n}\n\nfunction encodeWav(samples: Float32Array, sampleRate: number): Blob {\n const numChannels = 1;\n const bitsPerSample = 16;\n const byteRate = sampleRate * numChannels * (bitsPerSample / 8);\n const blockAlign = numChannels * (bitsPerSample / 8);\n const dataLength = samples.length * (bitsPerSample / 8);\n const buffer = new ArrayBuffer(44 + dataLength);\n const view = new DataView(buffer);\n\n writeString(view, 0, 'RIFF');\n view.setUint32(4, 36 + dataLength, true);\n writeString(view, 8, 'WAVE');\n writeString(view, 12, 'fmt ');\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true);\n view.setUint16(22, numChannels, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, byteRate, true);\n view.setUint16(32, blockAlign, true);\n view.setUint16(34, bitsPerSample, true);\n writeString(view, 36, 'data');\n view.setUint32(40, dataLength, true);\n\n let offset = 44;\n for (let i = 0; i < samples.length; i++) {\n const s = Math.max(-1, Math.min(1, samples[i]));\n view.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7fff, true);\n offset += 2;\n }\n\n return new Blob([buffer], { type: 'audio/wav' });\n}\n\nfunction writeString(view: DataView, offset: number, str: string) {\n for (let i = 0; i < str.length; i++) {\n view.setUint8(offset + i, str.charCodeAt(i));\n }\n}\n\nfunction createWorkletUrl(): string {\n const code = `\nclass RecorderProcessor extends AudioWorkletProcessor {\n constructor() {\n super();\n this._stopped = false;\n this.port.onmessage = (e) => {\n if (e.data === 'stop') this._stopped = true;\n };\n }\n process(inputs) {\n if (this._stopped) return false;\n const input = inputs[0];\n if (input && input[0]) {\n this.port.postMessage(new Float32Array(input[0]));\n }\n return true;\n }\n}\nregisterProcessor('recorder-processor', RecorderProcessor);\n`;\n const blob = new Blob([code], { type: 'application/javascript' });\n return URL.createObjectURL(blob);\n}\n\nexport function AudioRecorder({\n onRecordingComplete,\n disabled,\n className,\n mode = 'send',\n transcriptionEndpoint,\n transcriptionHeaders,\n onTranscriptionComplete,\n transcriptionFieldName = 'file',\n parseTranscriptionResponse,\n onRequestPermission,\n labels,\n}: AudioRecorderProps) {\n const [isRecording, setIsRecording] = useState(false);\n const [isTranscribing, setIsTranscribing] = useState(false);\n const [duration, setDuration] = useState(0);\n const [isSupported, setIsSupported] = useState(true);\n const streamRef = useRef<MediaStream | null>(null);\n const audioContextRef = useRef<AudioContext | null>(null);\n const workletNodeRef = useRef<AudioWorkletNode | null>(null);\n const chunksRef = useRef<Float32Array[]>([]);\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const workletUrlRef = useRef<string | null>(null);\n const onTranscriptionCompleteRef = useRef(onTranscriptionComplete);\n onTranscriptionCompleteRef.current = onTranscriptionComplete;\n\n useEffect(() => {\n if (typeof window === 'undefined' || !navigator.mediaDevices?.getUserMedia) {\n setIsSupported(false);\n }\n return () => {\n if (timerRef.current) clearInterval(timerRef.current);\n if (workletNodeRef.current) {\n workletNodeRef.current.port.postMessage('stop');\n workletNodeRef.current.disconnect();\n workletNodeRef.current = null;\n }\n if (audioContextRef.current) {\n audioContextRef.current.close();\n audioContextRef.current = null;\n }\n if (streamRef.current) {\n streamRef.current.getTracks().forEach((track) => track.stop());\n streamRef.current = null;\n }\n if (workletUrlRef.current) URL.revokeObjectURL(workletUrlRef.current);\n };\n }, []);\n\n const startRecording = useCallback(async () => {\n try {\n if (onRequestPermission) {\n const granted = await onRequestPermission();\n if (!granted) return;\n }\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n streamRef.current = stream;\n\n const audioContext = new AudioContext();\n audioContextRef.current = audioContext;\n\n const workletUrl = createWorkletUrl();\n workletUrlRef.current = workletUrl;\n await audioContext.audioWorklet.addModule(workletUrl);\n\n const source = audioContext.createMediaStreamSource(stream);\n const workletNode = new AudioWorkletNode(audioContext, 'recorder-processor');\n workletNodeRef.current = workletNode;\n chunksRef.current = [];\n\n workletNode.port.onmessage = (e) => {\n if (e.data instanceof Float32Array) {\n chunksRef.current.push(e.data);\n }\n };\n\n source.connect(workletNode);\n workletNode.connect(audioContext.destination);\n\n setIsRecording(true);\n setDuration(0);\n\n timerRef.current = setInterval(() => {\n setDuration((prev) => prev + 1);\n }, 1000);\n } catch {\n console.error('Failed to start recording');\n }\n }, [onRequestPermission]);\n\n const stopRecording = useCallback(async () => {\n if (workletNodeRef.current) {\n workletNodeRef.current.port.postMessage('stop');\n workletNodeRef.current.disconnect();\n workletNodeRef.current = null;\n }\n\n const audioContext = audioContextRef.current;\n let wavBlob: Blob | null = null;\n if (audioContext) {\n const sampleRate = audioContext.sampleRate;\n\n const totalLength = chunksRef.current.reduce((sum, chunk) => sum + chunk.length, 0);\n const merged = new Float32Array(totalLength);\n let offset = 0;\n for (const chunk of chunksRef.current) {\n merged.set(chunk, offset);\n offset += chunk.length;\n }\n chunksRef.current = [];\n\n wavBlob = encodeWav(merged, sampleRate);\n\n audioContext.close();\n audioContextRef.current = null;\n }\n\n if (streamRef.current) {\n streamRef.current.getTracks().forEach((track) => track.stop());\n streamRef.current = null;\n }\n\n if (workletUrlRef.current) {\n URL.revokeObjectURL(workletUrlRef.current);\n workletUrlRef.current = null;\n }\n\n setIsRecording(false);\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n\n if (!wavBlob) return;\n\n if (mode === 'transcribe' && transcriptionEndpoint) {\n setIsTranscribing(true);\n const formData = new FormData();\n formData.append(transcriptionFieldName, wavBlob, 'recording.wav');\n try {\n const res = await fetch(transcriptionEndpoint, {\n method: 'POST',\n headers: transcriptionHeaders,\n credentials: 'include',\n body: formData,\n });\n const data = await res.json();\n const text = parseTranscriptionResponse\n ? parseTranscriptionResponse(data)\n : data.text || data.transcript || data.transcription || (typeof data === 'string' ? data : '');\n if (text) onTranscriptionCompleteRef.current?.(text);\n } catch (err) {\n console.error('Transcription failed:', err);\n } finally {\n setIsTranscribing(false);\n }\n } else {\n onRecordingComplete(wavBlob);\n }\n }, [onRecordingComplete, mode, transcriptionEndpoint, transcriptionHeaders, transcriptionFieldName, parseTranscriptionResponse]);\n\n const resolvedLabels = {\n recordAudio: labels?.recordAudio ?? 'Record audio',\n stopRecording: labels?.stopRecording ?? 'Stop recording',\n transcribing: labels?.transcribing ?? 'Transcribing...',\n };\n\n const formatDuration = (seconds: number) => {\n const m = Math.floor(seconds / 60);\n const s = seconds % 60;\n return `${m}:${s.toString().padStart(2, '0')}`;\n };\n\n if (!isSupported) return null;\n\n return (\n <div className={cn('flex items-center gap-1', className)}>\n {isRecording && (\n <span className=\"text-xs text-destructive font-mono animate-pulse\">{formatDuration(duration)}</span>\n )}\n {isTranscribing ? (\n <span className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Loader2 className=\"size-3.5 animate-spin\" />\n {resolvedLabels.transcribing}\n </span>\n ) : (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn('h-8 w-8', isRecording && 'text-destructive hover:text-destructive')}\n disabled={disabled}\n onClick={isRecording ? stopRecording : startRecording}\n title={isRecording ? resolvedLabels.stopRecording : resolvedLabels.recordAudio}\n >\n {isRecording ? (\n <Square className=\"size-4 fill-current\" />\n ) : (\n <Mic className=\"size-4\" />\n )}\n </Button>\n )}\n </div>\n );\n}\n",
|
|
28
|
+
"import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../primitives/tooltip';\nimport { formatSmartTimestamp, formatFullTimestamp } from '../lib/format-timestamp';\n\nexport interface SmartTimestampProps {\n date: Date;\n /** Override the short display text (e.g. custom formatTimestamp prop) */\n formatShort?: (date: Date) => string;\n className?: string;\n}\n\nexport function SmartTimestamp({ date, formatShort, className }: SmartTimestampProps) {\n const shortText = formatShort ? formatShort(date) : formatSmartTimestamp(date);\n const fullText = formatFullTimestamp(date);\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className={className}>{shortText}</span>\n </TooltipTrigger>\n <TooltipContent>\n <p>{fullText}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n",
|
|
29
|
+
"import { cn } from '../lib/cn';\nimport { getFilePreviewType, formatFileSize, getFileExtension } from '../lib/file-utils';\nimport { FileIcon, Search } from 'lucide-react';\n\nexport interface FilePreviewFile {\n name: string;\n type?: string;\n url?: string;\n size?: number;\n}\n\nexport interface FilePreviewCardProps {\n file: FilePreviewFile;\n onClick?: () => void;\n className?: string;\n}\n\n/** Small corner badge for the file extension */\nfunction ExtBadge({ ext }: { ext: string }) {\n if (!ext) return null;\n return (\n <span className=\"absolute bottom-1.5 left-1.5 rounded px-1 py-0.5 text-[9px] font-semibold uppercase leading-none bg-background/80 text-muted-foreground border border-border/50 backdrop-blur-sm\">\n {ext}\n </span>\n );\n}\n\nexport function FilePreviewCard({ file, onClick, className }: FilePreviewCardProps) {\n const previewType = getFilePreviewType(file.type);\n const isClickable = !!onClick;\n const ext = getFileExtension(file.name, file.type);\n\n const cardBase = cn(\n 'group relative flex flex-col overflow-hidden rounded-xl border border-border bg-muted/20 w-28 h-28',\n isClickable && 'cursor-pointer hover:border-foreground/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 transition-colors',\n className,\n );\n\n // Image thumbnail\n if (previewType === 'image' && file.url) {\n return (\n <button type=\"button\" onClick={onClick} disabled={!isClickable} className={cardBase}>\n <img src={file.url} alt={file.name} className=\"w-full h-full object-cover\" />\n <ExtBadge ext={ext} />\n {isClickable && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/0 group-hover:bg-black/30 transition-colors\">\n <Search className=\"h-5 w-5 text-white opacity-0 group-hover:opacity-100 transition-opacity\" />\n </div>\n )}\n </button>\n );\n }\n\n // PDF thumbnail — render actual first page\n if (previewType === 'pdf' && file.url) {\n return (\n <button type=\"button\" onClick={onClick} disabled={!isClickable} className={cardBase}>\n <div className=\"w-full h-full overflow-hidden pointer-events-none\">\n <object\n data={`${file.url}#page=1&view=FitH`}\n type=\"application/pdf\"\n className=\"w-[200%] h-[200%] origin-top-left scale-50\"\n aria-label={file.name}\n >\n {/* Fallback if PDF can't render */}\n <div className=\"flex items-center justify-center w-full h-full\">\n <FileIcon className=\"h-8 w-8 text-muted-foreground/40\" />\n </div>\n </object>\n </div>\n <ExtBadge ext={ext} />\n {isClickable && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/0 group-hover:bg-black/10 transition-colors\">\n <Search className=\"h-5 w-5 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity\" />\n </div>\n )}\n </button>\n );\n }\n\n // Generic file — icon + extension badge in corner\n return (\n <button type=\"button\" onClick={onClick} disabled={!isClickable} className={cardBase}>\n <div className=\"flex-1 flex items-center justify-center\">\n <FileIcon className=\"h-8 w-8 text-muted-foreground/40\" />\n </div>\n\n {/* Filename + size at bottom */}\n <div className=\"w-full text-center min-w-0 px-2 pb-2 space-y-0.5\">\n <p className=\"text-[10px] text-foreground truncate leading-tight\" title={file.name}>\n {file.name}\n </p>\n {file.size != null && file.size > 0 && (\n <p className=\"text-[9px] text-muted-foreground leading-tight\">\n {formatFileSize(file.size)}\n </p>\n )}\n </div>\n\n <ExtBadge ext={ext} />\n </button>\n );\n}\n",
|
|
30
|
+
"import {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n} from '../primitives/dialog';\nimport { formatFileSize, isPreviewable, getFilePreviewType } from '../lib/file-utils';\nimport { Download, FileIcon } from 'lucide-react';\nimport type { FilePreviewFile } from './file-preview-card';\n\nexport interface FilePreviewModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n file: FilePreviewFile | null;\n}\n\nexport function FilePreviewModal({ open, onOpenChange, file }: FilePreviewModalProps) {\n if (!file) return null;\n\n const previewType = getFilePreviewType(file.type);\n const canPreview = isPreviewable(file.type) && !!file.url;\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n {previewType === 'image' && file.url ? (\n <DialogContent variant=\"lightbox\" aria-describedby={undefined}>\n <DialogTitle className=\"sr-only\">{file.name}</DialogTitle>\n <img\n src={file.url}\n alt={file.name}\n className=\"max-h-[85vh] max-w-full object-contain rounded-md\"\n />\n </DialogContent>\n ) : previewType === 'pdf' && file.url ? (\n <DialogContent variant=\"lightbox\" className=\"w-[80vw] h-[85vh]\" aria-describedby={undefined}>\n <DialogTitle className=\"sr-only\">{file.name}</DialogTitle>\n <object\n data={file.url}\n type=\"application/pdf\"\n className=\"w-full h-full rounded-md\"\n >\n <div className=\"flex flex-col items-center justify-center h-full gap-3 text-muted-foreground\">\n <p className=\"text-sm\">Unable to display PDF</p>\n <a\n href={file.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1.5 text-sm text-primary hover:underline\"\n >\n <Download className=\"h-4 w-4\" />\n Download {file.name}\n </a>\n </div>\n </object>\n </DialogContent>\n ) : (\n <DialogContent>\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <FileIcon className=\"h-5 w-5 text-muted-foreground\" />\n {file.name}\n </DialogTitle>\n <DialogDescription>\n {file.size != null && file.size > 0 && <span>{formatFileSize(file.size)}</span>}\n {!canPreview && <span> · Preview not available for this file type</span>}\n </DialogDescription>\n </DialogHeader>\n <div className=\"flex flex-col items-center justify-center py-8 text-muted-foreground gap-3\">\n <FileIcon className=\"h-12 w-12\" />\n <p className=\"text-sm\">Preview not available</p>\n {file.url && /^https?:\\/\\//i.test(file.url) && (\n <a\n href={file.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1.5 text-sm text-primary hover:underline\"\n >\n <Download className=\"h-4 w-4\" />\n Download file\n </a>\n )}\n </div>\n </DialogContent>\n )}\n </Dialog>\n );\n}\n",
|
|
31
|
+
"import { useState, useEffect, useCallback } from 'react';\nimport { Dialog, DialogContent, DialogTitle } from '../primitives/dialog';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { cn } from '../lib/cn';\n\nexport interface LightboxImage {\n url: string;\n alt?: string;\n}\n\nexport interface ImageLightboxProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n images: LightboxImage[];\n initialIndex?: number;\n}\n\nexport function ImageLightbox({ open, onOpenChange, images, initialIndex = 0 }: ImageLightboxProps) {\n const [currentIndex, setCurrentIndex] = useState(initialIndex);\n const hasMultiple = images.length > 1;\n\n useEffect(() => {\n if (open) setCurrentIndex(initialIndex);\n }, [open, initialIndex]);\n\n const goNext = useCallback(() => {\n setCurrentIndex((i) => (i + 1) % images.length);\n }, [images.length]);\n\n const goPrev = useCallback(() => {\n setCurrentIndex((i) => (i - 1 + images.length) % images.length);\n }, [images.length]);\n\n useEffect(() => {\n if (!open || !hasMultiple) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'ArrowRight') goNext();\n if (e.key === 'ArrowLeft') goPrev();\n };\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, [open, hasMultiple, goNext, goPrev]);\n\n if (images.length === 0) return null;\n const current = images[currentIndex];\n if (!current) return null;\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent variant=\"lightbox\" aria-describedby={undefined}>\n <DialogTitle className=\"sr-only\">\n {current.alt || `Image ${currentIndex + 1} of ${images.length}`}\n </DialogTitle>\n <div className=\"relative flex items-center justify-center\">\n <img\n src={current.url}\n alt={current.alt || 'Image preview'}\n className=\"max-h-[85vh] max-w-full object-contain rounded-md\"\n />\n\n {hasMultiple && (\n <>\n <button\n type=\"button\"\n onClick={goPrev}\n className={cn(\n 'absolute left-2 top-1/2 -translate-y-1/2 rounded-full bg-black/50 p-2 text-white',\n 'hover:bg-black/70 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring transition-colors',\n )}\n >\n <ChevronLeft className=\"h-5 w-5\" />\n <span className=\"sr-only\">Previous image</span>\n </button>\n <button\n type=\"button\"\n onClick={goNext}\n className={cn(\n 'absolute right-2 top-1/2 -translate-y-1/2 rounded-full bg-black/50 p-2 text-white',\n 'hover:bg-black/70 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring transition-colors',\n )}\n >\n <ChevronRight className=\"h-5 w-5\" />\n <span className=\"sr-only\">Next image</span>\n </button>\n <div className=\"absolute bottom-2 left-1/2 -translate-x-1/2 rounded-full bg-black/50 px-3 py-1 text-xs text-white\">\n {currentIndex + 1} / {images.length}\n </div>\n </>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n",
|
|
32
|
+
"import { createContext, useContext } from 'react';\nimport type { RefObject } from 'react';\nimport type { FileAttachment } from '../../types';\n\nexport type AttachmentsContext = {\n files: (FileAttachment & { id: string })[];\n add: (files: File[] | FileList) => void;\n remove: (id: string) => void;\n clear: () => void;\n openFileDialog: () => void;\n fileInputRef: RefObject<HTMLInputElement | null>;\n};\n\nexport type TextInputContext = {\n value: string;\n setInput: (v: string) => void;\n clear: () => void;\n};\n\nexport type PromptInputControllerProps = {\n textInput: TextInputContext;\n attachments: AttachmentsContext;\n __registerFileInput: (ref: RefObject<HTMLInputElement | null>, open: () => void) => void;\n};\n\nexport const PromptInputController = createContext<PromptInputControllerProps | null>(null);\nexport const ProviderAttachmentsContext = createContext<AttachmentsContext | null>(null);\nexport const LocalAttachmentsContext = createContext<AttachmentsContext | null>(null);\n\nexport const usePromptInputController = () => {\n const ctx = useContext(PromptInputController);\n if (!ctx) {\n throw new Error('Wrap your component inside <PromptInputProvider> to use usePromptInputController().');\n }\n return ctx;\n};\n\nexport const useOptionalPromptInputController = () => useContext(PromptInputController);\n\nexport const useProviderAttachments = () => {\n const ctx = useContext(ProviderAttachmentsContext);\n if (!ctx) {\n throw new Error('Wrap your component inside <PromptInputProvider> to use useProviderAttachments().');\n }\n return ctx;\n};\n\nexport const useOptionalProviderAttachments = () => useContext(ProviderAttachmentsContext);\n\nexport const usePromptInputAttachments = () => {\n const provider = useOptionalProviderAttachments();\n const local = useContext(LocalAttachmentsContext);\n const context = provider ?? local;\n if (!context) {\n throw new Error('usePromptInputAttachments must be used within a PromptInput or PromptInputProvider');\n }\n return context;\n};\n\nexport type DropZoneContextValue = {\n isDraggingOver: boolean;\n};\n\nexport const DropZoneContext = createContext<DropZoneContextValue>({ isDraggingOver: false });\n\nexport const usePromptInputDropZone = () => useContext(DropZoneContext);\n",
|
|
33
|
+
"import type { PropsWithChildren, RefObject } from 'react';\nimport { useCallback, useMemo, useRef, useState } from 'react';\nimport type { FileAttachment } from '../../types';\nimport type { AttachmentsContext, PromptInputControllerProps } from './context';\nimport { PromptInputController, ProviderAttachmentsContext } from './context';\n\nfunction generateId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\n\nexport type PromptInputProviderProps = PropsWithChildren<{\n initialInput?: string;\n}>;\n\nexport function PromptInputProvider({ initialInput: initialTextInput = '', children }: PromptInputProviderProps) {\n const [textInput, setTextInput] = useState(initialTextInput);\n const clearInput = useCallback(() => setTextInput(''), []);\n\n const [fileItems, setFileItems] = useState<(FileAttachment & { id: string })[]>([]);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n const openRef = useRef<() => void>(() => {});\n\n const add = useCallback((files: File[] | FileList) => {\n const incoming = Array.from(files);\n if (incoming.length === 0) return;\n\n setFileItems((prev) =>\n prev.concat(\n incoming.map((file) => ({\n id: generateId(),\n type: 'file' as const,\n url: URL.createObjectURL(file),\n mediaType: file.type,\n filename: file.name,\n })),\n ),\n );\n }, []);\n\n const remove = useCallback((id: string) => {\n setFileItems((prev) => {\n const found = prev.find((f) => f.id === id);\n if (found?.url) URL.revokeObjectURL(found.url);\n return prev.filter((f) => f.id !== id);\n });\n }, []);\n\n const clear = useCallback(() => {\n setFileItems((prev) => {\n for (const f of prev) if (f.url) URL.revokeObjectURL(f.url);\n return [];\n });\n }, []);\n\n const openFileDialog = useCallback(() => {\n openRef.current?.();\n }, []);\n\n const attachments = useMemo<AttachmentsContext>(\n () => ({\n files: fileItems,\n add,\n remove,\n clear,\n openFileDialog,\n fileInputRef,\n }),\n [fileItems, add, remove, clear, openFileDialog],\n );\n\n const __registerFileInput = useCallback(\n (ref: RefObject<HTMLInputElement | null>, open: () => void) => {\n fileInputRef.current = ref.current;\n openRef.current = open;\n },\n [],\n );\n\n const controller = useMemo<PromptInputControllerProps>(\n () => ({\n textInput: { value: textInput, setInput: setTextInput, clear: clearInput },\n attachments,\n __registerFileInput,\n }),\n [textInput, clearInput, attachments, __registerFileInput],\n );\n\n return (\n <PromptInputController.Provider value={controller}>\n <ProviderAttachmentsContext.Provider value={attachments}>{children}</ProviderAttachmentsContext.Provider>\n </PromptInputController.Provider>\n );\n}\n",
|
|
34
|
+
"import { cn } from '../../lib/cn';\nimport type { FileAttachment } from '../../types';\nimport { InputGroup } from '../../primitives/input-group';\nimport type { ChangeEventHandler, FormEvent, FormEventHandler, HTMLAttributes, RefObject } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { AttachmentsContext } from './context';\nimport { DropZoneContext, LocalAttachmentsContext, useOptionalPromptInputController } from './context';\n\nfunction generateId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\n\nexport type PromptInputMessage = {\n text?: string;\n files?: FileAttachment[];\n};\n\nexport type PromptInputProps = Omit<HTMLAttributes<HTMLFormElement>, 'onSubmit' | 'onError'> & {\n accept?: string;\n multiple?: boolean;\n globalDrop?: boolean;\n syncHiddenInput?: boolean;\n maxFiles?: number;\n maxFileSize?: number;\n dragListenerTarget?: RefObject<HTMLElement | null>;\n onError?: (err: { code: 'max_files' | 'max_file_size' | 'accept'; message: string }) => void;\n onSubmit: (message: PromptInputMessage, event: FormEvent<HTMLFormElement>) => void | Promise<void>;\n};\n\nexport const PromptInput = ({\n className,\n accept,\n multiple,\n globalDrop,\n syncHiddenInput,\n maxFiles,\n maxFileSize,\n dragListenerTarget,\n onError,\n onSubmit,\n children,\n ...props\n}: PromptInputProps) => {\n const controller = useOptionalPromptInputController();\n const usingProvider = !!controller;\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const formRef = useRef<HTMLFormElement | null>(null);\n\n const [items, setItems] = useState<(FileAttachment & { id: string })[]>([]);\n const files = usingProvider ? controller.attachments.files : items;\n\n const [isDraggingOver, setIsDraggingOver] = useState(false);\n const dragCounter = useRef(0);\n\n const openFileDialogLocal = useCallback(() => {\n inputRef.current?.click();\n }, []);\n\n const matchesAccept = useCallback(\n (f: File) => {\n if (!accept || accept.trim() === '') return true;\n const patterns = accept.split(',').map((p) => p.trim()).filter(Boolean);\n for (const pattern of patterns) {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -1);\n if (f.type.startsWith(prefix)) return true;\n } else if (pattern.startsWith('.')) {\n const ext = f.name.toLowerCase().split('.').pop();\n if (ext && `.${ext}` === pattern.toLowerCase()) return true;\n } else if (f.type === pattern) {\n return true;\n }\n }\n return false;\n },\n [accept],\n );\n\n const addLocal = useCallback(\n (fileList: File[] | FileList) => {\n const incoming = Array.from(fileList);\n const accepted = incoming.filter((f) => matchesAccept(f));\n if (incoming.length && accepted.length === 0) {\n onError?.({ code: 'accept', message: 'No files match the accepted types.' });\n return;\n }\n const withinSize = (f: File) => (maxFileSize ? f.size <= maxFileSize : true);\n const sized = accepted.filter(withinSize);\n if (accepted.length > 0 && sized.length === 0) {\n onError?.({ code: 'max_file_size', message: 'All files exceed the maximum size.' });\n return;\n }\n\n setItems((prev) => {\n const capacity = typeof maxFiles === 'number' ? Math.max(0, maxFiles - prev.length) : undefined;\n const capped = typeof capacity === 'number' ? sized.slice(0, capacity) : sized;\n if (typeof capacity === 'number' && sized.length > capacity) {\n onError?.({ code: 'max_files', message: 'Too many files. Some were not added.' });\n }\n const next: (FileAttachment & { id: string })[] = [];\n for (const file of capped) {\n next.push({\n id: generateId(),\n type: 'file',\n url: URL.createObjectURL(file),\n mediaType: file.type,\n filename: file.name,\n });\n }\n return prev.concat(next);\n });\n },\n [matchesAccept, maxFiles, maxFileSize, onError],\n );\n\n const add = usingProvider\n ? (fileList: File[] | FileList) => controller.attachments.add(fileList)\n : addLocal;\n\n const remove = usingProvider\n ? (id: string) => controller.attachments.remove(id)\n : (id: string) =>\n setItems((prev) => {\n const found = prev.find((file) => file.id === id);\n if (found?.url) URL.revokeObjectURL(found.url);\n return prev.filter((file) => file.id !== id);\n });\n\n const clear = usingProvider\n ? () => controller.attachments.clear()\n : () =>\n setItems((prev) => {\n for (const file of prev) if (file.url) URL.revokeObjectURL(file.url);\n return [];\n });\n\n const openFileDialog = usingProvider\n ? () => controller.attachments.openFileDialog()\n : openFileDialogLocal;\n\n useEffect(() => {\n if (!usingProvider) return;\n controller.__registerFileInput(inputRef, () => inputRef.current?.click());\n }, [usingProvider, controller]);\n\n useEffect(() => {\n if (syncHiddenInput && inputRef.current && files.length === 0) {\n inputRef.current.value = '';\n }\n }, [files, syncHiddenInput]);\n\n useEffect(() => {\n if (globalDrop) return; // document-level listeners handle everything\n const form = formRef.current;\n if (!form) return;\n\n const onDragOver = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes('Files')) e.preventDefault();\n };\n const onDragEnter = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes('Files')) {\n e.preventDefault();\n dragCounter.current++;\n if (dragCounter.current === 1) setIsDraggingOver(true);\n }\n };\n const onDragLeave = (_e: DragEvent) => {\n dragCounter.current--;\n if (dragCounter.current === 0) setIsDraggingOver(false);\n };\n const onDrop = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes('Files')) e.preventDefault();\n dragCounter.current = 0;\n setIsDraggingOver(false);\n if (e.dataTransfer?.files && e.dataTransfer.files.length > 0) add(e.dataTransfer.files);\n };\n form.addEventListener('dragover', onDragOver);\n form.addEventListener('dragenter', onDragEnter);\n form.addEventListener('dragleave', onDragLeave);\n form.addEventListener('drop', onDrop);\n return () => {\n form.removeEventListener('dragover', onDragOver);\n form.removeEventListener('dragenter', onDragEnter);\n form.removeEventListener('dragleave', onDragLeave);\n form.removeEventListener('drop', onDrop);\n };\n }, [add, globalDrop]);\n\n useEffect(() => {\n if (!globalDrop) return;\n\n const target = dragListenerTarget?.current ?? document;\n\n const onDragOver = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes('Files')) e.preventDefault();\n };\n const onDragEnter = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes('Files')) {\n e.preventDefault();\n dragCounter.current++;\n if (dragCounter.current === 1) setIsDraggingOver(true);\n }\n };\n const onDragLeave = (_e: DragEvent) => {\n dragCounter.current--;\n if (dragCounter.current === 0) setIsDraggingOver(false);\n };\n const onDrop = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes('Files')) e.preventDefault();\n dragCounter.current = 0;\n setIsDraggingOver(false);\n if (e.dataTransfer?.files && e.dataTransfer.files.length > 0) add(e.dataTransfer.files);\n };\n target.addEventListener('dragover', onDragOver as EventListener);\n target.addEventListener('dragenter', onDragEnter as EventListener);\n target.addEventListener('dragleave', onDragLeave as EventListener);\n target.addEventListener('drop', onDrop as EventListener);\n return () => {\n target.removeEventListener('dragover', onDragOver as EventListener);\n target.removeEventListener('dragenter', onDragEnter as EventListener);\n target.removeEventListener('dragleave', onDragLeave as EventListener);\n target.removeEventListener('drop', onDrop as EventListener);\n };\n }, [add, globalDrop, dragListenerTarget]);\n\n const filesRef = useRef(files);\n filesRef.current = files;\n\n useEffect(\n () => () => {\n if (!usingProvider) {\n for (const f of filesRef.current) if (f.url) URL.revokeObjectURL(f.url);\n }\n },\n [usingProvider],\n );\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n if (event.currentTarget.files) add(event.currentTarget.files);\n };\n\n const convertBlobUrlToDataUrl = async (url: string): Promise<string> => {\n const response = await fetch(url);\n const blob = await response.blob();\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n };\n\n const ctx = useMemo<AttachmentsContext>(\n () => ({\n files: files.map((item) => ({ ...item, id: item.id })),\n add,\n remove,\n clear,\n openFileDialog,\n fileInputRef: inputRef,\n }),\n [files, add, remove, clear, openFileDialog],\n );\n\n const handleSubmit: FormEventHandler<HTMLFormElement> = (event) => {\n event.preventDefault();\n\n const form = event.currentTarget;\n const text = usingProvider\n ? controller.textInput.value\n : (() => {\n const formData = new FormData(form);\n return (formData.get('message') as string) || '';\n })();\n\n if (!usingProvider) form.reset();\n\n Promise.all(\n files.map(async ({ id, ...item }) => {\n if (item.url && item.url.startsWith('blob:')) {\n return { ...item, url: await convertBlobUrlToDataUrl(item.url) };\n }\n return item;\n }),\n ).then((convertedFiles: FileAttachment[]) => {\n try {\n const result = onSubmit({ text, files: convertedFiles }, event);\n if (result instanceof Promise) {\n result\n .then(() => {\n clear();\n if (usingProvider) controller.textInput.clear();\n })\n .catch(() => {});\n } else {\n clear();\n if (usingProvider) controller.textInput.clear();\n }\n } catch {\n // Don't clear on error\n }\n });\n };\n\n const dropZoneValue = useMemo(() => ({ isDraggingOver }), [isDraggingOver]);\n\n const inner = (\n <DropZoneContext.Provider value={dropZoneValue}>\n <form className={cn('relative w-full', className)} onSubmit={handleSubmit} ref={formRef} {...props}>\n <input\n accept={accept}\n aria-label=\"Upload files\"\n className=\"hidden\"\n multiple={multiple}\n onChange={handleChange}\n ref={inputRef}\n title=\"Upload files\"\n type=\"file\"\n />\n <InputGroup>{children}</InputGroup>\n </form>\n </DropZoneContext.Provider>\n );\n\n return usingProvider ? inner : <LocalAttachmentsContext.Provider value={ctx}>{inner}</LocalAttachmentsContext.Provider>;\n};\n",
|
|
35
|
+
"import { cn } from '../../lib/cn';\nimport { InputGroupTextarea } from '../../primitives/input-group';\nimport type { ChangeEvent, ComponentProps, KeyboardEventHandler, ClipboardEventHandler } from 'react';\nimport { useState } from 'react';\nimport { useOptionalPromptInputController, usePromptInputAttachments } from './context';\n\nexport type PromptInputTextareaProps = ComponentProps<typeof InputGroupTextarea>;\n\nexport const PromptInputTextarea = ({\n onChange,\n className,\n placeholder = 'What would you like to know?',\n ...props\n}: PromptInputTextareaProps) => {\n const controller = useOptionalPromptInputController();\n const attachments = usePromptInputAttachments();\n const [isComposing, setIsComposing] = useState(false);\n\n const handleKeyDown: KeyboardEventHandler<HTMLTextAreaElement> = (e) => {\n if (e.key === 'Enter') {\n if (isComposing || e.nativeEvent.isComposing) return;\n if (e.shiftKey) return;\n e.preventDefault();\n e.currentTarget.form?.requestSubmit();\n }\n\n if (e.key === 'Backspace' && e.currentTarget.value === '' && attachments.files.length > 0) {\n e.preventDefault();\n const lastAttachment = attachments.files.at(-1);\n if (lastAttachment) attachments.remove(lastAttachment.id);\n }\n };\n\n const handlePaste: ClipboardEventHandler<HTMLTextAreaElement> = (event) => {\n const items = event.clipboardData?.items;\n if (!items) return;\n\n const files: File[] = [];\n for (const item of items) {\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (file) files.push(file);\n }\n }\n\n if (files.length > 0) {\n event.preventDefault();\n attachments.add(files);\n }\n };\n\n const controlledProps = controller\n ? {\n value: controller.textInput.value,\n onChange: (e: ChangeEvent<HTMLTextAreaElement>) => {\n controller.textInput.setInput(e.currentTarget.value);\n onChange?.(e);\n },\n }\n : { onChange };\n\n return (\n <InputGroupTextarea\n className={cn('[field-sizing:content] max-h-48 text-base', className)}\n rows={1}\n name=\"message\"\n onCompositionEnd={() => setIsComposing(false)}\n onCompositionStart={() => setIsComposing(true)}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n placeholder={placeholder}\n {...props}\n {...controlledProps}\n />\n );\n};\n",
|
|
36
|
+
"import { cn } from '../../lib/cn';\nimport { Button } from '../../primitives/button';\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from '../../primitives/hover-card';\nimport { DropdownMenuItem } from '../../primitives/dropdown-menu';\nimport { ImageIcon, MicIcon, PaperclipIcon, XIcon } from 'lucide-react';\nimport type { ComponentProps, HTMLAttributes, ReactNode } from 'react';\nimport { Fragment } from 'react';\nimport type { FileAttachment } from '../../types';\nimport { usePromptInputAttachments } from './context';\n\nexport type PromptInputAttachmentProps = HTMLAttributes<HTMLDivElement> & {\n data: FileAttachment & { id: string };\n className?: string;\n};\n\nexport function PromptInputAttachment({ data, className, ...props }: PromptInputAttachmentProps) {\n const attachments = usePromptInputAttachments();\n\n const filename = data.filename || '';\n const isImage = data.mediaType?.startsWith('image/') && data.url;\n const isAudio = data.mediaType?.startsWith('audio/');\n const attachmentLabel = filename || (isImage ? 'Image' : isAudio ? 'Audio' : 'Attachment');\n\n return (\n <HoverCard openDelay={0} closeDelay={0}>\n <HoverCardTrigger asChild>\n <div\n className={cn(\n 'group relative flex h-8 cursor-default select-none items-center gap-1.5 rounded-md border border-border px-1.5 font-medium text-sm transition-all hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n className,\n )}\n key={data.id}\n {...props}\n >\n <div className=\"relative size-5 shrink-0\">\n <div className=\"absolute inset-0 flex size-5 items-center justify-center overflow-hidden rounded bg-background transition-opacity group-hover:opacity-0\">\n {isImage ? (\n <img alt={filename || 'attachment'} className=\"size-5 object-cover\" height={20} src={data.url} width={20} />\n ) : isAudio ? (\n <div className=\"flex size-5 items-center justify-center text-muted-foreground\">\n <MicIcon className=\"size-3\" />\n </div>\n ) : (\n <div className=\"flex size-5 items-center justify-center text-muted-foreground\">\n <PaperclipIcon className=\"size-3\" />\n </div>\n )}\n </div>\n <Button\n aria-label=\"Remove attachment\"\n className=\"absolute inset-0 size-5 cursor-pointer rounded p-0 opacity-0 transition-opacity group-hover:pointer-events-auto group-hover:opacity-100 [&>svg]:size-2.5\"\n onClick={(e) => {\n e.stopPropagation();\n attachments.remove(data.id);\n }}\n type=\"button\"\n variant=\"ghost\"\n >\n <XIcon />\n <span className=\"sr-only\">Remove</span>\n </Button>\n </div>\n <span className=\"flex-1 truncate\">{attachmentLabel}</span>\n </div>\n </HoverCardTrigger>\n <HoverCardContent align=\"start\" className=\"w-auto p-2\">\n <div className=\"w-auto space-y-3\">\n {isImage && (\n <div className=\"flex max-h-96 w-96 items-center justify-center overflow-hidden rounded-md border\">\n <img alt={filename || 'attachment preview'} className=\"max-h-full max-w-full object-contain\" height={384} src={data.url} width={448} />\n </div>\n )}\n {isAudio && data.url && (\n <div className=\"w-64\">\n <audio src={data.url} controls className=\"w-full\" />\n </div>\n )}\n <div className=\"flex items-center gap-2.5\">\n <div className=\"min-w-0 flex-1 space-y-1 px-0.5\">\n <h4 className=\"truncate font-semibold text-sm leading-none\">{filename || (isImage ? 'Image' : 'Attachment')}</h4>\n {data.mediaType && <p className=\"truncate font-mono text-muted-foreground text-xs\">{data.mediaType}</p>}\n </div>\n </div>\n </div>\n </HoverCardContent>\n </HoverCard>\n );\n}\n\nexport type PromptInputAttachmentsProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {\n children: (attachment: FileAttachment & { id: string }) => ReactNode;\n};\n\nexport function PromptInputAttachments({ children }: PromptInputAttachmentsProps) {\n const attachments = usePromptInputAttachments();\n if (!attachments.files.length) return null;\n return attachments.files.map((file) => <Fragment key={file.id}>{children(file)}</Fragment>);\n}\n\nexport type PromptInputActionAddAttachmentsProps = ComponentProps<typeof DropdownMenuItem> & {\n label?: string;\n};\n\nexport const PromptInputActionAddAttachments = ({\n label = 'Add photos or files',\n ...props\n}: PromptInputActionAddAttachmentsProps) => {\n const attachments = usePromptInputAttachments();\n\n return (\n <DropdownMenuItem\n {...props}\n onSelect={() => {\n attachments.openFileDialog();\n }}\n >\n <ImageIcon className=\"mr-2 size-4\" /> {label}\n </DropdownMenuItem>\n );\n};\n",
|
|
37
|
+
"import { cn } from '../../lib/cn';\nimport { InputGroupAddon } from '../../primitives/input-group';\nimport type { ComponentProps, HTMLAttributes } from 'react';\n\nexport type PromptInputBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputBody = ({ className, ...props }: PromptInputBodyProps) => (\n <div className={cn('contents', className)} {...props} />\n);\n\nexport type PromptInputHeaderProps = Omit<ComponentProps<typeof InputGroupAddon>, 'align'>;\n\nexport const PromptInputHeader = ({ className, ...props }: PromptInputHeaderProps) => (\n <InputGroupAddon align=\"block-start\" className={cn('flex-wrap gap-1 empty:hidden empty:p-0', className)} {...props} />\n);\n\nexport type PromptInputFooterProps = Omit<ComponentProps<typeof InputGroupAddon>, 'align'>;\n\nexport const PromptInputFooter = ({ className, ...props }: PromptInputFooterProps) => (\n <InputGroupAddon align=\"block-end\" className={cn('justify-between gap-1', className)} {...props} />\n);\n\nexport type PromptInputToolsProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTools = ({ className, ...props }: PromptInputToolsProps) => (\n <div className={cn('flex items-center gap-1', className)} {...props} />\n);\n",
|
|
38
|
+
"import { cn } from '../../lib/cn';\nimport { InputGroupButton } from '../../primitives/input-group';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../../primitives/dropdown-menu';\nimport { Loader2Icon, PlusIcon, SendIcon, SquareIcon, XIcon } from 'lucide-react';\nimport { Children, type ComponentProps } from 'react';\nimport type { ChatStatus } from '../../types';\n\nexport type PromptInputButtonProps = ComponentProps<typeof InputGroupButton>;\n\nexport const PromptInputButton = ({\n variant = 'ghost',\n className,\n size,\n ...props\n}: PromptInputButtonProps) => {\n const newSize = size ?? (Children.count(props.children) > 1 ? 'sm' : 'icon-sm');\n\n return <InputGroupButton className={cn(className)} size={newSize} type=\"button\" variant={variant} {...props} />;\n};\n\nexport type PromptInputSubmitProps = ComponentProps<typeof InputGroupButton> & {\n status?: ChatStatus;\n};\n\nexport const PromptInputSubmit = ({\n className,\n variant = 'default',\n size = 'icon-sm',\n status,\n children,\n ...props\n}: PromptInputSubmitProps) => {\n let Icon = <SendIcon className=\"size-4\" />;\n\n if (status === 'submitted') {\n Icon = <Loader2Icon className=\"size-4 animate-spin\" />;\n } else if (status === 'streaming') {\n Icon = <SquareIcon className=\"size-4\" />;\n } else if (status === 'error') {\n Icon = <XIcon className=\"size-4\" />;\n }\n\n return (\n <InputGroupButton aria-label=\"Submit\" className={cn(className)} size={size} type=\"submit\" variant={variant} {...props}>\n {children ?? Icon}\n </InputGroupButton>\n );\n};\n\nexport type PromptInputActionMenuProps = ComponentProps<typeof DropdownMenu>;\nexport const PromptInputActionMenu = (props: PromptInputActionMenuProps) => <DropdownMenu {...props} />;\n\nexport type PromptInputActionMenuTriggerProps = PromptInputButtonProps;\n\nexport const PromptInputActionMenuTrigger = ({\n className,\n children,\n ...props\n}: PromptInputActionMenuTriggerProps) => (\n <DropdownMenuTrigger asChild>\n <PromptInputButton className={className} {...props}>\n {children ?? <PlusIcon className=\"size-4\" />}\n </PromptInputButton>\n </DropdownMenuTrigger>\n);\n\nexport type PromptInputActionMenuContentProps = ComponentProps<typeof DropdownMenuContent>;\nexport const PromptInputActionMenuContent = ({\n className,\n ...props\n}: PromptInputActionMenuContentProps) => <DropdownMenuContent align=\"start\" className={cn(className)} {...props} />;\n\nexport type PromptInputActionMenuItemProps = ComponentProps<typeof DropdownMenuItem>;\nexport const PromptInputActionMenuItem = ({\n className,\n ...props\n}: PromptInputActionMenuItemProps) => <DropdownMenuItem className={cn(className)} {...props} />;\n",
|
|
39
|
+
"import { Upload } from 'lucide-react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../lib/cn';\nimport { usePromptInputDropZone } from './context';\nimport type { HTMLAttributes, RefObject } from 'react';\n\nexport type PromptInputDropZoneProps = HTMLAttributes<HTMLDivElement> & {\n label?: string;\n container?: RefObject<HTMLElement | null>;\n};\n\nexport const PromptInputDropZone = ({\n label = 'Drop files here',\n className,\n container,\n ...props\n}: PromptInputDropZoneProps) => {\n const { isDraggingOver } = usePromptInputDropZone();\n\n const overlay = (\n <div\n className={cn(\n 'absolute inset-0 z-10 pointer-events-none',\n 'flex flex-col items-center justify-center gap-2',\n 'border-2 border-dashed border-primary rounded-xl',\n 'bg-primary/5 backdrop-blur-[2px] text-primary',\n 'transition-opacity duration-200',\n isDraggingOver ? 'opacity-100' : 'opacity-0',\n className,\n )}\n aria-hidden={!isDraggingOver}\n {...props}\n >\n <Upload className=\"size-14\" />\n <span className=\"text-sm font-medium mt-2\">{label}</span>\n </div>\n );\n\n if (container?.current) {\n return createPortal(overlay, container.current);\n }\n\n return overlay;\n};\n",
|
|
40
|
+
"import { cn } from '../../lib/cn';\nimport { MicIcon } from 'lucide-react';\nimport type { ComponentProps } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { PromptInputButton } from './buttons';\nimport { useOptionalPromptInputController } from './context';\n\ninterface SpeechRecognition extends EventTarget {\n continuous: boolean;\n interimResults: boolean;\n lang: string;\n start(): void;\n stop(): void;\n onstart: ((this: SpeechRecognition, ev: Event) => any) | null;\n onend: ((this: SpeechRecognition, ev: Event) => any) | null;\n onresult: ((this: SpeechRecognition, ev: SpeechRecognitionEvent) => any) | null;\n onerror: ((this: SpeechRecognition, ev: SpeechRecognitionErrorEvent) => any) | null;\n}\n\ninterface SpeechRecognitionEvent extends Event {\n results: SpeechRecognitionResultList;\n}\n\ntype SpeechRecognitionResultList = {\n readonly length: number;\n item(index: number): SpeechRecognitionResult;\n [index: number]: SpeechRecognitionResult;\n};\n\ntype SpeechRecognitionResult = {\n readonly length: number;\n item(index: number): SpeechRecognitionAlternative;\n [index: number]: SpeechRecognitionAlternative;\n isFinal: boolean;\n};\n\ntype SpeechRecognitionAlternative = {\n transcript: string;\n confidence: number;\n};\n\ninterface SpeechRecognitionErrorEvent extends Event {\n error: string;\n}\n\ndeclare global {\n interface Window {\n SpeechRecognition: { new (): SpeechRecognition };\n webkitSpeechRecognition: { new (): SpeechRecognition };\n }\n}\n\nexport type PromptInputSpeechButtonProps = ComponentProps<typeof PromptInputButton> & {\n onTranscriptionChange?: (text: string) => void;\n lang?: string;\n};\n\nexport const PromptInputSpeechButton = ({\n className,\n onTranscriptionChange,\n lang = 'en-US',\n ...props\n}: PromptInputSpeechButtonProps) => {\n const [isListening, setIsListening] = useState(false);\n const [recognition, setRecognition] = useState<SpeechRecognition | null>(null);\n const recognitionRef = useRef<SpeechRecognition | null>(null);\n const onTranscriptionChangeRef = useRef(onTranscriptionChange);\n onTranscriptionChangeRef.current = onTranscriptionChange;\n const controller = useOptionalPromptInputController();\n\n useEffect(() => {\n if (typeof window !== 'undefined' && ('SpeechRecognition' in window || 'webkitSpeechRecognition' in window)) {\n const SpeechRecognitionCtor = window.SpeechRecognition || window.webkitSpeechRecognition;\n const speechRecognition = new SpeechRecognitionCtor();\n\n speechRecognition.continuous = true;\n speechRecognition.interimResults = true;\n speechRecognition.lang = lang;\n\n speechRecognition.onstart = () => setIsListening(true);\n speechRecognition.onend = () => setIsListening(false);\n\n speechRecognition.onresult = (event) => {\n let finalTranscript = '';\n const results = Array.from(event.results);\n for (const result of results) {\n if (result.isFinal) finalTranscript += result[0]?.transcript ?? '';\n }\n if (finalTranscript) {\n if (controller) {\n const current = controller.textInput.value;\n const newValue = current + (current ? ' ' : '') + finalTranscript;\n controller.textInput.setInput(newValue);\n }\n onTranscriptionChangeRef.current?.(finalTranscript);\n }\n };\n\n speechRecognition.onerror = (event) => {\n console.error('Speech recognition error:', event.error);\n setIsListening(false);\n };\n\n recognitionRef.current = speechRecognition;\n setRecognition(speechRecognition);\n }\n\n return () => {\n if (recognitionRef.current) recognitionRef.current.stop();\n };\n }, [lang]);\n\n const toggleListening = useCallback(() => {\n if (!recognition) return;\n if (isListening) recognition.stop();\n else recognition.start();\n }, [recognition, isListening]);\n\n return (\n <PromptInputButton\n className={cn(\n 'relative transition-all duration-200',\n isListening && 'animate-pulse bg-accent text-accent-foreground',\n className,\n )}\n disabled={!recognition}\n onClick={toggleListening}\n {...props}\n >\n <MicIcon className=\"size-4\" />\n </PromptInputButton>\n );\n};\n",
|
|
41
|
+
"import { cn } from '../../lib/cn';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../primitives/select';\nimport type { ComponentProps } from 'react';\n\nexport type PromptInputModelSelectProps = ComponentProps<typeof Select>;\nexport const PromptInputModelSelect = (props: PromptInputModelSelectProps) => <Select {...props} />;\n\nexport type PromptInputModelSelectTriggerProps = ComponentProps<typeof SelectTrigger>;\n\nexport const PromptInputModelSelectTrigger = ({\n className,\n ...props\n}: PromptInputModelSelectTriggerProps) => (\n <SelectTrigger\n className={cn(\n 'border-none bg-transparent font-medium text-muted-foreground shadow-none transition-colors',\n 'hover:bg-accent hover:text-foreground [&[aria-expanded=\"true\"]]:bg-accent [&[aria-expanded=\"true\"]]:text-foreground',\n className,\n )}\n {...props}\n />\n);\n\nexport type PromptInputModelSelectContentProps = ComponentProps<typeof SelectContent>;\nexport const PromptInputModelSelectContent = ({ className, ...props }: PromptInputModelSelectContentProps) => (\n <SelectContent className={cn(className)} {...props} />\n);\n\nexport type PromptInputModelSelectItemProps = ComponentProps<typeof SelectItem>;\nexport const PromptInputModelSelectItem = ({ className, ...props }: PromptInputModelSelectItemProps) => (\n <SelectItem className={cn(className)} {...props} />\n);\n\nexport type PromptInputModelSelectValueProps = ComponentProps<typeof SelectValue>;\nexport const PromptInputModelSelectValue = ({ className, ...props }: PromptInputModelSelectValueProps) => (\n <SelectValue className={cn(className)} {...props} />\n);\n",
|
|
42
|
+
"import { cn } from '../../lib/cn';\nimport type { HTMLAttributes } from 'react';\n\nexport type PromptInputTabsListProps = HTMLAttributes<HTMLDivElement>;\nexport const PromptInputTabsList = ({ className, ...props }: PromptInputTabsListProps) => (\n <div className={cn(className)} {...props} />\n);\n\nexport type PromptInputTabProps = HTMLAttributes<HTMLDivElement>;\nexport const PromptInputTab = ({ className, ...props }: PromptInputTabProps) => (\n <div className={cn(className)} {...props} />\n);\n\nexport type PromptInputTabLabelProps = HTMLAttributes<HTMLHeadingElement>;\nexport const PromptInputTabLabel = ({ className, ...props }: PromptInputTabLabelProps) => (\n <h3 className={cn('mb-2 px-3 font-medium text-muted-foreground text-xs', className)} {...props} />\n);\n\nexport type PromptInputTabBodyProps = HTMLAttributes<HTMLDivElement>;\nexport const PromptInputTabBody = ({ className, ...props }: PromptInputTabBodyProps) => (\n <div className={cn('space-y-1', className)} {...props} />\n);\n\nexport type PromptInputTabItemProps = HTMLAttributes<HTMLDivElement>;\nexport const PromptInputTabItem = ({ className, ...props }: PromptInputTabItemProps) => (\n <div className={cn('flex items-center gap-2 px-3 py-2 text-xs hover:bg-accent', className)} {...props} />\n);\n",
|
|
43
|
+
"import { cn } from '../../lib/cn';\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '../../primitives/command';\nimport type { ComponentProps } from 'react';\n\nexport type PromptInputCommandProps = ComponentProps<typeof Command>;\nexport const PromptInputCommand = ({ className, ...props }: PromptInputCommandProps) => (\n <Command className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandInputProps = ComponentProps<typeof CommandInput>;\nexport const PromptInputCommandInput = ({ className, ...props }: PromptInputCommandInputProps) => (\n <CommandInput className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandListProps = ComponentProps<typeof CommandList>;\nexport const PromptInputCommandList = ({ className, ...props }: PromptInputCommandListProps) => (\n <CommandList className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandEmptyProps = ComponentProps<typeof CommandEmpty>;\nexport const PromptInputCommandEmpty = ({ className, ...props }: PromptInputCommandEmptyProps) => (\n <CommandEmpty className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandGroupProps = ComponentProps<typeof CommandGroup>;\nexport const PromptInputCommandGroup = ({ className, ...props }: PromptInputCommandGroupProps) => (\n <CommandGroup className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandItemProps = ComponentProps<typeof CommandItem>;\nexport const PromptInputCommandItem = ({ className, ...props }: PromptInputCommandItemProps) => (\n <CommandItem className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandSeparatorProps = ComponentProps<typeof CommandSeparator>;\nexport const PromptInputCommandSeparator = ({ className, ...props }: PromptInputCommandSeparatorProps) => (\n <CommandSeparator className={cn(className)} {...props} />\n);\n",
|
|
44
|
+
"import { useCallback, useMemo, useRef } from 'react';\nimport type { HTMLAttributes, ReactNode } from 'react';\nimport { useAgnoChat, useAgnoToolExecution } from '@rodrigocoliveira/agno-react';\nimport type { ToolHandler } from '@rodrigocoliveira/agno-react';\nimport { AgnoChatContext } from './context';\nimport type { AgnoChatContextValue } from './context';\nimport { cn } from '../../lib/cn';\n\nexport interface AgnoChatRootProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n toolHandlers?: Record<string, ToolHandler>;\n autoExecuteTools?: boolean;\n}\n\nexport function AgnoChatRoot({\n children,\n toolHandlers = {},\n autoExecuteTools = true,\n className,\n ...divProps\n}: AgnoChatRootProps) {\n const chat = useAgnoChat();\n const toolExec = useAgnoToolExecution(toolHandlers, autoExecuteTools);\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Stable ref so handleSend never changes identity\n const sendRef = useRef(chat.sendMessage);\n sendRef.current = chat.sendMessage;\n\n const handleSend = useCallback(async (message: string | FormData) => {\n try {\n await sendRef.current(message);\n } catch {\n // Error is surfaced via the error state\n }\n }, []);\n\n // Destructure individual values for stable dependency tracking\n const {\n messages,\n sendMessage,\n clearMessages,\n cancelRun,\n isStreaming,\n isRefreshing,\n isCancelling,\n currentRunId,\n error,\n state,\n } = chat;\n\n const {\n isPaused,\n isExecuting,\n pendingTools,\n executeAndContinue,\n executeTools,\n continueWithResults,\n executionError,\n } = toolExec;\n\n const contextValue = useMemo<AgnoChatContextValue>(\n () => ({\n // chat\n messages,\n sendMessage,\n clearMessages,\n cancelRun,\n isStreaming,\n isRefreshing,\n isCancelling: isCancelling ?? false,\n currentRunId,\n error,\n state,\n\n // tool execution\n isPaused,\n isExecuting,\n pendingTools,\n executeAndContinue,\n executeTools,\n continueWithResults,\n executionError,\n\n // derived\n handleSend,\n inputDisabled: isStreaming || isPaused,\n\n // drop zone\n dropZoneContainerRef: containerRef,\n }),\n [\n messages,\n sendMessage,\n clearMessages,\n cancelRun,\n isStreaming,\n isRefreshing,\n isCancelling,\n currentRunId,\n error,\n state,\n isPaused,\n isExecuting,\n pendingTools,\n executeAndContinue,\n executeTools,\n continueWithResults,\n executionError,\n handleSend,\n ],\n );\n\n return (\n <AgnoChatContext.Provider value={contextValue}>\n <div ref={containerRef} className={cn('relative h-full flex flex-col', className)} {...divProps}>\n {children}\n </div>\n </AgnoChatContext.Provider>\n );\n}\n",
|
|
45
|
+
"import { createContext, useContext } from 'react';\nimport type { RefObject } from 'react';\nimport type { ChatMessage, ClientState, ToolCall } from '@rodrigocoliveira/agno-types';\n\nexport interface AgnoChatContextValue {\n // From useAgnoChat()\n messages: ChatMessage[];\n sendMessage: (\n message: string | FormData,\n options?: { headers?: Record<string, string>; params?: Record<string, string> },\n ) => Promise<void>;\n clearMessages: () => void;\n cancelRun: () => Promise<void>;\n isStreaming: boolean;\n isRefreshing: boolean;\n isCancelling: boolean;\n currentRunId?: string;\n error?: string;\n state: ClientState;\n\n // From useAgnoToolExecution()\n isPaused: boolean;\n isExecuting: boolean;\n pendingTools: ToolCall[];\n executeAndContinue: () => Promise<void>;\n executeTools: (tools: ToolCall[]) => Promise<ToolCall[]>;\n continueWithResults: (\n tools: ToolCall[],\n options?: { headers?: Record<string, string>; params?: Record<string, string> },\n ) => Promise<void>;\n executionError?: string;\n\n // Derived convenience\n handleSend: (message: string | FormData) => Promise<void>;\n inputDisabled: boolean;\n\n // Drop zone\n dropZoneContainerRef?: RefObject<HTMLElement | null>;\n}\n\nexport const AgnoChatContext = createContext<AgnoChatContextValue | null>(null);\n\nexport function useAgnoChatContext(): AgnoChatContextValue {\n const ctx = useContext(AgnoChatContext);\n if (!ctx) {\n throw new Error(\n 'useAgnoChatContext must be used within an <AgnoChat> provider. ' +\n 'Wrap your component tree with <AgnoChat>.',\n );\n }\n return ctx;\n}\n",
|
|
46
|
+
"import type { ChatMessage } from '@rodrigocoliveira/agno-types';\nimport { useEffect, useRef, type ReactNode } from 'react';\nimport {\n Conversation,\n ConversationContent,\n ConversationEmptyState,\n ConversationScrollButton,\n useStickToBottomContext,\n} from '../../components/conversation';\nimport { StreamingIndicator } from '../../components/streaming-indicator';\nimport { AgnoMessageItem } from '../AgnoMessageItem';\nimport type { AgnoMessageItemProps } from '../AgnoMessageItem';\nimport { AgnoChatSuggestedPrompts } from './suggested-prompts';\nimport { useAgnoChatContext } from './context';\nimport { cn } from '../../lib/cn';\nimport { Bot } from 'lucide-react';\nimport type { SuggestedPrompt } from '../../types';\n\nexport interface AgnoChatMessagesProps {\n className?: string;\n renderMessage?: (message: ChatMessage, index: number) => ReactNode;\n userAvatar?: ReactNode;\n assistantAvatar?: ReactNode;\n messageItemProps?: Partial<Omit<AgnoMessageItemProps, 'message'>>;\n emptyState?: ReactNode;\n suggestedPrompts?: SuggestedPrompt[];\n /** Custom empty state via children — takes priority over emptyState prop */\n children?: ReactNode;\n /** Show the thinking indicator while waiting for the first response content (default: true) */\n showThinkingIndicator?: boolean;\n /** Custom component to render instead of the default thinking indicator */\n renderThinkingIndicator?: ReactNode;\n}\n\n/** Scrolls to bottom only when the user sends a new message */\nfunction ScrollOnNewUserMessage({ messageCount }: { messageCount: number }) {\n const { scrollToBottom } = useStickToBottomContext();\n const prevCount = useRef(messageCount);\n\n useEffect(() => {\n if (messageCount > prevCount.current) {\n scrollToBottom('smooth');\n }\n prevCount.current = messageCount;\n }, [messageCount, scrollToBottom]);\n\n return null;\n}\n\nconst DEFAULT_PROMPTS: SuggestedPrompt[] = [\n { text: 'What can you help me with?' },\n { text: 'Explain how you work' },\n];\n\nexport function AgnoChatMessages({\n className,\n renderMessage,\n userAvatar,\n assistantAvatar,\n messageItemProps,\n emptyState,\n suggestedPrompts = DEFAULT_PROMPTS,\n children,\n showThinkingIndicator = true,\n renderThinkingIndicator,\n}: AgnoChatMessagesProps) {\n const { messages, isStreaming } = useAgnoChatContext();\n const lastMessage = messages[messages.length - 1];\n const isThinking = showThinkingIndicator && isStreaming && (!lastMessage || lastMessage.role !== 'user') && !lastMessage?.content;\n\n const resolvedEmptyState = children ??\n emptyState ?? (\n <div className=\"flex flex-col items-center gap-6\">\n <div className=\"relative\">\n <div className=\"h-16 w-16 rounded-2xl bg-primary/10 flex items-center justify-center\">\n <Bot className=\"h-8 w-8 text-primary\" />\n </div>\n <div className=\"absolute -bottom-1 -right-1 h-5 w-5 rounded-full bg-green-500 border-2 border-background flex items-center justify-center\">\n <span className=\"h-2 w-2 rounded-full bg-white animate-pulse\" />\n </div>\n </div>\n <div className=\"space-y-2 text-center\">\n <h3 className=\"text-xl font-semibold tracking-tight\">Welcome to Agno Chat</h3>\n <p className=\"text-muted-foreground text-sm max-w-sm\">\n Start a conversation with your AI agent. Ask questions, explore ideas, or run tools.\n </p>\n </div>\n {suggestedPrompts.length > 0 && <AgnoChatSuggestedPrompts prompts={suggestedPrompts} />}\n </div>\n );\n\n return (\n <Conversation className={cn('relative flex-1 w-full', className)}>\n <ScrollOnNewUserMessage messageCount={messages.length} />\n <ConversationContent className=\"max-w-3xl mx-auto\">\n {messages.length === 0 ? (\n <ConversationEmptyState>{resolvedEmptyState}</ConversationEmptyState>\n ) : (\n messages.map((message, index) => {\n // Hide the empty placeholder while the thinking indicator is shown\n if (isThinking && index === messages.length - 1 && message === lastMessage) return null;\n return renderMessage ? (\n renderMessage(message, index)\n ) : (\n <AgnoMessageItem\n key={`msg-${index}-${message.created_at}`}\n message={message}\n userAvatar={userAvatar}\n assistantAvatar={assistantAvatar}\n {...messageItemProps}\n />\n );\n })\n )}\n\n {isThinking && (\n <div className=\"py-2\">\n {renderThinkingIndicator ?? <StreamingIndicator avatar={assistantAvatar} />}\n </div>\n )}\n </ConversationContent>\n <ConversationScrollButton />\n </Conversation>\n );\n}\n",
|
|
47
|
+
"import { useState } from 'react';\nimport type { ChatMessage, ToolCall } from '@rodrigocoliveira/agno-types';\nimport { GenerativeUIRenderer } from '@rodrigocoliveira/agno-react';\nimport { Response } from '../components/response';\nimport { Tool, ToolContent, ToolHeader, ToolInput, ToolOutput } from '../components/tool';\nimport { Artifact } from '../components/artifact';\nimport { SmartTimestamp } from '../components/smart-timestamp';\nimport { FilePreviewCard } from '../components/file-preview-card';\nimport { FilePreviewModal } from '../components/file-preview-modal';\nimport { ImageLightbox } from '../components/image-lightbox';\nimport type { FilePreviewFile } from '../components/file-preview-card';\nimport type { LightboxImage } from '../components/image-lightbox';\nimport { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '../primitives/accordion';\nimport { cn } from '../lib/cn';\nimport { formatSmartTimestamp } from '../lib/format-timestamp';\nimport type { ToolState } from '../types';\nimport type { AgnoMessageItemClassNames } from '../types';\nimport type { ReactNode } from 'react';\nimport {\n AlertCircle,\n FileIcon,\n FileText,\n Image as ImageIcon,\n Lightbulb,\n Music,\n Paperclip,\n Video,\n} from 'lucide-react';\n\nexport interface AgnoMessageItemProps {\n message: ChatMessage;\n className?: string;\n classNames?: AgnoMessageItemClassNames;\n /** Custom render for the entire message content area */\n renderContent?: (message: ChatMessage) => ReactNode;\n /** Custom render for individual tool calls */\n renderToolCall?: (tool: NonNullable<ChatMessage['tool_calls']>[0], index: number) => ReactNode;\n /** Custom render for media sections */\n renderMedia?: (message: ChatMessage) => ReactNode;\n /** Render action buttons below assistant messages (e.g., copy, like, dislike) */\n renderActions?: (message: ChatMessage) => ReactNode;\n /** Custom user avatar */\n userAvatar?: ReactNode;\n /** Custom assistant avatar */\n assistantAvatar?: ReactNode;\n /** Show reasoning steps (default: true) */\n showReasoning?: boolean;\n /** Show references (default: true) */\n showReferences?: boolean;\n /** Show timestamp (default: true) */\n showTimestamp?: boolean;\n /** Show generative UI renders (default: true) */\n showGenerativeUI?: boolean;\n /** Show tool call details (default: true) */\n showToolCalls?: boolean;\n /** Enable file preview cards with click-to-open modal (default: true) */\n showFilePreview?: boolean;\n /** Enable image lightbox on click (default: true) */\n showImageLightbox?: boolean;\n /** Custom timestamp formatter */\n formatTimestamp?: (date: Date) => string;\n}\n\nconst defaultFormatTimestamp = formatSmartTimestamp;\n\nconst getToolState = (tool: NonNullable<ChatMessage['tool_calls']>[0]): ToolState => {\n return tool.tool_call_error ? 'output-error' : 'output-available';\n};\n\ntype PreviewState =\n | { type: 'image'; images: LightboxImage[]; initialIndex: number }\n | { type: 'file'; file: FilePreviewFile }\n | null;\n\nexport function AgnoMessageItem({\n message,\n className,\n classNames,\n renderContent,\n renderToolCall,\n renderMedia,\n renderActions,\n userAvatar,\n assistantAvatar,\n showReasoning = true,\n showReferences = true,\n showTimestamp = true,\n showGenerativeUI = true,\n showToolCalls = true,\n showFilePreview = true,\n showImageLightbox = true,\n formatTimestamp,\n}: AgnoMessageItemProps) {\n const isUser = message.role === 'user';\n const hasError = message.streamingError;\n const toolsWithUI = message.tool_calls?.filter((tool) => (tool as ToolCall & { ui_component?: any }).ui_component) || [];\n\n const [preview, setPreview] = useState<PreviewState>(null);\n\n const isCustomTimestamp = !!formatTimestamp;\n const resolvedFormatTimestamp = formatTimestamp ?? defaultFormatTimestamp;\n\n const openImageLightbox = (images: LightboxImage[], index: number) => {\n if (!showImageLightbox) return;\n setPreview({ type: 'image', images, initialIndex: index });\n };\n\n const openFilePreview = (file: FilePreviewFile) => {\n if (!showFilePreview) return;\n setPreview({ type: 'file', file });\n };\n\n const closePreview = () => setPreview(null);\n\n return (\n <div className={cn('py-5 first:pt-2', isUser ? 'flex justify-end' : '', classNames?.root, className)}>\n {isUser ? (\n /* User message */\n <div className=\"flex items-start gap-2.5 max-w-[80%] flex-row-reverse\">\n {userAvatar}\n <div className=\"space-y-1.5 flex flex-col items-end min-w-0\">\n {/* Attachments row — images + files side-by-side as uniform cards */}\n {((message.images && message.images.length > 0) ||\n (message.audio && message.audio.length > 0) ||\n (message.files && message.files.length > 0)) && (\n <div className=\"flex flex-wrap gap-2 justify-end\">\n {/* Image thumbnails as square cards */}\n {message.images?.map((img, idx) => (\n <FilePreviewCard\n key={`img-${idx}`}\n file={{ name: img.revised_prompt || `Image ${idx + 1}`, type: 'image/png', url: img.url }}\n onClick={\n showImageLightbox\n ? () =>\n openImageLightbox(\n message.images!.map((i) => ({ url: i.url, alt: i.revised_prompt })),\n idx,\n )\n : undefined\n }\n />\n ))}\n {/* Audio chips */}\n {message.audio?.map((audio, idx) => (\n <div\n key={`audio-${idx}`}\n className=\"flex items-center gap-1.5 rounded-lg border border-border bg-muted/50 px-2.5 py-1.5 text-xs text-foreground self-end\"\n >\n <Music className=\"h-3.5 w-3.5 text-muted-foreground\" />\n <span className=\"truncate max-w-[150px]\">{audio.id || `Audio ${idx + 1}`}</span>\n </div>\n ))}\n {/* File cards */}\n {message.files?.map((file, idx) =>\n showFilePreview ? (\n <FilePreviewCard\n key={`file-${idx}`}\n file={{ name: file.name, type: file.type, url: file.url, size: file.size }}\n onClick={() =>\n openFilePreview({ name: file.name, type: file.type, url: file.url, size: file.size })\n }\n />\n ) : (\n <div\n key={`file-${idx}`}\n className=\"flex items-center gap-1.5 rounded-lg border border-border bg-muted/50 px-2.5 py-1.5 text-xs text-foreground self-end\"\n >\n <FileIcon className=\"h-3.5 w-3.5 text-muted-foreground\" />\n <span className=\"truncate max-w-[150px]\">{file.name}</span>\n </div>\n ),\n )}\n </div>\n )}\n {/* Message bubble — text only */}\n {message.content && (\n <div\n className={cn(\n 'rounded-2xl rounded-br-md px-4 py-2.5',\n classNames?.userBubble ?? 'bg-primary text-primary-foreground',\n hasError && 'opacity-70',\n )}\n >\n <p className=\"text-sm whitespace-pre-wrap\">{message.content}</p>\n </div>\n )}\n {showTimestamp && (\n <div className=\"flex items-center justify-end gap-1.5 px-1\">\n <SmartTimestamp\n date={new Date(message.created_at * 1000)}\n formatShort={isCustomTimestamp ? resolvedFormatTimestamp : undefined}\n className=\"text-[11px] text-muted-foreground\"\n />\n {hasError && <AlertCircle className=\"h-3 w-3 text-destructive\" />}\n </div>\n )}\n </div>\n </div>\n ) : (\n /* Assistant message */\n <div className=\"flex items-start gap-3\">\n {assistantAvatar}\n <div className={cn('flex-1 min-w-0 space-y-3', classNames?.assistantContainer)}>\n {/* Custom content render */}\n {renderContent ? (\n renderContent(message)\n ) : (\n <>\n {/* Reasoning Steps */}\n {showReasoning &&\n message.extra_data?.reasoning_steps &&\n message.extra_data.reasoning_steps.length > 0 && (\n <div className={cn('space-y-2 pt-1', classNames?.reasoning)}>\n <div className=\"flex items-center gap-2 text-xs font-medium text-muted-foreground\">\n <Lightbulb className=\"h-3.5 w-3.5\" />\n Reasoning ({message.extra_data.reasoning_steps.length} steps)\n </div>\n <Accordion type=\"multiple\" className=\"w-full\">\n {message.extra_data.reasoning_steps.map((step, idx) => (\n <AccordionItem key={idx} value={`reasoning-${idx}`} className=\"border-muted\">\n <AccordionTrigger className=\"text-xs py-1.5 hover:no-underline\">\n {step.title || `Step ${idx + 1}`}\n </AccordionTrigger>\n <AccordionContent className=\"space-y-1.5 text-xs text-muted-foreground\">\n {step.action && (\n <div>\n <span className=\"font-medium text-foreground\">Action:</span> {step.action}\n </div>\n )}\n {step.reasoning && (\n <div>\n <span className=\"font-medium text-foreground\">Reasoning:</span> {step.reasoning}\n </div>\n )}\n {step.result && (\n <div>\n <span className=\"font-medium text-foreground\">Result:</span> {step.result}\n </div>\n )}\n {step.confidence !== undefined && (\n <div>\n <span className=\"font-medium text-foreground\">Confidence:</span>{' '}\n {(step.confidence * 100).toFixed(1)}%\n </div>\n )}\n </AccordionContent>\n </AccordionItem>\n ))}\n </Accordion>\n </div>\n )}\n\n {/* Main Content */}\n {message.content && (\n <div className=\"prose prose-sm dark:prose-invert max-w-none prose-p:leading-relaxed prose-pre:bg-muted prose-pre:border prose-pre:border-border\">\n <Response>{message.content}</Response>\n </div>\n )}\n\n {/* Generative UI */}\n {showGenerativeUI && toolsWithUI.length > 0 && (\n <div className=\"space-y-3\">\n {toolsWithUI.map((tool) => {\n const uiComponent = (tool as ToolCall & { ui_component?: any }).ui_component;\n return (\n <div key={tool.tool_call_id}>\n {uiComponent.layout === 'artifact' ? (\n <Artifact>\n <GenerativeUIRenderer spec={uiComponent} className=\"w-full p-2\" />\n </Artifact>\n ) : (\n <GenerativeUIRenderer spec={uiComponent} className=\"w-full\" />\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {/* Media - custom or default */}\n {renderMedia\n ? renderMedia(message)\n : (() => {\n const mediaClassName = classNames?.media;\n return (\n <>\n {/* Images */}\n {message.images && message.images.length > 0 && (\n <div className={cn('space-y-2 pt-1', mediaClassName)}>\n <div className=\"flex items-center gap-2 text-xs font-medium text-muted-foreground\">\n <ImageIcon className=\"h-3.5 w-3.5\" />\n Images ({message.images.length})\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n {message.images.map((img, idx) => (\n <div key={idx} className=\"space-y-1\">\n {showImageLightbox ? (\n <button\n type=\"button\"\n onClick={() =>\n openImageLightbox(\n message.images!.map((i) => ({ url: i.url, alt: i.revised_prompt })),\n idx,\n )\n }\n className=\"group relative w-full overflow-hidden rounded-lg border border-border cursor-pointer hover:border-primary/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring transition-colors\"\n >\n <img\n src={img.url}\n alt={img.revised_prompt || 'Generated image'}\n className=\"w-full rounded-lg\"\n />\n </button>\n ) : (\n <img\n src={img.url}\n alt={img.revised_prompt || 'Generated image'}\n className=\"w-full rounded-lg border border-border\"\n />\n )}\n {img.revised_prompt && (\n <p className=\"text-[11px] text-muted-foreground italic px-0.5\">\n {img.revised_prompt}\n </p>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Videos */}\n {message.videos && message.videos.length > 0 && (\n <div className={cn('space-y-2 pt-1', mediaClassName)}>\n <div className=\"flex items-center gap-2 text-xs font-medium text-muted-foreground\">\n <Video className=\"h-3.5 w-3.5\" />\n Videos ({message.videos.length})\n </div>\n <div className=\"space-y-2\">\n {message.videos.map((video, idx) => (\n <div key={idx}>\n {video.url ? (\n <video\n src={video.url}\n controls\n className=\"w-full rounded-lg border border-border\"\n />\n ) : (\n <div className=\"bg-muted/50 border border-border p-2.5 rounded-lg text-xs text-muted-foreground\">\n Video ID: {video.id} (ETA: {video.eta}s)\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Audio */}\n {message.audio && message.audio.length > 0 && (\n <div className={cn('space-y-2 pt-1', mediaClassName)}>\n <div className=\"flex items-center gap-2 text-xs font-medium text-muted-foreground\">\n <Music className=\"h-3.5 w-3.5\" />\n Audio ({message.audio.length})\n </div>\n <div className=\"space-y-2\">\n {message.audio.map((audio, idx) => (\n <div key={idx}>\n {audio.url ? (\n <audio src={audio.url} controls className=\"w-full\" />\n ) : audio.base64_audio ? (\n <audio\n src={`data:${audio.mime_type || 'audio/wav'};base64,${audio.base64_audio}`}\n controls\n className=\"w-full\"\n />\n ) : (\n <div className=\"bg-muted/50 border border-border p-2.5 rounded-lg text-xs text-muted-foreground\">\n Audio data unavailable\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* File Attachments */}\n {message.files && message.files.length > 0 && (\n <div className={cn('space-y-2 pt-1', mediaClassName)}>\n <div className=\"flex items-center gap-2 text-xs font-medium text-muted-foreground\">\n <Paperclip className=\"h-3.5 w-3.5\" />\n Files ({message.files.length})\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {message.files.map((file, idx) =>\n showFilePreview ? (\n <FilePreviewCard\n key={idx}\n file={{ name: file.name, type: file.type, url: file.url, size: file.size }}\n onClick={() =>\n openFilePreview({ name: file.name, type: file.type, url: file.url, size: file.size })\n }\n />\n ) : (\n <div\n key={idx}\n className=\"flex items-center gap-2 rounded-lg border border-border px-3 py-2 text-xs bg-muted/30 hover:bg-muted/50 transition-colors\"\n >\n <FileIcon className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"truncate max-w-[180px]\">{file.name}</span>\n {file.size && (\n <span className=\"text-muted-foreground/70\">\n ({(file.size / 1024).toFixed(1)}KB)\n </span>\n )}\n {file.url && /^https?:\\/\\//i.test(file.url) && (\n <a\n href={file.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline font-medium\"\n >\n View\n </a>\n )}\n </div>\n ),\n )}\n </div>\n </div>\n )}\n\n {/* Response Audio (TTS) */}\n {message.response_audio && (\n <div className={cn('space-y-2 pt-1', mediaClassName)}>\n <div className=\"flex items-center gap-2 text-xs font-medium text-muted-foreground\">\n <Music className=\"h-3.5 w-3.5\" />\n Response Audio\n </div>\n {message.response_audio.transcript && (\n <div className=\"text-xs italic bg-muted/50 border border-border p-2.5 rounded-lg text-muted-foreground\">\n \"{message.response_audio.transcript}\"\n </div>\n )}\n {message.response_audio.content && (\n <audio\n src={`data:audio/wav;base64,${message.response_audio.content}`}\n controls\n className=\"w-full\"\n />\n )}\n </div>\n )}\n </>\n );\n })()}\n\n {/* Tool Calls */}\n {showToolCalls && message.tool_calls && message.tool_calls.length > 0 && (\n <div className={cn('space-y-2 pt-1', classNames?.toolCalls)}>\n {message.tool_calls.map((tool, idx) =>\n renderToolCall ? (\n renderToolCall(tool, idx)\n ) : (\n <Tool key={tool.tool_call_id || idx} defaultOpen={idx === 0}>\n <ToolHeader title={tool.tool_name} type=\"tool-use\" state={getToolState(tool)} />\n <ToolContent>\n <ToolInput input={tool.tool_args} />\n {tool.content && (\n <ToolOutput\n output={tool.content}\n errorText={tool.tool_call_error ? 'Tool execution failed' : undefined}\n />\n )}\n </ToolContent>\n </Tool>\n ),\n )}\n </div>\n )}\n\n {/* References */}\n {showReferences &&\n message.extra_data?.references &&\n message.extra_data.references.length > 0 && (\n <div className={cn('space-y-2 pt-1', classNames?.references)}>\n <div className=\"flex items-center gap-2 text-xs font-medium text-muted-foreground\">\n <FileText className=\"h-3.5 w-3.5\" />\n References ({message.extra_data.references.length})\n </div>\n <div className=\"space-y-2\">\n {message.extra_data.references.map((refData, idx) => (\n <div key={idx} className=\"text-xs space-y-1.5\">\n {refData.query && (\n <div className=\"font-medium text-foreground\">Query: {refData.query}</div>\n )}\n {refData.references.map((ref, refIdx) => (\n <div key={refIdx} className=\"bg-muted/50 border border-border p-2.5 rounded-lg\">\n <div className=\"italic text-muted-foreground mb-1\">\"{ref.content}\"</div>\n <div className=\"text-muted-foreground/70\">\n Source: {ref.name} (chunk {ref.meta_data.chunk}/{ref.meta_data.chunk_size})\n </div>\n </div>\n ))}\n </div>\n ))}\n </div>\n </div>\n )}\n </>\n )}\n\n {/* Footer: actions + timestamp, left-aligned */}\n {(renderActions || showTimestamp || hasError) && (\n <div className=\"flex items-center gap-2 pt-1\">\n {renderActions && (\n <div className={cn('flex items-center gap-1', classNames?.actions)}>\n {renderActions(message)}\n </div>\n )}\n {hasError && (\n <span className=\"flex items-center gap-1 text-[11px] text-destructive\">\n <AlertCircle className=\"h-3 w-3\" />\n Error\n </span>\n )}\n {showTimestamp && (\n <SmartTimestamp\n date={new Date(message.created_at * 1000)}\n formatShort={isCustomTimestamp ? resolvedFormatTimestamp : undefined}\n className=\"text-[11px] text-muted-foreground\"\n />\n )}\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Image Lightbox */}\n {preview?.type === 'image' && (\n <ImageLightbox\n open\n onOpenChange={(open) => { if (!open) closePreview(); }}\n images={preview.images}\n initialIndex={preview.initialIndex}\n />\n )}\n\n {/* File Preview Modal */}\n {preview?.type === 'file' && (\n <FilePreviewModal\n open\n onOpenChange={(open) => { if (!open) closePreview(); }}\n file={preview.file}\n />\n )}\n </div>\n );\n}\n",
|
|
48
|
+
"import { useAgnoChatContext } from './context';\nimport { cn } from '../../lib/cn';\nimport type { SuggestedPrompt } from '../../types';\n\nexport interface AgnoChatSuggestedPromptsProps {\n className?: string;\n prompts: SuggestedPrompt[];\n}\n\nexport function AgnoChatSuggestedPrompts({ className, prompts }: AgnoChatSuggestedPromptsProps) {\n const { handleSend } = useAgnoChatContext();\n\n if (prompts.length === 0) return null;\n\n return (\n <div className={cn('grid grid-cols-2 gap-2 w-full max-w-md', className)}>\n {prompts.map((prompt, idx) => (\n <button\n key={idx}\n onClick={() => handleSend(prompt.text)}\n className=\"flex items-center gap-2 px-3 py-2.5 rounded-xl border border-border bg-card hover:bg-accent/50 hover:border-primary/20 transition-all duration-200 text-left text-sm group\"\n >\n {prompt.icon && (\n <span className=\"text-muted-foreground group-hover:text-primary transition-colors\">\n {prompt.icon}\n </span>\n )}\n <span className=\"text-muted-foreground group-hover:text-foreground transition-colors text-xs leading-snug\">\n {prompt.text}\n </span>\n </button>\n ))}\n </div>\n );\n}\n",
|
|
49
|
+
"import type { HTMLAttributes, ReactNode } from 'react';\nimport { cn } from '../../lib/cn';\n\nexport interface AgnoChatEmptyStateProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nexport function AgnoChatEmptyState({ children, className, ...props }: AgnoChatEmptyStateProps) {\n return (\n <div className={cn('flex flex-col items-center gap-6', className)} {...props}>\n {children}\n </div>\n );\n}\n",
|
|
50
|
+
"import { useAgnoChatContext } from './context';\nimport { cn } from '../../lib/cn';\nimport { Loader2, Wrench } from 'lucide-react';\n\nexport interface AgnoChatToolStatusProps {\n className?: string;\n}\n\nexport function AgnoChatToolStatus({ className }: AgnoChatToolStatusProps) {\n const { isPaused, isExecuting, pendingTools } = useAgnoChatContext();\n\n if (!isPaused && !isExecuting) return null;\n\n return (\n <div className={cn('px-4 py-2.5 border-t border-border bg-primary/5', className)}>\n <div className=\"flex items-center gap-2.5 text-sm max-w-3xl mx-auto\">\n {isExecuting ? (\n <>\n <div className=\"h-5 w-5 rounded-full bg-primary/10 flex items-center justify-center\">\n <Loader2 className=\"h-3 w-3 animate-spin text-primary\" />\n </div>\n <span className=\"text-muted-foreground\">\n Executing{' '}\n <span className=\"font-medium text-foreground\">{pendingTools.length}</span> tool\n {pendingTools.length !== 1 ? 's' : ''}...\n </span>\n </>\n ) : (\n <>\n <div className=\"h-5 w-5 rounded-full bg-amber-500/10 flex items-center justify-center\">\n <Wrench className=\"h-3 w-3 text-amber-600 dark:text-amber-400\" />\n </div>\n <span className=\"text-muted-foreground\">\n Preparing{' '}\n <span className=\"font-medium text-foreground\">{pendingTools.length}</span> tool\n {pendingTools.length !== 1 ? 's' : ''}...\n </span>\n </>\n )}\n </div>\n </div>\n );\n}\n",
|
|
51
|
+
"import { useAgnoChatContext } from './context';\nimport { cn } from '../../lib/cn';\n\nexport interface AgnoChatErrorBarProps {\n className?: string;\n}\n\nexport function AgnoChatErrorBar({ className }: AgnoChatErrorBarProps) {\n const { error, executionError } = useAgnoChatContext();\n\n const message = error || executionError;\n if (!message) return null;\n\n return (\n <div className={cn('px-4 py-2.5 bg-destructive/5 border-t border-destructive/20', className)}>\n <p className=\"text-sm text-destructive max-w-3xl mx-auto\">{message}</p>\n </div>\n );\n}\n",
|
|
52
|
+
"import {\n PromptInput,\n PromptInputProvider,\n PromptInputBody,\n PromptInputTextarea,\n PromptInputFooter,\n PromptInputTools,\n PromptInputSubmit,\n PromptInputHeader,\n PromptInputAttachments,\n PromptInputAttachment,\n PromptInputActionMenu,\n PromptInputActionMenuTrigger,\n PromptInputActionMenuContent,\n PromptInputActionAddAttachments,\n PromptInputDropZone,\n usePromptInputController,\n usePromptInputAttachments,\n type PromptInputMessage,\n} from '../components/prompt-input';\nimport type { PromptInputDropZoneProps } from '../components/prompt-input/drop-zone';\nimport { AudioRecorder } from '../components/audio-recorder';\nimport type { AudioRecorderLabels } from '../components/audio-recorder';\nimport { Button } from '../primitives/button';\nimport { CircleStop } from 'lucide-react';\nimport { cn } from '../lib/cn';\nimport type { ChatStatus, FileUploadConfig } from '../types';\nimport type { ReactNode, RefObject } from 'react';\n\nconst DEFAULT_ACCEPTED_FILE_TYPES =\n 'image/*,audio/*,.pdf,.doc,.docx,.txt,.csv,.xlsx,.xls,.ppt,.pptx,.md,.json,.xml';\n\nexport interface AgnoChatInputProps {\n onSend: (message: string | FormData) => void;\n disabled?: boolean;\n placeholder?: string;\n className?: string;\n /** File upload configuration */\n fileUpload?: FileUploadConfig;\n /** Show audio recorder button (default: false) */\n showAudioRecorder?: boolean;\n /** Show attachments button (default: true) */\n showAttachments?: boolean;\n /** Override chat status for submit button icon */\n status?: ChatStatus;\n /** Whether a run is currently streaming */\n isStreaming?: boolean;\n /** Called when the user clicks stop during streaming */\n onCancel?: () => void;\n /** Show a stop button that cancels the run while streaming (default: false) */\n allowCancelRun?: boolean;\n /** Extra tools to add to the toolbar */\n extraTools?: ReactNode;\n /** Audio mode: 'send' sends blob immediately, 'transcribe' transcribes and adds text to input */\n audioMode?: 'send' | 'transcribe';\n /** Transcription endpoint URL (required when audioMode='transcribe') */\n transcriptionEndpoint?: string;\n /** Extra headers for transcription request */\n transcriptionHeaders?: Record<string, string>;\n /** Custom parser for the transcription response — receives the parsed JSON and returns the text */\n parseTranscriptionResponse?: (data: unknown) => string;\n /** Async callback to request microphone permission before recording (e.g., for WebView bridges) */\n onRequestPermission?: () => Promise<boolean>;\n /** Custom labels for the audio recorder button (useful for i18n) */\n audioRecorderLabels?: AudioRecorderLabels;\n /** Ref to a container element for rendering the drop zone overlay via portal */\n dropZoneContainerRef?: RefObject<HTMLElement | null>;\n /** Props forwarded to PromptInputDropZone (className, label) */\n dropZoneProps?: Partial<Pick<PromptInputDropZoneProps, 'label' | 'className'>>;\n}\n\nfunction dataUrlToBlob(dataUrl: string): Blob {\n const [header, base64] = dataUrl.split(',');\n const mime = header.match(/:(.*?);/)?.[1] || 'application/octet-stream';\n const bytes = atob(base64);\n const buf = new Uint8Array(bytes.length);\n for (let i = 0; i < bytes.length; i++) {\n buf[i] = bytes.charCodeAt(i);\n }\n return new Blob([buf], { type: mime });\n}\n\n/** Stop button shown during streaming when allowCancelRun is enabled */\nfunction CancelButton({ onCancel }: { onCancel: () => void }) {\n return (\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"icon\"\n className=\"h-8 w-8 rounded-lg\"\n onClick={onCancel}\n aria-label=\"Stop\"\n >\n <CircleStop className=\"size-4\" />\n </Button>\n );\n}\n\n/** Submit button disabled until text exists */\nfunction SubmitButton({ disabled, status }: { disabled?: boolean; status?: ChatStatus }) {\n const { textInput } = usePromptInputController();\n const hasText = textInput.value.trim().length > 0;\n return <PromptInputSubmit disabled={disabled || !hasText} status={status} />;\n}\n\n/** Only renders the attachment header when files are present */\nfunction AttachmentHeader() {\n const { files } = usePromptInputAttachments();\n if (files.length === 0) return null;\n return (\n <PromptInputHeader>\n <PromptInputAttachments>\n {(attachment) => <PromptInputAttachment data={attachment} />}\n </PromptInputAttachments>\n </PromptInputHeader>\n );\n}\n\n/** Internal wrapper that accesses PromptInput context to set transcribed text */\nfunction TranscribeAudioRecorder({\n endpoint,\n headers,\n disabled,\n parseResponse,\n onRequestPermission,\n labels,\n}: {\n endpoint: string;\n headers?: Record<string, string>;\n disabled?: boolean;\n parseResponse?: (data: unknown) => string;\n onRequestPermission?: () => Promise<boolean>;\n labels?: AudioRecorderLabels;\n}) {\n const { textInput } = usePromptInputController();\n return (\n <AudioRecorder\n mode=\"transcribe\"\n transcriptionEndpoint={endpoint}\n transcriptionHeaders={headers}\n parseTranscriptionResponse={parseResponse}\n onRequestPermission={onRequestPermission}\n onRecordingComplete={() => {}}\n onTranscriptionComplete={(text) => {\n const current = textInput.value;\n textInput.setInput(current + (current ? ' ' : '') + text);\n }}\n disabled={disabled}\n labels={labels}\n />\n );\n}\n\nexport function AgnoChatInput({\n onSend,\n disabled,\n placeholder,\n className,\n fileUpload,\n showAudioRecorder = false,\n showAttachments = true,\n status,\n isStreaming,\n onCancel,\n allowCancelRun = false,\n extraTools,\n audioMode = 'send',\n transcriptionEndpoint,\n transcriptionHeaders,\n parseTranscriptionResponse,\n onRequestPermission,\n audioRecorderLabels,\n dropZoneContainerRef,\n dropZoneProps,\n}: AgnoChatInputProps) {\n const handleSubmit = (message: PromptInputMessage) => {\n const text = message.text?.trim() || '';\n const files = message.files || [];\n\n if (!text) return;\n\n if (files.length === 0) {\n onSend(text);\n return;\n }\n\n const formData = new FormData();\n formData.append('message', text);\n\n for (const file of files) {\n if (!file.url) continue;\n const blob = file.url.startsWith('data:') ? dataUrlToBlob(file.url) : null;\n if (!blob) continue;\n const fileName = file.filename || 'file';\n formData.append('files', blob, fileName);\n }\n\n onSend(formData);\n };\n\n const handleAudioRecording = (blob: Blob) => {\n const formData = new FormData();\n formData.append('message', 'Audio message');\n formData.append('files', blob, `recording-${Date.now()}.wav`);\n onSend(formData);\n };\n\n const computedStatus = status ?? (disabled ? 'submitted' : undefined);\n const showCancelButton = allowCancelRun && isStreaming && onCancel;\n\n return (\n <PromptInputProvider>\n <PromptInput\n onSubmit={handleSubmit}\n accept={fileUpload?.accept ?? DEFAULT_ACCEPTED_FILE_TYPES}\n multiple={fileUpload?.multiple ?? true}\n maxFiles={fileUpload?.maxFiles}\n maxFileSize={fileUpload?.maxFileSize}\n globalDrop={!!dropZoneContainerRef}\n dragListenerTarget={dropZoneContainerRef}\n className={cn('w-full', className)}\n >\n <AttachmentHeader />\n <PromptInputBody>\n <PromptInputTextarea\n placeholder={placeholder || 'Type your message... (Enter to send, Shift+Enter for new line)'}\n disabled={disabled}\n />\n </PromptInputBody>\n <PromptInputFooter>\n <PromptInputTools>\n {showAttachments && (\n <PromptInputActionMenu>\n <PromptInputActionMenuTrigger />\n <PromptInputActionMenuContent>\n <PromptInputActionAddAttachments label=\"Add files\" />\n </PromptInputActionMenuContent>\n </PromptInputActionMenu>\n )}\n {showAudioRecorder &&\n (audioMode === 'transcribe' && transcriptionEndpoint ? (\n <TranscribeAudioRecorder\n endpoint={transcriptionEndpoint}\n headers={transcriptionHeaders}\n disabled={disabled}\n parseResponse={parseTranscriptionResponse}\n onRequestPermission={onRequestPermission}\n labels={audioRecorderLabels}\n />\n ) : (\n <AudioRecorder onRecordingComplete={handleAudioRecording} disabled={disabled} onRequestPermission={onRequestPermission} labels={audioRecorderLabels} />\n ))}\n {extraTools}\n </PromptInputTools>\n {showCancelButton ? (\n <CancelButton onCancel={onCancel} />\n ) : (\n <SubmitButton disabled={disabled} status={computedStatus} />\n )}\n </PromptInputFooter>\n {showAttachments && <PromptInputDropZone {...dropZoneProps} container={dropZoneContainerRef} />}\n </PromptInput>\n </PromptInputProvider>\n );\n}\n",
|
|
53
|
+
"import type { ReactNode } from 'react';\nimport { useAgnoChatContext } from './context';\nimport { AgnoChatInput } from '../AgnoChatInput';\nimport type { AgnoChatInputProps } from '../AgnoChatInput';\nimport type { PromptInputDropZoneProps } from '../../components/prompt-input/drop-zone';\nimport { cn } from '../../lib/cn';\nimport type { FileUploadConfig } from '../../types';\nimport type { AudioRecorderLabels } from '../../components/audio-recorder';\n\nexport interface AgnoChatInputRenderProps {\n onSend: (message: string | FormData) => Promise<void>;\n disabled: boolean;\n isStreaming: boolean;\n isPaused: boolean;\n}\n\nexport interface AgnoChatInputAreaProps {\n className?: string;\n children?: (props: AgnoChatInputRenderProps) => ReactNode;\n placeholder?: string;\n fileUpload?: FileUploadConfig;\n showAudioRecorder?: boolean;\n showAttachments?: boolean;\n extraTools?: ReactNode;\n chatInputProps?: Partial<Omit<AgnoChatInputProps, 'onSend'>>;\n /** Audio mode: 'send' sends blob immediately, 'transcribe' transcribes and adds text to input */\n audioMode?: 'send' | 'transcribe';\n /** Transcription endpoint URL (required when audioMode='transcribe') */\n transcriptionEndpoint?: string;\n /** Extra headers for transcription request */\n transcriptionHeaders?: Record<string, string>;\n /** Custom parser for the transcription response — receives the parsed JSON and returns the text */\n parseTranscriptionResponse?: (data: unknown) => string;\n /** Async callback to request microphone permission before recording (e.g., for WebView bridges) */\n onRequestPermission?: () => Promise<boolean>;\n /** Custom labels for the audio recorder button (useful for i18n) */\n audioRecorderLabels?: AudioRecorderLabels;\n /** Show a stop button that cancels the run while streaming (default: false) */\n allowCancelRun?: boolean;\n /** Props forwarded to PromptInputDropZone (className, label) */\n dropZoneProps?: Partial<Pick<PromptInputDropZoneProps, 'label' | 'className'>>;\n}\n\nexport function AgnoChatInputArea({\n className,\n children,\n placeholder,\n fileUpload,\n showAudioRecorder = false,\n showAttachments,\n extraTools,\n chatInputProps,\n audioMode,\n transcriptionEndpoint,\n transcriptionHeaders,\n parseTranscriptionResponse,\n onRequestPermission,\n audioRecorderLabels,\n allowCancelRun = false,\n dropZoneProps,\n}: AgnoChatInputAreaProps) {\n const { handleSend, inputDisabled, isStreaming, isPaused, cancelRun, dropZoneContainerRef } = useAgnoChatContext();\n\n return (\n <div className={cn('border-t border-border bg-background/80 backdrop-blur-sm', className)}>\n <div className=\"mx-auto px-4 py-2\">\n {children ? (\n children({ onSend: handleSend, disabled: inputDisabled, isStreaming, isPaused })\n ) : (\n <AgnoChatInput\n {...chatInputProps}\n onSend={handleSend}\n disabled={inputDisabled}\n isStreaming={isStreaming}\n onCancel={cancelRun}\n allowCancelRun={allowCancelRun}\n placeholder={placeholder ?? chatInputProps?.placeholder ?? 'Message your agent...'}\n fileUpload={fileUpload}\n showAudioRecorder={showAudioRecorder}\n showAttachments={showAttachments}\n extraTools={extraTools}\n audioMode={audioMode}\n transcriptionEndpoint={transcriptionEndpoint}\n transcriptionHeaders={transcriptionHeaders}\n parseTranscriptionResponse={parseTranscriptionResponse}\n onRequestPermission={onRequestPermission}\n audioRecorderLabels={audioRecorderLabels}\n dropZoneContainerRef={dropZoneContainerRef}\n dropZoneProps={dropZoneProps}\n />\n )}\n </div>\n </div>\n );\n}\n",
|
|
54
|
+
"import { AgnoChatRoot } from './agno-chat';\nimport { AgnoChatMessages } from './messages';\nimport { AgnoChatEmptyState } from './empty-state';\nimport { AgnoChatSuggestedPrompts } from './suggested-prompts';\nimport { AgnoChatToolStatus } from './tool-status';\nimport { AgnoChatErrorBar } from './error-bar';\nimport { AgnoChatInputArea } from './input';\n\n// Re-export context hook and type\nexport { useAgnoChatContext } from './context';\nexport type { AgnoChatContextValue } from './context';\n\n// Re-export individual sub-components for tree-shaking / named imports\nexport { AgnoChatRoot } from './agno-chat';\nexport type { AgnoChatRootProps } from './agno-chat';\nexport { AgnoChatMessages } from './messages';\nexport type { AgnoChatMessagesProps } from './messages';\nexport { AgnoChatEmptyState } from './empty-state';\nexport type { AgnoChatEmptyStateProps } from './empty-state';\nexport { AgnoChatSuggestedPrompts } from './suggested-prompts';\nexport type { AgnoChatSuggestedPromptsProps } from './suggested-prompts';\nexport { AgnoChatToolStatus } from './tool-status';\nexport type { AgnoChatToolStatusProps } from './tool-status';\nexport { AgnoChatErrorBar } from './error-bar';\nexport type { AgnoChatErrorBarProps } from './error-bar';\nexport { AgnoChatInputArea } from './input';\nexport type { AgnoChatInputAreaProps, AgnoChatInputRenderProps } from './input';\n\n// Compound component via Object.assign (type-safe, no double cast)\nconst AgnoChat = Object.assign(AgnoChatRoot, {\n Messages: AgnoChatMessages,\n EmptyState: AgnoChatEmptyState,\n SuggestedPrompts: AgnoChatSuggestedPrompts,\n ToolStatus: AgnoChatToolStatus,\n ErrorBar: AgnoChatErrorBar,\n Input: AgnoChatInputArea,\n});\n\nexport { AgnoChat };\n",
|
|
55
|
+
"import type { ReactNode } from 'react';\nimport type { ChatMessage } from '@rodrigocoliveira/agno-types';\nimport type { ToolHandler } from '@rodrigocoliveira/agno-react';\nimport type { AgnoChatInterfaceClassNames, FileUploadConfig, SuggestedPrompt } from '../types';\nimport type { AgnoMessageItemProps } from './AgnoMessageItem';\nimport type { AgnoChatInputProps } from './AgnoChatInput';\nimport { AgnoChat } from './agno-chat';\nimport { cn } from '../lib/cn';\nimport { Bot, Sparkles } from 'lucide-react';\n\nexport interface AgnoChatInterfaceProps {\n className?: string;\n classNames?: AgnoChatInterfaceClassNames;\n /** Custom render for individual messages */\n renderMessage?: (message: ChatMessage, index: number) => ReactNode;\n /** Custom render for the input area */\n renderInput?: (props: { onSend: (msg: string | FormData) => void; disabled: boolean }) => ReactNode;\n /** Custom empty state content */\n emptyState?: ReactNode;\n /** Slot: content above the messages area */\n headerSlot?: ReactNode;\n /** Slot: extra buttons in the input toolbar */\n inputToolbarSlot?: ReactNode;\n /** Suggested prompts for empty state */\n suggestedPrompts?: SuggestedPrompt[];\n /** Tool handlers for HITL execution */\n toolHandlers?: Record<string, ToolHandler>;\n /** Auto-execute tools (default: true) */\n autoExecuteTools?: boolean;\n /** Input placeholder */\n placeholder?: string;\n /** Custom user avatar */\n userAvatar?: ReactNode;\n /** Custom assistant avatar */\n assistantAvatar?: ReactNode;\n /** File upload config */\n fileUpload?: FileUploadConfig;\n /** Show audio recorder (default: true) */\n showAudioRecorder?: boolean;\n /** Show attachments button and drop zone (default: true) */\n showAttachments?: boolean;\n /** Props forwarded to AgnoMessageItem */\n messageItemProps?: Partial<Omit<AgnoMessageItemProps, 'message'>>;\n /** Props forwarded to AgnoChatInput */\n chatInputProps?: Partial<Omit<AgnoChatInputProps, 'onSend'>>;\n /** Custom label for the drop zone overlay */\n dropZoneLabel?: string;\n}\n\nconst DEFAULT_PROMPTS: SuggestedPrompt[] = [\n { icon: <Sparkles className=\"h-3.5 w-3.5\" />, text: 'What can you help me with?' },\n { icon: <Bot className=\"h-3.5 w-3.5\" />, text: 'Explain how you work' },\n];\n\nexport function AgnoChatInterface({\n className,\n classNames,\n renderMessage,\n renderInput,\n emptyState,\n headerSlot,\n inputToolbarSlot,\n suggestedPrompts = DEFAULT_PROMPTS,\n toolHandlers = {},\n autoExecuteTools = true,\n placeholder,\n userAvatar,\n assistantAvatar,\n fileUpload,\n showAudioRecorder = true,\n showAttachments = true,\n messageItemProps,\n chatInputProps,\n dropZoneLabel,\n}: AgnoChatInterfaceProps) {\n return (\n <AgnoChat\n toolHandlers={toolHandlers}\n autoExecuteTools={autoExecuteTools}\n className={cn(classNames?.root, className)}\n >\n {headerSlot}\n\n <AgnoChat.Messages\n className={classNames?.messagesArea}\n renderMessage={renderMessage}\n userAvatar={userAvatar}\n assistantAvatar={assistantAvatar}\n messageItemProps={messageItemProps}\n emptyState={emptyState}\n suggestedPrompts={suggestedPrompts}\n />\n\n <AgnoChat.ToolStatus className={classNames?.toolStatusBar} />\n <AgnoChat.ErrorBar className={classNames?.errorBar} />\n\n <AgnoChat.Input\n className={classNames?.inputArea}\n placeholder={placeholder}\n fileUpload={fileUpload}\n showAudioRecorder={showAudioRecorder}\n showAttachments={showAttachments}\n extraTools={inputToolbarSlot}\n chatInputProps={chatInputProps}\n dropZoneProps={{ className: classNames?.dropZone, label: dropZoneLabel }}\n >\n {renderInput\n ? ({ onSend, disabled }) => renderInput({ onSend, disabled })\n : undefined}\n </AgnoChat.Input>\n </AgnoChat>\n );\n}\n"
|
|
56
|
+
],
|
|
57
|
+
"mappings": "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",
|
|
58
|
+
"debugId": "128E98AEB83ACE9C64756E2164756E21",
|
|
59
|
+
"names": []
|
|
60
|
+
}
|