veza/docs/FRONTEND_AUDIT_VISUAL.md
2026-02-07 20:36:48 +01:00

13 KiB
Raw Permalink Blame History

Audit visuel exhaustif du frontend Veza

Date: 2026-02-07
Objectif: Identifier les causes précises de la "mocheté" perçue (layout, composants, couleurs, contrastes, typographie, cohérence).


1. Résumé exécutif

Le frontend souffre de plusieurs facteurs cumulés : palette daccents incohérente (teal + magenta/purple + vert + rouge), manque de profondeur (cartes trop plates), éléments "placeholder" visibles (ex. "0%" en rouge partout), barre de lecture disproportionnée, et typographie potentiellement dégradée (Rajdhani + erreurs glyph). Les correctifs ciblent des fichiers et variables précis ci-dessous.


2. Palette et couleurs

2.1 Incohérence des couleurs daccent

Contexte Couleur utilisée Fichier / token Problème
Élément actif sidebar, bouton play, "NETWORK STABLE" Teal / cyan (primary) --primary: oklch(0.75 0.18 195) dans index.css Cohérent comme accent principal.
Badges sidebar (Live Sessions 3, Channels 12) Magenta / violet (secondary) Sidebar.tsx L195 : bg-secondary/20 text-secondary ; --secondary: oklch(0.65 0.25 330) Hors palette par rapport au teal ; donne une impression de "troisième couleur" non intégrée.
Pourcentages positifs, "ACTIVE", "NETWORK STABLE" (dot) Vert (lime/success) StatCard.tsx (lime), succès sémantique Un vert distinct du teal pour "positif" crée une double convention (teal vs vert) pour des états similaires.
Tendances négatives, "Expired Warranty", Sign Out Rouge (destructive) AdminDashboardStatCard.tsx, Sidebar.tsx (Live icon) Correct sémantiquement mais trop présent si utilisé aussi pour "0%" (voir §3).

Recommandations :

  • Badges sidebar : remplacer secondary (magenta) par une variante du primary (ex. primary ou cyan-500) ou un token dédié "badge" aligné sur la charte. Fichier : apps/web/src/components/layout/Sidebar.tsx (L194201).
  • États "positif" : unifier soit sur teal, soit sur vert, et documenter (ex. teal = interactif/actif, vert = succès/variation positive uniquement).

2.2 Manque de profondeur (cartes, fonds)

  • Cartes dashboard : variante glass ou default avec bordures/ombres très légères (border-white/5, shadow-black/5). Fichiers : components/ui/card.tsx (variants glass, default), AdminDashboardStatCard.tsx, AdminDashboardTrafficCard.tsx.
  • Recherche header : bg-muted/50 border border-border — contraste faible avec le fond, la zone "Search Network..." se fond dans le fond.
  • Dark mode : --card: oklch(0.18 0.02 265) très proche de --background: oklch(0.15 0.02 265) dans index.css (.dark), donc peu de relief.

Recommandations :

  • Augmenter légèrement la différence luminance card vs background (ex. card à 0.200.22, background 0.15).
  • Donner aux cartes une bordure ou une ombre un peu plus marquée (ex. border-border plus visible, shadow-lg avec teinte légère).
  • Barre de recherche : fond ou bordure un peu plus marqués pour laffordance (ex. bg-card ou border-white/10).

2.3 Fichiers à modifier (couleurs)

  • apps/web/src/index.css : variables .dark (--card, --background), éventuellement --border.
  • apps/web/src/components/layout/Sidebar.tsx : classes des badges (remplacer secondary par primary/cyan).
  • apps/web/src/components/layout/Header.tsx : input search (classes bg/border).

3. Composants "placeholder" ou trompeurs

3.1 "0%" en rouge sur toutes les cartes (Admin)

  • Comportement : AdminDashboardStatCard affiche un badge de tendance (trend) avec trend > 0 → vert, sinon rouge. Si lAPI ne renvoie pas de tendances (ou renvoie 0), on obtient "0%" en rouge sur chaque carte.
  • Fichiers : AdminDashboardStatCard.tsx (L4657), AdminDashboardView.tsx (L4850 : trend: stats.trends?.users etc.), useAdminDashboardView.ts (stats venant de lAPI).
  • Impact : ressemble à une erreur ou à une donnée non implémentée, ce qui renforce limpression dinterface inachevée.

Recommandations :

  • Ne pas afficher le badge de tendance quand trend === undefined (ou null). Afficher "0%" seulement si la métrique a du sens (ex. "0% de variation" explicite).
  • Si trend === 0, éviter le style "erreur" (rouge) : utiliser un style neutre (muted) ou masquer.

3.2 Graphique "Traffic Flux"

  • Comportement : AdminDashboardTrafficCard utilise des barres aléatoires (Math.random()) et des labels factices ("SYS_INIT", "BUFFERING_NODES...", "LIVE_DATA"). Aucune donnée réelle, aucun axe Y, pas de grille lisible.
  • Fichier : apps/web/src/components/admin/admin-dashboard-view/AdminDashboardTrafficCard.tsx.
  • Impact : lintitulé "HOLOGRAPHIC STREAMING INTERFACE" promet un élément avancé alors que le rendu est clairement un placeholder.

Recommandations :

  • Soit brancher de vraies données + axes + légende claire, soit remplacer par un message du type "Données à venir" ou un skeleton, et éviter un faux graphique.

3.3 Bouton "Sign In" alors que lutilisateur est connecté

  • Constat (daprès captures) : un bouton "Sign In" peut apparaître à côté dun utilisateur déjà identifié (ex. "vezadev").
  • À vérifier : Header.tsx / Navbar.tsx — affichage conditionnel du bouton de connexion vs profil. Sassurer que "Sign In" nest affiché que lorsque !isAuthenticated.

4. Layout et espacement

4.1 Barre de lecture (MiniPlayer / GlobalPlayer)

  • Taille : MiniPlayer utilise h-24 (96px) en barre fixe. Les contrôles (notamment le bouton play) sont très mis en avant (teal, grande taille).
  • Impact : la barre occupe une part importante de la hauteur et attire trop lattention sur les pages où la lecture nest pas le focus (ex. Gear Locker, Academy, Admin).
  • Fichiers : apps/web/src/components/player/MiniPlayer.tsx (L36 : h-24), PlayerControls.tsx, PlayPauseButton.tsx.

Recommandations :

  • Réduire la hauteur sur desktop (ex. h-20 ou h-18) et/ou rendre le contraste du bouton play un peu moins fort (même teal mais moins saturé ou plus petit).
  • Barre de progression : déjà fine ; envisager une hauteur un peu plus visible pour la partie "remplie" (accessibilité + lisibilité).

4.2 Espacement entre sections (sidebar)

  • Constat : les blocs "MY STUDIO", "VEZA NETWORK", etc. ont un espacement vertical serré entre le titre de section et le premier lien.
  • Fichier : apps/web/src/components/layout/Sidebar.tsx (structure des sections).
  • Recommandation : ajouter un peu de marge au-dessus des titres de section (ex. mt-4 ou space-y-1 entre titre et premier item) pour clarifier la hiérarchie.

4.3 Cartes dashboard (Command Center)

  • Constat : les quatre petites cartes (Tracks Listened, Messages Sent, etc.) sont serrées ; le texte et les pourcentages peuvent sembler denses.
  • Fichiers : vues dashboard qui utilisent StatCard ou équivalent ; grille (ex. grid-cols-4, gap-6).
  • Recommandation : garder les layout primitives (pas de valeurs arbitraires) mais ajuster gap ou padding des cartes pour plus de respiration (ex. p-6 déjà présent, éventuellement gap-8).

5. Typographie

5.1 Police Rajdhani

  • Usage : --font-sans: 'Rajdhani', ... dans index.css (@theme inline). Utilisée pour le corps et une grande partie de lUI.
  • Problème connu : les erreurs console "downloadable font: Glyph bbox was incorrect" (Rajdhani) indiquent des glyphes mal déclarés dans le fichier de police. Conséquences possibles : rendu moins net, décalages, ou fallback partiel vers une autre police.
  • Fichiers : index.html (lien Google Fonts), apps/web/src/index.css (--font-sans).

Recommandations :

  • Vérifier la source de la police (version, subset) et si possible utiliser une version mise à jour ou un autre fournisseur.
  • En parallèle, prévoir un fallback explicite (ex. 'Rajdhani', 'Inter', system-ui, sans-serif) pour limiter les effets si Rajdhani pose problème.

5.2 Hiérarchie et lisibilité

  • Texte secondaire : text-muted-foreground (oklch(0.70 0.01 265) en dark) peut être trop proche du fond sur certains écrans, ce qui réduit le contraste et la hiérarchie.
  • Recommandation : augmenter très légèrement la luminance ou le contraste de --muted-foreground en dark (ex. 0.720.75) et valider avec un outil WCAG.

6. Contrastes et accessibilité

6.1 Éléments à faible contraste

  • Bordures : border-white/5, border-white/10 — très subtiles, peu visibles pour certains utilisateurs.
  • Icônes : petites icônes en text-muted-foreground dans les cartes et le player ; contraste insuffisant pour une identification rapide.
  • Progress bar (player) : barre de progression très fine ; partie "remplie" (teal) lisible, mais le rail peut manquer de contraste.

Recommandations :

  • Utiliser au minimum border-white/10 pour les séparations importantes, et réserver white/5 aux détails purement décoratifs.
  • Icônes secondaires : envisager une couleur un peu plus claire (ex. text-foreground/70) ou une taille légèrement supérieure pour les actions importantes.

6.2 Champs mot de passe en HTTP

  • Constat : message navigateur "Password fields present on an insecure (http://) page" en dev. Ce nest pas un problème de design mais de contexte (HTTPS en prod recommandé).

7. Cohérence et système de design

7.1 Double jeu de tokens (KŌDŌ vs design-tokens)

  • index.css : variables type --primary, --cyan-500, --card, etc. (oklch).
  • design-tokens.css : variables --kodo-void, --kodo-cyan, --kodo-text-dim, etc. (rgb).
  • Composants : certains utilisent primary / cyan-500, dautres text-kodo-cyan, bg-kodo-steel, etc. (ex. StatCard.tsx : text-kodo-cyan, bg-kodo-steel/10).
  • Risque : dérives de teintes entre les deux systèmes et maintenance plus difficile.

Recommandation :

  • À moyen terme, unifier sur un seul jeu de tokens (idéalement celui de index.css étendu en Tailwind) et migrer progressivement les kodo-* vers les tokens sémantiques (primary, muted, etc.).

7.2 Variantes de cartes

  • card.tsx propose plusieurs variants : default, elevated, ghost, outline, muted, glass, interactive, glow, glowMagenta, spotlight. Lusage de glass partout (admin, etc.) donne un rendu très uniforme et plat.
  • Recommandation : utiliser default ou elevated pour les cartes de contenu principal afin de retrouver un peu dombre et de relief, et réserver glass à des blocs spécifiques (panneaux, overlays).

8. Synthèse des actions prioritaires

Priorité Action Fichier(s) principal(aux)
P0 Unifier la couleur des badges sidebar (primary au lieu de secondary) Sidebar.tsx
P0 Ne pas afficher le badge "0%" en rouge quand trend est 0 ou undefined ; style neutre ou masqué AdminDashboardStatCard.tsx
P1 Donner plus de relief aux cartes (card vs background, bordure/ombre) index.css (.dark), card.tsx
P1 Remplacer ou clarifier le graphique "Traffic Flux" (données réelles ou placeholder explicite) AdminDashboardTrafficCard.tsx
P1 Vérifier laffichage "Sign In" quand lutilisateur est connecté Header.tsx, Navbar.tsx
P2 Réduire la prééminence visuelle du player (hauteur, taille du bouton play) MiniPlayer.tsx, PlayerControls.tsx
P2 Améliorer laffordance de la barre de recherche (fond/bordure) Header.tsx
P2 Renforcer le contraste du texte secondaire et des bordures en dark index.css
P3 Unifier les tokens (kodo-* vs primary/muted) et documenter la charte design-tokens.css, index.css, composants
P3 Corriger ou contourner les glyphes Rajdhani (source font, fallback) index.html, index.css

9. Fichiers modifiables (référence rapide)

  • Couleurs / thème : apps/web/src/index.css (variables :root et .dark).
  • Sidebar : apps/web/src/components/layout/Sidebar.tsx.
  • Header : apps/web/src/components/layout/Header.tsx.
  • Cartes : apps/web/src/components/ui/card.tsx ; AdminDashboardStatCard.tsx, AdminDashboardTrafficCard.tsx.
  • Player : apps/web/src/components/player/MiniPlayer.tsx, PlayerControls.tsx, PlayPauseButton.tsx.
  • Dashboard : apps/web/src/components/admin/admin-dashboard-view/AdminDashboardView.tsx, useAdminDashboardView.ts.
  • Typographie : apps/web/index.html (fonts), apps/web/src/index.css (--font-sans, @layer base).

Cet audit peut servir de base pour des tickets (P0 → P3) et pour une checklist avant refonte visuelle plus large.