Python 51.6%
TypeScript 46.7%
CSS 1.7%
1import type { Metadata } from "next";2import Link from "next/link";3import { apiSafe, type Forecast, type Meta, type SignalsPayload } from "@/lib/api";4import { AttentionPanel, ByElectionsPanel, FundamentalsPanel, MarketsPanel, MediaPanel, MomentumPanel, SignalsOverview } from "@/components/signals";5import { ComponentsCompare } from "@/components/forecast-blocks";6import { Card, Empty, PageTitle, SectionHeader } from "@/components/ui";7import { dateTimeFr } from "@/lib/format";89export const metadata: Metadata = { title: "Au-delà des sondages — marchés, presse, attention, fondamentaux, partielles", description: "Les signaux alternatifs du modèle QC26 : marchés de prédiction Polymarket, revue de presse classée, attention Wikipédia, satisfaction et leadership, élections partielles depuis 2022 — et leur poids exact dans la prévision." };10export const revalidate = 120;1112export default async function Page() {13 const [sig, f, meta] = await Promise.all([apiSafe<SignalsPayload>("/api/signals"), apiSafe<Forecast>("/api/forecast/latest"), apiSafe<Meta>("/api/meta")]);14 if (!sig || !f || !meta) return <Empty title="Signaux indisponibles" />;15 const comp = f.summary.components ?? sig.components;16 return (17 <div className="space-y-10 md:space-y-14">18 <PageTitle eyebrow="Au-delà des sondages · modèle 2.0" title={<>Ce que disent les marchés, la presse, l'attention et le terrain.</>}19 lede={<>Depuis la version 2.0, QC26 combine les sondages à quatre familles de signaux indépendants. Chacun est archivé avec sa provenance, publié séparément et pesé de façon explicite : cette page montre les données brutes <i>et</i> l'effet exact de chaque composante sur la prévision du {dateTimeFr(f.completedAt)}.</>} />2021 {comp && (22 <section>23 <SectionHeader num="01" eyebrow="Composantes" title="Cinq entrées, une prévision" description="Le point de départ reste la moyenne des sondages. Les autres signaux la corrigent à la marge, chacun avec un poids borné et documenté." />24 <SignalsOverview comp={comp} />25 <Card className="mt-4"><ComponentsCompare f={f} /></Card>26 </section>27 )}2829 <section id="marches" className="scroll-mt-24">30 <SectionHeader num="02" eyebrow="Marchés de prédiction" title="Polymarket" description="Des participants misent de l'argent réel sur le vainqueur, la majorité et les tranches de sièges. Le prix « Oui » est une probabilité implicite. QC26 repondère ses simulations vers 70 % modèle + 30 % marché, sans jamais casser la cohérence sièges ↔ circonscriptions." />31 <Card><MarketsPanel m={sig.markets} comp={comp} /></Card>32 </section>3334 <section id="fondamentaux" className="scroll-mt-24">35 <SectionHeader num="03" eyebrow="Fondamentaux" title="Satisfaction, leadership, souveraineté" description="Les rapports des firmes contiennent bien plus que des intentions de vote. QC26 en extrait les questions structurantes, page citée, et en tire un prior sur la part du gouvernement sortant." />36 <Card><FundamentalsPanel f={sig.fundamentals} comp={comp} /></Card>37 </section>3839 <section id="momentum" className="scroll-mt-24">40 <SectionHeader num="04" eyebrow="Momentum" title="Chef, attention, ton médiatique" description="Trois indicateurs de dynamique convertis en un déplacement borné (± 1 pt, somme nulle) de la moyenne du vote au jour du scrutin." />41 {comp && <Card><MomentumPanel comp={comp} /></Card>}42 </section>4344 <section id="presse" className="scroll-mt-24">45 <SectionHeader num="05" eyebrow="Presse" title="Revue de presse classée" description="Titres des médias québécois des dernières 48 h par parti (Google Actualités), classés par un modèle de langage : partis concernés, ton −1…+1, sujet. Chaque titre reste consultable ; le ton n'entre que dans le momentum." />46 <Card><MediaPanel m={sig.media} /></Card>47 </section>4849 <section id="attention" className="scroll-mt-24">50 <SectionHeader num="06" eyebrow="Attention publique" title="Pages vues Wikipédia" description="Combien de personnes consultent la page d'un parti ou de sa cheffe ou son chef ? Un indicateur de saillance, pas d'appui : il n'entre que par sa variation (7 j vs 28 j), avec un coefficient très faible." />51 <Card><AttentionPanel a={sig.attention} /></Card>52 </section>5354 <section id="partielles" className="scroll-mt-24">55 <SectionHeader num="07" eyebrow="Terrain" title="Élections partielles depuis 2022" description="Cinq scrutins réels, aux limites de 2022, comparés au résultat général précédent. Le modèle en retient l'excès de swing local, net du swing national du jour, pour la circonscription concernée." />56 <Card><ByElectionsPanel b={sig.byElections} comp={comp} /></Card>57 </section>5859 <section className="card card-lg p-6 md:p-8 grid md:grid-cols-[1fr_auto] gap-6 items-center">60 <div>61 <div className="eyebrow">Lire ces signaux</div>62 <h2 className="display text-[24px] mt-2">Des indices, pas des verdicts</h2>63 <p className="text-[14px] text-ink-2 mt-2 leading-relaxed max-w-2xl">Aucun de ces signaux ne remplace un sondage. Les marchés peuvent être minces, la presse suit l'actualité plutôt que l'opinion, l'attention mesure la curiosité, les partielles ont une participation faible. C'est pourquoi chaque poids est petit, borné, publié, et pourquoi la vue « sondages seuls » reste toujours affichée à côté de l'ensemble.</p>64 </div>65 <div className="flex gap-3"><Link href="/methodologie#signaux" className="btn btn-primary">Méthodologie</Link><Link href="/prevision" className="btn btn-ghost">Prévision</Link></div>66 </section>67 </div>68 );69}70