- = 200 && tryResult.status < 300
- ? "bg-emerald-500/15 text-emerald-500"
+ ? "success"
: tryResult.status >= 400
- ? "bg-red-500/15 text-red-500"
- : "bg-amber-500/15 text-amber-500"
- }`}
+ ? "error"
+ : "warning"
+ }
>
{tryResult.status} {tryResult.statusText}
-
+
{tryResult.latencyMs}ms
@@ -721,11 +699,8 @@ export default function ApiEndpointsTab() {
))}
{filteredEndpoints.length === 0 && (
-
-
- search_off
-
- {t("apiEndpointsNoMatch")}
+
+
)}
@@ -733,13 +708,11 @@ export default function ApiEndpointsTab() {
{catalog.schemas.length > 0 && (
-
- data_object
-
+
{t("dataSchemas")}
-
+
{catalog.schemas.length}
@@ -747,7 +720,7 @@ export default function ApiEndpointsTab() {
{catalog.schemas.map((schema) => (
{schema}
diff --git a/src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.tsx b/src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.tsx
index 1722f083c000..b49394ea8542 100644
--- a/src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.tsx
+++ b/src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.tsx
@@ -1,7 +1,18 @@
"use client";
+import Icon from "@/shared/components/Icon";
+import { Alert } from "@omniroute/ui-kit/alert";
+
import { useState, useEffect, useMemo, useCallback } from "react";
-import { Card, Button, Input, Modal, CardSkeleton, SegmentedControl } from "@/shared/components";
+import { Checkbox } from "@omniroute/ui-kit/checkbox";
+import { PageHeader } from "@omniroute/ui-kit/page-header";
+import Button from "@/shared/components/Button";
+import Card from "@/shared/components/Card";
+import Input from "@/shared/components/Input";
+import { CardSkeleton } from "@/shared/components/Loading";
+import Modal from "@/shared/components/Modal";
+import SegmentedControl from "@/shared/components/SegmentedControl";
+import { cn } from "@/shared/utils/cn";
import Toggle from "@/shared/components/Toggle";
import { useCopyToClipboard } from "@/shared/hooks/useCopyToClipboard";
import { isPublicDisplayBaseUrl, useDisplayBaseUrl } from "@/shared/hooks";
@@ -1144,11 +1155,11 @@ export default function APIPageClient({ machineId }: Readonly = {
running: {
label: translateOrFallback("tailscaleRunning", "Running"),
- className: "bg-green-500/10 border-green-500/30 text-green-400",
+ className: "bg-success/10 border-success/30 text-success",
},
needs_login: {
label: translateOrFallback("tailscaleNeedsLogin", "Needs Login"),
- className: "bg-blue-500/10 border-blue-500/30 text-blue-400",
+ className: "bg-info/10 border-info/30 text-info",
},
stopped: {
label: translateOrFallback("tailscaleStoppedState", "Stopped"),
@@ -1192,11 +1203,11 @@ export default function APIPageClient({ machineId }: Readonly = {
running: {
label: translateOrFallback("ngrokRunning", "Running"),
- className: "bg-green-500/10 border-green-500/30 text-green-400",
+ className: "bg-success/10 border-success/30 text-success",
},
starting: {
label: translateOrFallback("ngrokStarting", "Starting"),
- className: "bg-blue-500/10 border-blue-500/30 text-blue-400",
+ className: "bg-info/10 border-info/30 text-info",
},
stopped: {
label: translateOrFallback("ngrokStoppedState", "Stopped"),
@@ -1227,7 +1238,7 @@ export default function APIPageClient({ machineId }: Readonly
{/* Guided connection header (#11228): /v1 URL + test action lead; advanced protocols demoted */}
-
{t("title")}
-
{t("subtitle")}
+
{displayBaseUrl}/v1
@@ -1288,30 +1298,31 @@ export default function APIPageClient({ machineId }: Readonly
-
- {cloudStatus.type === "success"
- ? "check_circle"
+ ? "success"
: cloudStatus.type === "warning"
? "warning"
- : "error"}
-
- {cloudStatus.message}
-
-
+ : "critical"
+ }
+ className="mb-4 animate-in fade-in slide-in-from-top-2 duration-300"
+ icon={
+
+ }
+ description={cloudStatus.message}
+ dismissLabel={tc("close")}
+ onDismiss={() => setCloudStatus(null)}
+ />
)}
{/* Active URLs bar */}
@@ -1323,19 +1334,20 @@ export default function APIPageClient({ machineId }: Readonly
{activeUrls.map(({ label, url, key }) => (
-
+
{label}
{url}
-
+ className="shrink-0 text-text-muted"
+ aria-label={`${tc("copy")} ${label}`}
+ title={url}
+ icon={copied === key ? "check" : "content_copy"}
+ />
))}
@@ -1346,9 +1358,7 @@ export default function APIPageClient({ machineId }: Readonly
{/* Local Server */}
-
- computer
-
+
{t("localServer")}
@@ -1356,40 +1366,43 @@ export default function APIPageClient({ machineId }: Readonly
· {resolvedMachineId.slice(0, 8)}
)}
{lanUrls.map((url) => (
-
+
+
))}
-
-
+
+
{t("statusRunning")}
-
+
{/* Tunnels section header */}
-
- network_node
-
+
{t("tunnels")}
@@ -1404,9 +1417,7 @@ export default function APIPageClient({ machineId }: Readonly
-
- cloud
-
+
{t("cloudOmniroute")}
@@ -1420,12 +1431,12 @@ export default function APIPageClient({ machineId }: Readonly
{cloudEnabled ? tc("active") : tc("disabled")}
@@ -1436,7 +1447,7 @@ export default function APIPageClient({ machineId }: Readonly handleCloudToggle(false)}
disabled={cloudSyncing}
- className="shrink-0 bg-red-500/10! text-red-500! hover:bg-red-500/20! border-red-500/30!"
+ className="shrink-0 border-error/30 text-error hover:bg-error/10"
>
{t("disableCloud")}
@@ -1462,9 +1473,7 @@ export default function APIPageClient({ machineId }: Readonly
-
- cloud_queue
-
+
{translateOrFallback("cloudflaredTitle", "Cloudflare Quick Tunnel")}
@@ -1478,7 +1487,7 @@ export default function APIPageClient({ machineId }: Readonly {
@@ -1486,40 +1495,41 @@ export default function APIPageClient({ machineId }: Readonly
{cloudflaredActionLabel}
)}
{cloudflaredNotice && (
-
-
- {cloudflaredNotice.type === "success"
- ? "check_circle"
+ ? "success"
: cloudflaredNotice.type === "info"
? "info"
- : "error"}
-
- {cloudflaredNotice.message}
-
-
+ : "critical"
+ }
+ className="mb-2 ml-7"
+ icon={
+
+ }
+ description={cloudflaredNotice.message}
+ dismissLabel={tc("close")}
+ onDismiss={() => setCloudflaredNotice(null)}
+ />
)}
{cloudflaredStatus?.lastError && (
-
+
{translateOrFallback("cloudflaredLastError", "Last error: {error}", {
error: cloudflaredStatus.lastError,
})}
@@ -1543,30 +1553,33 @@ export default function APIPageClient({ machineId }: Readonly
-
- vpn_lock
-
+
{translateOrFallback("tailscaleTitle", "Tailscale Funnel")}
{tailscaleIpUrl && (
-
+
+
)}
@@ -1578,7 +1591,7 @@ export default function APIPageClient({ machineId }: Readonly {
@@ -1591,51 +1604,51 @@ export default function APIPageClient({ machineId }: Readonly
{tailscaleActionLabel}
)}
-
- expand_more
-
+
{expandedTunnel === "ts" && (
{tailscaleNotice && (
-
-
- {tailscaleNotice.type === "success"
- ? "check_circle"
+ ? "success"
: tailscaleNotice.type === "info"
? "info"
- : "error"}
-
- {tailscaleNotice.message}
-
-
+ : "critical"
+ }
+ icon={
+
+ }
+ description={tailscaleNotice.message}
+ dismissLabel={tc("close")}
+ onDismiss={() => setTailscaleNotice(null)}
+ />
)}
{tailscaleUrlNotice}
{tailscaleStatus?.phase === "needs_login" && (
-
+
{translateOrFallback(
"tailscaleNeedsLoginHint",
"Authenticate this machine with Tailscale, then enable Funnel."
@@ -1644,13 +1657,11 @@ export default function APIPageClient({ machineId }: Readonly
-