Date : 2026-05-09
Périmètre : 10 pages templates + 12 fichiers CSS du dossier static/
Posture : audit lecture seule, aucun fichier modifié.
Référentiel cible : SpaceX / NASA-JPL / Linear / Stripe (sobriété + polish typo / espacement).
ASTRO-SCAN possède un système de design propre dans static/css/design_tokens.css
(spacing 4/8/16/24/40/64, typo Orbitron + Space/Share Tech Mono + Inter,
4 transitions normalisées, variables couleurs claires) — mais aucun template
priorité ne l'utilise. Chaque template embarque un :root { ... } parallèle
qui redéfinit --cyan, --text, --border, etc. avec des nuances légèrement
différentes. Ce parallélisme produit l'essentiel de la "fatigue visuelle"
détectée : ce ne sont pas de gros défauts, ce sont des micro-écarts répétés
qui empêchent le site de "respirer pareil" d'une page à l'autre.
Le top imperfections, par ordre de "repos visuel offert" si corrigé :
- Polices Google Fonts importées via
@importdans<style>(observatoire.html) — bloque le rendu, oublié sur landing.html → FOUC variable d'une page à l'autre. - Tailles de texte sous les 12 px : 56×
10px, 35×11px, 19×9px, 10×9.5 px. Lisibilité limite et hiérarchie typographique floue. - Cyan multiple :
#00d4ff× 216 cohabite avec#00eaff× 21,#00d8ff× 10,#00bfff× 7,#00ffff× 11,#00e5ff× 9 → l'œil voit un "bleu qui flotte" sans en saisir la cause. !importantépidémique :orbital_map.html163,portail.html128,observatoire.html102 → cascade CSS enrayée, hover/focus parfois cassés.- 315
style="…"inline dansobservatoire.htmlseul. La maintenance visuelle devient impossible. - Animations sans
prefers-reduced-motionsur les 10 pages priorité (le pattern est respecté uniquement dans 3 CSS de blueprints secondaires). - Boutons sans
cursor:pointerexplicite :portail.html43 boutons / 9 ;observatoire.html44 / 19. Couplage avec<button>natif compense, mais les<div onclick>(nombreux) ne le font pas. :focus-visiblequasi inexistant (1 seul fichier) ; navigation au clavier sans retour visuel cohérent.- Images poids lourd à la racine
static/:earth.jpg2.6 MB,earth_texture.jpg2.5 MB,preview.png1.1 MB — non lazy, non WebP. ce_soir.html,dashboard.html,orbital_dashboard.html,orbital_map.htmlsans<meta name="description">— SEO + partage social dégradé. Inversementlanding.htmletobservatoire.htmlen ont deux (FR/EN) côte-à-côte, donc dupliquées pour Google.
Aucun de ces défauts n'est bloquant en prod. Tous se corrigent en < 2 h chacun, plusieurs en < 30 min.
Excellent point de départ. Le fichier est l'unique source de vérité pensée :
- 6 niveaux de spacing sur grille 8 (
--space-xs:4px→--space-2xl:64px) - 6 tailles de texte (
--text-xs:0.65rem→--text-2xl:1.5rem) - 3 polices : Orbitron (display), Space Mono (mono), Inter (body)
- 3 transitions standardisées (
fast/normal/slow= 150/300/500 ms) - 4 niveaux de radius (4/8/16/24)
- 6 niveaux de z-index nommés
- Glows déclinés par couleur sémantique (
--glow-accent,--glow-green, etc.)
| Fichier | hex | rgb/rgba | vars -- |
Verdict |
|---|---|---|---|---|
static/css/design_tokens.css |
7 | 11 | 49 | ✅ source |
static/css/orbital_command.css |
21 | 105 | 13 | ad-hoc partiel |
static/css/components.css |
0 | 13 | 0 | utilise vars (bien) |
static/css/fixes.css |
0 | 0 | 0 | OK |
static/scan_signal/css/scan_signal.css |
15 | 38 | 23 | tokens locaux |
static/scan_signal/css/live_effects.css |
7 | 14 | 0 | hardcodé |
static/scan_signal/css/panels.css |
1 | 17 | 0 | hardcodé |
static/flight_radar/css/atc_premium.css |
54 | 136 | 17 | 190 couleurs hardcodées |
static/ground_assets/css/ground_assets.css |
17 | 100 | 23 | ad-hoc |
static/ground_assets/css/panels.css |
2 | 6 | 0 | hardcodé |
static/ground_assets/css/responsive.css |
0 | 0 | 0 | OK |
17 #00ff66 — vert "matrix" (n'existe pas dans tokens — devrait être #00ff88)
10 #ffffff — blanc pur (devrait passer par var)
10 #ffb400 — orange/ambre (proche de --color-orange #ff8c00)
8 #00c8e8 — cyan (variante de --color-accent #00d4ff)
6 #00ffcc — cyan-turquoise hors tokens
6 #00e5ff — variante de --color-accent
3 #ffd166 — gold variante de --color-gold #f5c518
3 #ff4444 — rouge (matche --color-red ✓)
3 #05070a — fond (proche --color-bg #050a14)
3 #00ff88 — vert (matche --color-green ✓)
Top names redéfinis localement dans plusieurs templates :
| Variable | Templates |
|---|---|
--text |
5 |
--cyan |
5 |
--border |
5 |
--void |
4 |
--text-dim |
4 |
--text-bright |
4 |
--red |
4 |
--panel |
4 |
--mono |
4 |
--green |
4 |
--font |
4 |
--border-bright |
4 |
--amber |
4 |
--sidebar-w |
3 |
Chaque template a son propre mini-design-system. Les valeurs sont
proches mais pas identiques (ex. portail.html : --cyan:#00d4ff,
landing.html : --cyan:#00e8ff).
Verdict Section 1 : design system présent mais non adopté. Cohérent à l'intérieur d'un template, incohérent entre templates.
28 4px ✅ tokens (--space-xs)
23 10px ❌ hors grille
21 8px ✅ tokens (--space-sm)
21 14px ❌ hors grille (proche de 16)
19 6px ❌ hors grille
15 12px ❌ hors grille (entre 8 et 16)
10 5px ❌ hors grille
10 2px ❌ hors grille
7 3px ❌ hors grille
6 18px ❌ hors grille (entre 16 et 24)
5 22px ❌ hors grille (proche de 24)
3 9px ❌ hors grille
3 7px ❌ hors grille
1 60px ❌ hors grille (proche --space-2xl 64)
- Valeurs sur grille (4 / 8) : 49 occurrences sur ~177 → 27 %
- Valeurs proches mais hors grille : 22 px (devrait être 24), 14 px (16), 18 px (16 ou 20), 60 px (64), 10 px (8 ou 12)…
- Valeurs symptomatiques de "ajustement à l'œil" : 3, 5, 7, 9, 22, 60.
Verdict Section 2 : grille non respectée dans les templates inline.
Le fichier design_tokens.css la définit mais aucun var(--space-*) n'est
visible dans portail.html, observatoire.html, ce_soir.html,
orbital_map.html. Les valeurs hors grille (10/14/22) sont les plus
visuellement perturbantes : l'œil ne sait pas si c'est intentionnel.
Exemples concrets
landing.html:64-67:padding-top:72px; padding-bottom:48px; margin-top:56px; margin-bottom:56px;→ 72/56 = ratio 9/7, pas un rythme. Devrait être 64+48 ou 72+48.portail.html:175:font-size: 8px !important; padding: 2px 8px !important;→ 8 px de typo + 2 px de padding = densité illisible.ce_soir.html:198:transform:translateY(-2px)au hover → micro-saut asymétrique vs autres pages qui font-1px.
'Orbitron' (display) ← tokens + utilisé
'Share Tech Mono' (mono) ← utilisé partout (ne matche pas tokens)
'Space Mono' (--font-mono) ← déclaré dans tokens, jamais utilisé
'Inter' (body) ← déclaré dans tokens, jamais utilisé
system-ui (fallback générique) ← utilisé directement landing.html
56 10px — taille "ambiante"
35 11px
19 9px — limite lisibilité
17 12px
10 9.5px — quart de pixel (n'existe pas)
10 13px
6 18px / 14px
5 var(--text-xs)
4 22px — "presque 24"
3 8.5px / 16px / 10.5px
1 var(--text-sm) / 8px / 48px / 32px / 26px / 24px / 20px / 11.5px
1 1.15em / 0.9em / 0.6rem
- 3 unités mélangées :
px,rem,em(ce dernier rare mais présent). - Tailles fractionnaires : 8.5, 9.5, 10.5, 11.5 — l'œil ne les distingue pas des entiers ; elles brouillent juste la lecture du code.
- Échelle non géométrique : pas de ratio constant entre niveaux. Stripe et Linear utilisent un ratio ~1.125 ou 1.2. ASTRO-SCAN saute de 9 → 10 → 11 → 12 → 13 (cinq niveaux dans 4 px) puis bond direct à 18, 22, 26.
var(--text-*)utilisé seulement 6 fois sur ~150 occurrences typo.
24 600 ← dominant
12 700
12 500
1 bold ← incohérence
✅ Système simple et homogène.
Très peu déclaré explicitement (héritage souvent par défaut). Pour des polices mono à 9 px, line-height 1.0 produit du texte serré ; 1.5 du texte aéré. Le mélange est invisible mais perceptible.
Verdict Section 3 : typo trop dense (10 px standard est sous le minimum recommandé pour confort moderne — Stripe utilise 14 px de base, Linear 13 px). Système central ignoré.
21 .2s ← dominante (200 ms en notation seconde)
10 .25s
10 .15s
5 .35s
3 200ms ← même valeur que .2s, notation différente
3 .1s
3 0.6s
2 .6s
2 .18s
2 .12s
2 0.18s
2 0.15s
1 500ms / .3s / 300ms
34 ease ← dominant générique
2 cubic-bezier(0.2, 0.8, 0.2, 1)
1 cubic-bezier(.2,.8,.3,1) ← variante avec espace différent
1 ease-out
- 3 notations pour la même durée :
.2s,0.2s,200ms. Cosmétique mais signal de désordre. - Durations hors palette :
.18s,.12s,.35s— proches de.2s/.1s/.3smais distinctes. Aucune raison technique. easepartout : c'est lelineardu débutant. Linear, Stripe et NASA-JPL utilisent presque exclusivement des cubic-bezier custom (.4, 0, .2, 1Material, ou.16, 1, .3, 1"Quint").- Tokens définis mais non utilisés :
--transition-fast/normal/slown'est référencé nulle part dans les templates priorité.
| Template | :hover |
transition |
Déficit |
|---|---|---|---|
landing.html |
5 | 4 | |
portail.html |
14 | 19 | ✅ |
observatoire.html |
12 | 16 | ✅ |
ce_soir.html |
8 | 13 | ✅ |
dashboard.html |
1 | 1 | ✅ |
Un seul léger déficit (landing.html). Globalement OK.
Présent uniquement dans :
static/scan_signal/css/live_effects.cssstatic/ground_assets/css/ground_assets.cssstatic/ground_assets/css/responsive.css
Absent dans tous les templates priorité (landing/portail/observatoire/ ce_soir/orbital_*). Les animations starfield, glow et keyframes s'exécutent inconditionnellement. Détail anodin → important pour les utilisateurs sensibles au mal des transports / vestibulaires.
Verdict Section 4 : animations fonctionnelles mais génériques.
Le polish "Linear/Stripe" demande un cubic-bezier signature unique et le
respect de prefers-reduced-motion.
| Template | <img> |
sans alt |
sans loading="lazy" |
|---|---|---|---|
observatoire.html |
9 | 2 | 6 |
a_propos.html |
3 | 0 | 0 ✅ |
portail.html |
2 | 1 | 2 |
landing.html |
1 | 1 | 1 |
orbital_dashboard.html |
1 | 0 | 1 |
| autres | 0 | — | — |
2.6 MB static/earth.jpg
2.5 MB static/earth_texture.jpg
1.1 MB static/preview.png (open-graph, partagée social)
261 KB static/img/skyview/skyview_M27_DSS2_Red_*.gif
234 KB static/img/skyview/skyview_M27_WISE_3.4_*.gif
218 KB static/img/skyview/skyview_M104_DSS2_Red_*.gif (×2)
213 KB static/img/skyview/skyview_NGC7293_GALEX_Near_UV_*.gif
211 KB static/img/skyview/skyview_M13_DSS2_Red_*.gif
206 KB static/img/skyview/skyview_NGC7293_DSS_*.gif
3 images >500 KB. Les 3 lourdes (earth.jpg, earth_texture.jpg,
preview.png) totalisent 6.3 MB non optimisés.
preview.pngest leog:imagepartagé sur tous les social media (twitter:image, og:image, …) — un PNG 1.1 MB mais 400×210 attendus pour OG : suspecte conversion JPG/WebP à <100 KB.earth.jpg/earth_texture.jpg2.5 MB chacun : utilisés en texture WebGL/Three.js ? Si oui, ils peuvent rester. Sinon, KTX2 ou WebP cible ~600 KB.- Aucune image WebP/AVIF servie. Tous JPG/PNG/GIF.
observatoire.html: 9 images dont 6 sansloading="lazy"— 2-3 secondes de bande passante gaspillées pour le hero seul.
Verdict Section 5 : images fonctionnelles mais non optimisées.
Le profil bandwidth est typique d'un site amateur ; un script cwebp -q 82
sur les 3 lourdes économise ~5 MB par visite.
Top 5 imperfections :
:64-67— Padding/margin du hero non rythmé : 72/48/56/56 px. Suggestion :padding-top:64px; padding-bottom:48px; margin-block:56px(8-grid) ou tout envar(--space-*). Effort 5 min.:71—font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serifalors que les autres pages chargent Orbitron + Share Tech Mono. La page d'accueil n'a pas la typo signature du site. Effort 30 min (vérifier non-régression FOUC).:78—font-size: clamp(34px, 5vw, 40px)pour le titre principal : le clamp est correct, mais 34→40 est un range étroit. À 1280 px de viewport on est à clamp = 5vw = 64 px donc plafonné à 40 px : le clamp ne sert à rien sur desktop. Suggestion :clamp(36px, 6vw, 64px).- 5
:hoverpour 4transition→ un hover saute brutalement. Diff entre.hero a:hoveret.bullet-item:hover(à vérifier ligne par ligne). - Aucun
prefers-reduced-motionmalgré le canvas starfield et l'animation d'apparition. Effort 15 min (un@mediaglobal qui désactivetransformettransition).
Top 5 imperfections :
- 128
!importantdans le bloc<style>— symptôme de bataille avec un CSS hérité. Chaque ajout futur deviendra un nouveau!important. Suggestion : audit en 2 h pour ramener à <20 (cas vraiment inévitables). - 39
style="…"inline — perturbe la maintenance ; si on change le token cyan, il faut visiter chaque inline. :175—font-size: 8px !important: trop petit, illisible sur écran HD.- Bloc
<style>de 1 193 lignes dans le template. À extraire versstatic/css/portail.css. Effort ~1 h. - 43
<button>ouonclick=mais seulement 9cursor:pointerexplicites. Sur les boutons natifs, le navigateur applique un curseur par défaut, mais les<div onclick>(à compter cas par cas) ne le reçoivent pas.
Top 5 imperfections :
- 315
style="…"inline — record du repo. Chaque modal, chaque carte, chaque badge a son style local. Refactor majeur (probablement 4-6 h). - 102
!important+ bloc<style>644 lignes + un second bloc de 217 lignes. La cascade est imprévisible. :50—@import url('https://fonts.googleapis.com/...')dans le<style>.@importbloque le rendu parallèle des autres ressources. Doit être un<link>dans<head>, comme dansportail.htmletephemerides.html.- 2 images sans
alt, 6 images sansloading="lazy"sur 9 totales. La hero APOD à plein écran est rechargée à chaque visite. viewport: maximum-scale=1.0, user-scalable=no— empêche le zoom mobile, accessibilité dégradée.
Top 5 imperfections :
- Aucune
<meta name="description">— SEO + previews social vides. - Hovers utilisant
transform:translateY(-2px)(.oc:hover,.city-pill:hover) alors que d'autres pages font-1px. Micro-saut perçu différent. :198— comboborder-color,background,transformau hover sanstransitionexplicite sur la propriététransform(la rule globale couvreallmais peut être surchargée).:507— un:focusmanuel sur.city-search-input(✅ bien) mais aucun autre:focussur les boutons de la page.- 21
style="…"inline + 10!important.
Page minimale (probablement un wrapper / redirection). Pas auditable en l'état. Vérifier sa raison d'être : si page vide, supprimer ; si chargement async, ajouter un loading skeleton.
Top 5 imperfections :
- Aucune
<meta name="description">. - 61
style="…"inline. - 5
!important(acceptable). - 1 image sans
loading="lazy". - Pas de
prefers-reduced-motion.
Top 5 imperfections :
- 163
!important— record absolu. CSS quasiment ingouvernable. - Bloc
<style>de 973 lignes. <html lang="">vide — accessibilité critique cassée.- Aucune
<meta name="description">. - 107
style="…"inline, dont la plupart sur les contrôles de carte.
Top 5 imperfections :
- 71
style="…"inline. - 9
!important. - Pas de
prefers-reduced-motion. - ✅ 3 images, toutes avec
altetloading="lazy"— la meilleure page du repo sur les images. - Bloc
<style>287 lignes — extractible.
Top 5 imperfections :
- 2
style="…"inline (très peu — bonne hygiène). - 1 seul
!important. - Pas de
prefers-reduced-motion. - Aucune image.
- Bloc
<style>125 lignes — concentré et lisible. La page la plus propre.
Top 5 imperfections :
- 19
style="…"inline. - 10
!important. <link href="https://fonts.googleapis.com/..."correctement dans<head>(✅ contrairement àobservatoire.html).- Pas de
prefers-reduced-motion. - Bloc
<style>264 lignes. Tokens locaux non synchronisés avecdesign_tokens.css.
| Item | État |
|---|---|
Fichiers avec :focus-visible |
1 (sur 22 fichiers CSS+HTML examinés) |
Total règles :focus { … } |
1 |
Fichiers avec ::selection custom |
0 |
Fichiers avec ::-webkit-scrollbar custom |
3 (orbital_command, panels.css scan_signal, atc_premium) |
Fichiers avec prefers-reduced-motion |
3 (uniquement blueprints scan_signal & ground_assets) |
Fichiers avec prefers-color-scheme |
0 |
Fichiers avec scroll-behavior:smooth |
1 (ground_assets/css/panels.css) |
| Templates avec meta description | 5 / 10 |
<html lang=""> vide |
1 (orbital_map.html) |
Inputs vs <label> (top pages) |
0 <label> quasi partout — repose sur aria-label |
orbital_map.html<html lang="">— screen-readers sans hint de langue.- 5 pages sans meta description :
ce_soir.html,dashboard.html,orbital_dashboard.html,orbital_map.html. SEO + Twitter card vides. viewport=maximum-scale=1.0, user-scalable=nodansobservatoire.html— empêche le zoom (a11y critique).- Aucun
:focus-visiblesur les boutons interactifs des 10 pages priorité — navigation clavier sans feedback. prefers-reduced-motionignoré sur les 10 pages priorité.<input>sans<label>associé dansobservatoire.html(3 inputs),ce_soir.html(1),orbital_dashboard.html(1),orbital_map.html(10).aria-labelpartiellement compensatoire.- Boutons
<div onclick>non systématiquement assortis decursor:pointer—portail.htmletobservatoire.htmlparticulièrement. - Couleurs texte sur fond cyan ténu (
rgba(0,212,255,.04)) — contraste < 3:1 sur les états hover de panneaux. WCAG AA exige 4.5:1. - Pas d'
aria-currentsur la nav active (vérification visuelle : sidebar des templates portail/observatoire indique l'état actif via couleur seule, pas via attribut ARIA). - Liens sans
text-decorationni soulignement substitut dans plusieurs blocs.footer-links,.tbar-links— un utilisateur daltonien voit le lien comme du texte.
| Détail | Présent ? | Impact perçu |
|---|---|---|
:focus-visible (vs :focus simple) |
❌ 1/22 | navigation clavier brute |
scroll-behavior: smooth |
scroll instantané (vs glissé) | |
::selection custom (couleur sélection) |
❌ 0 | sélection bleue système |
::-webkit-scrollbar custom |
scrollbars OS par défaut sur 7 pages | |
prefers-color-scheme (light/dark auto) |
❌ 0 | site forcé dark, blanc agressif si user clair |
prefers-reduced-motion global |
❌ | starfield/glow ininterruptibles |
| Loading skeletons (vs spinner) | ❌ aucun spinner détecté ; un skeleton mentionné dans components.css mais non utilisé |
flashs de "rien" pendant le fetch |
Police font-display: swap |
@import dans observatoire.html ne le force pas) |
FOUC perceptible |
image-rendering: pixelated/optimizeQuality sur images astro |
❌ | textures Earth peuvent paraître floues au zoom |
aspect-ratio CSS sur conteneurs image |
❌ détecté | layout shift au chargement (CLS dégradé) |
content-visibility: auto sur sections below-fold |
❌ | render bloqué tant que tout n'est pas parsé |
Print stylesheet (@media print) |
❌ | impression illisible (pages noires) |
Aucun de ces points n'est critique. Pris ensemble, ils forment la différence "fait pro" vs "fait amateur".
| # | Imperfection | Page | Repos visuel | Effort | Aujourd'hui ? |
|---|---|---|---|---|---|
| 1 | Remplacer @import Google Fonts par <link> dans <head> |
observatoire.html:50 |
🟢 | ⚡ <30 min | ✅ oui |
| 2 | Ajouter <meta name="description"> aux 5 pages qui en manquent |
ce_soir, dashboard, orbital_dashboard, orbital_map | 🟢 | ⚡ <30 min | ✅ oui |
| 3 | Réparer <html lang=""> vide |
orbital_map.html |
🟢 | ⚡ <5 min | ✅ oui |
| 4 | Ajouter @media (prefers-reduced-motion: reduce) global dans design_tokens.css |
tous | 🟢 | ⚡ 30 min | ✅ oui |
| 5 | Ajouter :focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; } global |
tous | 🟡 | ⚡ <30 min | ✅ oui |
| 6 | Convertir earth.jpg/earth_texture.jpg/preview.png en WebP qualité 82 (gain ≈ 5 MB) |
static/ | 🟢 | ⏱ 30 min-1 h | ✅ oui |
| 7 | Unifier les durations de transitions sur var(--transition-fast/normal/slow) |
tous | 🟡 | ⏱ 1 h | 🤔 demain |
| 8 | Standardiser le cyan : remplacer #00eaff, #00d8ff, #00bfff, #00e5ff par var(--color-accent) |
tous CSS | 🟢 | ⏱ 1-2 h | 🤔 demain |
| 9 | Extraire les blocs <style> >500 lignes vers static/css/<page>.css (portail, observatoire, orbital_map) |
3 templates | 🟢 | 🕐 4-6 h | ❌ non (dédier 1 j) |
| 10 | Reconquérir les !important dans orbital_map.html (163 → <20) |
orbital_map.html |
⚪ | 🕐 >2 h | ❌ non |
Bloc 1 (≈ 1 h, gain SEO + a11y immédiat) : items #1 + #2 + #3 + #5 — corrections quasi-mécaniques, pas de risque visuel.
Bloc 2 (≈ 30 min, gain perf bandwidth) : item #6 (conversion WebP des 3
images lourdes via cwebp -q 82 + remplacement <img src=…> dans les
templates concernés).
Bloc 3 (≈ 30 min, gain perçu sur tout le site) : item #4 — bouge
un seul fichier design_tokens.css mais protège l'utilisateur sensible
sur les 10 pages.
Total bloc Kaizen 2026-05-09 : ~2 h, 4 commits, 0 risque prod. Le site change de niveau visuel/UX sans qu'on touche à un seul algorithme.
- Lecture seule (
grep,find,awk,cat,wc). Aucun fichier modifié. - Heuristiques :
<button>natif : compté comme bouton mais peut hériter decursor:pointerpar UA → la colonne "sans cursor" sous-estime probablement la couverture.- "Hover sans transition" : compté au niveau template (pas global) — ne
capture pas les
transitionhéritées par cascade. - "Style inline" : compte les
style="…"HTML, pas les<style>blocks.
- Top 10 priorité dans l'ordre demandé :
landing → portail → observatoire → ce_soir → dashboard → orbital_dashboard → orbital_map → a_propos → about → ephemerides. - Tagueur de pages CSS hors-priorité (
flight_radar,scan_signal,ground_assets,lab,nasa_proxy, etc.) examiné via leurs CSS dédiés uniquement, pas leurs templates. - Données chiffrées prises sur l'arborescence à la date 2026-05-09,
branche
mainaprès cleanup (3530 lignes pour observatoire.html, etc.).