import { PageHeader } from "@/components/page-header" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { StatusDot } from "@/components/status-dot" import { StatusBadge } from "@/components/status-badge" import { Sparkline } from "@/components/sparkline" import { LatencyChart } from "@/components/dashboard/latency-chart" import { BandwidthChart } from "@/components/dashboard/bandwidth-chart" import { servers, pingProbes, systemEvents, dashLatency, traffic } from "@/lib/data" import { Flag } from "@/components/flag" import { AlertCircleIcon, AlertTriangleIcon, InfoIcon, FilterIcon, DownloadIcon } from "lucide-react" import { Button } from "@/components/ui/button" function StatCard({ label, value, unit, delta, deltaDir, spark, sparkColor, }: { label: string; value: string; unit?: string; delta?: string deltaDir?: "up" | "down"; spark?: number[]; sparkColor?: string }) { return (

{label}

{value} {unit && {unit}}
{delta && (

{delta}

)} {spark && spark.length > 1 && (
)}
) } export default function DashboardPage() { return (
} />
{/* KPI row */}
{/* Latency chart + Events */}
Задержка до серверов

Последние 60 минут · ping от монитора → серверы MikroTik

Последние события

Система и BGP-активность

{systemEvents.map((e) => (
{e.sev === "destructive" && } {e.sev === "warning" && } {e.sev === "info" && }

{e.title}

{e.message}

{e.when}
))}
{/* Bandwidth + Server status */}
Пропускная способность

Суммарный RX / TX по всем серверам

RX 318 Мбит/с TX 244 Мбит/с
Состояние серверов

7 узлов MikroTik

{servers.slice(0, 5).map((s) => (

{s.name}

{s.host} · {s.site} · {s.asn}

60 ? "text-amber-500" : "text-muted-foreground"}`}> {s.latency == null ? "недоступен" : `${s.latency}мс`}
))}
{/* Ping probes table */}
Активные пробы

8 ping-зондов · опрос раз в секунду

{pingProbes.map((p) => { const sparkColor = p.status === "down" ? "hsl(0 84% 60%)" : p.status === "warn" ? "hsl(32 94% 44%)" : "hsl(142 76% 36%)" return ( ) })}
Проба Цель Фильтр RTT Потери 60с Статус
{p.name} {p.target} {p.filter} {p.rtt == null ? "—" : `${p.rtt} мс`} 5 ? "text-red-500" : p.loss > 0 ? "text-amber-500" : "text-muted-foreground"}`}> {p.loss}%
) }