diff --git a/eme-frontend/.gitignore b/eme-frontend/.gitignore new file mode 100644 index 0000000..3820a95 --- /dev/null +++ b/eme-frontend/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ +/coverage/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/eme-frontend/.metadata b/eme-frontend/.metadata new file mode 100644 index 0000000..a7b35d5 --- /dev/null +++ b/eme-frontend/.metadata @@ -0,0 +1,30 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "b45fa18946ecc2d9b4009952c636ba7e2ffbb787" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787 + base_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787 + - platform: web + create_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787 + base_revision: b45fa18946ecc2d9b4009952c636ba7e2ffbb787 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/eme-frontend/README.md b/eme-frontend/README.md new file mode 100644 index 0000000..fa0f189 --- /dev/null +++ b/eme-frontend/README.md @@ -0,0 +1,16 @@ +# eme_frontend + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/eme-frontend/analysis_options.yaml b/eme-frontend/analysis_options.yaml new file mode 100644 index 0000000..5b4c39c --- /dev/null +++ b/eme-frontend/analysis_options.yaml @@ -0,0 +1,6 @@ +include: package:flutter_lints/flutter.yaml + +linter: + rules: + # Convention projet (CLAUDE.md) : guillemets doubles en Dart. + prefer_single_quotes: false diff --git a/eme-frontend/lib/main.dart b/eme-frontend/lib/main.dart new file mode 100644 index 0000000..898997e --- /dev/null +++ b/eme-frontend/lib/main.dart @@ -0,0 +1,21 @@ +import "package:flutter/material.dart"; +import "theme/ensup_theme.dart"; +import "screens/home_screen.dart"; + +void main() { + runApp(const EmeApp()); +} + +class EmeApp extends StatelessWidget { + const EmeApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: "EME — Emprunt Matériel ENSUP", + debugShowCheckedModeBanner: false, + theme: buildEnsupTheme(), + home: const HomeScreen(), + ); + } +} diff --git a/eme-frontend/lib/screens/home_screen.dart b/eme-frontend/lib/screens/home_screen.dart new file mode 100644 index 0000000..ff2da71 --- /dev/null +++ b/eme-frontend/lib/screens/home_screen.dart @@ -0,0 +1,105 @@ +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/profile_card.dart"; +import "../widgets/action_card.dart"; + +/// Écran d'accueil étudiant : profil + choix Emprunter / Restituer. +class HomeScreen extends StatelessWidget { + const HomeScreen({super.key}); + + void _bientot(BuildContext context, String action) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text("$action — écran à venir")), + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: EnsupColors.soft, + body: 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( + campusTag: "Paris · Ensitech", + userName: "Lucas Martin", + userInitials: "LM", + ), + Expanded( + child: SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 28), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const ProfileCard( + name: "Lucas Martin", + subtitle: "Étudiant · BTS SIO 2ème année · Ensitech Paris", + initials: "LM", + ), + const SizedBox(height: 24), + Text( + "Que souhaitez-vous faire ?", + style: GoogleFonts.darkerGrotesque( + fontSize: 28, + fontWeight: FontWeight.w900, + color: EnsupColors.text, + ), + ), + const SizedBox(height: 18), + IntrinsicHeight( + child: Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded( + child: ActionCard( + icon: Icons.inventory_2_outlined, + title: "EMPRUNTER", + description: + "Accéder au catalogue et emprunter du matériel éducatif", + color: EnsupColors.cyan, + onTap: () => _bientot(context, "Emprunter"), + ), + ), + const SizedBox(width: 16), + Expanded( + child: ActionCard( + icon: Icons.assignment_return_outlined, + title: "RESTITUER", + description: "Restituer un matériel que vous avez emprunté", + color: EnsupColors.teal, + onTap: () => _bientot(context, "Restituer"), + ), + ), + ], + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/eme-frontend/lib/theme/ensup_colors.dart b/eme-frontend/lib/theme/ensup_colors.dart new file mode 100644 index 0000000..b74d01c --- /dev/null +++ b/eme-frontend/lib/theme/ensup_colors.dart @@ -0,0 +1,22 @@ +import "package:flutter/material.dart"; + +/// Couleurs de la charte graphique ENSUP. +class EnsupColors { + EnsupColors._(); + + static const Color cyan = Color(0xFF009CE0); + static const Color blue1 = Color(0xFF006DAC); + static const Color blue2 = Color(0xFF0090D7); + static const Color blue3 = Color(0xFF005CAA); + static const Color teal = Color(0xFF198AB4); + static const Color purple = Color(0xFF7E5AA2); + static const Color red = Color(0xFFDD1B3D); + static const Color green = Color(0xFF16A34A); + + static const Color text = Color(0xFF0F172A); + static const Color text2 = Color(0xFF334155); + static const Color muted = Color(0xFF64748B); + static const Color line = Color(0xFFE2E8F0); + static const Color soft = Color(0xFFF8FAFC); + static const Color white = Color(0xFFFFFFFF); +} diff --git a/eme-frontend/lib/theme/ensup_theme.dart b/eme-frontend/lib/theme/ensup_theme.dart new file mode 100644 index 0000000..7d755c0 --- /dev/null +++ b/eme-frontend/lib/theme/ensup_theme.dart @@ -0,0 +1,23 @@ +import "package:flutter/material.dart"; +import "package:google_fonts/google_fonts.dart"; +import "ensup_colors.dart"; + +/// Thème global : couleurs ENSUP et police de corps Titillium Web. +/// Les titres utilisent Darker Grotesque, appliqué directement dans les widgets. +ThemeData buildEnsupTheme() { + final base = ThemeData( + useMaterial3: true, + colorScheme: ColorScheme.fromSeed( + seedColor: EnsupColors.cyan, + primary: EnsupColors.cyan, + ), + scaffoldBackgroundColor: EnsupColors.soft, + ); + + return base.copyWith( + textTheme: GoogleFonts.titilliumWebTextTheme(base.textTheme).apply( + bodyColor: EnsupColors.text, + displayColor: EnsupColors.text, + ), + ); +} diff --git a/eme-frontend/lib/widgets/action_card.dart b/eme-frontend/lib/widgets/action_card.dart new file mode 100644 index 0000000..0fa4565 --- /dev/null +++ b/eme-frontend/lib/widgets/action_card.dart @@ -0,0 +1,76 @@ +import "package:flutter/material.dart"; +import "package:google_fonts/google_fonts.dart"; +import "../theme/ensup_colors.dart"; + +/// Grande carte d'action de l'accueil (Emprunter / Restituer). +class ActionCard extends StatelessWidget { + const ActionCard({ + super.key, + required this.icon, + required this.title, + required this.description, + required this.color, + this.onTap, + }); + + final IconData icon; + final String title; + final String description; + final Color color; + final VoidCallback? onTap; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(16), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 32), + decoration: BoxDecoration( + color: color.withValues(alpha: 0.07), + borderRadius: BorderRadius.circular(16), + border: Border.all(color: color.withValues(alpha: 0.2), width: 2), + ), + child: Column( + children: [ + Container( + width: 60, + height: 60, + decoration: BoxDecoration( + gradient: LinearGradient(colors: [color, color.withValues(alpha: 0.75)]), + borderRadius: BorderRadius.circular(18), + boxShadow: [ + BoxShadow( + color: color.withValues(alpha: 0.35), + blurRadius: 16, + offset: const Offset(0, 4), + ), + ], + ), + child: Icon(icon, color: Colors.white, size: 28), + ), + const SizedBox(height: 14), + Text( + title, + style: GoogleFonts.darkerGrotesque( + fontSize: 26, + fontWeight: FontWeight.w900, + color: EnsupColors.text, + ), + ), + const SizedBox(height: 6), + Text( + description, + textAlign: TextAlign.center, + style: GoogleFonts.titilliumWeb( + fontSize: 13, + color: EnsupColors.muted, + height: 1.5, + ), + ), + ], + ), + ), + ); + } +} diff --git a/eme-frontend/lib/widgets/ensup_top_bar.dart b/eme-frontend/lib/widgets/ensup_top_bar.dart new file mode 100644 index 0000000..26e2483 --- /dev/null +++ b/eme-frontend/lib/widgets/ensup_top_bar.dart @@ -0,0 +1,105 @@ +import "package:flutter/material.dart"; +import "package:google_fonts/google_fonts.dart"; +import "../theme/ensup_colors.dart"; + +/// Barre supérieure ENSUP : marque EME, campus et utilisateur connecté. +class EnsupTopBar extends StatelessWidget { + const EnsupTopBar({ + super.key, + required this.campusTag, + required this.userName, + required this.userInitials, + }); + + final String campusTag; + final String userName; + final String userInitials; + + @override + Widget build(BuildContext context) { + return Container( + height: 56, + padding: const EdgeInsets.symmetric(horizontal: 28), + color: EnsupColors.blue3, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + const Icon(Icons.devices_other, color: Colors.white, size: 18), + const SizedBox(width: 10), + Text( + "EME", + style: GoogleFonts.darkerGrotesque( + color: Colors.white, + fontWeight: FontWeight.w900, + fontSize: 22, + letterSpacing: 0.3, + ), + ), + ], + ), + Row( + children: [ + Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4), + decoration: BoxDecoration( + color: Colors.white.withValues(alpha: 0.15), + borderRadius: BorderRadius.circular(999), + border: Border.all(color: Colors.white.withValues(alpha: 0.2)), + ), + child: Text( + campusTag, + style: GoogleFonts.titilliumWeb( + color: Colors.white, + fontSize: 12, + fontWeight: FontWeight.w600, + ), + ), + ), + const SizedBox(width: 12), + _Avatar(initials: userInitials), + const SizedBox(width: 8), + Text( + userName, + style: GoogleFonts.titilliumWeb( + color: Colors.white, + fontSize: 13, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ], + ), + ); + } +} + +class _Avatar extends StatelessWidget { + const _Avatar({required this.initials}); + + final String initials; + + @override + Widget build(BuildContext context) { + return Container( + width: 30, + height: 30, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: const LinearGradient(colors: [EnsupColors.teal, EnsupColors.cyan]), + border: Border.all(color: Colors.white.withValues(alpha: 0.3), width: 2), + ), + alignment: Alignment.center, + child: Text( + initials, + style: GoogleFonts.darkerGrotesque( + color: Colors.white, + fontWeight: FontWeight.w900, + fontSize: 12, + ), + ), + ); + } +} diff --git a/eme-frontend/lib/widgets/profile_card.dart b/eme-frontend/lib/widgets/profile_card.dart new file mode 100644 index 0000000..40d519d --- /dev/null +++ b/eme-frontend/lib/widgets/profile_card.dart @@ -0,0 +1,91 @@ +import "package:flutter/material.dart"; +import "package:google_fonts/google_fonts.dart"; +import "../theme/ensup_colors.dart"; + +/// Carte de profil de l'étudiant identifié (accueil). +class ProfileCard extends StatelessWidget { + const ProfileCard({ + super.key, + required this.name, + required this.subtitle, + required this.initials, + }); + + final String name; + final String subtitle; + final String initials; + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 18, vertical: 14), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + EnsupColors.cyan.withValues(alpha: 0.06), + EnsupColors.teal.withValues(alpha: 0.04), + ], + ), + borderRadius: BorderRadius.circular(12), + border: Border.all(color: EnsupColors.cyan.withValues(alpha: 0.15), width: 1.5), + ), + child: Row( + children: [ + Container( + width: 48, + height: 48, + decoration: const BoxDecoration( + shape: BoxShape.circle, + gradient: LinearGradient(colors: [EnsupColors.teal, EnsupColors.cyan]), + ), + alignment: Alignment.center, + child: Text( + initials, + style: GoogleFonts.darkerGrotesque( + color: Colors.white, + fontWeight: FontWeight.w900, + fontSize: 18, + ), + ), + ), + const SizedBox(width: 14), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + name, + style: GoogleFonts.darkerGrotesque( + fontWeight: FontWeight.w800, + fontSize: 20, + color: EnsupColors.text, + ), + ), + const SizedBox(height: 2), + Text( + subtitle, + style: GoogleFonts.titilliumWeb(fontSize: 12, color: EnsupColors.muted), + ), + ], + ), + ), + Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 5), + decoration: BoxDecoration( + color: EnsupColors.green.withValues(alpha: 0.12), + borderRadius: BorderRadius.circular(999), + ), + child: Text( + "Connecté", + style: GoogleFonts.titilliumWeb( + fontSize: 12, + fontWeight: FontWeight.w600, + color: EnsupColors.green, + ), + ), + ), + ], + ), + ); + } +} diff --git a/eme-frontend/pubspec.lock b/eme-frontend/pubspec.lock new file mode 100644 index 0000000..d47afde --- /dev/null +++ b/eme-frontend/pubspec.lock @@ -0,0 +1,373 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + async: + dependency: transitive + description: + name: async + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 + url: "https://pub.dev" + source: hosted + version: "2.13.1" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.dev" + source: hosted + version: "3.0.7" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" + url: "https://pub.dev" + source: hosted + version: "1.0.9" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + sha256: "4e9391085e524954a51e3625b7c9c7e9851dc3f376603208bb45c24b9a66255d" + url: "https://pub.dev" + source: hosted + version: "8.1.0" + http: + dependency: transitive + description: + name: http + sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" + url: "https://pub.dev" + source: hosted + version: "1.6.0" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + jni: + dependency: transitive + description: + name: jni + sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f + url: "https://pub.dev" + source: hosted + version: "1.0.0" + jni_flutter: + dependency: transitive + description: + name: jni_flutter + sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" + source: hosted + version: "0.12.17" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" + source: hosted + version: "1.17.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: a7f4874f987173da295a61c181b8ee71dab59b332a486b391babf26a1b884825 + url: "https://pub.dev" + source: hosted + version: "2.1.6" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "6d13aece7b3f5c5a9731eaf553ff9dcbc2eff41087fd2df587fd0fed9a3eb0c4" + url: "https://pub.dev" + source: hosted + version: "2.5.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: "58c2005f147315b11e9b4a7bc889cd5203e250cba8e3f012dae259b4972b5c16" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "484838772624c3a4b94f1e44a3e19897fee738f2d5c4ce448443b0417f7c9dda" + url: "https://pub.dev" + source: hosted + version: "2.1.3" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + url: "https://pub.dev" + source: hosted + version: "0.7.7" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" + url: "https://pub.dev" + source: hosted + version: "15.2.0" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" +sdks: + dart: ">=3.10.0 <4.0.0" + flutter: ">=3.38.0" diff --git a/eme-frontend/pubspec.yaml b/eme-frontend/pubspec.yaml new file mode 100644 index 0000000..875a7d7 --- /dev/null +++ b/eme-frontend/pubspec.yaml @@ -0,0 +1,90 @@ +name: eme_frontend +description: "A new Flutter project." +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.0.0+1 + +environment: + sdk: ^3.10.0 + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.8 + google_fonts: ^8.1.0 + +dev_dependencies: + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^6.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/to/asset-from-package + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/to/font-from-package diff --git a/eme-frontend/test/widget_test.dart b/eme-frontend/test/widget_test.dart new file mode 100644 index 0000000..94b47da --- /dev/null +++ b/eme-frontend/test/widget_test.dart @@ -0,0 +1,11 @@ +import "package:flutter_test/flutter_test.dart"; +import "package:eme_frontend/main.dart"; + +void main() { + testWidgets("L'accueil affiche les actions Emprunter et Restituer", (tester) async { + await tester.pumpWidget(const EmeApp()); + + expect(find.text("EMPRUNTER"), findsOneWidget); + expect(find.text("RESTITUER"), findsOneWidget); + }); +} diff --git a/eme-frontend/web/favicon.png b/eme-frontend/web/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/eme-frontend/web/favicon.png differ diff --git a/eme-frontend/web/icons/Icon-192.png b/eme-frontend/web/icons/Icon-192.png new file mode 100644 index 0000000..b749bfe Binary files /dev/null and b/eme-frontend/web/icons/Icon-192.png differ diff --git a/eme-frontend/web/icons/Icon-512.png b/eme-frontend/web/icons/Icon-512.png new file mode 100644 index 0000000..88cfd48 Binary files /dev/null and b/eme-frontend/web/icons/Icon-512.png differ diff --git a/eme-frontend/web/icons/Icon-maskable-192.png b/eme-frontend/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000..eb9b4d7 Binary files /dev/null and b/eme-frontend/web/icons/Icon-maskable-192.png differ diff --git a/eme-frontend/web/icons/Icon-maskable-512.png b/eme-frontend/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000..d69c566 Binary files /dev/null and b/eme-frontend/web/icons/Icon-maskable-512.png differ diff --git a/eme-frontend/web/index.html b/eme-frontend/web/index.html new file mode 100644 index 0000000..80c8348 --- /dev/null +++ b/eme-frontend/web/index.html @@ -0,0 +1,38 @@ + + +
+ +