feat(historique): refonte pixel-perfect avec stats + filtres + tendance 30j (Sprint 4.7)
Inclut le retrait du padding de AppLayout et le wrapper standardisé (mx-auto w-full max-w-[1100px] px-5 py-6 lg:px-9 lg:py-9) ajouté sur 11 pages (Dashboard, Progression, 9 pages Simulation EE/EO/T1) pour laisser chaque page gérer son max-width. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
d8bae9520c
commit
3ce91aaa7b
20 changed files with 1417 additions and 874 deletions
|
|
@ -36,38 +36,41 @@ export function ProgressionPage() {
|
|||
const isPremium = planData ? hasAccess(planData.plan, 'pattern_analysis') : false
|
||||
|
||||
return (
|
||||
<main className="mx-auto max-w-3xl space-y-6 px-4 py-6">
|
||||
<header className="space-y-1">
|
||||
<h1 className="text-lg font-semibold text-ink-primary">Profil de préparation</h1>
|
||||
<p className="text-sm text-ink-secondary">
|
||||
Repérez vos erreurs récurrentes et travaillez-les avec des exercices ciblés.
|
||||
</p>
|
||||
</header>
|
||||
<div className="mx-auto w-full max-w-[1100px] px-5 py-6 lg:px-9 lg:py-9">
|
||||
<main className="mx-auto max-w-3xl space-y-6 px-4 py-6">
|
||||
<header className="space-y-1">
|
||||
<h1 className="text-lg font-semibold text-ink-primary">Profil de préparation</h1>
|
||||
<p className="text-sm text-ink-secondary">
|
||||
Repérez vos erreurs récurrentes et travaillez-les avec des exercices ciblés.
|
||||
</p>
|
||||
</header>
|
||||
|
||||
{isPlanLoading && <Skeleton />}
|
||||
{isPlanLoading && <Skeleton />}
|
||||
|
||||
{!isPlanLoading && planData && !isPremium && (
|
||||
<BlurredProgression onUpgrade={() => navigate('/plan')} />
|
||||
)}
|
||||
{!isPlanLoading && planData && !isPremium && (
|
||||
<BlurredProgression onUpgrade={() => navigate('/plan')} />
|
||||
)}
|
||||
|
||||
{!isPlanLoading && planData && isPremium && (
|
||||
<>
|
||||
{isPatternsLoading && <Skeleton />}
|
||||
{isError && (
|
||||
<Card variant="default" className="border-l-4 border-l-danger p-4">
|
||||
<p className="text-sm text-danger" role="alert">
|
||||
Impossible de charger votre profil de préparation. Réessayez dans quelques instants.
|
||||
</p>
|
||||
<div className="mt-3">
|
||||
<Button variant="secondary" size="sm" onClick={() => navigate(0)}>
|
||||
Rafraîchir
|
||||
</Button>
|
||||
</div>
|
||||
</Card>
|
||||
)}
|
||||
{patternsData && <ProgressionPremium data={patternsData} />}
|
||||
</>
|
||||
)}
|
||||
</main>
|
||||
{!isPlanLoading && planData && isPremium && (
|
||||
<>
|
||||
{isPatternsLoading && <Skeleton />}
|
||||
{isError && (
|
||||
<Card variant="default" className="border-l-4 border-l-danger p-4">
|
||||
<p className="text-sm text-danger" role="alert">
|
||||
Impossible de charger votre profil de préparation. Réessayez dans quelques
|
||||
instants.
|
||||
</p>
|
||||
<div className="mt-3">
|
||||
<Button variant="secondary" size="sm" onClick={() => navigate(0)}>
|
||||
Rafraîchir
|
||||
</Button>
|
||||
</div>
|
||||
</Card>
|
||||
)}
|
||||
{patternsData && <ProgressionPremium data={patternsData} />}
|
||||
</>
|
||||
)}
|
||||
</main>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue