import { cn } from "cn" import { Chip } from "@/components/cockpit/Chip" import { Panel } from "@/components/cockpit/Panel" import { useAblaeufe } from "@/lib/abfragen" import type { Ablauf } from "@/lib/typen" import { flugplanZeit, vor } from "@/lib/zeit" // Die geplanten Abläufe der Box mit letztem und nächstem Lauf — der Totmannschalter (Ausbauplan Welle 1, seit // 25.09.2026). Was länger schweigt als erlaubt, steht oben und rot; der Wächter macht daraus einen Hinweis. const STATUS: Record = { ok: { wort: "pünktlich", punkt: "bg-gruen", text: "text-text-3" }, ueberfaellig: { wort: "überfällig", punkt: "bg-rot shadow-[0_0_8px_var(--rot)]", text: "text-rot-text" }, gestoppt: { wort: "läuft nicht", punkt: "bg-rot shadow-[0_0_8px_var(--rot)]", text: "text-rot-text" }, aus: { wort: "abgeschaltet", punkt: "bg-text-3", text: "text-text-3" }, } const SPALTEN = "md:grid-cols-[minmax(0,1.4fr)_minmax(0,1fr)_minmax(0,1fr)_110px]" const zeit = (s: number) => flugplanZeit(new Date(s * 1000).toISOString()) function Zeile({ a }: { a: Ablauf }) { const s = STATUS[a.status] ?? STATUS.ok return (
{a.name} {a.takt}
Zuletzt {a.letzter ? {vor(a.letzter)} : –} Nächster {a.naechster ? {zeit(a.naechster).toLowerCase()} : –} {s.wort} {a.text && a.status !== "ok" && (

{a.text}

)}
) } /** „Zeitpläne“: je Ablauf Takt, letzter und nächster Lauf, Zustand. */ export function Zeitplaene() { const abfrage = useAblaeufe() const liste = abfrage.data?.ablaeufe ?? [] const probleme = liste.filter((a) => a.status === "ueberfaellig" || a.status === "gestoppt").length return ( {probleme ? `${probleme} überfällig` : "alle pünktlich"} : undefined}>

Was die Box regelmäßig von selbst tut. Bleibt ein Lauf länger aus als erwartet, steht er hier oben und der Wächter meldet es — ein Stillstand wie im September fällt so am ersten Morgen auf.

{abfrage.isPending ? (

Wird gelesen …

) : abfrage.error ? (

Die Zeitpläne lassen sich gerade nicht lesen: {abfrage.error.message}

) : (
{liste.map((a) => )}
)}
) }