import type { Metadata } from "next";
import Link from "next/link";
import { apiSafe, type Forecast, type LiveState, type Meta } from "@/lib/api";
import { LiveHome } from "@/components/live";
import { Card, Empty } from "@/components/ui";
import { dateFr } from "@/lib/format";
export const metadata: Metadata = { title: "Soirée électorale — résultats en direct", description: "Le 5 octobre 2026 : résultats officiels en direct, forecast vs live, nowcast, probabilité de majorité, carte et ticker." };
export const revalidate = 0;
export default async function Page() {
const [meta, f, st] = await Promise.all([apiSafe("/api/meta", { revalidate: 0 }), apiSafe("/api/forecast/latest"), apiSafe("/api/live/state", { revalidate: 0 })]);
if (!meta || !f) return ;
if (meta.mode === "forecast" && !st?.simulation) {
return (
QC26 Live · prêt
Soirée électorale du {dateFr(meta.electionDate)}
À la fermeture des bureaux (20 h), QC26 bascule automatiquement en mode DIRECT : résultats officiels d'Élections Québec toutes les 2 à 5 minutes, carte qui se colore bureau par bureau, ticker, nowcast et probabilité de majorité en temps réel, comparaison prévision–réalité. Même produit, même adresse.
{[["Flux officiel", "donnees.electionsquebec.qc.ca — JSON officiel, validé, archivé à chaque changement, mis en quarantaine en cas d'anomalie."], ["Forecast vs Live", "La dernière projection publiée avant 20 h est figée et comparée aux résultats, siège par siège."], ["Nowcast", "Prior QC26 + résultats partiels → probabilité de majorité mise à jour à chaque snapshot."], ["Replay", "Chaque snapshot est conservé : la soirée pourra être rejouée seconde par seconde."]].map(([t, d]) =>
{t}
{d}
)}
Dans {meta.daysToElection} jours. En attendant : la prévision, les circonscriptions à surveiller, la page Modèle vs réalité (active le soir du vote).