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.