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 } from '$lib/constants/icons';
8 import { TOOLTIP_DELAY_DURATION } from '$lib/constants/tooltip-config';
13 hasAudioModality?: boolean;
14 hasVisionModality?: boolean;
15 onFileUpload?: () => void;
16 onSystemPromptClick?: () => void;
20 class: className = '',
22 hasAudioModality = false,
23 hasVisionModality = false,
28 let isNewChat = $derived(!page.params.id);
30 let systemMessageTooltip = $derived(
32 ? 'Add custom system message for a new conversation'
33 : 'Inject custom system message at the beginning of the conversation'
36 let dropdownOpen = $state(false);
38 const fileUploadTooltipText = 'Add files, system prompt or MCP Servers';
41 <div class="flex items-center gap-1 {className}">
42 <DropdownMenu.Root bind:open={dropdownOpen}>
43 <DropdownMenu.Trigger name="Attach files" {disabled}>
45 <Tooltip.Trigger class="w-full">
47 class="file-upload-button h-8 w-8 rounded-full p-0"
52 <span class="sr-only">{fileUploadTooltipText}</span>
54 <Plus class="h-4 w-4" />
59 <p>{fileUploadTooltipText}</p>
62 </DropdownMenu.Trigger>
64 <DropdownMenu.Content align="start" class="w-48">
65 {#if hasVisionModality}
67 class="images-button flex cursor-pointer items-center gap-2"
68 onclick={() => onFileUpload?.()}
70 <FILE_TYPE_ICONS.image class="h-4 w-4" />
75 <Tooltip.Root delayDuration={TOOLTIP_DELAY_DURATION}>
76 <Tooltip.Trigger class="w-full">
78 class="images-button flex cursor-pointer items-center gap-2"
81 <FILE_TYPE_ICONS.image class="h-4 w-4" />
87 <Tooltip.Content side="right">
88 <p>Images require vision models to be processed</p>
93 {#if hasAudioModality}
95 class="audio-button flex cursor-pointer items-center gap-2"
96 onclick={() => onFileUpload?.()}
98 <FILE_TYPE_ICONS.audio class="h-4 w-4" />
100 <span>Audio Files</span>
103 <Tooltip.Root delayDuration={TOOLTIP_DELAY_DURATION}>
104 <Tooltip.Trigger class="w-full">
105 <DropdownMenu.Item class="audio-button flex cursor-pointer items-center gap-2" disabled>
106 <FILE_TYPE_ICONS.audio class="h-4 w-4" />
108 <span>Audio Files</span>
112 <Tooltip.Content side="right">
113 <p>Audio files require audio models to be processed</p>
119 class="flex cursor-pointer items-center gap-2"
120 onclick={() => onFileUpload?.()}
122 <FILE_TYPE_ICONS.text class="h-4 w-4" />
124 <span>Text Files</span>
127 {#if hasVisionModality}
129 class="flex cursor-pointer items-center gap-2"
130 onclick={() => onFileUpload?.()}
132 <FILE_TYPE_ICONS.pdf class="h-4 w-4" />
134 <span>PDF Files</span>
137 <Tooltip.Root delayDuration={TOOLTIP_DELAY_DURATION}>
138 <Tooltip.Trigger class="w-full">
140 class="flex cursor-pointer items-center gap-2"
141 onclick={() => onFileUpload?.()}
143 <FILE_TYPE_ICONS.pdf class="h-4 w-4" />
145 <span>PDF Files</span>
149 <Tooltip.Content side="right">
150 <p>PDFs will be converted to text. Image-based PDFs may not work properly.</p>
155 <Tooltip.Root delayDuration={TOOLTIP_DELAY_DURATION}>
156 <Tooltip.Trigger class="w-full">
158 class="flex cursor-pointer items-center gap-2"
159 onclick={() => onSystemPromptClick?.()}
161 <MessageSquare class="h-4 w-4" />
163 <span>System Message</span>
167 <Tooltip.Content side="right">
168 <p>{systemMessageTooltip}</p>
171 </DropdownMenu.Content>