diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 854f38b..ecaf2e9 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -29,6 +29,40 @@ Chaque entrée suit ce format : --- +## [Unreleased] — 2026-04-25 — Sprint UI Polish — Sidebar + Topbar + Dashboard + +### Added + +- `src/app/Topbar.tsx` — topbar sticky avec backdrop-blur, breadcrumb "Expria › {page}", barre de recherche (placeholder), icônes raccourcis clavier et notifications. +- `src/app/route-titles.ts` — mapping centralisé pathname → titre de page, consommé par Topbar. +- `src/features/dashboard/components/NclcHero.tsx` — carte hero NCLC avec jauge horizontale 5→10 + anneau SVG score circulaire. Supporte état placeholder (Free/vide). +- `src/features/dashboard/components/StatCards.tsx` — 3 cartes métriques (simulations restantes, NCLC estimé, dernier score avec delta coloré). +- `src/features/dashboard/components/RecentSimulations.tsx` — liste 3 dernières simulations avec badge NCLC coloré + navigation vers `/rapport/:id`. +- `src/features/dashboard/components/NextStepCard.tsx` — carte "Prochaine étape" recommandée, contenu statique par plan. +- `src/features/dashboard/components/DashboardFreeView.tsx` — vue dashboard Free (hero placeholder, stat cards, premiers pas, PaywallBanner). +- `src/features/dashboard/components/DashboardStandardView.tsx` — vue dashboard Standard (hero NCLC dernière simu, simulations récentes, NextStepCard). +- `src/features/dashboard/components/DashboardPremiumView.tsx` — vue dashboard Premium (tout Standard + MonProfilPreparation). + +### Changed + +- `src/app/Sidebar.tsx` — icônes lucide-react (LayoutGrid, Pencil, Mic, etc.), cadenas Lock sur items verrouillés, badge upgrade ArrowUpCircle sur "Mon plan", user footer (avatar initiales + nom + plan + ThemeToggle), logo header "EX|PRIA" avec séparateur et sous-titre. +- `src/app/AppLayout.tsx` — intégration Topbar sticky, padding reporté sur wrapper contenu. +- `src/features/dashboard/pages/DashboardPage.tsx` — refactoré en orchestrateur : routing vers Free/Standard/Premium via `hasAccess`. Aucun `plan === 'xxx'` (Règle D). +- `src/features/dashboard/components/PaywallBanner.tsx` — refonte full-width + correction tokens morts Boréal (`border-brand-100`, `dark:border-brand/20`). + +### Removed + +- `src/app/MobileHeader.tsx` — fonctionnalité reprise par Topbar + Sidebar (0 consommateur confirmé par grep). + +### Notes + +- Tests : 122/122 verts. Typecheck : 0 erreur. +- Contenu NextStepCard statique par plan (pas d'endpoint backend dédié). +- Hero NCLC : Premium → usePatterns, Standard → NCLC dernière simulation, Free → état placeholder. +- Timeout API intermittent (cold start Render) préexistant — cause le fallback temporaire plan=free au chargement initial. + +--- + ## [Unreleased] — 2026-04-24 — Sprint DA Charcoal — Reskin complet ### Changed diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index f4b13a3..bfa4a67 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -94,6 +94,13 @@ - Renommage tokens sur ~45 composants + inversion dark:/light: shadcn - ADR 006 mis à jour +## Sprint UI Polish — Sidebar + Topbar + Dashboard ✅ + +- Sidebar : icônes lucide, cadenas gating, badge upgrade, user footer, logo "EX|PRIA" +- Topbar : sticky backdrop-blur, breadcrumb centralisé, recherche placeholder +- Dashboard : split Free/Standard/Premium, NclcHero + StatCards + RecentSimulations + NextStepCard + PaywallBanner refonte +- MobileHeader supprimé (remplacé par Topbar) + ## Sprint 4 — Simulations EO (audio) 16. MediaRecorder + upload audio EO T1/T3 diff --git a/src/app/AppLayout.tsx b/src/app/AppLayout.tsx index 234bce1..297e83d 100644 --- a/src/app/AppLayout.tsx +++ b/src/app/AppLayout.tsx @@ -1,20 +1,20 @@ /** * Layout applicatif — enveloppe toutes les routes privées. * - * Desktop (≥ 1024px) : Sidebar fixe 240px + zone contenu principale. - * Mobile (< 1024px) : MobileHeader sticky + drawer slide-in + BottomNav fixe. + * Desktop (≥ 1024px) : Sidebar fixe 230px + Topbar sticky + zone contenu. + * Mobile (< 1024px) : Topbar avec hamburger + drawer slide-in + BottomNav fixe. * * Le drawer mobile se ferme automatiquement à chaque changement de route * (useEffect sur location.pathname). * - * Règle L : tokens Direction H exclusivement. + * Règle L : tokens du design system exclusivement. * Règle H : aucune logique métier — plan lu depuis le cache TanStack Query. */ import { useState, useEffect } from 'react' import { useLocation } from 'react-router-dom' import { Sidebar } from './Sidebar' -import { MobileHeader } from './MobileHeader' +import { Topbar } from './Topbar' import { BottomNav } from './BottomNav' import { usePlan } from '@/features/dashboard/hooks/usePlan' import { cn } from '@/shared/lib/utils' @@ -31,8 +31,6 @@ export function AppLayout({ children }: AppLayoutProps) { const plan: Plan = data?.plan ?? 'free' // Ferme le drawer à chaque changement de route. - // Synchronisation UI → router state : pattern légitime (source externe = React - // Router). Bail-out React si déjà fermé = zéro cascading render en pratique. useEffect(() => { // eslint-disable-next-line react-hooks/set-state-in-effect setIsMobileMenuOpen(false) @@ -51,9 +49,6 @@ export function AppLayout({ children }: AppLayoutProps) { - {/* ── MOBILE — Header sticky ─────────────────────────────────── */} - setIsMobileMenuOpen(true)} /> - {/* ── MOBILE — Drawer overlay ────────────────────────────────── */}