From de25e199d446d12f1995235f739a6172a51ce51a Mon Sep 17 00:00:00 2001 From: Yuneng Jiang Date: Sat, 15 Aug 2026 00:33:20 -0700 Subject: [PATCH] fix(ui): de-duplicate the reset budget option and polish shadcn surfaces Create Key offered two options labelled "Never resets" in the Reset Budget dropdown. BudgetDurationDropdown renders its unset item using the caller's placeholder, and create_key_button passed placeholder="Never resets" alongside showNeverResets, so the omit option and the explicit-null option looked identical while behaving differently. An omitted budget_duration picks up default_key_generate_params and the linked budget tier's schedule, whereas the "none" sentinel is converted to an explicit null and truly never resets. The unset item now reads "Not set", matching getBudgetDurationLabel, and the create-key test mock passes the placeholder through so a future collision fails the suite The rest is migration cleanup found during manual QA. The models and endpoints tab strip hides its scrollbar and fades at the right edge using a vendored copy of the shadcn scroll-fade utility, keeping the CLI package out of the build. globals.css neutralises the @tailwindcss/forms resting-state rules for combobox-chip-input, which lets twelve call sites drop the same copy-pasted className workaround. Guardrails moves to the line tab variant and stops clipping its textarea focus ring, the log drawer JSON tree takes the app background, the audit log empty state centres, the caching page selects no longer stretch to the row height, the usage page team filter shares its row with the Export button through a new filterSlot prop, and the cost optimization and vector store tab strips drop their leftover full-width divider --- ui/litellm-dashboard/eslint-suppressions.json | 5 ++ .../caching/_components/cache_dashboard.tsx | 6 +- .../_components/CostOptimizationView.tsx | 2 +- .../_components/GuardrailTestPanel.tsx | 2 +- .../_components/GuardrailsPanel.tsx | 2 +- .../custom_code/CustomCodeModal.tsx | 5 +- .../guardrails/_components/pii_components.tsx | 1 - .../(dashboard)/models-and-endpoints/page.tsx | 2 +- .../old-usage/_components/usage.tsx | 2 +- .../components/chat_ui/ChatComposer.tsx | 7 +- .../src/app/(dashboard)/playground/page.tsx | 13 ++- .../components/EntityUsage/EntityUsage.tsx | 11 +-- .../vector-stores/_components/index.tsx | 2 +- ui/litellm-dashboard/src/app/globals.css | 72 +++++++++++++++ .../EntityUsageExport/UsageExportHeader.tsx | 87 ++++++++++--------- .../components/ModelSelect/ModelSelect.tsx | 6 +- .../CommunityEngagementButtons.tsx | 80 +++++++++-------- .../src/components/TeamSSOSettings.tsx | 6 +- .../common_components/team_multi_select.tsx | 7 +- .../organisms/create_key_button.test.tsx | 25 +++++- .../organisms/create_key_button.tsx | 2 +- .../src/components/public_model_hub.tsx | 2 +- .../search_tools/SearchToolSelector.tsx | 7 +- .../components/shared/DataTable/DataTable.tsx | 5 +- .../src/components/shared/MultiSelect.tsx | 2 +- .../src/components/ui/button-group.tsx | 76 ++++++++++++++++ .../src/components/user_agent_activity.tsx | 6 +- .../view_logs/LogDetailsDrawer/JsonViewer.tsx | 6 +- 28 files changed, 295 insertions(+), 154 deletions(-) create mode 100644 ui/litellm-dashboard/src/components/ui/button-group.tsx diff --git a/ui/litellm-dashboard/eslint-suppressions.json b/ui/litellm-dashboard/eslint-suppressions.json index 2b903f763d9..4a6d7006893 100644 --- a/ui/litellm-dashboard/eslint-suppressions.json +++ b/ui/litellm-dashboard/eslint-suppressions.json @@ -2974,6 +2974,11 @@ "count": 1 } }, + "src/components/ui/button-group.tsx": { + "local/filename-pascal-case": { + "count": 1 + } + }, "src/components/ui/button.tsx": { "local/filename-pascal-case": { "count": 1 diff --git a/ui/litellm-dashboard/src/app/(dashboard)/caching/_components/cache_dashboard.tsx b/ui/litellm-dashboard/src/app/(dashboard)/caching/_components/cache_dashboard.tsx index 6759a9af63f..c1a4968f58b 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/caching/_components/cache_dashboard.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/caching/_components/cache_dashboard.tsx @@ -190,7 +190,7 @@ const CacheDashboard: React.FC = ({ accessToken, token, userRole Metrics" on the Usage page or individual requests in the Logs page.

-
+
= ({ accessToken, token, userRole )) } - + No virtual keys found @@ -237,7 +237,7 @@ const CacheDashboard: React.FC = ({ accessToken, token, userRole )) } - + No models found diff --git a/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.tsx b/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.tsx index 702bb5b8034..8122cfa7a9c 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.tsx @@ -63,7 +63,7 @@ const CostOptimizationView: React.FC = ({ accessToken
- + Overall diff --git a/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/GuardrailTestPanel.tsx b/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/GuardrailTestPanel.tsx index 8297c1e1e3b..5c79a2292a2 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/GuardrailTestPanel.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/GuardrailTestPanel.tsx @@ -131,7 +131,7 @@ export function GuardrailTestPanel({
{/* Input Section */} -
+
diff --git a/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/GuardrailsPanel.tsx b/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/GuardrailsPanel.tsx index 9df2fa04c04..80267f97a94 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/GuardrailsPanel.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/GuardrailsPanel.tsx @@ -126,7 +126,7 @@ const GuardrailsPanel: React.FC = ({ accessToken, userRole return (
- + {isAdmin && ( <> diff --git a/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/custom_code/CustomCodeModal.tsx b/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/custom_code/CustomCodeModal.tsx index 1497c789cb4..5015884de31 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/custom_code/CustomCodeModal.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/custom_code/CustomCodeModal.tsx @@ -532,10 +532,7 @@ const CustomCodeModal: React.FC = ({ visible, onClose, onS {option.label} ))} - + No matching modes diff --git a/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/pii_components.tsx b/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/pii_components.tsx index 6994f43772c..5f8e833af8d 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/pii_components.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/guardrails/_components/pii_components.tsx @@ -59,7 +59,6 @@ export const CategoryFilter: React.FC = ({ categories, sele ))} diff --git a/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/page.tsx b/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/page.tsx index 998f65629e0..94737d88d0f 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/page.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/page.tsx @@ -175,7 +175,7 @@ export default function ModelsAndEndpointsPage() { ) : (
-
+
{visibleSlugs.map((slug) => { const key = slug || BASE_TAB_KEY; diff --git a/ui/litellm-dashboard/src/app/(dashboard)/old-usage/_components/usage.tsx b/ui/litellm-dashboard/src/app/(dashboard)/old-usage/_components/usage.tsx index 7ddf2622c7a..a0835729f1b 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/old-usage/_components/usage.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/old-usage/_components/usage.tsx @@ -891,7 +891,7 @@ const UsagePage: React.FC = ({ accessToken, token, userRole, use )) } - + No tags found diff --git a/ui/litellm-dashboard/src/app/(dashboard)/playground/components/chat_ui/ChatComposer.tsx b/ui/litellm-dashboard/src/app/(dashboard)/playground/components/chat_ui/ChatComposer.tsx index cc541c939ad..934e502492e 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/playground/components/chat_ui/ChatComposer.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/playground/components/chat_ui/ChatComposer.tsx @@ -54,15 +54,12 @@ export function ChatComposer({ return (
{showSuggestions && suggestions.length > 0 && ( -
+
{suggestions.map((suggestion) => (