import type { ReactNode } from "react"; import { cn } from "@/lib/utils"; export type { OnlineUser } from "@/components/admin/online-users-widget"; export { OnlineUsersWidget } from "@/components/admin/online-users-widget"; type State = "ok" | "warn" | "danger" | "neutral"; const STATE_RING: Record = { ok: "ring-1 ring-[var(--admin-success-subtle)]/50 border-[var(--admin-success-subtle)]/40", warn: "ring-1 ring-[var(--admin-accent)]/40 border-[var(--admin-accent)]/35", danger: "ring-1 ring-[var(--admin-error-subtle)]/50 border-[var(--admin-error-subtle)]/45", neutral: "border-[var(--admin-border)]", }; const STATE_ICON_BG: Record = { ok: "from-[var(--admin-success-subtle)]/25 to-[var(--admin-success-subtle)]/5 text-[var(--admin-success)]", warn: "from-[var(--admin-accent)]/20 to-[var(--admin-accent)]/5 text-[var(--admin-accent)]", danger: "from-[var(--admin-error-subtle)]/25 to-[var(--admin-error-subtle)]/5 text-[var(--admin-error)]", neutral: "from-[var(--admin-accent)]/15 to-[var(--admin-accent)]/5 text-[var(--admin-accent)]", }; /** A single live-status tile (online users, emulator, DB, …). Server-safe. */ export function StatusCard({ label, value, hint, state = "neutral", icon, }: { label: string; value: ReactNode; hint?: string; state?: State; icon?: ReactNode; }) { return (
{label} {icon ? ( {icon} ) : null}
{value}
{hint ? (
{hint}
) : null}
); } /** A row in the system-diagnostics list with an ok/warn/error pill. */ export function DiagnosticRow({ label, detail, state, }: { label: string; detail: string; state: Exclude; }) { const text = state === "ok" ? "OK" : state === "warn" ? "WARN" : "ERROR"; const dotColor = state === "ok" ? "bg-[var(--admin-success-subtle)] shadow-[0_0_0_3px_rgba(22,163,74,0.22)]" : state === "warn" ? "bg-[var(--admin-accent)] shadow-[0_0_0_3px_rgba(238,180,37,0.22)]" : "bg-[var(--admin-error-subtle)] shadow-[0_0_0_3px_rgba(239,68,68,0.22)]"; const badgeColor = state === "ok" ? "bg-[var(--admin-success-subtle)]" : state === "danger" ? "bg-[var(--admin-error-subtle)]" : "bg-[var(--admin-accent)]/18"; return (
{label} {detail} {text}
); } /** Small labelled key/value used in the server-info card. */ export function InfoItem({ label, value, }: { label: string; value: ReactNode; }) { return (
{label} {value}
); }