176 lines
8.4 KiB
Dart
176 lines
8.4 KiB
Dart
import "package:flutter/material.dart";
|
|
import "package:google_fonts/google_fonts.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";
|
|
|
|
/// É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()),
|
|
);
|
|
}
|
|
|
|
@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: "Ensitech · Paris",
|
|
),
|
|
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: () {},
|
|
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()),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|