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>
4.1 KiB
4.1 KiB
Audit visuel — Résumé et écarts World-Class
Date : 2025-02-08
Référents : Discord (densité, clarté sidebar), Spotify (rythme vertical, rounded-xl, listes).
Ce qui a été capturé
- Login (full page) — spacing inputs, social buttons, primary CTA
- Register (full page) — idem
- Dashboard (full page) — cartes stats, activité récente
- Playlists (full page) — liste / grille
- Library (full page) — contenu bibliothèque
- 404 (full page)
- Header (composant isolé) — barre supérieure
- Sidebar et Player — locators mis à jour (
data-testid="app-sidebar",data-testid="global-player"sur GlobalPlayer). Si toujours skippés, vérifier ordre de rendu ou visibilité (sidebar collapsed par défaut, player sans piste).
Ce que j’ai “vu” (analyse des screenshots)
1. Login & Register (focus spacing & inputs)
- Points positifs : Inputs en
rounded-xl, bouton principal en gradient bien mis en avant, champs avecspace-y-5cohérent. - Écarts :
- Espace entre la ligne “Remember me / Forgot password?” et le bouton “Sign In” un peu grand ou variable par rapport au rythme des champs → à caler sur l’échelle (ex.
mt-4/mt-5). - Texte secondaire (“OR CONTINUE WITH”, “Don’t have an account?”) en contraste un peu faible → vérifier
muted-foreground/ tokens pour respect AA.
- Espace entre la ligne “Remember me / Forgot password?” et le bouton “Sign In” un peu grand ou variable par rapport au rythme des champs → à caler sur l’échelle (ex.
- Tokens : Pas de valeurs arbitraires visibles dans les forms ;
space-y-5/space-y-8alignés sur l’échelle Tailwind.
2. Dashboard (hiérarchie des cartes)
- Points positifs : Cartes stats utilisent déjà
drop-shadow-stat-icon(ombre neutre), grillegap-4/gap-6, pas de glow coloré sur les icônes. - Écarts : Activité récente / listes internes : ombres ou bordures encore marquées sur certains blocs → à atténuer pour renforcer la hiérarchie (contenu > chrome).
3. Sidebar (alignements, 240px)
- Code : Largeur gérée par tokens (
--sidebar-width-expanded: 15rem= 240px), classesleft-sidebar,top-sidebar, etc. → aligné Discord. - Capture : Test sidebar skippé (locator trop strict). À corriger en
aside[class*="left-sidebar"]pour rendre la capture fiable.
4. Playlists & Library (densité verticale)
- Points positifs :
PlaylistTrackItemenp-3 sm:p-4,gap-2 sm:gap-4; liste engap-3 sm:gap-4→ rythme correct. - Écarts : Vérifier qu’aucun
gap-[Xpx]oup-[Xpx]ne reste ; tout doit passer par l’échelle ou des tokens.
5. Global Player
- Code : Barre fixe en bas (
fixed bottom-0 left-0 right-0,h-16). - Capture : Skippée car le locator
div.fixed.bottom-0.left-0.right-0peut matcher un autre élément ou l’ordre du DOM. À cibler viadiv.fixed.bottom-0.left-0.right-0.h-16(ou une classe dédiée).
Synthèse des corrections appliquées
| Zone | Action |
|---|---|
| Login/Register | Espacement explicite entre la ligne “Remember me” et le bouton submit (mt-5) pour un rythme vertical cohérent. |
| Tokens | Vérification que --layout-gap ou équivalent est documenté/utilisé là où c’est pertinent. |
| Spec visuelle | Locators sidebar → aside[class*="left-sidebar"] ; player → div.fixed.bottom-0.left-0.right-0.h-16 pour capturer les deux composants. |
| Hiérarchie | Déjà en bonne voie (stat cards, ombres). Pas de changement supplémentaire dans ce cycle. |
Contraste (muted-foreground)
Les textes secondaires (“Sign in to your account”, “OR CONTINUE WITH”, “Don’t have an account?”) reposent sur text-muted-foreground. Pour viser un niveau “World-Class” et AA, garder ou ajuster la variable --muted-foreground (dark) dans index.css pour un ratio ≥ 4.5:1 sur le fond sombre.
Prochaines étapes recommandées
- Relancer
npm run visual:captureaprès correction des locators → vérifier que sidebar et player sont bien capturés. - Mettre à jour les baselines avec
npm run visual:updatesi les changements de spacing sont validés. - Optionnel : audit contraste (muted-foreground) avec outil type axe DevTools ou Contrast Checker.