SPB Git forge

spb/qc-election

Public
20commits 1branches 0releases
4.9 MBsize
maindefault branch
20 days agolast push
Python 66.6% HTML 24.8% CSS 4.9% JavaScript 3.6%
30.0 KB · 537 lines css
Raw Blame History
1/*2 * QC Élection Forecast — Plateforme de prévision électorale du Québec 20263 * Auteur : Simon-Pierre Boucher4 * Contact : contact@spboucher.ai5 * https://www.qc-election.com6 */7/* ============================================================================8   QC SIGNAL — design system v49   « editorial intelligence · election command center · scientific forecasting »10   - Palettes light/dark dédiées (le dark n'est pas une inversion)11   - Couleurs des partis RÉSERVÉES aux données (validées CVD/contraste)12   - Bleu institutionnel neutre (jamais celui d'un parti)13   - Surfaces > bordures ; ombres discrètes ; chiffres tabulaires partout14   ========================================================================== */15@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap');1617/* ---------------------------------------------------------------- tokens */18:root, [data-theme="dark"] {19  /* fonds : bleu-noir profond → surfaces graphite */20  --bg: #0a0d14;21  --surface: #0f131c;22  --card: #131824;23  --card-2: #1a2030;24  --line: rgba(160, 178, 210, .10);        /* bordure discrète par défaut */25  --border: rgba(160, 178, 210, .11);26  --border-strong: rgba(170, 188, 218, .22);27  --ink: #edeff5;                          /* blanc cassé */28  --ink-2: #aab2c5;29  --muted: #7d8699;30  --accent: #94a9d3;                       /* bleu institutionnel neutre */31  --accent-strong: #5c7ec2;32  --accent-ink: #0a0d14;33  --good: #40a869;34  --warn: #cc9526;35  --danger: #e5484d;36  --shadow-sm: 0 1px 2px rgba(2, 4, 10, .35);37  --shadow-md: 0 1px 2px rgba(2, 4, 10, .35), 0 14px 34px -22px rgba(2, 4, 10, .8);38  --shadow: var(--shadow-sm);39  --shadow-lift: var(--shadow-md);40  --hero-grad:41    radial-gradient(1100px 420px at 12% -12%, rgba(78, 112, 178, .13), transparent 62%),42    radial-gradient(900px 400px at 88% -18%, rgba(112, 105, 214, .07), transparent 60%);43  --header-bg: rgba(10, 13, 20, .8);44  --strip-bg: rgba(15, 19, 28, .86);45  --drawer-bg: rgba(14, 18, 27, .97);46  color-scheme: dark;47}48[data-theme="light"] {49  --bg: #eef0f4;50  --surface: #f5f6fa;51  --card: #ffffff;52  --card-2: #edeff5;53  --line: rgba(38, 54, 92, .10);54  --border: rgba(38, 54, 92, .11);55  --border-strong: rgba(38, 54, 92, .22);56  --ink: #161b26;57  --ink-2: #414d68;58  --muted: #67718a;59  --accent: #3d5a94;60  --accent-strong: #35507e;61  --accent-ink: #ffffff;62  --good: #257347;63  --warn: #94690f;64  --danger: #c93540;65  --shadow-sm: 0 1px 2px rgba(23, 32, 64, .06);66  --shadow-md: 0 1px 2px rgba(23, 32, 64, .05), 0 14px 34px -24px rgba(23, 32, 64, .3);67  --shadow: var(--shadow-sm);68  --shadow-lift: var(--shadow-md);69  --hero-grad:70    radial-gradient(1100px 420px at 12% -12%, rgba(70, 100, 160, .09), transparent 62%),71    radial-gradient(900px 400px at 88% -18%, rgba(112, 105, 214, .05), transparent 60%);72  --header-bg: rgba(245, 246, 250, .85);73  --strip-bg: rgba(255, 255, 255, .82);74  --drawer-bg: rgba(250, 251, 253, .98);75  color-scheme: light;76}77:root {78  /* radius / espace / motion */79  --r-8: 8px; --r-12: 12px; --r-16: 16px; --r-20: 20px; --r-24: 24px; --r-full: 999px;80  --radius: var(--r-16); --radius-sm: var(--r-8);81  --s-1: 4px; --s-2: 8px; --s-3: 12px; --s-4: 16px; --s-5: 20px; --s-6: 24px;82  --s-8: 32px; --s-10: 40px; --s-12: 48px;83  --ease: cubic-bezier(.25, .6, .3, 1); --t-fast: 130ms; --t-med: 200ms;84  /* couleurs des partis — DONNÉES SEULEMENT, jamais pour le chrome du site */85  --caq: #0097cf; --plq: #e5484d; --pq: #3f7ad6; --qs: #e06c1f; --pcq: #7069d6; --aut: #ad8226;86  font-size: 15px;87}8889/* ---------------------------------------------------------------- base */90* { box-sizing: border-box; }91html { scroll-behavior: smooth; }92html, body { margin: 0; padding: 0; background: var(--bg); color: var(--ink);93  font-family: "Inter", -apple-system, "SF Pro Text", "Segoe UI", Roboto, sans-serif;94  -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility;95  font-feature-settings: "cv02", "cv11"; }96html, body { overflow-x: clip; } /* le tiroir hors-écran ne doit jamais créer de défilement */97body { background-image: var(--hero-grad); background-repeat: no-repeat; min-height: 100dvh; }98body.nav-open { overflow: hidden; }99a { color: var(--accent); text-decoration: none; }100a:hover { text-decoration: underline; text-underline-offset: 3px; }101:focus-visible { outline: 2px solid var(--accent-strong); outline-offset: 2px; border-radius: 4px; }102::selection { background: color-mix(in srgb, var(--accent-strong) 30%, transparent); }103code { font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: .84em; }104b, strong { font-weight: 650; }105106.wrap { max-width: 1280px; margin: 0 auto;107  padding: 0 max(20px, env(safe-area-inset-left)) 60px max(20px, env(safe-area-inset-right)); }108109/* -------------------------------------------------- échelle typographique */110.t-display { font-size: clamp(1.7rem, 1.1rem + 2.4vw, 2.5rem); font-weight: 800;111  letter-spacing: -.035em; line-height: 1.12; }112.metric-xl { font-size: clamp(2.6rem, 1.6rem + 3.4vw, 4.27rem); /* ~64px */113  font-weight: 800; letter-spacing: -.045em; line-height: 1;114  font-variant-numeric: tabular-nums; }115.caption { font-size: .76rem; color: var(--muted); line-height: 1.5; }116.label-up { font-size: .72rem; font-weight: 700; color: var(--muted);117  text-transform: uppercase; letter-spacing: .1em; }118.num, .tabular { font-variant-numeric: tabular-nums; }119120/* ---------------------------------------------------------------- header */121header.site { position: sticky; top: 0; z-index: 80; background: var(--header-bg);122  -webkit-backdrop-filter: blur(18px) saturate(1.4); backdrop-filter: blur(18px) saturate(1.4);123  border-bottom: 1px solid var(--line); }124header.site .inner { max-width: 1280px; margin: 0 auto;125  padding: 0 max(16px, env(safe-area-inset-left));126  display: flex; align-items: center; gap: 16px; height: 56px; }127.brand { font-weight: 800; letter-spacing: -.025em; font-size: 1.02rem;128  white-space: nowrap; display: flex; align-items: center; gap: 8px; color: var(--ink); }129.brand .fleur { display: inline-flex; align-items: center; color: var(--accent-strong); flex: none; }130.brand .fleur svg { width: 19px; height: 19px; display: block; }131.brand .b-sub { color: var(--muted); font-weight: 500; }132nav.main { display: flex; gap: 2px; overflow-x: auto; scrollbar-width: none; }133nav.main::-webkit-scrollbar { display: none; }134nav.main a { color: var(--ink-2); padding: 6px 10px; border-radius: var(--r-full);135  font-size: .88rem; font-weight: 500; white-space: nowrap;136  transition: background var(--t-fast), color var(--t-fast); }137nav.main a:hover { color: var(--ink); background: var(--card-2); text-decoration: none; }138nav.main a.active { color: var(--ink); background: var(--card-2); font-weight: 650; }139.updated { margin-left: auto; color: var(--muted); font-size: .76rem;140  white-space: nowrap; font-variant-numeric: tabular-nums; }141142/* --------------------------------------------------------- forecast strip */143.fstrip { border-top: 1px solid var(--line); background: var(--strip-bg);144  overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch; }145.fstrip::-webkit-scrollbar { display: none; }146.fstrip .fs-inner { max-width: 1280px; margin: 0 auto; height: 34px;147  display: flex; align-items: center; gap: 18px;148  padding: 0 max(16px, env(safe-area-inset-left)); white-space: nowrap; }149.fstrip .fs-label { font-size: .68rem; font-weight: 700; letter-spacing: .09em;150  text-transform: uppercase; color: var(--muted); flex: none; }151.fstrip .fs-item { display: inline-flex; align-items: baseline; gap: 5px;152  font-size: .8rem; font-variant-numeric: tabular-nums; color: var(--ink-2);153  text-decoration: none; flex: none; }154.fstrip .fs-item:hover { text-decoration: none; color: var(--ink); }155.fstrip .fs-item .p { font-weight: 800; letter-spacing: .01em; }156.fstrip .fs-item .v { font-weight: 650; color: var(--ink); }157.fstrip .fs-item .dlt { font-size: .7rem; font-weight: 600; color: var(--muted); }158.fstrip .fs-right { margin-left: auto; color: var(--muted); font-size: .72rem;159  font-variant-numeric: tabular-nums; flex: none; padding-left: 14px; }160161/* ------------------------------------------------ hamburger + drawer */162.nav-burger { display: none; margin-left: auto; width: 40px; height: 40px; flex: none;163  background: transparent; border: 1px solid var(--border); border-radius: var(--r-12);164  cursor: pointer; position: relative; padding: 0; }165.nav-burger span { position: absolute; left: 11px; right: 11px; height: 2px;166  border-radius: 2px; background: var(--ink);167  transition: transform .22s var(--ease), opacity .18s, top .22s var(--ease); }168.nav-burger span:nth-child(1) { top: 13px; }169.nav-burger span:nth-child(2) { top: 19px; }170.nav-burger span:nth-child(3) { top: 25px; }171body.nav-open .nav-burger span:nth-child(1) { top: 19px; transform: rotate(45deg); }172body.nav-open .nav-burger span:nth-child(2) { opacity: 0; }173body.nav-open .nav-burger span:nth-child(3) { top: 19px; transform: rotate(-45deg); }174175.nav-backdrop { position: fixed; inset: 0; z-index: 90; background: rgba(4, 6, 10, .55);176  -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px);177  opacity: 0; pointer-events: none; transition: opacity .22s var(--ease); }178body.nav-open .nav-backdrop { opacity: 1; pointer-events: auto; }179180.drawer { position: fixed; top: 0; right: 0; bottom: 0; z-index: 95;181  width: min(320px, 86vw); background: var(--drawer-bg);182  -webkit-backdrop-filter: blur(24px); backdrop-filter: blur(24px);183  border-left: 1px solid var(--line);184  transform: translateX(105%); transition: transform .22s var(--ease);185  display: flex; flex-direction: column;186  padding: max(14px, env(safe-area-inset-top)) 14px max(20px, env(safe-area-inset-bottom));187  box-shadow: -24px 0 60px -30px rgba(0, 0, 0, .55); }188body.nav-open .drawer { transform: translateX(0); }189.drawer .drawer-head { display: flex; align-items: center; justify-content: space-between;190  padding: 4px 6px 14px; border-bottom: 1px solid var(--line); margin-bottom: 10px; }191.drawer .drawer-head .brand { font-size: 1rem; }192.drawer nav { display: flex; flex-direction: column; gap: 3px; overflow-y: auto; }193.drawer nav a { display: flex; align-items: center; justify-content: space-between;194  color: var(--ink-2); font-size: 1.02rem; font-weight: 500;195  padding: 12px 14px; border-radius: var(--r-12); }196.drawer nav a:hover { text-decoration: none; background: var(--card-2); color: var(--ink); }197.drawer nav a.active { background: var(--card-2); color: var(--ink); font-weight: 700; }198.drawer nav a.active::after { content: "●"; font-size: 8px; color: var(--accent-strong); }199.drawer .drawer-foot { margin-top: auto; padding-top: 14px; border-top: 1px solid var(--line);200  color: var(--muted); font-size: .76rem; display: flex; align-items: center;201  justify-content: space-between; gap: 10px; }202203/* ---------------------------------------------------------------- hero */204.hero { padding: 40px 0 8px; }205.hero h1 { font-size: clamp(1.55rem, 1.1rem + 2vw, 2.15rem); font-weight: 800;206  letter-spacing: -.035em; margin: 0 0 7px; line-height: 1.15; color: var(--ink); }207.hero .sub { color: var(--ink-2); margin: 0; font-size: .98rem; line-height: 1.6;208  max-width: 880px; }209.hero .countdown { color: var(--accent); font-variant-numeric: tabular-nums; font-weight: 650; }210.disclaimer { color: var(--muted); font-size: .8rem; margin-top: 8px; max-width: 780px;211  line-height: 1.55; }212.hero .kicker { font-size: .72rem; font-weight: 700; letter-spacing: .12em;213  text-transform: uppercase; color: var(--muted); margin: 0 0 8px;214  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;215  font-variant-numeric: tabular-nums; }216.hero .kicker .sep { color: var(--border-strong); }217218/* ---------------------------------------------------------------- cards */219.grid { display: grid; gap: 14px; margin: 22px 0; }220.grid > * { min-width: 0; } /* les items de grille doivent pouvoir rétrécir (canvas ECharts) */221.grid.parties { grid-template-columns: repeat(auto-fit, minmax(196px, 1fr)); }222.grid.two { grid-template-columns: 1fr 1fr; }223.grid.three { grid-template-columns: repeat(3, 1fr); }224@media (max-width: 900px) { .grid.two, .grid.three { grid-template-columns: 1fr; } }225226.card { background: var(--card); border: 1px solid var(--line);227  border-radius: var(--radius); padding: 18px 20px; box-shadow: var(--shadow-sm);228  transition: border-color var(--t-med), box-shadow var(--t-med), transform var(--t-med); }229.card:hover { border-color: var(--border-strong); }230.party-card:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); }231.card h3 { margin: 0 0 5px; font-size: .76rem; font-weight: 700; color: var(--muted);232  text-transform: uppercase; letter-spacing: .09em; }233.card .note, .note { color: var(--muted); font-size: .78rem; margin-top: 8px; line-height: 1.55; }234235.party-card { position: relative; overflow: hidden; }236.party-card .bar { position: absolute; top: 0; left: 0; right: 0; height: 3px;237  mask-image: linear-gradient(90deg, #000 55%, transparent); }238.party-card .pname { font-weight: 700; font-size: .93rem; margin-bottom: 2px;239  letter-spacing: -.01em; }240.party-card .leader { color: var(--muted); font-size: .76rem; margin-bottom: 10px; }241.bignum { font-size: 2.25rem; font-weight: 800; letter-spacing: -.04em;242  font-variant-numeric: tabular-nums; line-height: 1.06; }243.bignum small { font-size: .9rem; color: var(--ink-2); font-weight: 500; letter-spacing: 0; }244.kv { display: flex; justify-content: space-between; gap: 10px; font-size: .84rem;245  color: var(--ink-2); padding: 4px 0; font-variant-numeric: tabular-nums; }246.kv b { color: var(--ink); font-weight: 650; text-align: right; }247248/* ---------- indicateur de variation (neutre — jamais vert/rouge) ---------- */249.delta { display: inline-flex; align-items: baseline; gap: 3px; font-size: .74rem;250  font-weight: 650; color: var(--muted); font-variant-numeric: tabular-nums;251  white-space: nowrap; }252.delta .arr { font-size: .68em; transform: translateY(-1px); }253254/* ---------- barre d'intervalle visuelle  a ───●─── b ---------- */255.range { display: grid; grid-template-columns: auto 1fr auto; align-items: center;256  gap: 8px; font-size: .78rem; color: var(--muted); font-variant-numeric: tabular-nums; }257.range .rtrack { position: relative; height: 4px; border-radius: 4px;258  background: color-mix(in srgb, var(--ink) 9%, transparent); min-width: 40px; }259.range .rfill { position: absolute; top: 0; bottom: 0; border-radius: 4px; opacity: .45; }260.range .rdot { position: absolute; top: 50%; width: 9px; height: 9px; border-radius: 50%;261  transform: translate(-50%, -50%); box-shadow: 0 0 0 2px var(--card); }262.range .rmark { position: absolute; top: -4px; bottom: -4px; width: 1.5px;263  background: var(--border-strong); }264265/* ---------------------------------------------- hémicycle + outcome bar */266.hemi { position: relative; }267.hemi svg { display: block; width: 100%; height: auto; }268.hemi .seat { transition: opacity var(--t-fast); cursor: default; }269.hemi .seat.dim { opacity: .25; }270.hemi-legend { display: flex; flex-wrap: wrap; gap: 6px 16px; justify-content: center;271  margin-top: 6px; font-size: .78rem; color: var(--ink-2);272  font-variant-numeric: tabular-nums; }273.hemi-legend .hl-item { display: inline-flex; align-items: baseline; gap: 6px;274  cursor: default; }275.hemi-legend .hl-item .sw { width: 10px; height: 10px; border-radius: 3px;276  align-self: center; margin: 0; }277.hemi-legend .hl-item b { color: var(--ink); }278.hemi-legend .hl-item .ci { color: var(--muted); font-size: .72rem; }279.hemi-tip { position: absolute; pointer-events: none; z-index: 5; display: none;280  background: var(--card-2); border: 1px solid var(--border-strong);281  border-radius: var(--r-8); padding: 6px 10px; font-size: .76rem;282  color: var(--ink); box-shadow: var(--shadow-md); white-space: nowrap;283  font-variant-numeric: tabular-nums; }284285.outcome-bar { display: flex; height: 40px; border-radius: var(--r-12); overflow: hidden;286  background: var(--card-2); }287.outcome-bar > div { display: flex; flex-direction: column; justify-content: center;288  padding: 0 12px; min-width: 0; overflow: hidden; white-space: nowrap; }289.outcome-bar .ob-t { font-size: .68rem; font-weight: 650; opacity: .85;290  text-overflow: ellipsis; overflow: hidden; }291.outcome-bar .ob-v { font-size: .92rem; font-weight: 800; font-variant-numeric: tabular-nums; }292293/* --------------------------------------------------------------- charts */294.chart { width: 100%; height: 360px; }295.chart.tall { height: 440px; }296.chart.short { height: 240px; }297.chart-note { color: var(--muted); font-size: .78rem; margin-top: 6px; line-height: 1.55; }298299/* --------------------------------------------------------- majority meter */300.meter { display: flex; height: 34px; border-radius: var(--r-12); overflow: hidden; gap: 2px;301  background: var(--surface); }302.meter div { display: flex; align-items: center; justify-content: center;303  font-size: .74rem; font-weight: 700; color: #fff; letter-spacing: .02em;304  text-shadow: 0 1px 2px rgba(0, 0, 0, .5); min-width: 0; overflow: hidden;305  transition: flex .4s var(--ease); font-variant-numeric: tabular-nums; }306.meter-axis { position: relative; height: 18px; color: var(--muted); font-size: .72rem; }307.meter-axis .maj { position: absolute; left: 50%; transform: translateX(-50%); }308309/* --------------------------------------------------------------- tables */310table.data { width: 100%; border-collapse: collapse; font-size: .86rem;311  font-variant-numeric: tabular-nums; }312table.data th { text-align: left; color: var(--muted); font-weight: 650;313  font-size: .72rem; text-transform: uppercase; letter-spacing: .07em;314  padding: 9px 10px; border-bottom: 1px solid var(--border-strong); white-space: nowrap;315  position: sticky; top: 0; background: var(--card); z-index: 2; }316table.data td { padding: 9px 10px; border-bottom: 1px solid var(--line); }317table.data tr:last-child td { border-bottom: 0; }318table.data tr:hover td { background: color-mix(in srgb, var(--accent) 6%, transparent); }319.table-scroll { overflow: auto; max-height: 70vh; border-radius: var(--r-8); }320.chip { display: inline-block; padding: 2.5px 10px; border-radius: var(--r-full);321  font-size: .72rem; font-weight: 650; letter-spacing: .01em; }322.dot { display: inline-block; width: 9px; height: 9px; border-radius: 50%;323  margin-right: 7px; vertical-align: baseline; }324325/* ------------------------------------------------------ filtres & champs */326.filters { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin: 14px 0; }327.filters label { color: var(--muted); font-size: .8rem; }328select, input[type="text"], input[type="date"], input[type="number"], input[type="password"], textarea {329  background: var(--card-2); color: var(--ink); border: 1px solid var(--line);330  border-radius: var(--r-8); padding: 8px 12px; font-size: .88rem; font-family: inherit;331  transition: border-color var(--t-fast); }332select:hover, input:hover, textarea:hover { border-color: var(--border-strong); }333select:focus, input:focus, textarea:focus { outline: none;334  border-color: var(--accent-strong);335  box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent-strong) 20%, transparent); }336button, .btn { background: var(--card-2); color: var(--ink); border: 1px solid var(--line);337  border-radius: var(--r-8); padding: 9px 15px; font-size: .88rem; cursor: pointer;338  font-family: inherit; font-weight: 600;339  transition: border-color var(--t-fast), background var(--t-fast), transform var(--t-fast); }340button:hover, .btn:hover { border-color: var(--accent-strong); }341button:active { transform: scale(.985); }342button.primary { background: var(--accent-strong); color: #fff; border-color: transparent; }343button.primary:hover { background: color-mix(in srgb, var(--accent-strong) 88%, #fff); }344button:disabled { opacity: .5; cursor: default; }345346/* ------------------------------------------------------ sliders (simulateur) */347.slider-row { display: grid; grid-template-columns: 130px 1fr 64px; gap: 12px;348  align-items: center; padding: 7px 0; }349.slider-row .val { text-align: right; font-variant-numeric: tabular-nums;350  font-weight: 650; font-size: .9rem; }351input[type="range"] { width: 100%; accent-color: var(--accent-strong); }352353/* ------------------------------------------------------ carte / cartogramme */354.carto { display: flex; flex-wrap: wrap; gap: 18px; }355.carto .region { min-width: 150px; }356.carto .region h4 { margin: 0 0 6px; font-size: .76rem; color: var(--muted); font-weight: 650; }357.carto .cells { display: grid; grid-template-columns: repeat(4, 26px); gap: 3px; }358.cell { width: 26px; height: 26px; border-radius: 6px; cursor: pointer;359  border: 1px solid transparent; transition: transform var(--t-fast); }360.cell:hover { transform: scale(1.2); border-color: var(--ink); z-index: 2; position: relative; }361.cell.tossup { border: 1px dashed color-mix(in srgb, var(--ink) 55%, transparent); }362.side-panel { position: sticky; top: 106px; max-height: calc(100vh - 130px); overflow: auto; }363.legend-row { display: flex; flex-wrap: wrap; gap: 12px 14px; align-items: center;364  color: var(--ink-2); font-size: .8rem; margin: 10px 0; }365.sw { display: inline-block; width: 13px; height: 13px; border-radius: 4px;366  vertical-align: -2px; margin-right: 5px; }367.map-layout { display: grid; grid-template-columns: minmax(0, 3fr) minmax(300px, 1fr);368  gap: 14px; margin: 14px 0; align-items: start; }369@media (max-width: 980px) { .map-layout { grid-template-columns: 1fr; } }370371/* ------------------------------------------------------ timeline événements */372.events { display: flex; flex-direction: column; gap: 9px; }373.event { display: flex; gap: 12px; font-size: .85rem; line-height: 1.45; }374.event .d { color: var(--muted); white-space: nowrap; font-variant-numeric: tabular-nums; }375376/* ---------------------------------------------------------------- divers */377h2.section { font-size: 1.16rem; font-weight: 750; letter-spacing: -.025em; margin: 38px 0 4px;378  display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }379p.section-sub { color: var(--muted); font-size: .84rem; margin: 0 0 12px; line-height: 1.55;380  max-width: 880px; }381.prose { max-width: 860px; line-height: 1.7; color: var(--ink-2); }382.prose h2 { color: var(--ink); font-size: 1.2rem; margin-top: 36px; letter-spacing: -.02em; }383.prose h3 { color: var(--ink); font-size: 1rem; margin-top: 24px; }384.prose code { background: var(--card-2); padding: 1px 6px; border-radius: 5px; }385.prose table.data { margin: 12px 0; }386.badge-aux { background: color-mix(in srgb, var(--warn) 14%, transparent); color: var(--warn); }387.ask-box { display: flex; gap: 10px; }388.ask-box input { flex: 1; }389.answer { background: var(--card-2); border-radius: var(--r-12); padding: 14px 16px;390  line-height: 1.6; font-size: .92rem; margin-top: 12px; display: none; }391footer.site { margin-top: 64px; padding: 26px 0 max(26px, env(safe-area-inset-bottom));392  border-top: 1px solid var(--line);393  color: var(--muted); font-size: .8rem; line-height: 1.65; }394.credits { color: var(--muted); font-size: .72rem; }395396/* ------------------------------------------------- états : chargement / vide */397.loading { color: var(--muted); padding: 34px; text-align: center; position: relative;398  font-size: .85rem; }399.loading::after { content: ""; display: block; margin: 14px auto 0; width: 130px; height: 4px;400  border-radius: 4px; background: linear-gradient(90deg, var(--card-2), var(--border-strong), var(--card-2));401  background-size: 200% 100%; animation: shimmer 1.3s linear infinite; }402@keyframes shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }403.skel { border-radius: var(--r-8);404  background: linear-gradient(100deg, var(--card-2) 40%, color-mix(in srgb, var(--ink) 7%, var(--card-2)) 50%, var(--card-2) 60%);405  background-size: 200% 100%; animation: shimmer 1.4s linear infinite; min-height: 14px; }406.empty-note { color: var(--muted); font-size: .84rem; padding: 22px 10px; text-align: center;407  line-height: 1.55; }408409/* ------------------------------------------------------- bascule de thème */410.theme-toggle { background: transparent; border: 1px solid var(--border);411  border-radius: var(--r-full); width: 36px; height: 36px; display: flex; align-items: center;412  justify-content: center; cursor: pointer; padding: 0; flex: none; color: var(--ink-2); }413.theme-toggle:hover { border-color: var(--accent-strong); color: var(--ink); }414.theme-toggle svg { width: 16px; height: 16px; display: block; }415416/* -------------------------------------------------------- carte géographique */417.geo-map { width: 100%; height: min(72vh, 700px); min-height: 420px; }418.map-tabs { display: flex; gap: 6px; margin: 0 0 12px; flex-wrap: wrap; }419.map-tabs button.on { background: var(--accent-strong); color: #fff; border-color: var(--accent-strong); }420421/* -------------------------------------------------------- avatars & logos */422.avatar { border-radius: 50%; object-fit: cover; border: 2px solid var(--border);423  vertical-align: middle; background: var(--card-2); }424.avatar-init { display: inline-flex; align-items: center; justify-content: center;425  font-weight: 700; border: 2px solid; border-radius: 50%; }426.party-head { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }427.party-head .who { min-width: 0; }428.plogo { height: 20px; max-width: 88px; object-fit: contain; display: block;429  margin-top: 6px; opacity: .92; }430[data-theme="dark"] .plogo { filter: drop-shadow(0 0 1px rgba(255,255,255,.25));431  background: rgba(255, 255, 255, .9); border-radius: 5px; padding: 2px 6px; }432.avatars-stack { display: flex; }433.avatars-stack .avatar + .avatar { margin-left: -12px; }434435/* ------------------------------------------- accueil : main outcome ----- */436.outcome { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);437  gap: 24px 36px; align-items: center; padding: 26px 28px; margin: 20px 0; }438.outcome .o-left .o-verdict { margin: 2px 0 6px; }439.outcome .o-left .o-verdict .metric-xl { display: inline; }440.outcome .o-facts { display: flex; flex-direction: column; gap: 10px; margin-top: 16px;441  max-width: 460px; }442.outcome .o-fact { display: grid; grid-template-columns: 118px 1fr; gap: 12px;443  align-items: center; font-size: .84rem; }444.outcome .o-fact .f-l { color: var(--muted); }445.outcome .o-fact .f-v { color: var(--ink); font-weight: 650;446  font-variant-numeric: tabular-nums; }447@media (max-width: 980px) {448  .outcome { grid-template-columns: 1fr; padding: 20px 18px; gap: 18px; }449}450451/* cartes partis compactes data-first */452.pcard .p-top { display: flex; align-items: center; justify-content: space-between;453  gap: 8px; margin-bottom: 8px; }454.pcard .p-id { display: flex; align-items: center; gap: 8px; min-width: 0; }455.pcard .p-abbr { font-weight: 800; font-size: .92rem; letter-spacing: .01em; }456.pcard .p-leader { color: var(--muted); font-size: .7rem; white-space: nowrap;457  overflow: hidden; text-overflow: ellipsis; }458.pcard .p-main { display: flex; align-items: baseline; gap: 8px; }459.pcard .p-main .v { font-size: 2.4rem; font-weight: 800; letter-spacing: -.045em;460  line-height: 1; font-variant-numeric: tabular-nums; white-space: nowrap; }461.pcard .p-main .u { color: var(--muted); font-size: .74rem; line-height: 1.25; }462.pcard .p-spark { height: 26px; margin: 8px 0 2px; }463.pcard .p-rows { margin-top: 8px; display: flex; flex-direction: column; gap: 5px; }464.pcard .p-row { display: grid; grid-template-columns: 1fr auto; gap: 8px;465  align-items: center; font-size: .78rem; }466.pcard .p-row .l { color: var(--muted); }467.pcard .p-row .r { color: var(--ink); font-weight: 650; font-variant-numeric: tabular-nums;468  text-align: right; }469470/* ------------------------------------------- « le point du jour » éditorial */471.day-date { font-size: .82rem; letter-spacing: .12em; text-transform: uppercase;472  color: var(--muted); font-weight: 650; font-variant-numeric: tabular-nums; }473.headline { font-size: clamp(1.6rem, 1rem + 2.6vw, 2.5rem); font-weight: 800;474  line-height: 1.18; letter-spacing: -.03em; margin: 10px 0 8px; max-width: 980px; }475476/* ---------------------------------------------------------------- responsive */477@media (max-width: 1560px) {478  header.site .inner { gap: 12px; }479  nav.main a { padding: 6px 8px; font-size: .85rem; }480  .updated { font-size: .72rem; }481}482@media (max-width: 1250px) { .updated { display: none; } }483@media (max-width: 1120px) {484  nav.main a { padding: 6px 7px; font-size: .84rem; }485  .brand .b-sub { display: none; }486}487@media (max-width: 980px) {488  nav.main, .updated { display: none; }489  .nav-burger { display: block; }490  header.site .inner { gap: 12px; }491  .side-panel { position: static; max-height: none; }492  .grid[style*="grid-template-columns"] { grid-template-columns: 1fr !important; }493}494@media (max-width: 900px) { .geo-map { height: 480px; min-height: 0; } }495@media (max-width: 640px) {496  :root { font-size: 14px; }497  header.site .inner { height: 52px; padding: 0 12px; }498  .fstrip .fs-inner { height: 32px; gap: 14px; padding: 0 12px; }499  .fstrip .fs-right { display: none; }500  .hero { padding: 22px 0 4px; }501  .hero .sub { font-size: .92rem; }502  .wrap { padding: 0 max(13px, env(safe-area-inset-left)) 44px max(13px, env(safe-area-inset-right)); }503  .grid { gap: 11px; margin: 18px 0; }504  .grid.parties { grid-template-columns: repeat(2, 1fr); }505  .card { padding: 14px 14px; border-radius: 14px; }506  .bignum { font-size: 1.78rem; }507  .pcard .p-main .v { font-size: 2rem; }508  .chart { height: 290px; }509  .chart.tall { height: 340px; }510  .chart.short { height: 210px; }511  .geo-map { height: 400px; }512  .meter { height: 27px; }513  .meter div { font-size: .66rem; }514  .slider-row { grid-template-columns: 92px 1fr 52px; gap: 8px; }515  table.data { font-size: .8rem; }516  table.data th, table.data td { padding: 7px 6px; }517  .carto .cells { grid-template-columns: repeat(6, 24px); }518  .cell { width: 24px; height: 24px; }519  .ask-box { flex-direction: column; }520  .filters { gap: 8px; }521  .filters select, .filters input { max-width: 100%; }522  h2.section { margin: 26px 0 4px; }523  .party-card .leader { margin-bottom: 8px; }524  .avatars-stack .avatar { width: 34px !important; height: 34px !important; }525  .outcome .o-fact { grid-template-columns: 104px 1fr; }526  /* anti-zoom iOS : tout champ de saisie à 16px minimum */527  select, input[type="text"], input[type="date"], input[type="number"],528  input[type="password"], textarea { font-size: 16px; }529}530@media (max-width: 400px) {531  .grid.parties { grid-template-columns: 1fr; }532}533@media (prefers-reduced-motion: reduce) {534  *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; }535  html { scroll-behavior: auto; }536}537