veza/apps/web/visual-tests/PHASE2_COMPARATIVE_REPORT.md

286 lines
17 KiB
Markdown
Raw Normal View History

# Phase 2 — Analyse comparative visuelle (Discord × Spotify)
**Contexte** : Baselines Veza en conditions contrôlées (1280×720, dark, reduced motion).
**Métriques Veza** : déduites du code (composants, `index.css`, Tailwind).
**Métriques Discord/Spotify** : reverse-engineering communautaire et documentation publique ; lorsquaucune valeur px nest disponible, la méthode de mesure sur capture de référence est indiquée.
**Aucune modification de code ou de tokens** : phase analytique uniquement.
---
## 1. Référents par écran
| Écran Veza | Fichier baseline | Équivalent Discord | Équivalent Spotify |
|------------|------------------|--------------------|---------------------|
| Login | `login-desktop.png` | N/A (Discord desktop = app native) | Login web (desktop) |
| Register | `register-desktop.png` | N/A | Inscription web |
| Dashboard | `dashboard-desktop.png` | Vue principale (canal actif + liste messages) | Home / Search (zone centrale) |
| Sidebar | `sidebar-desktop.png` | Liste serveurs + liste canaux (channel list) | Left nav (Home, Search, Library) |
| Playlists (liste) | `playlists-desktop.png` | Liste canaux (texte) / liste DMs | Liste playlists / liste titres |
| Library | `library-desktop.png` | — | Your Library (grille/liste) |
| 404 | `404-desktop.png` | Page erreur / lien mort | Page non trouvée |
---
## 2. Analyse par écran
### 2.1 Login (`login-desktop.png`)
**Référent** : Spotify login (desktop web) — formulaire centré, fond sombre, un seul CTA.
#### Métriques déduites du code (Veza)
- **Typographie** : Titre de page (non présent dans LoginForm ; dépend du layout) ; labels/inputs via `FloatingInput` ; bouton `text-sm font-medium` (14px), CTA avec `font-bold tracking-wide` (button primary). Pas de titre explicite dans le formulaire dans le snippet — à confirmer sur baseline.
- **Spacing** : `space-y-8` entre blocs (32px), `space-y-4` dans le groupe champs (16px). Champs espacés 16px verticalement.
- **Conteneur** : Formulaire `w-full` ; conteneur centré dépend du layout parent (AuthLayout).
- **Bouton** : `h-10` (40px), `rounded-full`, `rounded-xl` sur le CTA login (override dans le form).
#### Comparaison Spotify login (pratiques courantes)
- **Typographie** : Titre principal lisible (souvent 2428px), sous-texte plus petit (1416px). Ratio titre/corps marqué.
- **Spacing** : Espacement vertical généreux entre champs (2024px) ; padding du conteneur 3240px.
- **Densité** : Une seule colonne, peu déléments ; pas de surcharge.
#### Diagnostic
| Critère | Veza (code) | Spotify (référence) | Écart |
|---------|-------------|----------------------|--------|
| Espacement vertical entre champs | 16px (space-y-4) | 2024px typique | Veza plus serré ; risque de sensation "compact" |
| Espacement entre sections | 32px (space-y-8) | Souvent 3240px | Proche |
| Hauteur bouton principal | 40px (h-10) | ~4048px | Proche |
| Radius bouton | full / xl | Souvent 2428px (pill) | Cohérent |
**Verdict** : Densité **légèrement sur-dense** par rapport à un login type Spotify (espacement entre champs). Hiérarchie à vérifier sur capture : titre de page vs labels vs lien "Forgot password" (taille, contraste).
**Écarts précis** :
- Lespacement vertical entre champs (16px) est inférieur aux ~2024px courants sur login Spotify, ce qui réduit la respiration du formulaire.
- Si le titre de page est absent ou en petit, la hiérarchie "titre > sous-titre > champs > CTA" est faible.
---
### 2.2 Register (`register-desktop.png`)
Même référent que login (formulaire dinscription web).
#### Métriques Veza (code)
- Même système que login : `space-y-8` / `space-y-4`, boutons et inputs partagés.
- Formulaire plus long (plus de champs) → plus de scroll.
#### Diagnostic
- **Densité** : Identique au login ; si le nombre de champs est élevé, 16px entre champs peut donner une liste étouffée.
- **Hiérarchie** : Sections (étapes ou blocs) doivent se distinguer par un espacement ou un titre ; à vérifier sur baseline.
**Verdict** : Même problème potentiel que login (spacing entre champs). Risque **moyen** si beaucoup de champs sans séparation visuelle.
---
### 2.3 Dashboard (`dashboard-desktop.png`)
**Référents** : Discord = zone canal + liste messages ; Spotify = Home (cartes, sections).
#### Métriques déduites du code (Veza)
- **Conteneur** : `space-y-6 p-6 pb-24` → 24px entre sections, 24px padding, 96px en bas (player).
- **Titre** : `text-3xl font-display font-bold` (30px) + sous-texte `text-muted-foreground` (p = leading-relaxed).
- **Grille cartes** : `grid gap-4 md:grid-cols-2 lg:grid-cols-4` → 16px entre cartes, 4 colonnes en large.
- **Cartes** : Card + CardHeader/CardContent ; pas de padding explicite dans le snippet — dépend de `card.tsx`.
#### Comparaison Discord (zone principale)
- **Densité** : Élevée ; messages serrés (padding vertical ~48px par message), scroll long.
- **Hiérarchie** : Nom dutilisateur / heure en petit ; contenu en corps ; contraste typographique fort.
#### Comparaison Spotify Home
- **Densité** : Moyenne ; sections avec titres (ex. 24px), cartes horizontales scrollables, espacement vertical entre sections ~2432px.
- **Rythme** : Répétition section titre + carrousel ; padding latéral marqué.
#### Diagnostic
| Critère | Veza (code) | Discord | Spotify Home |
|---------|-------------|---------|--------------|
| Padding zone principale | 24px (p-6) | ~16px | ~2432px |
| Espacement entre sections | 24px (space-y-6) | — | 2432px |
| Espacement entre cartes | 16px (gap-4) | — | 1624px |
| Titre page | 30px (text-3xl) | — | 2428px section |
**Verdict** : **Ni sous-dense ni sur-dense** pour un dashboard type "command center". Hiérarchie à valider sur capture : le titre avec gradient (Welcome back, {name}) doit dominer ; les cartes stats ne doivent pas rivaliser en poids visuel (couleurs, ombres).
**Écarts précis** :
- Les stats utilisent des couleurs vives (cyan, lime, destructive, magenta) et des ombres (drop-shadow) : risque de **concurrence visuelle** avec le titre et entre cartes.
- `space-y-6` (24px) entre blocs est cohérent avec Spotify ; à confirmer que le premier bloc (titre + sous-titre) est bien séparé du bloc cartes.
---
### 2.4 Sidebar (`sidebar-desktop.png`)
**Référents** : Discord = liste serveurs (icônes) + liste canaux (texte) ; Spotify = left nav (icônes + labels).
#### Métriques déduites du code (Veza)
- **Dimensions** : Ouverte `w-64` (256px), fermée `lg:w-20` (80px). Position `left-6 bottom-6 top-20` → 24px gauche/bas, 80px haut (sous header).
- **Header** : `px-4 py-4` (16px), `gap-3` (12px). Logo 32×32px. Titre `text-sm font-semibold`, sous-texte `text-xs text-muted-foreground`.
- **Sections** : `space-y-6` (24px entre groupes), `px-3 py-2` (12px/8px), labels `text-xs font-medium uppercase tracking-wider mb-2 px-3`.
- **Items** : `px-3 py-2` (12px/8px), `space-y-0.5` (2px entre items), `text-sm font-medium`. Hauteur approximative par item : 8+8+line-height(14px) ≈ 3640px.
- **Radius** : `rounded-xl` sur laside (12px avec --radius 0.5rem + 4px).
#### Comparaison Discord (reverse-engineering communautaire)
- **Liste canaux** : Largeur étendue **240px**, collapsed **72px**.
- **Items** : Hauteur ditem ~3240px ; padding horizontal ~812px ; texte canal en 1416px.
- **Sections** : Séparation nette ; labels en petit, uppercase ou titre court.
#### Comparaison Spotify (pratiques courantes)
- **Left nav** : Largeur variable (resizable) ; collapsed = icônes seules (~5672px), étendu ~200280px.
- **Items** : Hauteur ~4048px ; icône + label ; peu ditems visibles sans scroll.
- **Rythme** : Espacement vertical régulier ; pas de surcharge.
#### Diagnostic
| Critère | Veza (code) | Discord | Spotify |
|---------|-------------|---------|---------|
| Largeur ouverte | 256px (w-64) | 240px | ~200280px |
| Largeur fermée | 80px (w-20) | 72px | ~5672px |
| Padding horizontal items | 12px (px-3) | ~812px | ~1216px |
| Padding vertical item | 8px (py-2) | ~68px | ~1012px |
| Espacement entre items | 2px (space-y-0.5) | ~02px | ~04px |
| Espacement entre sections | 24px (space-y-6) | ~1624px | ~816px |
| Taille label section | 12px (text-xs) | ~1112px | ~1112px |
| Taille item | 14px (text-sm) | ~14px | ~14px |
**Verdict** : **Densité et largeur dans la fourchette** Discord/Spotify. Points à valider sur capture : alignement icônetexte (gap-3 = 12px), contraste item actif vs inactif, et **incohérences de mise en page** (valeurs en dur : `left-6`, `top-20`, `bottom-6`, `z-[95]` non issues de tokens).
**Écarts précis** :
- La sidebar Veza fait **256px** ouverte contre **240px** Discord : 16px de plus, pas bloquant mais à aligner sur un token si on vise la même densité que Discord.
- `space-y-0.5` (2px) entre items donne une liste très serrée ; Discord/Spotify sont souvent dans la même gamme ; à confirmer que la ligne de base du texte ne touche pas litem suivant.
- **Alignements** : Le header utilise `gap-3`, les items `gap-3` (icônetexte) ; vérifier sur capture que les icônes des items sont alignées verticalement avec le titre "System Hub" (grille implicite).
---
### 2.5 Playlists — liste dense (`playlists-desktop.png`)
**Référents** : Discord = liste de canaux texte ; Spotify = liste de playlists ou liste de titres.
#### Métriques déduites du code (Veza)
- **Vue liste** : `flex flex-col gap-2 sm:gap-3` → 8px (mobile) / 12px (desktop) entre lignes.
- **PlaylistTrackItem** : `p-2 sm:p-3` (8px / 12px), `gap-2 sm:gap-4` (8px / 16px). Titre `text-sm sm:text-base` (14px / 16px), secondaire `text-xs sm:text-sm` (12px / 14px). Hauteur de ligne ≈ 12+12+20 (line-height) ≈ 44px (sm) ou 12+12+~24 ≈ 48px avec text-base.
- **Vue grille** : `grid gap-4`, `grid-cols-2 md:grid-cols-3 lg:grid-cols-4`. PlaylistCard avec `aspect-square` pour la cover.
- **Espacement global** : `space-y-4` entre toolbar et liste.
#### Comparaison Spotify (liste titres / playlists)
- **Liste titres** : Hauteur de ligne souvent ~4856px ; padding horizontal ~16px ; titre 1416px, secondaire 1214px.
- **Liste playlists** : Cartes ou lignes ; espacement régulier (gap 1624px).
#### Comparaison Discord (liste canaux)
- **Items** : Hauteur ~3240px ; texte 14px ; padding serré.
- **Densité** : Élevée pour afficher beaucoup de canaux.
#### Diagnostic
| Critère | Veza (code) | Spotify (liste) | Discord (canaux) |
|---------|-------------|-----------------|------------------|
| Padding vertical ligne | 812px (p-2/p-3) | ~1216px | ~610px |
| Espacement entre lignes | 812px (gap-2/gap-3) | ~04px (liste) | ~02px |
| Taille titre ligne | 1416px | 1416px | ~14px |
| Taille secondaire | 1214px | 1214px | ~12px |
| Hauteur approximative ligne | ~4448px | ~4856px | ~3240px |
**Verdict** : **Légèrement plus compact** que Spotify (padding et gap plus faibles), **proche** de Discord en densité. Pour une "liste dense" type Spotify, augmenter le padding vertical des lignes (p-3 → p-4) et/ou le gap entre lignes (gap-3 → gap-4) rapprocherait du rythme Spotify sans changer la structure.
**Écarts précis** :
- Litem de liste fait environ **4448px** de hauteur (p-2/p-3 + texte) contre **4856px** typique Spotify, ce qui donne une liste plus serrée.
- En vue grille, `gap-4` (16px) est cohérent ; vérifier sur capture que les cartes ne semblent pas collées (ratio cover/titre cohérent).
---
### 2.6 Library (`library-desktop.png`)
**Référent** : Spotify "Your Library" (grille ou liste dalbums/playlists).
#### Métriques Veza (code)
- Même composants que playlists (PlaylistList, grille/liste) ; écran library peut réutiliser des vues liste ou grille selon le code.
- Si grille : `gap-4`, colonnes 2/3/4 ; si liste : même métriques que playlists.
**Verdict** : Aligner sur le même diagnostic que Playlists (densité, hauteur de ligne, gap). **Cohérence** entre Library et Playlists à confirmer sur baselines (mêmes tokens, pas décart visuel entre les deux écrans).
---
### 2.7 404 (`404-desktop.png`)
**Référent** : Page erreur minimale (Spotify / Discord : message + CTA).
#### Points à vérifier sur baseline
- Hiérarchie : message principal > explication > bouton.
- Densité : centré, pas trop vide (min-h-layout-page-sm = 400px).
- Contraste : texte lisible sur fond dark.
- Composant : KodoEmptyState ou équivalent (icône, titre, description, action).
**Verdict** : Pas de référent métrique strict ; **qualité** = lisibilité et un seul CTA clair. À valider en Phase 3 avec une capture.
---
## 3. Synthèse transverse
### 3.1 Règles implicites Discord (extraites)
1. **Densité élevée avec contraste typographique fort** : Beaucoup déléments visibles (canaux, messages) ; différenciation par taille (labels petits, contenu en corps) et poids (gras pour noms), pas par espacement excessif.
2. **Sidebar à largeur fixe et prévisible** : 72px (collapsed) / 240px (étendu) ; peu de variation. Hiérarchie visuelle par sections (serveurs vs canaux) et par état actif/hover.
3. **Alignements stricts** : Icônes et texte alignés sur une grille ; pas de décalage entre zones équivalentes (même padding gauche pour tous les items de même niveau).
### 3.2 Règles implicites Spotify (extraites)
1. **Densité modérée, rythme vertical régulier** : Espacement entre sections et entre lignes cohérent (1624px) ; moins ditems visibles que Discord mais lecture plus confortable.
2. **Sidebar resizable avec états clairs** : Collapsed = icônes seules ; étendu = icône + label ; transition nette. Pas de demi-mesure visuelle.
3. **Hiérarchie par taille et contraste secondaire** : Titres de section 24px ou équivalent ; corps 1416px ; secondaire (métadonnées) plus petit et plus terne ; peu de couleurs vives en dehors des covers et CTAs.
### 3.3 Ce que lapp actuelle fait déjà bien
- **Sidebar** : Largeur et structure (sections, items, collapsed) dans la fourchette Discord/Spotify ; tokens sémantiques (sidebar-primary, sidebar-accent) présents.
- **Dashboard** : Padding et espacement entre blocs (p-6, space-y-6, gap-4) proches de Spotify Home.
- **Formulaires auth** : Structure space-y-8 / space-y-4 et boutons (h-10, rounded-full) cohérents avec des patterns courants.
- **Listes** : Typo (text-sm / text-xs) et structure (titre + secondaire) alignées avec les référents.
### 3.4 Ce qui éloigne structurellement des référents
- **Spacing formulaires** : 16px entre champs (space-y-4) plus serré que le 2024px type Spotify login → sensation plus dense.
- **Liste playlists** : Lignes ~4448px et gap 812px plus compacts que Spotify (~4856px, 04px gap) → liste plus "Discord" que "Spotify".
- **Dashboard** : Multiplicité de couleurs vives et ombres sur les cartes → risque de concurrence visuelle avec le titre ; Discord/Spotify limitent les couleurs vives à des zones précises (accents, états).
- **Sidebar** : Valeurs en dur (left-6, top-20, bottom-6, z-[95], w-64) non issues de tokens → incohérence potentielle et maintenance difficile ; Discord/Spotify sappuient sur des variables de layout.
- **Alignements** : Non audités pixel-perfect sur les captures ; ruptures de grille ou padding incohérents entre zones équivalentes restent possibles.
---
## 4. Tableau de synthèse (ordre de traitement Phase 3)
| Écran | Problème principal | Type | Impact perçu |
|-------|--------------------|------|--------------|
| Login | Espacement vertical entre champs trop faible (16px vs 2024px) | Spacing | Moyen |
| Register | Idem login ; risque détouffement si nombreux champs | Spacing | Moyen |
| Dashboard | Concurrence visuelle cartes (couleurs + ombres) vs titre | Hiérarchie | Fort |
| Sidebar | Valeurs en dur (position, z-index, w-64) ; 256px vs 240px Discord | Spacing / Alignement | Moyen |
| Playlists (liste) | Hauteur de ligne et gap plus compacts que Spotify | Spacing / Densité | Moyen |
| Library | Cohérence avec Playlists (mêmes tokens) | Alignement | Faible |
| 404 | À valider sur capture (lisibilité, CTA unique) | Hiérarchie / Contraste | Faible |
---
## 5. Ordre recommandé pour la Phase 3
1. **Sidebar** : Remplacer les valeurs en dur par des tokens (largeur, positions, z-index) ; optionnellement aligner la largeur ouverte sur 240px si cible Discord.
2. **Login / Register** : Augmenter lespacement vertical entre champs (nouveau token ou space-y-5 / space-y-6) ; une seule catégorie à la fois, puis capture + pixelmatch.
3. **Dashboard** : Réduire la concurrence visuelle des cartes (ombres ou couleurs) pour renforcer la hiérarchie titre > cartes ; vérifier contrastes.
4. **Playlists (liste)** : Ajuster padding vertical des lignes et/ou gap entre lignes pour se rapprocher du rythme Spotify ; mesurer sur baseline après correction.
5. **Library** : Sassurer que les mêmes tokens que Playlists sont utilisés ; pas de dérive visuelle.
6. **404** : Validation visuelle et contraste ; corrections mineures si besoin.
---
**Fin du rapport Phase 2.** Aucune modification de code ou de tokens na été effectuée ; les corrections seront appliquées en Phase 3, une catégorie à la fois, avec capture et diff pixelmatch pour chaque changement.