@@ -418,9 +360,8 @@
{:else}
{@const selectedOption = getDisplayOption()}
-
-
-
- {#if isOpen && isRouter}
-
+
+
+
+
+
+
+
0
- ? `${menuPosition.maxHeight}px`
- : undefined}
+ class="models-list order-2 min-h-0 flex-1 overflow-y-auto group-data-[side=top]/popover-content:order-1"
>
{#if !isCurrentModelInCache() && currentModel}
- {/if}
-
+
+
{/if}
diff --git a/tools/server/webui/src/lib/components/ui/popover/index.ts b/tools/server/webui/src/lib/components/ui/popover/index.ts
new file mode 100644
index 00000000000..c5937fb3a04
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/popover/index.ts
@@ -0,0 +1,19 @@
+import Root from './popover.svelte';
+import Close from './popover-close.svelte';
+import Content from './popover-content.svelte';
+import Trigger from './popover-trigger.svelte';
+import Portal from './popover-portal.svelte';
+
+export {
+ Root,
+ Content,
+ Trigger,
+ Close,
+ Portal,
+ //
+ Root as Popover,
+ Content as PopoverContent,
+ Trigger as PopoverTrigger,
+ Close as PopoverClose,
+ Portal as PopoverPortal
+};
diff --git a/tools/server/webui/src/lib/components/ui/popover/popover-close.svelte b/tools/server/webui/src/lib/components/ui/popover/popover-close.svelte
new file mode 100644
index 00000000000..dc4dec4b339
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/popover/popover-close.svelte
@@ -0,0 +1,7 @@
+
+
+
diff --git a/tools/server/webui/src/lib/components/ui/popover/popover-content.svelte b/tools/server/webui/src/lib/components/ui/popover/popover-content.svelte
new file mode 100644
index 00000000000..2d3513d347f
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/popover/popover-content.svelte
@@ -0,0 +1,37 @@
+
+
+
+
+
diff --git a/tools/server/webui/src/lib/components/ui/popover/popover-portal.svelte b/tools/server/webui/src/lib/components/ui/popover/popover-portal.svelte
new file mode 100644
index 00000000000..25efb877b73
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/popover/popover-portal.svelte
@@ -0,0 +1,7 @@
+
+
+
diff --git a/tools/server/webui/src/lib/components/ui/popover/popover-trigger.svelte b/tools/server/webui/src/lib/components/ui/popover/popover-trigger.svelte
new file mode 100644
index 00000000000..5ef3d0e9324
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/popover/popover-trigger.svelte
@@ -0,0 +1,17 @@
+
+
+
diff --git a/tools/server/webui/src/lib/components/ui/popover/popover.svelte b/tools/server/webui/src/lib/components/ui/popover/popover.svelte
new file mode 100644
index 00000000000..f39b867a694
--- /dev/null
+++ b/tools/server/webui/src/lib/components/ui/popover/popover.svelte
@@ -0,0 +1,7 @@
+
+
+
diff --git a/tools/server/webui/src/lib/constants/floating-ui-constraints.ts b/tools/server/webui/src/lib/constants/floating-ui-constraints.ts
index c95d3f18417..003fc77acb0 100644
--- a/tools/server/webui/src/lib/constants/floating-ui-constraints.ts
+++ b/tools/server/webui/src/lib/constants/floating-ui-constraints.ts
@@ -1,3 +1,2 @@
export const VIEWPORT_GUTTER = 8;
export const MENU_OFFSET = 6;
-export const MENU_MAX_WIDTH = 320;
diff --git a/tools/server/webui/src/lib/stores/models.svelte.ts b/tools/server/webui/src/lib/stores/models.svelte.ts
index 2e834af5a00..1bc299abc0d 100644
--- a/tools/server/webui/src/lib/stores/models.svelte.ts
+++ b/tools/server/webui/src/lib/stores/models.svelte.ts
@@ -279,14 +279,21 @@ class ModelsStore {
* Fetch props for a specific model from /props endpoint
* Uses caching to avoid redundant requests
*
+ * In ROUTER mode, this will only fetch props if the model is loaded,
+ * since unloaded models return 400 from /props endpoint.
+ *
* @param modelId - Model identifier to fetch props for
- * @returns Props data or null if fetch failed
+ * @returns Props data or null if fetch failed or model not loaded
*/
async fetchModelProps(modelId: string): Promise
{
// Return cached props if available
const cached = this.modelPropsCache.get(modelId);
if (cached) return cached;
+ if (serverStore.isRouterMode && !this.isModelLoaded(modelId)) {
+ return null;
+ }
+
// Avoid duplicate fetches
if (this.modelPropsFetching.has(modelId)) return null;