diff --git a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActionAttachmentsDropdown.svelte b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActionAttachmentsDropdown.svelte index f453c8a80c..87d56d3ba3 100644 --- a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActionAttachmentsDropdown.svelte +++ b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActionAttachmentsDropdown.svelte @@ -6,7 +6,7 @@ import * as Tooltip from '$lib/components/ui/tooltip'; import { Switch } from '$lib/components/ui/switch'; import { FILE_TYPE_ICONS } from '$lib/constants/icons'; - import { McpLogo, SearchInput } from '$lib/components/app'; + import { McpLogo, DropdownMenuSearchable } from '$lib/components/app'; import { TOOLTIP_DELAY_DURATION } from '$lib/constants/tooltip-config'; import { conversationsStore } from '$lib/stores/conversations.svelte'; import { mcpStore } from '$lib/stores/mcp.svelte'; @@ -243,12 +243,13 @@ -
- -
- -
- {#if filteredMcpServers.length > 0} + +
{#each filteredMcpServers as server (server.id)} {@const healthState = mcpStore.getHealthCheckState(server.id)} {@const hasError = healthState.status === HealthCheckStatus.ERROR} @@ -291,27 +292,19 @@ /> {/each} - {:else if hasMcpServers} -
- No servers found -
- {:else} -
- No MCP servers configured -
- {/if} -
+
- + {#snippet footer()} + + - - - - Manage MCP Servers - + Manage MCP Servers + + {/snippet} +
diff --git a/tools/server/webui/src/lib/components/app/mcp/McpServersSelector.svelte b/tools/server/webui/src/lib/components/app/mcp/McpServersSelector.svelte index 488d3fce7c..0d1707c1c0 100644 --- a/tools/server/webui/src/lib/components/app/mcp/McpServersSelector.svelte +++ b/tools/server/webui/src/lib/components/app/mcp/McpServersSelector.svelte @@ -68,15 +68,21 @@ {#if hasMcpServers && hasEnabledMcpServers && mcpFavicons.length > 0} - { + if (!open) { + searchQuery = ''; + } + handleDropdownOpen(open); + }} > - {#snippet trigger()} + { + e.preventDefault(); + e.stopPropagation(); + }} + > - {/snippet} + + + +
{#each filteredMcpServers as server (server.id)} @@ -139,5 +153,7 @@ Manage MCP Servers {/snippet} - + + + {/if} diff --git a/tools/server/webui/src/lib/components/app/models/ModelsSelector.svelte b/tools/server/webui/src/lib/components/app/models/ModelsSelector.svelte index cfb533a044..d7d528e3ad 100644 --- a/tools/server/webui/src/lib/components/app/models/ModelsSelector.svelte +++ b/tools/server/webui/src/lib/components/app/models/ModelsSelector.svelte @@ -1,6 +1,7 @@ - - { - e.preventDefault(); - e.stopPropagation(); - }} - > - {@render trigger()} - +
+ +
- -
- -
+
+ {@render children()} -
- {@render children()} + {#if isEmpty} +
{emptyMessage}
+ {/if} +
- {#if isEmpty} -
{emptyMessage}
- {/if} -
+{#if footer} + - {#if footer} - - - {@render footer()} - {/if} -
-
+ {@render footer()} +{/if} diff --git a/tools/server/webui/src/lib/components/app/navigation/index.ts b/tools/server/webui/src/lib/components/app/navigation/index.ts index 6a8a99c627..051491b866 100644 --- a/tools/server/webui/src/lib/components/app/navigation/index.ts +++ b/tools/server/webui/src/lib/components/app/navigation/index.ts @@ -7,30 +7,32 @@ */ /** - * **DropdownMenuSearchable** - Filterable dropdown menu + * **DropdownMenuSearchable** - Searchable content for dropdown menus * - * Generic dropdown with search input for filtering options. - * Uses Svelte snippets for flexible content rendering. + * Renders a search input with filtered content area, empty state, and optional footer. + * Designed to be injected into any dropdown container (DropdownMenu.Content, + * DropdownMenu.SubContent, etc.) without providing its own Root. * * **Features:** - * - Search/filter input with clear on close + * - Search/filter input * - Keyboard navigation support - * - Custom trigger, content, and footer via snippets + * - Custom content and footer via snippets * - Empty state message - * - Disabled state - * - Configurable alignment and width * * @example * ```svelte - * - * {#snippet trigger()}{/snippet} - * {#snippet children()}{#each items as item}{/each}{/snippet} - * + * + * ... + * + * + * {#each items as item}{/each} + * + * + * * ``` */ export { default as DropdownMenuSearchable } from './DropdownMenuSearchable.svelte';