2 import { Paperclip } from '@lucide/svelte';
3 import { Button } from '$lib/components/ui/button';
4 import * as DropdownMenu from '$lib/components/ui/dropdown-menu';
5 import * as Tooltip from '$lib/components/ui/tooltip';
6 import { FILE_TYPE_ICONS } from '$lib/constants/icons';
11 hasAudioModality?: boolean;
12 hasVisionModality?: boolean;
13 onFileUpload?: () => void;
17 class: className = '',
19 hasAudioModality = false,
20 hasVisionModality = false,
24 const fileUploadTooltipText = $derived.by(() => {
25 return !hasVisionModality
26 ? 'Text files and PDFs supported. Images, audio, and video require vision models.'
31 <div class="flex items-center gap-1 {className}">
33 <DropdownMenu.Trigger name="Attach files" {disabled}>
37 class="file-upload-button h-8 w-8 rounded-full bg-transparent p-0 text-muted-foreground hover:bg-foreground/10 hover:text-foreground"
41 <span class="sr-only">Attach files</span>
43 <Paperclip class="h-4 w-4" />
48 <p>{fileUploadTooltipText}</p>
51 </DropdownMenu.Trigger>
53 <DropdownMenu.Content align="start" class="w-48">
55 <Tooltip.Trigger class="w-full">
57 class="images-button flex cursor-pointer items-center gap-2"
58 disabled={!hasVisionModality}
59 onclick={() => onFileUpload?.()}
61 <FILE_TYPE_ICONS.image class="h-4 w-4" />
67 {#if !hasVisionModality}
69 <p>Images require vision models to be processed</p>
75 <Tooltip.Trigger class="w-full">
77 class="audio-button flex cursor-pointer items-center gap-2"
78 disabled={!hasAudioModality}
79 onclick={() => onFileUpload?.()}
81 <FILE_TYPE_ICONS.audio class="h-4 w-4" />
83 <span>Audio Files</span>
87 {#if !hasAudioModality}
89 <p>Audio files require audio models to be processed</p>
95 class="flex cursor-pointer items-center gap-2"
96 onclick={() => onFileUpload?.()}
98 <FILE_TYPE_ICONS.text class="h-4 w-4" />
100 <span>Text Files</span>
104 <Tooltip.Trigger class="w-full">
106 class="flex cursor-pointer items-center gap-2"
107 onclick={() => onFileUpload?.()}
109 <FILE_TYPE_ICONS.pdf class="h-4 w-4" />
111 <span>PDF Files</span>
115 {#if !hasVisionModality}
117 <p>PDFs will be converted to text. Image-based PDFs may not work properly.</p>
121 </DropdownMenu.Content>