import "package:flutter/material.dart"; import "package:google_fonts/google_fonts.dart"; import "../demo_identity.dart"; import "../theme/ensup_colors.dart"; import "../widgets/ensup_top_bar.dart"; import "../widgets/identification_option.dart"; import "../widgets/brand_corners.dart"; import "home_screen.dart"; import "responsable_screen.dart"; /// Écran de démarrage : identification de l'étudiant (RG01/RG02). class LoginScreen extends StatelessWidget { const LoginScreen({super.key}); void _identifier(BuildContext context) { Navigator.of(context).push( MaterialPageRoute( builder: (_) => const HomeScreen(), settings: const RouteSettings(name: "home"), ), ); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: EnsupColors.soft, body: Stack( children: [ Center( child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 1280, maxHeight: 820), child: Container( margin: const EdgeInsets.all(24), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(16), boxShadow: [ BoxShadow( color: EnsupColors.text.withValues(alpha: 0.14), blurRadius: 60, offset: const Offset(0, 18), ), ], ), clipBehavior: Clip.antiAlias, child: Column( children: [ const EnsupTopBar( brandText: "EME — Emprunt Matériel ENSUP", campusTag: DemoIdentity.loginCampusTag, ), Expanded( child: DecoratedBox( decoration: const BoxDecoration( gradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [Color(0xFFF0F6FF), Color(0xFFF8FAFC)], ), ), child: Center( child: SingleChildScrollView( padding: const EdgeInsets.symmetric( horizontal: 28, vertical: 40, ), child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 560), child: Column( mainAxisSize: MainAxisSize.min, children: [ Container( width: 72, height: 72, decoration: BoxDecoration( gradient: const LinearGradient( colors: [ EnsupColors.blue3, EnsupColors.cyan, ], ), borderRadius: BorderRadius.circular(22), boxShadow: [ BoxShadow( color: EnsupColors.blue3.withValues( alpha: 0.35, ), blurRadius: 24, offset: const Offset(0, 8), ), ], ), child: const Icon( Icons.badge_outlined, color: Colors.white, size: 34, ), ), const SizedBox(height: 20), Text( "Bienvenue sur EME", style: GoogleFonts.darkerGrotesque( fontSize: 34, fontWeight: FontWeight.w900, color: EnsupColors.text, ), ), const SizedBox(height: 8), Text( "Emprunt Matériel ENSUP · Accès réservé aux membres du groupe ENSUP", textAlign: TextAlign.center, style: GoogleFonts.titilliumWeb( fontSize: 14, color: EnsupColors.muted, ), ), const SizedBox(height: 28), IdentificationOption( icon: Icons.qr_code_2, iconColor: EnsupColors.cyan, label: "Scanner ma carte étudiante", description: "Présentez votre carte étudiante dématérialisée à la douchette ou à la tablette", onTap: () => _identifier(context), ), const SizedBox(height: 12), IdentificationOption( icon: Icons.mail_outline, iconColor: EnsupColors.teal, label: "Connexion compte professionnel ENSUP", description: "Utiliser mon adresse e-mail Microsoft 365", onTap: () => _identifier(context), ), const SizedBox(height: 20), Row( children: [ const Expanded( child: Divider(color: EnsupColors.line), ), Padding( padding: const EdgeInsets.symmetric( horizontal: 12, ), child: Text( "ou", style: GoogleFonts.titilliumWeb( fontSize: 12, color: EnsupColors.muted, ), ), ), const Expanded( child: Divider(color: EnsupColors.line), ), ], ), const SizedBox(height: 20), SizedBox( width: double.infinity, child: OutlinedButton.icon( onPressed: () => Navigator.of(context).push( MaterialPageRoute( builder: (_) => const ResponsableScreen(), settings: const RouteSettings( name: "responsable", ), ), ), icon: const Icon( Icons.person_outline, size: 16, ), label: Text( "Accès responsable matériel", style: GoogleFonts.darkerGrotesque( fontWeight: FontWeight.w700, fontSize: 15, ), ), style: OutlinedButton.styleFrom( foregroundColor: EnsupColors.text2, side: const BorderSide( color: EnsupColors.line, width: 1.5, ), padding: const EdgeInsets.symmetric( vertical: 14, ), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular( 10, ), ), ), ), ), ], ), ), ), ), ), ), ], ), ), ), ), const Positioned.fill(child: BrandCorners()), ], ), ); } }