import 'package:flutter/material.dart'; /// Custom page route with smooth fade transition class FadePageRoute extends PageRouteBuilder { final Widget page; final Duration duration; FadePageRoute({ required this.page, this.duration = const Duration(milliseconds: 400), }) : super( pageBuilder: (context, animation, secondaryAnimation) => page, transitionDuration: duration, reverseTransitionDuration: duration, transitionsBuilder: (context, animation, secondaryAnimation, child) { return FadeTransition( opacity: animation.drive( Tween( begin: 0.0, end: 1.0, ).chain(CurveTween(curve: Curves.easeInOut)), ), child: child, ); }, ); } /// Custom page route with slide up + fade transition class SlideUpFadePageRoute extends PageRouteBuilder { final Widget page; final Duration duration; SlideUpFadePageRoute({ required this.page, this.duration = const Duration(milliseconds: 350), }) : super( pageBuilder: (context, animation, secondaryAnimation) => page, transitionDuration: duration, reverseTransitionDuration: duration, transitionsBuilder: (context, animation, secondaryAnimation, child) { final offsetAnimation = Tween( begin: const Offset(0, 0.1), end: Offset.zero, ).animate( CurvedAnimation(parent: animation, curve: Curves.easeOutCubic), ); final fadeAnimation = Tween( begin: 0.0, end: 1.0, ).animate(CurvedAnimation(parent: animation, curve: Curves.easeIn)); return FadeTransition( opacity: fadeAnimation, child: SlideTransition(position: offsetAnimation, child: child), ); }, ); } /// Custom page route with scale + fade transition (good for splash to onboarding) class ScaleFadePageRoute extends PageRouteBuilder { final Widget page; final Duration duration; ScaleFadePageRoute({ required this.page, this.duration = const Duration(milliseconds: 450), }) : super( pageBuilder: (context, animation, secondaryAnimation) => page, transitionDuration: duration, reverseTransitionDuration: duration, transitionsBuilder: (context, animation, secondaryAnimation, child) { final scaleAnimation = Tween(begin: 0.95, end: 1.0).animate( CurvedAnimation(parent: animation, curve: Curves.easeOutCubic), ); final fadeAnimation = Tween( begin: 0.0, end: 1.0, ).animate(CurvedAnimation(parent: animation, curve: Curves.easeIn)); return FadeTransition( opacity: fadeAnimation, child: ScaleTransition(scale: scaleAnimation, child: child), ); }, ); }