From 72eff32065b9cb499e25cec569e306cce6e63487 Mon Sep 17 00:00:00 2001 From: wasimysaid Date: Sat, 30 May 2026 23:00:41 +0200 Subject: [PATCH] style(chat): polish composer and sidebar interactions --- .../assistant-ui/model-selector.tsx | 66 +++++++++++++++---- .../src/features/chat/shared-composer.tsx | 2 +- studio/frontend/src/index.css | 41 ++++++++++-- 3 files changed, 90 insertions(+), 19 deletions(-) diff --git a/studio/frontend/src/components/assistant-ui/model-selector.tsx b/studio/frontend/src/components/assistant-ui/model-selector.tsx index 8058a4d322..474d776a8c 100644 --- a/studio/frontend/src/components/assistant-ui/model-selector.tsx +++ b/studio/frontend/src/components/assistant-ui/model-selector.tsx @@ -10,7 +10,6 @@ import { } from "@/components/ui/popover"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { usePlatformStore } from "@/config/env"; -import { isCustomProviderType } from "@/features/chat/external-providers"; import { cn } from "@/lib/utils"; import { ArrowDown01Icon, @@ -32,6 +31,22 @@ import type { import { HubModelPicker, LoraModelPicker } from "./model-selector/pickers"; import { Input } from "../ui/input"; +const CUSTOM_PROVIDER_TYPES_WITH_FALLBACK_LOGO = new Set([ + "custom", + "llama_cpp", + "vllm", + "ollama", +]); + +function isCustomProviderTypeWithFallbackLogo( + providerType: string | undefined, +): boolean { + return ( + providerType !== undefined && + CUSTOM_PROVIDER_TYPES_WITH_FALLBACK_LOGO.has(providerType) + ); +} + const PROVIDER_LOGO_EXT: Record = { openai: "svg", mistral: "svg", @@ -64,7 +79,7 @@ function ExternalProviderLogo({ title?: string; }) { const src = providerLogoSrc(providerType); - if (!src && isCustomProviderType(providerType)) { + if (!src && isCustomProviderTypeWithFallbackLogo(providerType)) { return ( )} {currentModel?.icon ? ( - {currentModel.icon} + + {currentModel.icon} + ) : null} @@ -228,7 +246,10 @@ function ModelSelectorContent({ const chatOnly = usePlatformStore((s) => s.isChatOnly()); const hasExternal = externalModels.length > 0; const chatOnlyTabsDefault = useMemo( - () => (value && externalModels.some((model) => model.id === value) ? "external" : "hub"), + () => + value && externalModels.some((model) => model.id === value) + ? "external" + : "hub", [externalModels, value], ); const studioTabsDefault = useMemo((): "hub" | "lora" | "external" => { @@ -246,7 +267,7 @@ function ModelSelectorContent({ align="start" data-tour={dataTour} className={cn( - "menu-soft-surface ring-0 w-[min(440px,calc(100vw-1rem))] max-w-[calc(100vw-1rem)] min-w-0 gap-0 p-2", + "model-selector-menu menu-soft-surface ring-0 w-[min(440px,calc(100vw-1rem))] max-w-[calc(100vw-1rem)] min-w-0 gap-0 p-2", className, )} > @@ -258,7 +279,12 @@ function ModelSelectorContent({ Connected - + ) : ( - + ) ) : ( Hub models Fine-tuned - {hasExternal ? Connected : null} + {hasExternal ? ( + Connected + ) : null} - + @@ -420,7 +458,9 @@ export function ModelSelector({ const found = optionById.get(selected); if (activeGgufVariant) { const desc = `GGUF ยท ${activeGgufVariant}`; - return found ? { ...found, description: desc } : { id: selected, name: selected, description: desc }; + return found + ? { ...found, description: desc } + : { id: selected, name: selected, description: desc }; } return found ?? { id: selected, name: selected }; }, [selected, optionById, activeGgufVariant]); diff --git a/studio/frontend/src/features/chat/shared-composer.tsx b/studio/frontend/src/features/chat/shared-composer.tsx index d9ad02067a..cb1bc72ffe 100644 --- a/studio/frontend/src/features/chat/shared-composer.tsx +++ b/studio/frontend/src/features/chat/shared-composer.tsx @@ -1130,7 +1130,7 @@ export function SharedComposer({ dir="auto" />
-
+
span { + font-size: 13px; + font-weight: 400; + line-height: 17px; + } + + .unsloth-thinking-pill svg { + width: 16px !important; + height: 16px !important; + flex-shrink: 0; } .unsloth-thinking-pill[data-active="true"], @@ -1555,15 +1586,15 @@ } [data-sidebar="content"] { - scrollbar-color: oklch(0.5 0 0 / 0.22) var(--sidebar); + scrollbar-color: oklch(0.5 0 0 / 0.22) transparent; } .dark [data-sidebar="content"] { - scrollbar-color: oklch(0.72 0 0 / 0.25) var(--sidebar); + scrollbar-color: oklch(0.72 0 0 / 0.25) transparent; } [data-sidebar="content"]::-webkit-scrollbar-track { - background: var(--sidebar); + background: transparent; } [data-sidebar="content"]::-webkit-scrollbar-thumb {