From 869124be31a9552c02c7c61d0f3f607afe3f504f Mon Sep 17 00:00:00 2001 From: NayMak Date: Mon, 21 Feb 2022 17:19:25 +0100 Subject: [PATCH] feat(ui): improve ui (#31) --- ios/Runner/Info.plist | 4 - lib/app/app.dart | 13 +- lib/l10n/app_en.arb | 38 +- lib/l10n/app_fr.arb | 8 +- lib/view/homepage/homepage.dart | 132 ++- lib/view/puzzle_page/puzzle_page.dart | 345 +++++--- lib/view/puzzle_page/widgets/puzzle.dart | 57 +- lib/view/puzzle_page/widgets/title.dart | 22 +- lib/view/widgets/puzzle.dart | 6 + ...k~ebfbc8364658439cfc814e090745f054eb014fd7 | 787 ++++++++++++++++++ pubspec.yaml | 3 +- 11 files changed, 1173 insertions(+), 242 deletions(-) create mode 100644 pubspec.lock~ebfbc8364658439cfc814e090745f054eb014fd7 diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index b621347..ce7339d 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -31,15 +31,11 @@ UISupportedInterfaceOrientations UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight UIViewControllerBasedStatusBarAppearance diff --git a/lib/app/app.dart b/lib/app/app.dart index 33fed8c..cb585bc 100644 --- a/lib/app/app.dart +++ b/lib/app/app.dart @@ -1,7 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:google_fonts/google_fonts.dart'; import 'package:puzzle/bloc/bloc.dart'; +import 'package:puzzle/services/shared.dart'; import 'package:puzzle/theme/theme.dart'; import 'package:puzzle/view/view.dart'; import 'package:go_router/go_router.dart'; @@ -16,6 +19,10 @@ class PuzzleApp extends StatelessWidget { builder: (context) { final _router = _buildRouter(); + if (isMobile()) { + SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + } + return MaterialApp.router( routeInformationParser: _router.routeInformationParser, routerDelegate: _router.routerDelegate, @@ -23,8 +30,10 @@ class PuzzleApp extends StatelessWidget { localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, theme: ThemeData( - primarySwatch: xpehoGreen, - ), + primarySwatch: xpehoGreen, + textTheme: GoogleFonts.aBeeZeeTextTheme(), + backgroundColor: Colors.white), + themeMode: ThemeMode.light, ); }, ); diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 83ab0fa..128521a 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -1,11 +1,11 @@ { - "app_name": "Puzzle", + "app_name": "Flutter Puzzle Hack", "@app_name": { "description": "Name of the application" }, - "shuffle": "Shuffle", - "@shuffle": { - "description": "Shuffle button label" + "company_name": "XPEHO", + "@company_name": { + "description": "Company name" }, "complexity": "Complexity {complexityValue}", "@complexity": { @@ -17,15 +17,7 @@ } } }, - "solve": "Solve", - "@solve": { - "description": "Solve button label" - }, - "team_name": "Xpeho mobile", - "@team_name": { - "description": "Team name" - }, - "moves": "Moves {count}", + "moves": "Moves: {count}", "@moves": { "description": "Moves label", "placeholders": { @@ -39,10 +31,6 @@ "@play": { "description": "Play button label" }, - "victory_title": "You win !", - "@victory_title": { - "description": "Victory title" - }, "restart_btn": "Restart", "@restart_btn": { "description": "Restart button label" @@ -68,5 +56,21 @@ "empty_nickname_error": "Nickname can't be empty", "@empty_nickname_error": { "description": "Error displayed when the user validate a null nickname" + }, + "shuffle": "Shuffle", + "@shuffle": { + "description": "Shuffle button label" + }, + "solve": "Solve", + "@solve": { + "description": "Solve button label" + }, + "team_name": "Xpeho mobile", + "@team_name": { + "description": "Team name" + }, + "victory_title": "You win !", + "@victory_title": { + "description": "Victory title" } } \ No newline at end of file diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index a9969fb..ff2526a 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -1,7 +1,11 @@ { - "app_name": "Puzzle", - "shuffle": "Mélanger", + "app_name": "Flutter Puzzle Hack", + "company_name": "XPEHO", "complexity": "Complexité {complexityValue}", + "moves": "Déplacements : {count}", + "play": "Jouer", + "restart_btn": "Recommencer", + "shuffle": "Mélanger", "solve": "Résoudre", "team_name": "Xpeho mobile", "moves": "Mouvements {count}", diff --git a/lib/view/homepage/homepage.dart b/lib/view/homepage/homepage.dart index 0d75d29..ea50634 100644 --- a/lib/view/homepage/homepage.dart +++ b/lib/view/homepage/homepage.dart @@ -21,90 +21,86 @@ class _HomePageState extends State { @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: Colors.grey[300], body: Padding( padding: const EdgeInsets.all(16.0), - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - child: Center( - child: Text( - AppLocalizations.of(context)!.team_name, - textAlign: TextAlign.center, - style: TextStyle( - color: Theme.of(context).primaryColor, - fontSize: 48, - fontFamily: "QueenOfTheModernAge", - ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Center( + child: Text( + AppLocalizations.of(context)!.team_name, + textAlign: TextAlign.center, + style: TextStyle( + color: Theme.of(context).primaryColor, + fontSize: 48, + fontFamily: "QueenOfTheModernAge", ), ), ), - Expanded( - child: Center( - child: Column( - children: [ - if (isFirebaseUsable()) - TextFormField( - cursorWidth: 1, - textInputAction: TextInputAction.done, - decoration: InputDecoration( - hintText: - AppLocalizations.of(context)!.nickname_hint, - contentPadding: const EdgeInsets.all(12.0), - fillColor: Colors.white, - focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: Colors.grey[600]!, - ), - ), - border: OutlineInputBorder( - borderSide: BorderSide( - color: Colors.grey[600]!, - ), + ), + Expanded( + child: Center( + child: Column( + children: [ + if (isFirebaseUsable()) + TextFormField( + cursorWidth: 1, + textInputAction: TextInputAction.done, + decoration: InputDecoration( + hintText: AppLocalizations.of(context)!.nickname_hint, + contentPadding: const EdgeInsets.all(12.0), + fillColor: Colors.white, + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: Colors.grey[600]!, ), ), - style: TextStyle( - fontSize: 16, - color: Colors.grey[600]!, + border: OutlineInputBorder( + borderSide: BorderSide( + color: Colors.grey[600]!, + ), ), - onChanged: (term) { - setState(() { - nickname = term; - }); - }, ), - const SizedBox(height: 16), - MenuButton( - redirection: () { - LeaderboardProvider().updateUserNickname(nickname); - GoRouter.of(context).go( - PuzzlePage.route, - ); + style: TextStyle( + fontSize: 16, + color: Colors.grey[600]!, + ), + onChanged: (term) { + setState(() { + nickname = term; + }); }, - text: AppLocalizations.of(context)!.play, - isClickable: nickname.isNotEmpty, ), - ], - ), + const SizedBox(height: 16), + MenuButton( + redirection: () { + LeaderboardProvider().updateUserNickname(nickname); + GoRouter.of(context).go( + PuzzlePage.route, + ); + }, + text: AppLocalizations.of(context)!.play, + isClickable: nickname.isNotEmpty, + ), + ], ), ), - if (isFirebaseUsable()) - Expanded( - child: Center( - child: MenuButton( - redirection: () => GoRouter.of(context).go( - LeaderboardPage.route, - ), - text: AppLocalizations.of(context)!.leaderboard_btn, - isClickable: true, + ), + if (isFirebaseUsable()) + Expanded( + child: Center( + child: MenuButton( + redirection: () => GoRouter.of(context).go( + LeaderboardPage.route, ), + text: AppLocalizations.of(context)!.leaderboard_btn, + isClickable: true, ), ), - ], - ), + ), + ], ), ), ); diff --git a/lib/view/puzzle_page/puzzle_page.dart b/lib/view/puzzle_page/puzzle_page.dart index 77e2d70..d3cf7c9 100644 --- a/lib/view/puzzle_page/puzzle_page.dart +++ b/lib/view/puzzle_page/puzzle_page.dart @@ -150,64 +150,117 @@ class _PuzzlePageState extends State { /// Build the portrait mode Widget _buildPortrait(BuildContext context, PuzzleState state) { return Scaffold( - bottomNavigationBar: Padding( - padding: const EdgeInsets.all(16.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - IconButton( - onPressed: () => _shuffle(context), - icon: const Icon(Icons.shuffle), - ), - IconButton( - onPressed: () => _reset(context), - icon: const Icon(Icons.refresh), - ), - IconButton( - onPressed: _pickImage, - icon: const Icon(Icons.attach_file), - ), - ], - ), - ), + backgroundColor: Colors.white, body: SafeArea( child: Padding( padding: const EdgeInsets.all(16.0), - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Flexible( - flex: 2, - fit: FlexFit.tight, - child: Text( - AppLocalizations.of(context)!.moves(state.moves), - style: Theme.of(context).textTheme.headline5!, - ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: isMobile() + ? const EdgeInsets.symmetric(vertical: 24.0) + : const EdgeInsets.symmetric(vertical: 8.0), + child: const PuzzleTitle(), + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + AppLocalizations.of(context)!.moves(state.moves), + style: Theme.of(context).textTheme.headline5!, + ), + const SizedBox( + height: 12.0, + ), + Focus( + onKey: (_, event) => _onKeyEvent( + context, + event, + ), + autofocus: true, + canRequestFocus: true, + focusNode: _puzzleFocusNode, + child: FractionallySizedBox( + widthFactor: isMobile() ? 1 : 0.7, + child: Puzzle( + size: state.complexity, + data: state.data, + onTileTapped: (value) { + _trySwap(context, value); + _puzzleFocusNode.requestFocus(); + }, + ), + ), + ), + ], ), - Flexible( - flex: 10, - child: Focus( - onKey: (_, event) => _onKeyEvent( - context, - event, + ), + Padding( + padding: isMobile() + ? const EdgeInsets.symmetric(vertical: 24.0) + : const EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + ElevatedButton( + onPressed: () => _shuffle(context), + style: ElevatedButton.styleFrom( + primary: Colors.grey, + shape: const CircleBorder(), + padding: const EdgeInsets.all(18), + elevation: 0, + ), + child: const Icon( + Icons.shuffle, + color: Colors.white, + ), ), - autofocus: true, - canRequestFocus: true, - focusNode: _puzzleFocusNode, - child: Puzzle( - size: state.complexity, - data: state.data, - onTileTapped: (value) { - _trySwap(context, value); - _puzzleFocusNode.requestFocus(); - }, + ElevatedButton( + onPressed: () => _reset(context), + style: ElevatedButton.styleFrom( + primary: Colors.grey, + shape: const CircleBorder(), + padding: const EdgeInsets.all(18), + elevation: 0, + ), + child: const Icon( + Icons.refresh, + color: Colors.white, + ), ), - ), + ElevatedButton( + onPressed: () => _pickImage, + style: ElevatedButton.styleFrom( + primary: Colors.grey, + shape: const CircleBorder(), + padding: const EdgeInsets.all(18), + elevation: 0, + ), + child: const Icon( + Icons.attach_file, + color: Colors.white, + ), + ), + ElevatedButton( + onPressed: () => _pickImage, + style: ElevatedButton.styleFrom( + primary: Colors.grey, + shape: const CircleBorder(), + padding: const EdgeInsets.all(18), + elevation: 0, + ), + child: const Icon( + Icons.volume_mute, + color: Colors.white, + ), + ), + ], ), - ], - ), + ), + ], ), ), ), @@ -217,77 +270,134 @@ class _PuzzlePageState extends State { /// Build the landscape mode Widget _buildLandscape(BuildContext context, PuzzleState state) { return Scaffold( - body: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, + backgroundColor: Colors.white, + body: Row( children: [ - const Padding( - padding: EdgeInsets.all(24.0), - child: PuzzleTitle(), - ), Expanded( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + child: Column( children: [ - SizedBox( - width: MediaQuery.of(context).size.width * .3, - height: double.infinity, - child: Material( - color: Colors.grey.shade100, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Text( - AppLocalizations.of(context)!.moves(state.moves), - style: Theme.of(context).textTheme.headline5!, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, + Expanded( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Wrap( + direction: Axis.vertical, + spacing: 24, + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Row( + children: [ + ElevatedButton( + onPressed: () => _shuffle(context), + style: ElevatedButton.styleFrom( + primary: Colors.grey, + shape: const CircleBorder(), + padding: const EdgeInsets.all(32), + elevation: 0, + ), + child: const Icon( + Icons.shuffle, + color: Colors.white, + ), + ), + const SizedBox(width: 24), + ElevatedButton( + onPressed: () => _reset(context), + style: ElevatedButton.styleFrom( + primary: Colors.grey, + shape: const CircleBorder(), + padding: const EdgeInsets.all(32), + elevation: 0, + ), + child: const Icon( + Icons.refresh, + color: Colors.white, + ), + ), + ], + ), + Row( + children: [ + ElevatedButton( + onPressed: () => _pickImage, + style: ElevatedButton.styleFrom( + primary: Colors.grey, + shape: const CircleBorder(), + padding: const EdgeInsets.all(32), + elevation: 0, + ), + child: const Icon( + Icons.attach_file, + color: Colors.white, + ), + ), + const SizedBox(width: 24), + ElevatedButton( + onPressed: () => _pickImage, + style: ElevatedButton.styleFrom( + primary: Colors.grey, + shape: const CircleBorder(), + padding: const EdgeInsets.all(32), + elevation: 0, + ), + child: const Icon( + Icons.volume_up, + color: Colors.white, + ), + ), + ], + ) + /* + Visibility( + visible: false, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, children: [ - IconButton( - onPressed: () => _shuffle(context), - icon: const Icon( - Icons.shuffle, + const Icon(Icons.volume_down), + Flexible( + child: Slider( + activeColor: Colors.indigoAccent, + min: 0.0, + max: 1.0, + onChanged: (newRating) async { + setState(() { + audioService.volume = newRating; + }); + audioService.updateVolume(newRating); + _puzzleFocusNode.requestFocus(); + }, + value: audioService.volume, ), ), - IconButton( - onPressed: _pickImage, - icon: const Icon(Icons.attach_file), - ), + const Icon(Icons.volume_up), ], ), - const SizedBox(height: 16), - if (!isMobile()) - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Icon(Icons.volume_down), - Flexible( - child: Slider( - activeColor: Colors.indigoAccent, - min: 0.0, - max: 1.0, - onChanged: (newRating) async { - setState(() { - audioService.volume = newRating; - }); - audioService.updateVolume(newRating); - _puzzleFocusNode.requestFocus(); - }, - value: audioService.volume, - ), - ), - const Icon(Icons.volume_up), - ], - ), - ], - ), + ), + */ + ], ), ), ), + ], + ), + ), + Expanded( + child: Column( + children: [ + const Padding( + padding: EdgeInsets.symmetric(vertical: 24.0), + child: PuzzleTitle(), + ), + Align( + alignment: Alignment.centerLeft, + child: Text( + AppLocalizations.of(context)!.moves(state.moves), + style: Theme.of(context).textTheme.headline5!, + ), + ), + const SizedBox( + height: 12.0, + ), Expanded( child: Focus( onKey: (_, event) => _onKeyEvent( @@ -307,16 +417,15 @@ class _PuzzlePageState extends State { ), ), ), - SizedBox( - width: MediaQuery.of(context).size.width * .3, - child: Align( - alignment: Alignment.bottomRight, - child: Image.asset('assets/images/mascotte.jpeg'), - ), - ), ], ), ), + Expanded( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Image.asset('assets/images/mascotte.jpeg'), + ), + ), ], ), ); diff --git a/lib/view/puzzle_page/widgets/puzzle.dart b/lib/view/puzzle_page/widgets/puzzle.dart index 4a7b516..3649f00 100644 --- a/lib/view/puzzle_page/widgets/puzzle.dart +++ b/lib/view/puzzle_page/widgets/puzzle.dart @@ -43,32 +43,41 @@ class _PuzzleState extends State with TickerProviderStateMixin { ); } + @override + void dispose() { + _openingAnimationController.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { - return GridView.count( - crossAxisCount: widget.size, - mainAxisSpacing: 8.0, - crossAxisSpacing: 8.0, - children: widget.data.map((value) { - return AnimatedSwitcher( - duration: const Duration(milliseconds: 400), - reverseDuration: const Duration(milliseconds: 200), - transitionBuilder: (Widget child, Animation animation) { - return ScaleTransition(scale: animation, child: child); - }, - child: ScaleTransition( - key: ValueKey(value.value), - scale: _openingAnimation, - child: Tile( - tile: value, - onTap: (int number) { - setState(() { - widget.onTileTapped(number); - }); - }, - gotImage: context.read().state.image != null, - ))); - }).toList(), + return Center( + child: GridView.count( + crossAxisCount: widget.size, + mainAxisSpacing: 8.0, + crossAxisSpacing: 8.0, + shrinkWrap: true, + children: widget.data.map((value) { + return AnimatedSwitcher( + duration: const Duration(milliseconds: 400), + reverseDuration: const Duration(milliseconds: 200), + transitionBuilder: (Widget child, Animation animation) { + return ScaleTransition(scale: animation, child: child); + }, + child: ScaleTransition( + key: ValueKey(value.value), + scale: _openingAnimation, + child: Tile( + tile: value, + onTap: (int number) { + setState(() { + widget.onTileTapped(number); + }); + }, + gotImage: context.read().state.image != null, + ))); + }).toList(), + ), ); } } diff --git a/lib/view/puzzle_page/widgets/title.dart b/lib/view/puzzle_page/widgets/title.dart index ed3c001..c490af1 100644 --- a/lib/view/puzzle_page/widgets/title.dart +++ b/lib/view/puzzle_page/widgets/title.dart @@ -8,14 +8,24 @@ class PuzzleTitle extends StatelessWidget { Widget build(BuildContext context) { return Column( children: [ - Text(AppLocalizations.of(context)!.app_name, - style: Theme.of(context).textTheme.headline2), Text( - AppLocalizations.of(context)!.team_name, - style: Theme.of(context).textTheme.headline4!.copyWith( - color: Theme.of(context).primaryColor, - ), + AppLocalizations.of(context)!.app_name, + style: const TextStyle( + fontFamily: "QueenOfTheModernAge", + fontSize: 24, + color: Colors.grey, + ), + textAlign: TextAlign.center, ), + const SizedBox( + height: 12, + ), + Text(AppLocalizations.of(context)!.company_name, + style: TextStyle( + fontFamily: "QueenOfTheModernAge", + fontSize: 24, + color: Theme.of(context).primaryColor, + )), ], ); } diff --git a/lib/view/widgets/puzzle.dart b/lib/view/widgets/puzzle.dart index 4a7b516..2d3966d 100644 --- a/lib/view/widgets/puzzle.dart +++ b/lib/view/widgets/puzzle.dart @@ -43,6 +43,12 @@ class _PuzzleState extends State with TickerProviderStateMixin { ); } + @override + void dispose() { + _openingAnimationController.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { return GridView.count( diff --git a/pubspec.lock~ebfbc8364658439cfc814e090745f054eb014fd7 b/pubspec.lock~ebfbc8364658439cfc814e090745f054eb014fd7 new file mode 100644 index 0000000..9da97a9 --- /dev/null +++ b/pubspec.lock~ebfbc8364658439cfc814e090745f054eb014fd7 @@ -0,0 +1,787 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + url: "https://pub.dartlang.org" + source: hosted + version: "34.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.0" + ansicolor: + dependency: transitive + description: + name: ansicolor + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + archive: + dependency: transitive + description: + name: archive + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.11" + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.0" + async: + dependency: transitive + description: + name: async + url: "https://pub.dartlang.org" + source: hosted + version: "2.8.2" + audioplayers: + dependency: "direct main" + description: + name: audioplayers + url: "https://pub.dartlang.org" + source: hosted + version: "0.20.1" + bloc: + dependency: transitive + description: + name: bloc + url: "https://pub.dartlang.org" + source: hosted + version: "8.0.2" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + build: + dependency: transitive + description: + name: build + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" + build_config: + dependency: transitive + description: + name: build_config + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + build_daemon: + dependency: transitive + description: + name: build_daemon + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.6" + build_runner: + dependency: "direct dev" + description: + name: build_runner + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.7" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + url: "https://pub.dartlang.org" + source: hosted + version: "7.2.3" + built_collection: + dependency: transitive + description: + name: built_collection + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + url: "https://pub.dartlang.org" + source: hosted + version: "8.1.4" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + charcode: + dependency: transitive + description: + name: charcode + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + cli_util: + dependency: transitive + description: + name: cli_util + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.5" + clock: + dependency: transitive + description: + name: clock + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + code_builder: + dependency: transitive + description: + name: code_builder + url: "https://pub.dartlang.org" + source: hosted + version: "4.1.0" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.15.0" + convert: + dependency: transitive + description: + name: convert + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + cross_file: + dependency: transitive + description: + name: cross_file + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.2" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + dart_style: + dependency: transitive + description: + name: dart_style + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" + fake_async: + dependency: transitive + description: + name: fake_async + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + ffi: + dependency: transitive + description: + name: ffi + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.2" + file_picker: + dependency: "direct main" + description: + name: file_picker + url: "https://pub.dartlang.org" + source: hosted + version: "4.3.3" + fixnum: + dependency: transitive + description: + name: fixnum + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_bloc: + dependency: "direct main" + description: + name: flutter_bloc + url: "https://pub.dartlang.org" + source: hosted + version: "8.0.1" + flutter_launcher_icons: + dependency: "direct dev" + description: + name: flutter_launcher_icons + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.2" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + freezed: + dependency: "direct dev" + description: + name: freezed + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" + freezed_annotation: + dependency: "direct main" + description: + name: freezed_annotation + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.2" + get_it: + dependency: "direct main" + description: + name: get_it + url: "https://pub.dartlang.org" + source: hosted + version: "7.2.0" + glob: + dependency: transitive + description: + name: glob + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + go_router: + dependency: "direct main" + description: + name: go_router + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" + graphs: + dependency: transitive + description: + name: graphs + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + http: + dependency: transitive + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.13.4" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" + image: + dependency: transitive + description: + name: image + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.1" + image_picker: + dependency: "direct main" + description: + name: image_picker + url: "https://pub.dartlang.org" + source: hosted + version: "0.8.4+9" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.6" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.4.4" + intl: + dependency: "direct main" + description: + name: intl + url: "https://pub.dartlang.org" + source: hosted + version: "0.17.0" + io: + dependency: transitive + description: + name: io + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.3" + js: + dependency: transitive + description: + name: js + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.3" + json_annotation: + dependency: transitive + description: + name: json_annotation + url: "https://pub.dartlang.org" + source: hosted + version: "4.4.0" + lints: + dependency: transitive + description: + name: lints + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + logging: + dependency: transitive + description: + name: logging + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.11" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.7.0" + mime: + dependency: transitive + description: + name: mime + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + mockito: + dependency: "direct main" + description: + name: mockito + url: "https://pub.dartlang.org" + source: hosted + version: "5.0.17" + msix: + dependency: "direct dev" + description: + name: msix + url: "https://pub.dartlang.org" + source: hosted + version: "2.8.15" + nested: + dependency: transitive + description: + name: nested + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + package_config: + dependency: transitive + description: + name: package_config + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + path: + dependency: transitive + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.0" + path_provider: + dependency: transitive + description: + name: path_provider + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.8" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" + path_provider_ios: + dependency: transitive + description: + name: path_provider_ios + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.7" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.5" + path_provider_macos: + dependency: transitive + description: + name: path_provider_macos + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + path_to_regexp: + dependency: transitive + description: + name: path_to_regexp + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.0" + petitparser: + dependency: transitive + description: + name: petitparser + url: "https://pub.dartlang.org" + source: hosted + version: "4.4.0" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.2" + pool: + dependency: transitive + description: + name: pool + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.0" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "4.2.4" + provider: + dependency: transitive + description: + name: provider + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.2" + pub_semver: + dependency: transitive + description: + name: pub_semver + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + sensors_plus: + dependency: transitive + description: + name: sensors_plus + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.1" + sensors_plus_platform_interface: + dependency: transitive + description: + name: sensors_plus_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + sensors_plus_web: + dependency: transitive + description: + name: sensors_plus_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + shake: + dependency: "direct main" + description: + name: shake + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + shelf: + dependency: transitive + description: + name: shelf + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_gen: + dependency: transitive + description: + name: source_gen + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.1" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.1" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.10.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + stream_transform: + dependency: transitive + description: + name: stream_transform + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.3" + timing: + dependency: transitive + description: + name: timing + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + uuid: + dependency: transitive + description: + name: uuid + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.5" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + volume_controller: + dependency: "direct main" + description: + name: volume_controller + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + watcher: + dependency: transitive + description: + name: watcher + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + win32: + dependency: transitive + description: + name: win32 + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.10" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0" + xml: + dependency: transitive + description: + name: xml + url: "https://pub.dartlang.org" + source: hosted + version: "5.3.1" + yaml: + dependency: transitive + description: + name: yaml + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" +sdks: + dart: ">=2.15.1 <3.0.0" + flutter: ">=2.5.0" diff --git a/pubspec.yaml b/pubspec.yaml index 8204624..75319a1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -40,6 +40,7 @@ dependencies: freezed_annotation: ^1.1.0 get_it: ^7.2.0 go_router: ^3.0.1 + google_fonts: 2.2.0 image_picker: ^0.8.4+5 intl: ^0.17.0 mockito: ^5.0.17 @@ -90,7 +91,7 @@ flutter: - family: QueenOfTheModernAge fonts: - asset: assets/fonts/queen_of_the_modern_age.ttf - + # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware.