Audit UX — /recommendations — 15 mai 2026
TL;DR
- Cognitive overload landing : 6 couches UI avant contenu actionnable. 15-25s vs cible 10s.
- Filtre
repeat_buyerfantôme : parsé/compté/appliqué mais zero UI. Accessible URL only. - Tooltip score mobile :
onPointerDowntoggle sans tap extérieur. Reste ouvert indéfiniment. - Hero card non-responsive :
gridTemplateColumns: "1fr auto"sans media query → crash 375px. - Toggle Buy/Sell écrase filtres actifs :
hrefabsolus sans query params préservés.
Frictions par sévérité
S0 — Bloquant
- F1
RecoFilterBar.tsx:38,52,99,912— FiltrerepeatBuyerparsé/sérialisé/compté sans UI. "1 filtre actif" sans pill identifiable. - F2
RecoSearchBar.tsx:122—jumpToEntitycherche dansallItemsmasqués (freemium). Recherche "Vicat" retourne "aucun signal actif" alors que signal existe derrière paywall.
S1 — Majeur
- F3
page.tsx:951-953— MethodologyCard interruptive entre toggle direction et hero (300-400px scroll obligatoire). - F4
RecoHeroCard.tsx:263-268—gridTemplateColumns: "1fr auto"sans media query. Mobile 375px : col droite (96px ring + 160px min) → 83px restants pour nom société. - F5
page.tsx:471-513— Toggle bar URLs absolues (/recommendations?dir=buy) → reset tous autres filtres. - F6
RecoConvictionGrid.tsx:270-283— Tooltip score mobile : pas de fermeture extérieure,pointerEvents:noneempêche copie. - F7
RecoFilterBar.tsx:263-287— Score slider 12 steps invisibles, "0" = "pas de filtre",height: 2pxcible tactile insuffisante.
S2 — Modéré
- F8
RecoFilterBar.tsx:453-534— Deux affordances pour ouvrir filtres (header + bouton "Affiner"). - F9
RecoConvictionGrid.tsx:446-461— Orphan handling :calc(50% - 8px)override parminWidth: 280→ carte alignée gauche au lieu centrée. - F10
page.tsx:214-288— MethodologyCard 5 colonnes border-right cellules paires. - F11
RecoSearchBar.tsx:172-225— Placeholder ne précise pas scope (signaux actifs uniquement, pas BDD complète). - F12
page.tsx:471-513— Pasaria-currentsur onglet actif. - F13
RecoFilteredContent.tsx:289-354— TripleFreemiumGateconsécutifs (hero/grid/table) → paywall fatigue. - F14
RecoFilterBar.tsx:383—panelOpenfalse par défaut, CTA peu visible.
S3 — Mineur
- F15
RecoHeroCard.tsx:66-87— Sparkline sans fallback visible si Yahoo 404. - F16
RecoFilterBar.tsx:784-829— Filtres Rôle + Sort absents du drawer mobile. - F17
RecoFilterBar.tsx:104-111— Mappingsize: valeursweet= label "Mid",mid= label "Large" confusant. - F18
RecoHeroCard.tsx:220—deadline = transactionDate + 7jsans guard date passée. - F19
RecoConvictionGrid.tsx:279—role="button"sur div, focus visible non stylé. - F20
RecoEmptyState.tsx:148-153— Couleurs hardcodées (#fef9c3,#fde047,#eab308) ignorent dark mode.
Performance (estimé, sans Playwright)
- LCP : H1 <200ms ; hero card perçu 800ms-2s (Suspense + cache 5min)
- TTI : hydration unique 60 items, O(60) filtering — <100ms
- Slowest API :
/api/sparkline/[symbol](Yahoo) — 2-5s sans cache client visible - Bundle : 4 client components lourds (FilterBar 978L, HeroCard 500L, ConvictionGrid 520L, FullTable 200L) sans
dynamic()lazy
Mobile (375px)
- M1 Hero card crash potentiel
- M2 Rôle + Tri absents drawer
- M3 Slider track 2px
- M4 Tooltip non-fermable
- M5 Orphan card mal dimensionnée
- M6 Table sans indicateur scroll horizontal
- M7 Deadline passée non guardée
Plan d'action — 10 fixes priorisés
| # | Fix | Fichier:ligne |
|---|---|---|
| 1 | UI repeatBuyer dans filterPanel + drawer |
RecoFilterBar.tsx:643-677 / 784-829 |
| 2 | Distinguer "signal masqué" de "signal absent" | RecoSearchBar.tsx:122 + page.tsx:76-90 |
| 3 | Hero card @media (max-width:640px) |
RecoHeroCard.tsx:263-268 |
| 4 | Toggle bar useSearchParams preserve params |
page.tsx:471-513 |
| 5 | Tooltip pointer-down extérieur + guard deadline | RecoConvictionGrid.tsx:270-283 + RecoHeroCard.tsx:220 |
| 6 | MethodologyCard collapsée par défaut OU déplacée | page.tsx:951-953 |
| 7 | Empty state tokens CSS | RecoEmptyState.tsx:148-153 |
| 8 | Shadow scroll horizontal mobile table | RecoFullTable.tsx:117-124 |
| 9 | Consolider 2 boutons "Affiner" | RecoFilterBar.tsx:453-534 |
| 10 | aria-current="page" toggle bar |
page.tsx:471-513 |