13 KiB
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 d’accents 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 d’accent
| 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.primaryoucyan-500) ou un token dédié "badge" aligné sur la charte. Fichier :apps/web/src/components/layout/Sidebar.tsx(L194–201). - É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
glassoudefaultavec bordures/ombres très légères (border-white/5,shadow-black/5). Fichiers :components/ui/card.tsx(variantsglass,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)dansindex.css(.dark), donc peu de relief.
Recommandations :
- Augmenter légèrement la différence luminance card vs background (ex. card à 0.20–0.22, background 0.15).
- Donner aux cartes une bordure ou une ombre un peu plus marquée (ex.
border-borderplus visible,shadow-lgavec teinte légère). - Barre de recherche : fond ou bordure un peu plus marqués pour l’affordance (ex.
bg-cardouborder-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 :
AdminDashboardStatCardaffiche un badge de tendance (trend) avectrend > 0→ vert, sinon rouge. Si l’API ne renvoie pas de tendances (ou renvoie 0), on obtient "0%" en rouge sur chaque carte. - Fichiers :
AdminDashboardStatCard.tsx(L46–57),AdminDashboardView.tsx(L48–50 :trend: stats.trends?.usersetc.),useAdminDashboardView.ts(stats venant de l’API). - Impact : ressemble à une erreur ou à une donnée non implémentée, ce qui renforce l’impression d’interface 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 :
AdminDashboardTrafficCardutilise 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 : l’intitulé "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 l’utilisateur est connecté
- Constat (d’après captures) : un bouton "Sign In" peut apparaître à côté d’un utilisateur déjà identifié (ex. "vezadev").
- À vérifier :
Header.tsx/Navbar.tsx— affichage conditionnel du bouton de connexion vs profil. S’assurer que "Sign In" n’est affiché que lorsque!isAuthenticated.
4. Layout et espacement
4.1 Barre de lecture (MiniPlayer / GlobalPlayer)
- Taille :
MiniPlayerutiliseh-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 l’attention sur les pages où la lecture n’est 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-20ouh-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-4ouspace-y-1entre 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
StatCardou équivalent ; grille (ex.grid-cols-4,gap-6). - Recommandation : garder les layout primitives (pas de valeurs arbitraires) mais ajuster
gapoupaddingdes cartes pour plus de respiration (ex.p-6déjà présent, éventuellementgap-8).
5. Typographie
5.1 Police Rajdhani
- Usage :
--font-sans: 'Rajdhani', ...dansindex.css(@theme inline). Utilisée pour le corps et une grande partie de l’UI. - 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-foregrounden dark (ex. 0.72–0.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-foregrounddans 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/10pour les séparations importantes, et réserverwhite/5aux 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 n’est 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, d’autrestext-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 leskodo-*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. L’usage deglasspartout (admin, etc.) donne un rendu très uniforme et plat. - Recommandation : utiliser
defaultouelevatedpour les cartes de contenu principal afin de retrouver un peu d’ombre et de relief, et réserverglassà 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 l’affichage "Sign In" quand l’utilisateur 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 l’affordance 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.