import type { Metadata } from "next"; import Link from "next/link"; import { apiSafe, type Meta } from "@/lib/api"; import { PartyLogo } from "@/components/party"; import { Card, Empty } from "@/components/ui"; import { PARTY_IDS, partyVar, partyLabel } from "@/lib/parties"; export const metadata: Metadata = { title: "Comparateur des partis — matrice enjeux × partis", description: "Ce que proposent la CAQ, le PQ, le PLQ, QS et le PCQ sur chaque enjeu, d'après leurs documents officiels ; chaque cellule renvoie à la source." }; export const revalidate = 300; interface Matrix { topics: { id: string; label: string; counts: Record }[]; top: Record } export default async function Page() { const [m, meta] = await Promise.all([apiSafe("/api/matrix"), apiSafe("/api/meta")]); if (!m || !meta) return ; return (
Policy Matrix · documents officiels

Comparateur des partis

Une cellule = la proposition la mieux documentée du parti sur l'enjeu (cliquez pour la source, la page et la citation). Une case vide signifie qu'aucun document officiel ingéré n'aborde le sujet, pas que le parti n'a pas de position.

{m.topics.length === 0 ? Les documents officiels des partis sont en cours d'analyse ; la matrice se remplit au fil des heures. : ( {PARTY_IDS.map((id) => )} {m.topics.map((t) => ( {PARTY_IDS.map((id) => { const cell = m.top[`${t.id}:${id}`]; return ( ); })} ))}
Enjeu{partyLabel(id)}
{t.label} {cell ? {cell.proposal.length > 150 ? cell.proposal.slice(0, 150) + "…" : cell.proposal} {cell.page ? `· p. ${cell.page}` : ""} · {t.counts[id] ?? 0} prop. : —}
)}
); }