# QC Signal — design system de QC Élection Forecast Version 4 (2026-08-30). Direction : **editorial intelligence + election command center + scientific forecasting + identité québécoise**. La sensation recherchée : « je regarde un instrument de mesure de l'élection ». À proscrire : dashboard SaaS générique, admin panel, esthétique crypto. Tout vit dans deux fichiers partagés : - `frontend/assets/style.css` — tokens + composants (source de vérité visuelle) - `frontend/assets/app.js` — coquille (`initShell`), composants JS, thème ECharts « qc-signal » --- ## 1. Tokens ### Couleurs de surface (palettes dédiées, le dark n'est PAS une inversion) | Token | Dark | Light | Rôle | |---|---|---|---| | `--bg` | `#0a0d14` | `#eef0f4` | fond de page (bleu-noir profond / gris papier) | | `--surface` | `#0f131c` | `#f5f6fa` | fonds encaissés (meter, pistes) | | `--card` | `#131824` | `#ffffff` | cartes | | `--card-2` | `#1a2030` | `#edeff5` | surfaces secondaires (champs, chips, hover) | | `--ink` | `#edeff5` | `#161b26` | texte principal (blanc cassé / encre) | | `--ink-2` / `--muted` | `#aab2c5` / `#7d8699` | `#414d68` / `#67718a` | texte secondaire / tertiaire | | `--line` / `--border` | `rgba(160,178,210,.10)` | `rgba(38,54,92,.10)` | bordure discrète par défaut | | `--border-strong` | `rgba(170,188,218,.22)` | `rgba(38,54,92,.22)` | bordure appuyée (hover, th) | | `--accent` / `--accent-strong` | `#94a9d3` / `#5c7ec2` | `#3d5a94` / `#35507e` | bleu institutionnel **politiquement neutre** | | `--good` / `--warn` / `--danger` | états sémantiques SEULEMENT (statut pipeline, badges) — jamais pour un mouvement de parti | Principe : **espace / contraste / surface avant bordure**. Les bordures sont des `rgba` faibles; l'appui visuel vient des surfaces (`--card` vs `--bg`) et des ombres discrètes `--shadow-sm` / `--shadow-md` (jamais de gros box-shadow). ### Couleurs des partis — DONNÉES SEULEMENT `--caq #0097cf · --plq #e5484d · --pq #3f7ad6 · --qs #e06c1f · --pcq #7069d6 · --aut #ad8226` Validées daltonisme/contraste sur les deux surfaces. **Interdiction** de les réutiliser pour le chrome du site, et interdiction de modifier ces valeurs. Toujours accompagnées du sigle texte (jamais la couleur seule pour identifier un parti). Accès JS : `partyColor(p)`. ### Radius, espacement, motion - Radius : `--r-8, --r-12, --r-16, --r-20, --r-24, --r-full` (8/12/16/20/24/999). `--radius` = 16 (cartes), `--radius-sm` = 8 (champs, boutons). - Espacement : grille 4/8 px — `--s-1…--s-12` (4, 8, 12, 16, 20, 24, 32, 40, 48). - Motion : `--t-fast` 130 ms, `--t-med` 200 ms, `--ease` cubic-bezier(.25,.6,.3,1). Aucune transition > 220 ms. `prefers-reduced-motion` coupe tout (CSS global + ECharts via `baseChart`). ## 2. Typographie **Inter uniquement** (400–900). `font-variant-numeric: tabular-nums` sur tout chiffre (kv, tables, metrics, deltas, strip, tooltips ECharts). | Classe | Usage | Taille | |---|---|---| | `.t-display` | titre display | clamp ~27→40 px, 800 | | `.hero h1` / `.headline` | H1 de page / manchette éditoriale | clamp ~23→32 / ~24→40 px | | `h2.section` | titre de section | 1.16 rem, 750 | | `.card h3` / `.label-up` | étiquette de carte | .76 rem, uppercase, letterspacing .09 em | | `.metric-xl` | métrique héroïque | clamp → **64 px**, 800, tabular | | `.bignum` / `.pcard .p-main .v` | métrique de carte | 2.25 / 2.4 rem | | corps | `.sub`, `.kv`, tables | .84–.98 rem | | `.caption` / `.note` / `.chart-note` | légendes | .76–.78 rem | ## 3. Coquille partagée (`initShell(active)`) Sur chaque page : `
` + `