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).
); } return ; }