diff --git a/ui/litellm-dashboard/src/app/(dashboard)/teams/components/TeamsTable/YourRoleCell/YourRoleCell.tsx b/ui/litellm-dashboard/src/app/(dashboard)/teams/components/TeamsTable/YourRoleCell/YourRoleCell.tsx index 66592943fd5..b3bd777cf89 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/teams/components/TeamsTable/YourRoleCell/YourRoleCell.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/teams/components/TeamsTable/YourRoleCell/YourRoleCell.tsx @@ -1,3 +1,4 @@ +// eslint-disable-next-line litellm-ui/no-banned-ui-imports import { TableCell } from "@tremor/react"; import { Team } from "@/components/key_team_helpers/key_list"; import TeamRoleBadge from "@/app/(dashboard)/teams/components/TeamsTable/YourRoleCell/TeamRoleBadge"; diff --git a/ui/litellm-dashboard/src/app/onboarding/OnboardingErrorView.tsx b/ui/litellm-dashboard/src/app/onboarding/OnboardingErrorView.tsx index ca0f57c56ce..744c85a3877 100644 --- a/ui/litellm-dashboard/src/app/onboarding/OnboardingErrorView.tsx +++ b/ui/litellm-dashboard/src/app/onboarding/OnboardingErrorView.tsx @@ -1,17 +1,23 @@ import React from "react"; -import { Alert, Button } from "antd"; +import { AlertCircle } from "lucide-react"; +import { Button } from "@/components/ui/button"; export function OnboardingErrorView() { return (
- +
+ +
+
Failed to load invitation
+
+ The invitation link may be invalid or expired. +
+
+
- +
); diff --git a/ui/litellm-dashboard/src/app/onboarding/OnboardingLoadingView.tsx b/ui/litellm-dashboard/src/app/onboarding/OnboardingLoadingView.tsx index 7efa1d2504f..5b079b4b9fa 100644 --- a/ui/litellm-dashboard/src/app/onboarding/OnboardingLoadingView.tsx +++ b/ui/litellm-dashboard/src/app/onboarding/OnboardingLoadingView.tsx @@ -1,11 +1,10 @@ import React from "react"; -import { Spin } from "antd"; -import { LoadingOutlined } from "@ant-design/icons"; +import { Loader2 } from "lucide-react"; export function OnboardingLoadingView() { return (
- } size="large" /> +
); } diff --git a/ui/litellm-dashboard/src/components/common_components/Filters/FilterInput.tsx b/ui/litellm-dashboard/src/components/common_components/Filters/FilterInput.tsx index 3590619ba25..97db9ba5bc7 100644 --- a/ui/litellm-dashboard/src/components/common_components/Filters/FilterInput.tsx +++ b/ui/litellm-dashboard/src/components/common_components/Filters/FilterInput.tsx @@ -1,5 +1,5 @@ -import { cx } from "@/lib/cva.config"; -import { Input } from "antd"; +import { Input } from "@/components/ui/input"; +import { cn } from "@/lib/utils"; import debounce from "lodash/debounce"; import { LucideIcon } from "lucide-react"; import React, { useCallback, useEffect, useMemo, useState } from "react"; @@ -15,14 +15,23 @@ interface FilterInputProps { const DEBOUNCE_DELAY = 300; -export const FilterInput: React.FC = ({ placeholder, value, onChange, icon: Icon, className }) => { +export const FilterInput: React.FC = ({ + placeholder, + value, + onChange, + icon: Icon, + className, +}) => { const [localValue, setLocalValue] = useState(value); useEffect(() => { setLocalValue(value); }, [value]); - const debouncedOnChange = useMemo(() => debounce((val: string) => onChange(val), DEBOUNCE_DELAY), [onChange]); + const debouncedOnChange = useMemo( + () => debounce((val: string) => onChange(val), DEBOUNCE_DELAY), + [onChange], + ); useEffect(() => { return () => { @@ -40,12 +49,19 @@ export const FilterInput: React.FC = ({ placeholder, value, on ); return ( - : undefined} - className={cx("w-64", className)} - /> +
+ {Icon && ( + + )} + +
); }; diff --git a/ui/litellm-dashboard/src/components/common_components/Filters/FiltersButton.tsx b/ui/litellm-dashboard/src/components/common_components/Filters/FiltersButton.tsx index 09782dd4469..a65550a58aa 100644 --- a/ui/litellm-dashboard/src/components/common_components/Filters/FiltersButton.tsx +++ b/ui/litellm-dashboard/src/components/common_components/Filters/FiltersButton.tsx @@ -1,6 +1,7 @@ -import { Badge, Button } from "antd"; +import { Button } from "@/components/ui/button"; import { Filter } from "lucide-react"; import React from "react"; +import { cn } from "@/lib/utils"; interface FiltersButtonProps { onClick: () => void; @@ -16,10 +17,18 @@ export const FiltersButton: React.FC = ({ label = "Filters", }) => { return ( - - - + {hasActiveFilters && ( + + )} + ); }; diff --git a/ui/litellm-dashboard/src/components/common_components/Filters/ResetFiltersButton.tsx b/ui/litellm-dashboard/src/components/common_components/Filters/ResetFiltersButton.tsx index 113d03ddc0b..79a3e448539 100644 --- a/ui/litellm-dashboard/src/components/common_components/Filters/ResetFiltersButton.tsx +++ b/ui/litellm-dashboard/src/components/common_components/Filters/ResetFiltersButton.tsx @@ -1,4 +1,4 @@ -import { Button } from "antd"; +import { Button } from "@/components/ui/button"; import { RotateCcw } from "lucide-react"; import React from "react"; @@ -7,9 +7,13 @@ interface ResetFiltersButtonProps { label?: string; } -export const ResetFiltersButton: React.FC = ({ onClick, label = "Reset Filters" }) => { +export const ResetFiltersButton: React.FC = ({ + onClick, + label = "Reset Filters", +}) => { return ( - ); diff --git a/ui/litellm-dashboard/src/components/playground/chat_ui/ChatImageRenderer.tsx b/ui/litellm-dashboard/src/components/playground/chat_ui/ChatImageRenderer.tsx index 49adaaed8c1..97b41a97f9d 100644 --- a/ui/litellm-dashboard/src/components/playground/chat_ui/ChatImageRenderer.tsx +++ b/ui/litellm-dashboard/src/components/playground/chat_ui/ChatImageRenderer.tsx @@ -1,8 +1,8 @@ import React from "react"; import Image from "next/image"; +import { FileText } from "lucide-react"; import { MessageType } from "./types"; import { shouldShowChatAttachedImage } from "./ChatImageUtils"; -import { FilePdfOutlined } from "@ant-design/icons"; interface ChatImageRendererProps { message: MessageType; @@ -13,13 +13,15 @@ const ChatImageRenderer: React.FC = ({ message }) => { return null; } - const isPdf = typeof message.content === "string" && message.content.includes("[PDF attached]"); + const isPdf = + typeof message.content === "string" && + message.content.includes("[PDF attached]"); return (
{isPdf ? ( -
- +
+
) : ( = ({ message }) => { alt="User uploaded image" width={256} height={200} - className="max-w-64 rounded-md border border-gray-200 shadow-sm" + className="max-w-64 rounded-md border border-border shadow-sm" style={{ maxHeight: "200px", width: "auto", height: "auto" }} /> )} diff --git a/ui/litellm-dashboard/src/components/playground/chat_ui/EndpointSelector.tsx b/ui/litellm-dashboard/src/components/playground/chat_ui/EndpointSelector.tsx index c6c15d3714b..e21324bb082 100644 --- a/ui/litellm-dashboard/src/components/playground/chat_ui/EndpointSelector.tsx +++ b/ui/litellm-dashboard/src/components/playground/chat_ui/EndpointSelector.tsx @@ -1,28 +1,42 @@ -import { Select } from "antd"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { cn } from "@/lib/utils"; import React from "react"; import { ENDPOINT_OPTIONS } from "./chatConstants"; interface EndpointSelectorProps { - endpointType: string; // Accept string to avoid type conflicts + endpointType: string; onEndpointChange: (value: string) => void; className?: string; } -const EndpointSelector: React.FC = ({ endpointType, onEndpointChange, className }) => { +const EndpointSelector: React.FC = ({ + endpointType, + onEndpointChange, + className, +}) => { return ( -
- + + + + + {ENDPOINT_OPTIONS.map((opt) => ( + + {opt.label} + + ))} + +
); }; diff --git a/ui/litellm-dashboard/src/components/playground/chat_ui/ResponsesImageRenderer.tsx b/ui/litellm-dashboard/src/components/playground/chat_ui/ResponsesImageRenderer.tsx index a8707ebd21b..43a672b8556 100644 --- a/ui/litellm-dashboard/src/components/playground/chat_ui/ResponsesImageRenderer.tsx +++ b/ui/litellm-dashboard/src/components/playground/chat_ui/ResponsesImageRenderer.tsx @@ -1,30 +1,35 @@ import React from "react"; +import { FileText } from "lucide-react"; import { MessageType } from "./types"; import { shouldShowAttachedImage } from "./ResponsesImageUtils"; -import { FilePdfOutlined } from "@ant-design/icons"; interface ResponsesImageRendererProps { message: MessageType; } -const ResponsesImageRenderer: React.FC = ({ message }) => { +const ResponsesImageRenderer: React.FC = ({ + message, +}) => { if (!shouldShowAttachedImage(message)) { return null; } - const isPdf = typeof message.content === "string" && message.content.includes("[PDF attached]"); + const isPdf = + typeof message.content === "string" && + message.content.includes("[PDF attached]"); return (
{isPdf ? ( -
- +
+
) : ( + // eslint-disable-next-line @next/next/no-img-element User uploaded image )} diff --git a/ui/litellm-dashboard/src/components/prompts/prompt_editor_view/DeveloperMessageCard.tsx b/ui/litellm-dashboard/src/components/prompts/prompt_editor_view/DeveloperMessageCard.tsx index 8f920ea5534..9f12214b2d9 100644 --- a/ui/litellm-dashboard/src/components/prompts/prompt_editor_view/DeveloperMessageCard.tsx +++ b/ui/litellm-dashboard/src/components/prompts/prompt_editor_view/DeveloperMessageCard.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { Card, Text } from "@tremor/react"; +import { Card } from "@/components/ui/card"; import VariableTextArea from "../variable_textarea"; interface DeveloperMessageCardProps { @@ -13,10 +13,10 @@ const DeveloperMessageCard: React.FC = ({ }) => { return ( - Developer message - +

Developer message

+

Optional system instructions for the model - +

= ({ }; export default DeveloperMessageCard; - diff --git a/ui/litellm-dashboard/src/components/prompts/prompt_editor_view/conversation_panel/EmptyState.tsx b/ui/litellm-dashboard/src/components/prompts/prompt_editor_view/conversation_panel/EmptyState.tsx index 57a6a54760d..32338112705 100644 --- a/ui/litellm-dashboard/src/components/prompts/prompt_editor_view/conversation_panel/EmptyState.tsx +++ b/ui/litellm-dashboard/src/components/prompts/prompt_editor_view/conversation_panel/EmptyState.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { RobotOutlined } from "@ant-design/icons"; +import { Bot } from "lucide-react"; interface EmptyStateProps { hasVariables: boolean; @@ -7,8 +7,8 @@ interface EmptyStateProps { const EmptyState: React.FC = ({ hasVariables }) => { return ( -
- +
+ {hasVariables ? "Fill in the variables above, then type a message to start testing" @@ -19,4 +19,3 @@ const EmptyState: React.FC = ({ hasVariables }) => { }; export default EmptyState; -