diff --git a/src/components/auth/AuthSuccessPanel.tsx b/src/components/auth/AuthSuccessPanel.tsx
index e0b974a..4e76b79 100644
--- a/src/components/auth/AuthSuccessPanel.tsx
+++ b/src/components/auth/AuthSuccessPanel.tsx
@@ -1,10 +1,10 @@
import { useEffect, useRef } from "react";
-import { CircleCheck } from "lucide-react";
import { Button } from "@/components/ui/button";
+import { STATUS_ICON } from "@/lib/status";
/**
* Shared success state for ResetPassword / PasswordChangeRequired: a
- * CircleCheck heading (focus-managed for screen-reader/keyboard users),
+ * success-icon heading (focus-managed for screen-reader/keyboard users),
* body copy, and a single CTA. Not used by ForgotPassword, which shows its
* success state as an InlineNotification instead of this pattern.
*/
@@ -37,10 +37,7 @@ export function AuthSuccessPanel({
tabIndex={-1}
className="flex items-center gap-2 text-base font-semibold leading-6 text-neutral-900 dark:text-neutral-100 outline-none"
>
-
+
{title}
{body}
diff --git a/src/components/dashboard/StatusDot.tsx b/src/components/dashboard/StatusDot.tsx
index a4ce7c6..f62ad29 100644
--- a/src/components/dashboard/StatusDot.tsx
+++ b/src/components/dashboard/StatusDot.tsx
@@ -11,9 +11,9 @@ import { cn } from "@/lib/utils";
export type StatusTone = "success" | "error" | "warning" | "muted";
const TONE_CLASS: Record = {
- success: "bg-green-500",
+ success: "bg-success",
error: "bg-destructive",
- warning: "bg-yellow-500",
+ warning: "bg-warning",
muted: "bg-muted-foreground",
};
diff --git a/src/components/dashboard/StatusHeadline.tsx b/src/components/dashboard/StatusHeadline.tsx
index 3f88742..75122e9 100644
--- a/src/components/dashboard/StatusHeadline.tsx
+++ b/src/components/dashboard/StatusHeadline.tsx
@@ -7,19 +7,23 @@
* `action` are slots the fuller #5847 / default-state content fills in.
*/
-import { Activity, AlertTriangle, Info } from "lucide-react";
+import { Activity, Info } from "lucide-react";
import type { ComponentType, ReactNode } from "react";
import { useIntl } from "react-intl";
import { cn } from "@/lib/utils";
+import { STATUS_ICON } from "@/lib/status";
import type { Severity } from "./homeStates";
import { resolveHeadline, type HeadlineCondition } from "./resolveHeadline";
+// success/info keep their own dashboard-specific glyphs (a pulse for "all
+// active", not a generic checkmark); warning/error consume the shared
+// severity icons so the two no longer render identically.
const SEVERITY_ICON: Record> = {
success: Activity,
info: Info,
- warning: AlertTriangle,
- error: AlertTriangle,
+ warning: STATUS_ICON.warning,
+ error: STATUS_ICON.error,
};
// Severity is conveyed by the icon shape and the message, not by colour: the
diff --git a/src/components/gateways/CreateServerForm.tsx b/src/components/gateways/CreateServerForm.tsx
index fbca0f6..2f1bcfc 100644
--- a/src/components/gateways/CreateServerForm.tsx
+++ b/src/components/gateways/CreateServerForm.tsx
@@ -1,6 +1,6 @@
import { useState, type ReactNode } from "react";
import { useIntl } from "react-intl";
-import { ChevronRight, CircleAlert, Server } from "lucide-react";
+import { ChevronRight, Server } from "lucide-react";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { TagInput } from "@/components/ui/tag-input";
@@ -15,6 +15,7 @@ import { MAX_TAGS } from "@/utils/tags";
import type { CreateServerDetails } from "@/components/gateways/types";
import type { Visibility } from "@/types/server";
import { VisibilityInfoPopover } from "@/components/common/VisibilityInfoPopover";
+import { STATUS_ICON } from "@/lib/status";
const visibilityOptions: Array<{
value: Visibility;
@@ -111,7 +112,7 @@ export function CreateServerForm({
role="alert"
aria-live="assertive"
>
-
+
{displayedSubmitError}
)}
diff --git a/src/components/gateways/SourceSelection.tsx b/src/components/gateways/SourceSelection.tsx
index 1709b9a..bc6f43a 100644
--- a/src/components/gateways/SourceSelection.tsx
+++ b/src/components/gateways/SourceSelection.tsx
@@ -11,7 +11,6 @@ import {
Lock,
MessageSquareCode,
Plus,
- TriangleAlert,
Users,
Wrench,
} from "lucide-react";
@@ -23,6 +22,7 @@ import { Loading } from "@/components/ui/loading";
import type { ActionCard } from "@/components/gateways/types";
import { useQuery } from "@/hooks/useQuery";
import { cn } from "@/lib/utils";
+import { STATUS_ICON } from "@/lib/status";
import type { MCPServer, ServerStatus } from "@/types/server";
const MCP_SERVERS_QUERY_PATH = "/gateways?limit=100&include_inactive=true";
@@ -71,13 +71,13 @@ function getStatusConfig(status: ServerStatus) {
return {
Icon: Activity,
labelId: "gateways.source.status.active",
- className: "text-emerald-400",
+ className: "text-success",
};
case "warning":
return {
- Icon: TriangleAlert,
+ Icon: STATUS_ICON.warning,
labelId: "gateways.source.status.warning",
- className: "text-amber-400",
+ className: "text-warning",
};
case "offline":
return {
diff --git a/src/components/mcp-servers/AdvancedSettings.tsx b/src/components/mcp-servers/AdvancedSettings.tsx
index dc544f5..03376d5 100644
--- a/src/components/mcp-servers/AdvancedSettings.tsx
+++ b/src/components/mcp-servers/AdvancedSettings.tsx
@@ -1,6 +1,6 @@
import { useEffect } from "react";
import { useIntl } from "react-intl";
-import { Info, TriangleAlert } from "lucide-react";
+import { Info } from "lucide-react";
import { Textarea } from "@/components/ui/textarea";
import { Switch } from "@/components/ui/switch";
import {
@@ -18,6 +18,7 @@ import { CustomHeadersAuth, type CustomHeader } from "@/components/mcp-servers/C
import { OAuth2Auth } from "@/components/mcp-servers/OAuth2Auth";
import { QueryParameterAuth } from "@/components/mcp-servers/QueryParameterAuth";
import { useAuthContext } from "@/auth/AuthContext";
+import { STATUS_ICON } from "@/lib/status";
import type { Visibility } from "@/types/server";
import { VisibilityInfoPopover } from "@/components/common/VisibilityInfoPopover";
@@ -307,7 +308,7 @@ export function AdvancedSettings({
{oneTimeAuth && (