From 1c27c014e96ba7f2c322d033875701a22a553c59 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 23 Apr 2026 10:32:27 +0000 Subject: [PATCH] feat(ui): migrate navbar + ui_theme_settings to shadcn - navbar: antd Button/Switch/Tag + @ant-design/icons Menu/PanelLeftClose/ Moon/Sun \u2192 shadcn Button/Switch/Badge + lucide equivalents. Docs link now uses . Version Badge uses variant='outline'. - ui_theme_settings: @tremor Card/Title/Text/TextInput/Button \u2192 shadcn Card/Input/Button/Label. Semantic tokens throughout (text-foreground, text-muted-foreground, bg-background). Gates: TS \u2713 | Build \u2713. Co-authored-by: yuneng-jiang --- .../src/components/navbar.tsx | 69 +++++++--- .../src/components/ui_theme_settings.tsx | 121 +++++++++++++----- 2 files changed, 139 insertions(+), 51 deletions(-) diff --git a/ui/litellm-dashboard/src/components/navbar.tsx b/ui/litellm-dashboard/src/components/navbar.tsx index 6e0a47a23f9..fb77b48ecd4 100644 --- a/ui/litellm-dashboard/src/components/navbar.tsx +++ b/ui/litellm-dashboard/src/components/navbar.tsx @@ -5,8 +5,10 @@ import { useTheme } from "@/contexts/ThemeContext"; import { clearTokenCookies } from "@/utils/cookieUtils"; import { clearStoredReturnUrl } from "@/utils/returnUrlUtils"; import { fetchProxySettings } from "@/utils/proxyUtils"; -import { MenuFoldOutlined, MenuUnfoldOutlined, MoonOutlined, SunOutlined } from "@ant-design/icons"; -import { Button, Switch, Tag } from "antd"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Switch } from "@/components/ui/switch"; +import { Menu, Moon, PanelLeftClose, Sun } from "lucide-react"; import Link from "next/link"; import React, { useEffect, useState } from "react"; import { BlogDropdown } from "./Navbar/BlogDropdown/BlogDropdown"; @@ -19,7 +21,9 @@ interface NavbarProps { userEmail: string | null; userRole: string | null; premiumUser: boolean; + // eslint-disable-next-line @typescript-eslint/no-explicit-any proxySettings: any; + // eslint-disable-next-line @typescript-eslint/no-explicit-any setProxySettings: React.Dispatch>; accessToken: string | null; isPublicPage: boolean; @@ -30,9 +34,13 @@ interface NavbarProps { } const Navbar: React.FC = ({ + // eslint-disable-next-line @typescript-eslint/no-unused-vars userID, + // eslint-disable-next-line @typescript-eslint/no-unused-vars userEmail, + // eslint-disable-next-line @typescript-eslint/no-unused-vars userRole, + // eslint-disable-next-line @typescript-eslint/no-unused-vars premiumUser, proxySettings, setProxySettings, @@ -50,7 +58,6 @@ const Navbar: React.FC = ({ const version = healthData?.litellm_version; const disableBouncingIcon = useDisableBouncingIcon(); - // Simple logo URL: use custom logo if available, otherwise default const imageUrl = logoUrl || `${baseUrl}/get_image`; useEffect(() => { @@ -65,6 +72,7 @@ const Navbar: React.FC = ({ }; initializeProxySettings(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [accessToken]); useEffect(() => { @@ -87,22 +95,32 @@ const Navbar: React.FC = ({ }; return ( -