2 import { Paperclip } from '@lucide/svelte';
3 import { MessageSquare } from '@lucide/svelte';
4 import { Button } from '$lib/components/ui/button';
5 import * as DropdownMenu from '$lib/components/ui/dropdown-menu';
6 import * as Tooltip from '$lib/components/ui/tooltip';
7 import { FILE_TYPE_ICONS } from '$lib/constants/icons';
12 hasAudioModality?: boolean;
13 hasVisionModality?: boolean;
14 onFileUpload?: () => void;
15 onSystemPromptClick?: () => void;
19 class: className = '',
21 hasAudioModality = false,
22 hasVisionModality = false,
27 const fileUploadTooltipText = $derived.by(() => {
28 return !hasVisionModality
29 ? 'Text files and PDFs supported. Images, audio, and video require vision models.'
34 <div class="flex items-center gap-1 {className}">
36 <DropdownMenu.Trigger name="Attach files" {disabled}>
40 class="file-upload-button h-8 w-8 rounded-full bg-transparent p-0 text-muted-foreground hover:bg-foreground/10 hover:text-foreground"
44 <span class="sr-only">Attach files</span>
46 <Paperclip class="h-4 w-4" />
51 <p>{fileUploadTooltipText}</p>
54 </DropdownMenu.Trigger>
56 <DropdownMenu.Content align="start" class="w-48">
58 <Tooltip.Trigger class="w-full">
60 class="images-button flex cursor-pointer items-center gap-2"
61 disabled={!hasVisionModality}
62 onclick={() => onFileUpload?.()}
64 <FILE_TYPE_ICONS.image class="h-4 w-4" />
70 {#if !hasVisionModality}
72 <p>Images require vision models to be processed</p>
78 <Tooltip.Trigger class="w-full">
80 class="audio-button flex cursor-pointer items-center gap-2"
81 disabled={!hasAudioModality}
82 onclick={() => onFileUpload?.()}
84 <FILE_TYPE_ICONS.audio class="h-4 w-4" />
86 <span>Audio Files</span>
90 {#if !hasAudioModality}
92 <p>Audio files require audio models to be processed</p>
98 class="flex cursor-pointer items-center gap-2"
99 onclick={() => onFileUpload?.()}
101 <FILE_TYPE_ICONS.text class="h-4 w-4" />
103 <span>Text Files</span>
107 <Tooltip.Trigger class="w-full">
109 class="flex cursor-pointer items-center gap-2"
110 onclick={() => onFileUpload?.()}
112 <FILE_TYPE_ICONS.pdf class="h-4 w-4" />
114 <span>PDF Files</span>
118 {#if !hasVisionModality}
120 <p>PDFs will be converted to text. Image-based PDFs may not work properly.</p>
124 <DropdownMenu.Separator />
126 <Tooltip.Trigger class="w-full">
128 class="flex cursor-pointer items-center gap-2"
129 onclick={() => onSystemPromptClick?.()}
131 <MessageSquare class="h-4 w-4" />
133 <span>System Prompt</span>
138 <p>Add a custom system message for this conversation</p>
141 </DropdownMenu.Content>