feat: complete 20-screen onboarding flow

Full quiz flow s01-s20: splash, intro, value prop, social proof,
name/skin-type/age/concerns/goal quiz with insights, analysing loader,
result with skin score, AM/PM routines, ingredient science, signup, welcome.

Duolingo-style design: flat cards, pressable SButton (Stack trick),
4px progress bar, mascot moods (wave/think/analyze/celebrate),
confetti on result+welcome, personalized content throughout.
This commit is contained in:
mav
2026-05-28 17:11:27 +02:00
parent 6311088256
commit 93042cbb4c
26 changed files with 2582 additions and 2 deletions

27
lib/router.dart Normal file
View File

@@ -0,0 +1,27 @@
import 'package:flutter/material.dart';
Route<T> slideRoute<T>(Widget page) => PageRouteBuilder<T>(
pageBuilder: (_, a, __) => page,
transitionsBuilder: (_, a, __, child) => SlideTransition(
position: Tween<Offset>(begin: const Offset(1, 0), end: Offset.zero)
.animate(CurvedAnimation(parent: a, curve: Curves.easeOut)),
child: child,
),
transitionDuration: const Duration(milliseconds: 320),
);
Route<T> fadeRoute<T>(Widget page) => PageRouteBuilder<T>(
pageBuilder: (_, a, __) => page,
transitionsBuilder: (_, a, __, child) => FadeTransition(opacity: a, child: child),
transitionDuration: const Duration(milliseconds: 400),
);
Route<T> scaleRoute<T>(Widget page) => PageRouteBuilder<T>(
pageBuilder: (_, a, __) => page,
transitionsBuilder: (_, a, __, child) => ScaleTransition(
scale: Tween<double>(begin: 0.88, end: 1.0)
.animate(CurvedAnimation(parent: a, curve: Curves.easeOut)),
child: FadeTransition(opacity: a, child: child),
),
transitionDuration: const Duration(milliseconds: 350),
);