2 import { Plus, MessageSquare, Zap, FolderOpen } from '@lucide/svelte';
3 import { Button } from '$lib/components/ui/button';
4 import * as Sheet from '$lib/components/ui/sheet';
5 import { FILE_TYPE_ICONS } from '$lib/constants';
6 import { McpLogo } from '$lib/components/app';
11 hasAudioModality?: boolean;
12 hasVisionModality?: boolean;
13 hasMcpPromptsSupport?: boolean;
14 hasMcpResourcesSupport?: boolean;
15 onFileUpload?: () => void;
16 onSystemPromptClick?: () => void;
17 onMcpPromptClick?: () => void;
18 onMcpSettingsClick?: () => void;
19 onMcpResourcesClick?: () => void;
23 class: className = '',
25 hasAudioModality = false,
26 hasVisionModality = false,
27 hasMcpPromptsSupport = false,
28 hasMcpResourcesSupport = false,
36 let sheetOpen = $state(false);
38 function handleMcpPromptClick() {
43 function handleMcpSettingsClick() {
44 onMcpSettingsClick?.();
47 function handleMcpResourcesClick() {
49 onMcpResourcesClick?.();
52 function handleSheetFileUpload() {
57 function handleSheetSystemPromptClick() {
59 onSystemPromptClick?.();
62 const fileUploadTooltipText = 'Add files, system prompt or MCP Servers';
64 const sheetItemClass =
65 'flex w-full items-center gap-3 rounded-md px-3 py-2.5 text-left text-sm transition-colors hover:bg-accent active:bg-accent disabled:cursor-not-allowed disabled:opacity-50';
68 <div class="flex items-center gap-1 {className}">
69 <Sheet.Root bind:open={sheetOpen}>
71 class="file-upload-button h-8 w-8 rounded-full p-0"
75 onclick={() => (sheetOpen = true)}
77 <span class="sr-only">{fileUploadTooltipText}</span>
79 <Plus class="h-4 w-4" />
82 <Sheet.Content side="bottom" class="max-h-[85vh] gap-0">
84 <Sheet.Title>Add to chat</Sheet.Title>
86 <Sheet.Description class="sr-only">
87 Add files, system prompt or configure MCP servers
91 <div class="flex flex-col gap-1 overflow-y-auto px-1.5 pb-2">
95 class={sheetItemClass}
96 disabled={!hasVisionModality}
97 onclick={handleSheetFileUpload}
99 <FILE_TYPE_ICONS.image class="h-4 w-4 shrink-0" />
103 {#if !hasVisionModality}
104 <span class="ml-auto text-xs text-muted-foreground">Requires vision model</span>
111 class={sheetItemClass}
112 disabled={!hasAudioModality}
113 onclick={handleSheetFileUpload}
115 <FILE_TYPE_ICONS.audio class="h-4 w-4 shrink-0" />
117 <span>Audio Files</span>
119 {#if !hasAudioModality}
120 <span class="ml-auto text-xs text-muted-foreground">Requires audio model</span>
124 <button type="button" class={sheetItemClass} onclick={handleSheetFileUpload}>
125 <FILE_TYPE_ICONS.text class="h-4 w-4 shrink-0" />
127 <span>Text Files</span>
130 <button type="button" class={sheetItemClass} onclick={handleSheetFileUpload}>
131 <FILE_TYPE_ICONS.pdf class="h-4 w-4 shrink-0" />
133 <span>PDF Files</span>
135 {#if !hasVisionModality}
136 <span class="ml-auto text-xs text-muted-foreground">Text-only</span>
140 <button type="button" class={sheetItemClass} onclick={handleSheetSystemPromptClick}>
141 <MessageSquare class="h-4 w-4 shrink-0" />
143 <span>System Message</span>
146 <button type="button" class={sheetItemClass} onclick={handleMcpSettingsClick}>
147 <McpLogo class="h-4 w-4 shrink-0" />
149 <span>MCP Servers</span>
152 {#if hasMcpPromptsSupport}
153 <button type="button" class={sheetItemClass} onclick={handleMcpPromptClick}>
154 <Zap class="h-4 w-4 shrink-0" />
156 <span>MCP Prompt</span>
160 {#if hasMcpResourcesSupport}
161 <button type="button" class={sheetItemClass} onclick={handleMcpResourcesClick}>
162 <FolderOpen class="h-4 w-4 shrink-0" />
164 <span>MCP Resources</span>