diff --git a/tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettingsFields.svelte b/tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettingsFields.svelte
index 7e11b2a92fe88..e06399e0bc163 100644
--- a/tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettingsFields.svelte
+++ b/tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettingsFields.svelte
@@ -5,7 +5,6 @@
import * as Select from '$lib/components/ui/select';
import { Textarea } from '$lib/components/ui/textarea';
import { SETTING_CONFIG_DEFAULT, SETTING_CONFIG_INFO } from '$lib/constants/settings-config';
- import { IsMobile } from '$lib/hooks/is-mobile.svelte';
import { supportsVision } from '$lib/stores/server.svelte';
import type { Component } from 'svelte';
@@ -17,8 +16,6 @@
}
let { fields, localConfig, onConfigChange, onThemeChange }: Props = $props();
-
- let isMobile = $state(new IsMobile());
{#each fields as field (field.key)}
@@ -33,7 +30,7 @@
value={String(localConfig[field.key] ?? '')}
onchange={(e) => onConfigChange(field.key, e.currentTarget.value)}
placeholder={`Default: ${SETTING_CONFIG_DEFAULT[field.key] ?? 'none'}`}
- class={isMobile ? 'w-full' : 'max-w-md'}
+ class="w-full md:max-w-md"
/>
{#if field.help || SETTING_CONFIG_INFO[field.key]}
@@ -50,7 +47,7 @@
value={String(localConfig[field.key] ?? '')}
onchange={(e) => onConfigChange(field.key, e.currentTarget.value)}
placeholder={`Default: ${SETTING_CONFIG_DEFAULT[field.key] ?? 'none'}`}
- class={isMobile ? 'min-h-[100px] w-full' : 'min-h-[100px] max-w-2xl'}
+ class="min-h-[100px] w-full md:max-w-2xl"
/>
{#if field.help || SETTING_CONFIG_INFO[field.key]}
@@ -78,7 +75,7 @@
}
}}
>
-
+
{#if selectedOption?.icon}
{@const IconComponent = selectedOption.icon}
diff --git a/tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettingsFooter.svelte b/tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettingsFooter.svelte
index e862cdb2bc68a..3408fe3ce4257 100644
--- a/tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettingsFooter.svelte
+++ b/tools/server/webui/src/lib/components/app/chat/ChatSettings/ChatSettingsFooter.svelte
@@ -1,5 +1,6 @@
-
+
+
+
+
+
+ Reset Settings to Default
+
+ Are you sure you want to reset all settings to their default values? This action cannot be
+ undone and will permanently remove all your custom configurations.
+
+
+
+ Cancel
+ Reset to Default
+
+
+
diff --git a/tools/server/webui/src/lib/components/app/chat/ChatSidebar/ChatSidebar.svelte b/tools/server/webui/src/lib/components/app/chat/ChatSidebar/ChatSidebar.svelte
index 6af348e696da7..8dd4b20dcbb97 100644
--- a/tools/server/webui/src/lib/components/app/chat/ChatSidebar/ChatSidebar.svelte
+++ b/tools/server/webui/src/lib/components/app/chat/ChatSidebar/ChatSidebar.svelte
@@ -87,7 +87,7 @@
{#each filteredConversations as conversation (conversation.id)}
-
+
void;
onDelete?: (id: string) => void;
onEdit?: (id: string, name: string) => void;
onSelect?: (id: string) => void;
@@ -16,6 +17,7 @@
let {
conversation,
+ handleMobileSidebarItemClick,
onDelete,
onEdit,
onSelect,
@@ -47,6 +49,7 @@
function handleConfirmEdit() {
if (!editedName.trim()) return;
+ showEditDialog = false;
onEdit?.(conversation.id, editedName);
}
@@ -85,7 +88,12 @@
: ''}"
onclick={handleSelect}
>
-
+
+
+
{conversation.name}
@@ -178,5 +186,10 @@
&:is(:hover) :global([data-slot='dropdown-menu-trigger']) {
opacity: 1;
}
+ @media (max-width: 768px) {
+ :global([data-slot='dropdown-menu-trigger']) {
+ opacity: 1 !important;
+ }
+ }
}
diff --git a/tools/server/webui/src/lib/components/app/misc/ActionDropdown.svelte b/tools/server/webui/src/lib/components/app/misc/ActionDropdown.svelte
index e06bbc5086721..da29e2584f967 100644
--- a/tools/server/webui/src/lib/components/app/misc/ActionDropdown.svelte
+++ b/tools/server/webui/src/lib/components/app/misc/ActionDropdown.svelte
@@ -37,6 +37,7 @@
e.stopPropagation()}
>
{#if triggerTooltip}
@@ -53,7 +54,7 @@
{/if}
-
+
{#each actions as action, index (action.label)}
{#if action.separator && index > 0}
diff --git a/tools/server/webui/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte b/tools/server/webui/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte
index 2d4a8fd62d4a3..2398daee70b59 100644
--- a/tools/server/webui/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte
+++ b/tools/server/webui/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte
@@ -19,7 +19,15 @@
bind:ref
data-slot="alert-dialog-content"
class={cn(
- 'fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg',
+ 'fixed z-[999999] grid w-full gap-4 border bg-background p-6 shadow-lg duration-200',
+ // Mobile: Bottom sheet behavior
+ 'right-0 bottom-0 left-0 max-h-[100dvh] translate-x-0 translate-y-0 overflow-y-auto rounded-t-lg',
+ 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-bottom-full',
+ 'data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:slide-in-from-bottom-full',
+ // Desktop: Centered dialog behavior
+ 'sm:top-[50%] sm:right-auto sm:bottom-auto sm:left-[50%] sm:max-h-[100vh] sm:max-w-lg sm:translate-x-[-50%] sm:translate-y-[-50%] sm:rounded-lg',
+ 'sm:data-[state=closed]:slide-out-to-bottom-0 sm:data-[state=closed]:zoom-out-95',
+ 'sm:data-[state=open]:slide-in-from-bottom-0 sm:data-[state=open]:zoom-in-95',
className
)}
{...restProps}
diff --git a/tools/server/webui/src/lib/components/ui/alert-dialog/alert-dialog-footer.svelte b/tools/server/webui/src/lib/components/ui/alert-dialog/alert-dialog-footer.svelte
index 4b55eb65d155a..da0f7be74b65a 100644
--- a/tools/server/webui/src/lib/components/ui/alert-dialog/alert-dialog-footer.svelte
+++ b/tools/server/webui/src/lib/components/ui/alert-dialog/alert-dialog-footer.svelte
@@ -13,7 +13,10 @@
*]:flex-1 sm:[&>*]:flex-none',
+ className
+ )}
{...restProps}
>
{@render children?.()}
diff --git a/tools/server/webui/src/lib/components/ui/dialog/dialog-content.svelte b/tools/server/webui/src/lib/components/ui/dialog/dialog-content.svelte
index 93d97bc4a6687..74df0eacb5708 100644
--- a/tools/server/webui/src/lib/components/ui/dialog/dialog-content.svelte
+++ b/tools/server/webui/src/lib/components/ui/dialog/dialog-content.svelte
@@ -25,7 +25,7 @@
bind:ref
data-slot="dialog-content"
class={cn(
- 'fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border border-border/30 bg-background p-6 shadow-lg duration-200 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg',
+ `fixed top-[50%] left-[50%] z-50 grid max-h-[100dvh] w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 overflow-y-auto rounded-lg border border-border/30 bg-background p-6 shadow-lg duration-200 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg md:max-h-[100vh]`,
className
)}
{...restProps}
diff --git a/tools/server/webui/src/lib/components/ui/select/select-content.svelte b/tools/server/webui/src/lib/components/ui/select/select-content.svelte
index a5199584b64f2..4050628cc8769 100644
--- a/tools/server/webui/src/lib/components/ui/select/select-content.svelte
+++ b/tools/server/webui/src/lib/components/ui/select/select-content.svelte
@@ -1,4 +1,5 @@
@@ -22,7 +93,7 @@
{sideOffset}
data-slot="select-content"
class={cn(
- 'relative z-50 max-h-(--bits-select-content-available-height) min-w-[8rem] origin-(--bits-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-md data-[side=bottom]:translate-y-1 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:-translate-x-1 data-[side=left]:slide-in-from-right-2 data-[side=right]:translate-x-1 data-[side=right]:slide-in-from-left-2 data-[side=top]:-translate-y-1 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95',
+ 'relative z-[var(--layer-popover,1000000)] max-h-(--bits-select-content-available-height) min-w-[8rem] origin-(--bits-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-md data-[side=bottom]:translate-y-1 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:-translate-x-1 data-[side=left]:slide-in-from-right-2 data-[side=right]:translate-x-1 data-[side=right]:slide-in-from-left-2 data-[side=top]:-translate-y-1 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95',
className
)}
{...restProps}