Plan UI premium 6–8 semaines (design system, shell, Storybook, a11y): - Design system: DESIGN_TOKENS.md, APP_SHELL.md, FULL_LAYOUT_PAGE.md. Single source for layout/shell (index.css), shadows (design-system.css), durations/easing. - Tokens: shadow-cover-depth, shadow-gold-glow, shadow-fab-glow; layout max-height (max-h-layout-drawer, max-h-layout-panel, max-h-layout-list). All duration-200/300/500 replaced by --duration-fast/normal/slow. Arbitrary shadows replaced by token classes. - Shell & player: Sidebar, Header, GlobalPlayer, MiniPlayer, PlayerQueue, PlayerControls, AudioPlayer use tokens; focus-visible on Sidebar, PlayerQueue, DropdownMenuTrigger/Item, TabsTrigger. Typography: text-[10px]/[9px] → text-xs where applicable. - ESLint: no-restricted-syntax (warn) for w-/h-/rounded-/shadow-/text-/spacing arbitrary. - Scripts: report-arbitrary-values.mjs, capture/compare/generate visual; visual-complete.spec.ts. - Stories full layout: Dashboard, Playlists, Library, Settings, Profile in DashboardLayout.stories. - .cursorrules + README: DESIGN_TOKENS, APP_SHELL, visual commands, no arbitrary without justification. - apps/web/.gitignore: e2e test artifacts (test-results-visual, playwright-report-visual). Co-authored-by: Cursor <cursoragent@cursor.com>
17 KiB
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 ; lorsqu’aucune valeur px n’est 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; boutontext-sm font-medium(14px), CTA avecfont-bold tracking-wide(button primary). Pas de titre explicite dans le formulaire dans le snippet — à confirmer sur baseline. - Spacing :
space-y-8entre blocs (32px),space-y-4dans 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-xlsur le CTA login (override dans le form).
Comparaison Spotify login (pratiques courantes)
- Typographie : Titre principal lisible (souvent 24–28px), sous-texte plus petit (14–16px). Ratio titre/corps marqué.
- Spacing : Espacement vertical généreux entre champs (20–24px) ; padding du conteneur 32–40px.
- 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) | 20–24px typique | Veza plus serré ; risque de sensation "compact" |
| Espacement entre sections | 32px (space-y-8) | Souvent 32–40px | Proche |
| Hauteur bouton principal | 40px (h-10) | ~40–48px | Proche |
| Radius bouton | full / xl | Souvent 24–28px (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 :
- L’espacement vertical entre champs (16px) est inférieur aux ~20–24px 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 d’inscription 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-textetext-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 ~4–8px par message), scroll long.
- Hiérarchie : Nom d’utilisateur / 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 ~24–32px.
- 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 | ~24–32px |
| Espacement entre sections | 24px (space-y-6) | — | 24–32px |
| Espacement entre cartes | 16px (gap-4) | — | 16–24px |
| Titre page | 30px (text-3xl) | — | 24–28px 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éelg:w-20(80px). Positionleft-6 bottom-6 top-20→ 24px gauche/bas, 80px haut (sous header). - Header :
px-4 py-4(16px),gap-3(12px). Logo 32×32px. Titretext-sm font-semibold, sous-textetext-xs text-muted-foreground. - Sections :
space-y-6(24px entre groupes),px-3 py-2(12px/8px), labelstext-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) ≈ 36–40px. - Radius :
rounded-xlsur l’aside (12px avec --radius 0.5rem + 4px).
Comparaison Discord (reverse-engineering communautaire)
- Liste canaux : Largeur étendue 240px, collapsed 72px.
- Items : Hauteur d’item ~32–40px ; padding horizontal ~8–12px ; texte canal en 14–16px.
- Sections : Séparation nette ; labels en petit, uppercase ou titre court.
Comparaison Spotify (pratiques courantes)
- Left nav : Largeur variable (resizable) ; collapsed = icônes seules (~56–72px), étendu ~200–280px.
- Items : Hauteur ~40–48px ; icône + label ; peu d’items visibles sans scroll.
- Rythme : Espacement vertical régulier ; pas de surcharge.
Diagnostic
| Critère | Veza (code) | Discord | Spotify |
|---|---|---|---|
| Largeur ouverte | 256px (w-64) | 240px | ~200–280px |
| Largeur fermée | 80px (w-20) | 72px | ~56–72px |
| Padding horizontal items | 12px (px-3) | ~8–12px | ~12–16px |
| Padding vertical item | 8px (py-2) | ~6–8px | ~10–12px |
| Espacement entre items | 2px (space-y-0.5) | ~0–2px | ~0–4px |
| Espacement entre sections | 24px (space-y-6) | ~16–24px | ~8–16px |
| Taille label section | 12px (text-xs) | ~11–12px | ~11–12px |
| Taille item | 14px (text-sm) | ~14px | ~14px |
Verdict : Densité et largeur dans la fourchette Discord/Spotify. Points à valider sur capture : alignement icône–texte (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 l’item suivant.- Alignements : Le header utilise
gap-3, les itemsgap-3(icône–texte) ; 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). Titretext-sm sm:text-base(14px / 16px), secondairetext-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 avecaspect-squarepour la cover. - Espacement global :
space-y-4entre toolbar et liste.
Comparaison Spotify (liste titres / playlists)
- Liste titres : Hauteur de ligne souvent ~48–56px ; padding horizontal ~16px ; titre 14–16px, secondaire 12–14px.
- Liste playlists : Cartes ou lignes ; espacement régulier (gap 16–24px).
Comparaison Discord (liste canaux)
- Items : Hauteur ~32–40px ; texte 14px ; padding serré.
- Densité : Élevée pour afficher beaucoup de canaux.
Diagnostic
| Critère | Veza (code) | Spotify (liste) | Discord (canaux) |
|---|---|---|---|
| Padding vertical ligne | 8–12px (p-2/p-3) | ~12–16px | ~6–10px |
| Espacement entre lignes | 8–12px (gap-2/gap-3) | ~0–4px (liste) | ~0–2px |
| Taille titre ligne | 14–16px | 14–16px | ~14px |
| Taille secondaire | 12–14px | 12–14px | ~12px |
| Hauteur approximative ligne | ~44–48px | ~48–56px | ~32–40px |
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 :
- L’item de liste fait environ 44–48px de hauteur (p-2/p-3 + texte) contre 48–56px 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 d’albums/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)
- 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.
- 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.
- 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)
- Densité modérée, rythme vertical régulier : Espacement entre sections et entre lignes cohérent (16–24px) ; moins d’items visibles que Discord mais lecture plus confortable.
- Sidebar resizable avec états clairs : Collapsed = icônes seules ; étendu = icône + label ; transition nette. Pas de demi-mesure visuelle.
- Hiérarchie par taille et contraste secondaire : Titres de section 24px ou équivalent ; corps 14–16px ; secondaire (métadonnées) plus petit et plus terne ; peu de couleurs vives en dehors des covers et CTAs.
3.3 Ce que l’app 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 20–24px type Spotify login → sensation plus dense.
- Liste playlists : Lignes ~44–48px et gap 8–12px plus compacts que Spotify (~48–56px, 0–4px 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 s’appuient 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 20–24px) | 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
- Sidebar : Remplacer les valeurs en dur par des tokens (largeur, positions, z-index) ; optionnellement aligner la largeur ouverte sur 240px si cible Discord.
- Login / Register : Augmenter l’espacement vertical entre champs (nouveau token ou space-y-5 / space-y-6) ; une seule catégorie à la fois, puis capture + pixelmatch.
- Dashboard : Réduire la concurrence visuelle des cartes (ombres ou couleurs) pour renforcer la hiérarchie titre > cartes ; vérifier contrastes.
- Playlists (liste) : Ajuster padding vertical des lignes et/ou gap entre lignes pour se rapprocher du rythme Spotify ; mesurer sur baseline après correction.
- Library : S’assurer que les mêmes tokens que Playlists sont utilisés ; pas de dérive visuelle.
- 404 : Validation visuelle et contraste ; corrections mineures si besoin.
Fin du rapport Phase 2. Aucune modification de code ou de tokens n’a été effectuée ; les corrections seront appliquées en Phase 3, une catégorie à la fois, avec capture et diff pixelmatch pour chaque changement.