|
1 | 1 | <script lang="ts"> |
2 | | - import type { Snippet } from 'svelte'; |
| 2 | + import { Plus } from '@lucide/svelte'; |
3 | 3 | import * as DropdownMenu from '$lib/components/ui/dropdown-menu'; |
4 | 4 | import * as Tooltip from '$lib/components/ui/tooltip'; |
| 5 | + import { buttonVariants } from '$lib/components/ui/button'; |
| 6 | + import { cn } from '$lib/components/ui/utils'; |
5 | 7 | import { |
6 | 8 | ATTACHMENT_FILE_ITEMS, |
7 | 9 | ATTACHMENT_EXTRA_ITEMS, |
8 | 10 | ATTACHMENT_MCP_ITEMS, |
| 11 | + ATTACHMENT_TOOLTIP_TEXT, |
9 | 12 | TOOLTIP_DELAY_DURATION |
10 | 13 | } from '$lib/constants'; |
11 | 14 | import { AttachmentMenuItemId } from '$lib/enums'; |
|
28 | 31 | onMcpPromptClick?: () => void; |
29 | 32 | onMcpSettingsClick?: () => void; |
30 | 33 | onMcpResourcesClick?: () => void; |
31 | | - trigger: Snippet<[{ disabled: boolean }]>; |
32 | 34 | } |
33 | 35 |
|
34 | 36 | let { |
|
42 | 44 | onSystemPromptClick, |
43 | 45 | onMcpPromptClick, |
44 | 46 | onMcpSettingsClick, |
45 | | - onMcpResourcesClick, |
46 | | - trigger |
| 47 | + onMcpResourcesClick |
47 | 48 | }: Props = $props(); |
48 | 49 |
|
49 | 50 | let dropdownOpen = $state(false); |
|
69 | 70 |
|
70 | 71 | <div class="flex items-center gap-1 {className}"> |
71 | 72 | <DropdownMenu.Root bind:open={dropdownOpen}> |
72 | | - <DropdownMenu.Trigger name="Attach files" {disabled}> |
73 | | - {@render trigger({ disabled })} |
74 | | - </DropdownMenu.Trigger> |
| 73 | + <Tooltip.Root> |
| 74 | + <Tooltip.Trigger> |
| 75 | + {#snippet child({ props })} |
| 76 | + <DropdownMenu.Trigger |
| 77 | + {...props} |
| 78 | + class={cn( |
| 79 | + buttonVariants({ variant: 'secondary' }), |
| 80 | + 'file-upload-button h-8 w-8 cursor-pointer rounded-full p-0' |
| 81 | + )} |
| 82 | + {disabled} |
| 83 | + > |
| 84 | + <span class="sr-only">{ATTACHMENT_TOOLTIP_TEXT}</span> |
| 85 | + |
| 86 | + <Plus class="h-4 w-4" /> |
| 87 | + </DropdownMenu.Trigger> |
| 88 | + {/snippet} |
| 89 | + </Tooltip.Trigger> |
| 90 | + |
| 91 | + <Tooltip.Content> |
| 92 | + <p>{ATTACHMENT_TOOLTIP_TEXT}</p> |
| 93 | + </Tooltip.Content> |
| 94 | + </Tooltip.Root> |
75 | 95 |
|
76 | 96 | <DropdownMenu.Content align="start" class="w-48"> |
77 | 97 | {#each ATTACHMENT_FILE_ITEMS as item (item.id)} |
|
87 | 107 | </DropdownMenu.Item> |
88 | 108 | {:else if item.disabledTooltip} |
89 | 109 | <Tooltip.Root delayDuration={TOOLTIP_DELAY_DURATION}> |
90 | | - <Tooltip.Trigger class="w-full"> |
91 | | - <DropdownMenu.Item |
92 | | - class="{item.class ?? ''} flex cursor-pointer items-center gap-2" |
93 | | - disabled |
94 | | - > |
95 | | - <item.icon class="h-4 w-4" /> |
96 | | - |
97 | | - <span>{item.label}</span> |
98 | | - </DropdownMenu.Item> |
| 110 | + <Tooltip.Trigger tabindex={-1}> |
| 111 | + {#snippet child({ props })} |
| 112 | + <div {...props} class="cursor-default"> |
| 113 | + <DropdownMenu.Item class="{item.class ?? ''} flex items-center gap-2" disabled> |
| 114 | + <item.icon class="h-4 w-4" /> |
| 115 | + |
| 116 | + <span>{item.label}</span> |
| 117 | + </DropdownMenu.Item> |
| 118 | + </div> |
| 119 | + {/snippet} |
99 | 120 | </Tooltip.Trigger> |
100 | 121 |
|
101 | 122 | <Tooltip.Content side="right"> |
|
107 | 128 |
|
108 | 129 | {#if !attachmentMenu.isItemEnabled('hasVisionModality')} |
109 | 130 | <Tooltip.Root delayDuration={TOOLTIP_DELAY_DURATION}> |
110 | | - <Tooltip.Trigger class="w-full"> |
111 | | - <DropdownMenu.Item |
112 | | - class="flex cursor-pointer items-center gap-2" |
113 | | - onclick={attachmentMenu.callbacks.onFileUpload} |
114 | | - > |
115 | | - {@const pdfItem = ATTACHMENT_FILE_ITEMS.find( |
116 | | - (i) => i.id === AttachmentMenuItemId.PDF |
117 | | - )} |
118 | | - {#if pdfItem} |
119 | | - <pdfItem.icon class="h-4 w-4" /> |
120 | | - |
121 | | - <span>{pdfItem.label}</span> |
122 | | - {/if} |
123 | | - </DropdownMenu.Item> |
| 131 | + <Tooltip.Trigger> |
| 132 | + {#snippet child({ props })} |
| 133 | + <DropdownMenu.Item |
| 134 | + {...props} |
| 135 | + class="flex cursor-pointer items-center gap-2" |
| 136 | + onclick={attachmentMenu.callbacks.onFileUpload} |
| 137 | + > |
| 138 | + {@const pdfItem = ATTACHMENT_FILE_ITEMS.find( |
| 139 | + (i) => i.id === AttachmentMenuItemId.PDF |
| 140 | + )} |
| 141 | + {#if pdfItem} |
| 142 | + <pdfItem.icon class="h-4 w-4" /> |
| 143 | + |
| 144 | + <span>{pdfItem.label}</span> |
| 145 | + {/if} |
| 146 | + </DropdownMenu.Item> |
| 147 | + {/snippet} |
124 | 148 | </Tooltip.Trigger> |
125 | 149 |
|
126 | 150 | <Tooltip.Content side="right"> |
|
134 | 158 | {#each ATTACHMENT_EXTRA_ITEMS as item (item.id)} |
135 | 159 | {#if item.id === AttachmentMenuItemId.SYSTEM_MESSAGE} |
136 | 160 | <Tooltip.Root delayDuration={TOOLTIP_DELAY_DURATION}> |
137 | | - <Tooltip.Trigger class="w-full"> |
138 | | - <DropdownMenu.Item |
139 | | - class="flex cursor-pointer items-center gap-2" |
140 | | - onclick={() => attachmentMenu.callbacks[item.action]()} |
141 | | - > |
142 | | - <item.icon class="h-4 w-4" /> |
143 | | - |
144 | | - <span>{item.label}</span> |
145 | | - </DropdownMenu.Item> |
| 161 | + <Tooltip.Trigger> |
| 162 | + {#snippet child({ props })} |
| 163 | + <DropdownMenu.Item |
| 164 | + {...props} |
| 165 | + class="flex cursor-pointer items-center gap-2" |
| 166 | + onclick={() => attachmentMenu.callbacks[item.action]()} |
| 167 | + > |
| 168 | + <item.icon class="h-4 w-4" /> |
| 169 | + |
| 170 | + <span>{item.label}</span> |
| 171 | + </DropdownMenu.Item> |
| 172 | + {/snippet} |
146 | 173 | </Tooltip.Trigger> |
147 | 174 |
|
148 | 175 | <Tooltip.Content side="right"> |
|
0 commit comments