2 import { page } from '$app/state';
3 import { Plus, 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, TOOLTIP_DELAY_DURATION } from '$lib/constants';
12 hasAudioModality?: boolean;
13 hasVisionModality?: boolean;
14 onFileUpload?: () => void;
15 onSystemPromptClick?: () => void;
19 class: className = '',
21 hasAudioModality = false,
22 hasVisionModality = false,
27 let isNewChat = $derived(!page.params.id);
29 let systemMessageTooltip = $derived(
31 ? 'Add custom system message for a new conversation'
32 : 'Inject custom system message at the beginning of the conversation'
35 let dropdownOpen = $state(false);
37 const fileUploadTooltipText = 'Add files, system prompt or MCP Servers';
40 <div class="flex items-center gap-1 {className}">
41 <DropdownMenu.Root bind:open={dropdownOpen}>
42 <DropdownMenu.Trigger name="Attach files" {disabled}>
44 <Tooltip.Trigger class="w-full">
46 class="file-upload-button h-8 w-8 rounded-full p-0"
51 <span class="sr-only">{fileUploadTooltipText}</span>
53 <Plus class="h-4 w-4" />
58 <p>{fileUploadTooltipText}</p>
61 </DropdownMenu.Trigger>
63 <DropdownMenu.Content align="start" class="w-48">
64 {#if hasVisionModality}
66 class="images-button flex cursor-pointer items-center gap-2"
67 onclick={() => onFileUpload?.()}
69 <FILE_TYPE_ICONS.image class="h-4 w-4" />
74 <Tooltip.Root delayDuration={TOOLTIP_DELAY_DURATION}>
75 <Tooltip.Trigger class="w-full">
77 class="images-button flex cursor-pointer items-center gap-2"
80 <FILE_TYPE_ICONS.image class="h-4 w-4" />
86 <Tooltip.Content side="right">
87 <p>Images require vision models to be processed</p>
92 {#if hasAudioModality}
94 class="audio-button flex cursor-pointer items-center gap-2"
95 onclick={() => onFileUpload?.()}
97 <FILE_TYPE_ICONS.audio class="h-4 w-4" />
99 <span>Audio Files</span>
102 <Tooltip.Root delayDuration={TOOLTIP_DELAY_DURATION}>
103 <Tooltip.Trigger class="w-full">
104 <DropdownMenu.Item class="audio-button flex cursor-pointer items-center gap-2" disabled>
105 <FILE_TYPE_ICONS.audio class="h-4 w-4" />
107 <span>Audio Files</span>
111 <Tooltip.Content side="right">
112 <p>Audio files require audio models to be processed</p>
118 class="flex cursor-pointer items-center gap-2"
119 onclick={() => onFileUpload?.()}
121 <FILE_TYPE_ICONS.text class="h-4 w-4" />
123 <span>Text Files</span>
126 {#if hasVisionModality}
128 class="flex cursor-pointer items-center gap-2"
129 onclick={() => onFileUpload?.()}
131 <FILE_TYPE_ICONS.pdf class="h-4 w-4" />
133 <span>PDF Files</span>
136 <Tooltip.Root delayDuration={TOOLTIP_DELAY_DURATION}>
137 <Tooltip.Trigger class="w-full">
139 class="flex cursor-pointer items-center gap-2"
140 onclick={() => onFileUpload?.()}
142 <FILE_TYPE_ICONS.pdf class="h-4 w-4" />
144 <span>PDF Files</span>
148 <Tooltip.Content side="right">
149 <p>PDFs will be converted to text. Image-based PDFs may not work properly.</p>
154 <Tooltip.Root delayDuration={TOOLTIP_DELAY_DURATION}>
155 <Tooltip.Trigger class="w-full">
157 class="flex cursor-pointer items-center gap-2"
158 onclick={() => onSystemPromptClick?.()}
160 <MessageSquare class="h-4 w-4" />
162 <span>System Message</span>
166 <Tooltip.Content side="right">
167 <p>{systemMessageTooltip}</p>
170 </DropdownMenu.Content>