ui: home screen design in-progress

This commit is contained in:
Osama Asif 2023-05-02 03:56:17 +05:00
parent 791e00ae18
commit 47e3c4d5d0
22 changed files with 258 additions and 93 deletions

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10.9 21.95C9.63333 21.8167 8.45833 21.4667 7.37499 20.9C6.29166 20.3333 5.35416 19.6 4.56249 18.7C3.77083 17.8 3.14999 16.775 2.69999 15.625C2.24999 14.475 2.02499 13.2583 2.02499 11.975C2.02499 9.39167 2.87083 7.15 4.56249 5.25C6.25416 3.35 8.37499 2.26667 10.925 2V3.5C8.79166 3.81667 7.02499 4.775 5.62499 6.375C4.22499 7.975 3.52499 9.84167 3.52499 11.975C3.52499 14.1083 4.22083 15.975 5.61249 17.575C7.00416 19.175 8.76666 20.1333 10.9 20.45V21.95ZM12 17L6.99999 12L8.07499 10.925L11.25 14.1V7H12.75V14.1L15.925 10.925L17 12L12 17ZM13.1 21.95V20.45C13.8667 20.35 14.6042 20.1542 15.3125 19.8625C16.0208 19.5708 16.675 19.1833 17.275 18.7L18.375 19.8C17.6083 20.3833 16.7792 20.8667 15.8875 21.25C14.9958 21.6333 14.0667 21.8667 13.1 21.95ZM17.3 5.275C16.6667 4.825 16 4.44583 15.3 4.1375C14.6 3.82917 13.8667 3.61667 13.1 3.5V2C14.0667 2.11667 14.9917 2.3625 15.875 2.7375C16.7583 3.1125 17.5917 3.59167 18.375 4.175L17.3 5.275ZM19.8 18.25L18.725 17.2C19.2083 16.5833 19.5917 15.9208 19.875 15.2125C20.1583 14.5042 20.35 13.7667 20.45 13H21.975C21.8583 13.9667 21.6167 14.8958 21.25 15.7875C20.8833 16.6792 20.4 17.5 19.8 18.25ZM20.45 10.95C20.35 10.1833 20.1583 9.44167 19.875 8.725C19.5917 8.00833 19.2083 7.35 18.725 6.75L19.9 5.725C20.4833 6.49167 20.95 7.31667 21.3 8.2C21.65 9.08333 21.875 10 21.975 10.95H20.45Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.9964 20C11.6655 20 11.3833 19.8821 11.15 19.6464C10.9167 19.4108 10.8 19.1274 10.8 18.7964C10.8 18.4655 10.9178 18.1833 11.1535 17.95C11.3892 17.7167 11.6726 17.6 12.0035 17.6C12.3345 17.6 12.6167 17.7179 12.85 17.9536C13.0833 18.1892 13.2 18.4726 13.2 18.8036C13.2 19.1345 13.0821 19.4167 12.8464 19.65C12.6108 19.8833 12.3274 20 11.9964 20ZM11.9964 13.2C11.6655 13.2 11.3833 13.0821 11.15 12.8464C10.9167 12.6108 10.8 12.3274 10.8 11.9964C10.8 11.6655 10.9178 11.3833 11.1535 11.15C11.3892 10.9167 11.6726 10.8 12.0035 10.8C12.3345 10.8 12.6167 10.9179 12.85 11.1536C13.0833 11.3892 13.2 11.6726 13.2 12.0036C13.2 12.3345 13.0821 12.6167 12.8464 12.85C12.6108 13.0833 12.3274 13.2 11.9964 13.2ZM11.9964 6.4C11.6655 6.4 11.3833 6.28215 11.15 6.04645C10.9167 5.81077 10.8 5.52743 10.8 5.19645C10.8 4.86548 10.9178 4.58333 11.1535 4.35C11.3892 4.11667 11.6726 4 12.0035 4C12.3345 4 12.6167 4.11785 12.85 4.35355C13.0833 4.58923 13.2 4.87257 13.2 5.20355C13.2 5.53452 13.0821 5.81667 12.8464 6.05C12.6108 6.28333 12.3274 6.4 11.9964 6.4Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19.9 20.975L13.325 14.4C12.825 14.8333 12.242 15.1708 11.576 15.4125C10.91 15.6542 10.2014 15.775 9.45 15.775C7.6473 15.775 6.12163 15.15 4.87298 13.9C3.62433 12.65 3 11.1417 3 9.37501C3 7.60834 3.625 6.10001 4.875 4.85001C6.125 3.60001 7.6375 2.97501 9.4125 2.97501C11.1875 2.97501 12.6958 3.60001 13.9375 4.85001C15.1792 6.10001 15.8 7.60959 15.8 9.37876C15.8 10.0929 15.6833 10.7833 15.45 11.45C15.2167 12.1167 14.8667 12.7417 14.4 13.325L21 19.875L19.9 20.975ZM9.425 14.275C10.7792 14.275 11.9302 13.7958 12.8781 12.8375C13.826 11.8792 14.3 10.725 14.3 9.37501C14.3 8.02501 13.826 6.87084 12.8781 5.91251C11.9302 4.95417 10.7792 4.47501 9.425 4.47501C8.05695 4.47501 6.8941 4.95417 5.93645 5.91251C4.97882 6.87084 4.5 8.02501 4.5 9.37501C4.5 10.725 4.97882 11.8792 5.93645 12.8375C6.8941 13.7958 8.05695 14.275 9.425 14.275Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 958 B

View File

@ -0,0 +1,10 @@
<svg width="12" height="14" viewBox="0 0 12 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1125_34027)">
<path d="M1.66666 7.83333C1.66666 8.53333 1.82499 9.19167 2.14166 9.80833C2.45832 10.425 2.89999 10.9389 3.46666 11.35C3.42221 11.2167 3.38888 11.0806 3.36666 10.9417C3.34443 10.8028 3.33332 10.6667 3.33332 10.5333C3.33332 10.1778 3.39999 9.84444 3.53332 9.53333C3.66666 9.22222 3.8611 8.93889 4.11666 8.68333L5.99999 6.83333L7.88332 8.68333C8.13888 8.93889 8.33332 9.22222 8.46666 9.53333C8.59999 9.84444 8.66666 10.1778 8.66666 10.5333C8.66666 10.6667 8.65554 10.8028 8.63332 10.9417C8.6111 11.0806 8.57777 11.2167 8.53332 11.35C9.09999 10.9389 9.54166 10.425 9.85832 9.80833C10.175 9.19167 10.3333 8.53333 10.3333 7.83333C10.3333 7.23333 10.2055 6.64722 9.94999 6.075C9.69443 5.50278 9.32777 4.97778 8.84999 4.5C8.61666 4.66667 8.37221 4.79722 8.11666 4.89167C7.8611 4.98611 7.60555 5.03333 7.34999 5.03333C6.67221 5.03333 6.1111 4.80278 5.66666 4.34167C5.22221 3.88056 4.99999 3.3 4.99999 2.6V2.26667C4.48888 2.63333 4.02777 3.03889 3.61666 3.48333C3.20555 3.92778 2.85555 4.39167 2.56666 4.875C2.27777 5.35833 2.05555 5.85278 1.89999 6.35833C1.74443 6.86389 1.66666 7.35556 1.66666 7.83333ZM5.99999 8.23333L4.81666 9.4C4.6611 9.55556 4.54166 9.72778 4.45832 9.91667C4.37499 10.1056 4.33332 10.3111 4.33332 10.5333C4.33332 10.9889 4.49443 11.375 4.81666 11.6917C5.13888 12.0083 5.53332 12.1667 5.99999 12.1667C6.46666 12.1667 6.8611 12.0083 7.18332 11.6917C7.50555 11.375 7.66666 10.9889 7.66666 10.5333C7.66666 10.3111 7.62499 10.1056 7.54166 9.91667C7.45832 9.72778 7.33888 9.55556 7.18332 9.4L5.99999 8.23333ZM5.99999 0.5V2.7C5.99999 3.07778 6.13055 3.39444 6.39166 3.65C6.65277 3.90556 6.97221 4.03333 7.34999 4.03333C7.54999 4.03333 7.7361 3.99167 7.90832 3.90833C8.08054 3.825 8.23332 3.7 8.36666 3.53333L8.66666 3.16667C9.48888 3.63333 10.1389 4.28333 10.6167 5.11667C11.0944 5.95 11.3333 6.85556 11.3333 7.83333C11.3333 9.32222 10.8167 10.5833 9.78332 11.6167C8.74999 12.65 7.48888 13.1667 5.99999 13.1667C4.5111 13.1667 3.24999 12.65 2.21666 11.6167C1.18332 10.5833 0.666656 9.32222 0.666656 7.83333C0.666656 6.41111 1.14443 5.04167 2.09999 3.725C3.05555 2.40833 4.35555 1.33333 5.99999 0.5Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_1125_34027">
<rect width="12" height="13" fill="white" transform="translate(0 0.5)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -14,4 +14,8 @@ class AssetConstants {
static const String icYoutube = 'assets/images/ic_youtube.svg';
static const String icInsta = 'assets/images/ic_insta.svg';
static const String icReddit = 'assets/images/ic_reddit.svg';
static const String icSearch = 'assets/images/ic_search.svg';
static const String icStreak = 'assets/images/ic_streak.svg';
static const String icMenu = 'assets/images/ic_menu.svg';
static const String icDownload = 'assets/images/ic_download.svg';
}

View File

@ -4,6 +4,7 @@ class RouteConstants {
static const String sessionPath = '/session/:sid';
static const String dailyPath = '/daily/:did';
static const String donationPath = '/donation';
static const String downloadsPath = '/downloads';
static const String playerPath = '/player';
static const String articlePath = '/article/:aid';
static const String folderPath = '/folder/:fid';

View File

@ -68,5 +68,6 @@ class StringConstants {
static const String welcomeMessage = 'You are now logged in. If you ever need to transfer Medito to another phone, use the same email address to log in and your preferences will be restored.';
static const String thanksForJoining = 'Thanks for being on this journey with us.';
static const String close = 'Close';
static const String search = 'Search';
}

View File

@ -6,6 +6,8 @@ final String? DmSans = GoogleFonts.dmSans().fontFamily;
const String ClashDisplay = 'Clash Display';
const defaultPadding = 16.0;
const height16 = SizedBox(height: 16);
const height8 = SizedBox(height: 8);
const width16 = SizedBox(width: 16);
const height8 = SizedBox(height: 8);
const width8 = SizedBox(width: 8);
const height4 = SizedBox(height: 4);
const width4 = SizedBox(width: 4);

View File

@ -9,13 +9,14 @@ import 'package:Medito/views/auth/join_welcome_view.dart';
import 'package:Medito/views/background_sound/background_sound_view.dart';
import 'package:Medito/views/downloads/downloads_view.dart';
import 'package:Medito/views/folder/folder_view.dart';
import 'package:Medito/views/home/home_view.dart';
import 'package:Medito/views/player/player_view.dart';
import 'package:Medito/views/session/session_view.dart';
import 'package:Medito/views/splash_view.dart';
import 'package:Medito/views/text/text_file_widget.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import '../views/home/home_wrapper_widget.dart';
import '../views/home_old/home_wrapper_widget.dart';
final GlobalKey<NavigatorState> _rootNavigatorKey = GlobalKey<NavigatorState>();
final GlobalKey<NavigatorState> _shellNavigatorKey =
@ -23,47 +24,47 @@ final GlobalKey<NavigatorState> _shellNavigatorKey =
final router = GoRouter(
debugLogDiagnostics: true,
navigatorKey: _rootNavigatorKey,
initialLocation: RouteConstants.root,
initialLocation: RouteConstants.homePath,
routes: [
GoRoute(
path: RouteConstants.root,
pageBuilder: (context, state) => MaterialPage(
key: state.pageKey,
child: SplashView(),
),
),
GoRoute(
path: RouteConstants.joinIntroPath,
pageBuilder: (context, state) => MaterialPage(
key: state.pageKey,
child: JoinIntroView(),
),
),
GoRoute(
path: RouteConstants.joinEmailPath,
pageBuilder: (context, state) => MaterialPage(
key: state.pageKey,
child: JoinEmailView(),
),
),
GoRoute(
path: RouteConstants.joinVerifyOTPPath,
pageBuilder: (context, state) {
final data = state.extra! as Map;
// GoRoute(
// path: RouteConstants.root,
// pageBuilder: (context, state) => MaterialPage(
// key: state.pageKey,
// child: SplashView(),
// ),
// ),
// GoRoute(
// path: RouteConstants.joinIntroPath,
// pageBuilder: (context, state) => MaterialPage(
// key: state.pageKey,
// child: JoinIntroView(),
// ),
// ),
// GoRoute(
// path: RouteConstants.joinEmailPath,
// pageBuilder: (context, state) => MaterialPage(
// key: state.pageKey,
// child: JoinEmailView(),
// ),
// ),
// GoRoute(
// path: RouteConstants.joinVerifyOTPPath,
// pageBuilder: (context, state) {
// final data = state.extra! as Map;
return MaterialPage(
key: state.pageKey,
child: JoinVerifyOTPView(email: data['email']!),
);
},
),
GoRoute(
path: RouteConstants.joinWelcomePath,
pageBuilder: (context, state) => MaterialPage(
key: state.pageKey,
child: JoinWelcomeView(),
),
),
// return MaterialPage(
// key: state.pageKey,
// child: JoinVerifyOTPView(email: data['email']!),
// );
// },
// ),
// GoRoute(
// path: RouteConstants.joinWelcomePath,
// pageBuilder: (context, state) => MaterialPage(
// key: state.pageKey,
// child: JoinWelcomeView(),
// ),
// ),
ShellRoute(
navigatorKey: _shellNavigatorKey,
builder: (context, state, child) => RootPageView(
@ -74,7 +75,7 @@ final router = GoRouter(
path: RouteConstants.homePath,
pageBuilder: (context, state) => MaterialPage(
key: state.pageKey,
child: HomeWrapperWidget(),
child: HomeView(),
),
),
_getSessionRoute(fromRoot: true),
@ -84,7 +85,9 @@ final router = GoRouter(
_getBackgroundSoundRoute(),
GoRoute(
path: RouteConstants.collectionPath,
routes: [_getPlayerRoute()],
routes: [
_getPlayerRoute(),
],
pageBuilder: (context, state) => getCollectionMaterialPage(state),
),
GoRoute(

View File

@ -25,10 +25,10 @@ import 'package:Medito/network/user/user_utils.dart';
import 'package:Medito/routes/routes.dart';
import 'package:Medito/tracking/tracking.dart';
import 'package:Medito/utils/utils.dart';
import 'package:Medito/views/home/courses_row_widget.dart';
import 'package:Medito/views/home/daily_message_widget.dart';
import 'package:Medito/views/home/small_shortcuts_row_widget.dart';
import 'package:Medito/views/home/stats_widget.dart';
import 'package:Medito/views/home_old/courses_row_widget.dart';
import 'package:Medito/views/home_old/daily_message_widget.dart';
import 'package:Medito/views/home_old/small_shortcuts_row_widget.dart';
import 'package:Medito/views/home_old/stats_widget.dart';
import 'package:Medito/views/packs/announcement_banner_widget.dart';
import 'package:Medito/views/packs/error_widget.dart';
import 'package:connectivity/connectivity.dart';

View File

@ -0,0 +1,23 @@
import 'package:Medito/constants/constants.dart';
import 'package:flutter/material.dart';
import 'widgets/header/home_header_widget.dart';
import 'widgets/search/search_widget.dart';
class HomeView extends StatelessWidget {
const HomeView({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Column(
children: [
height8,
HomeHeaderWidget(),
SearchWidget(),
],
),
),
);
}
}

View File

@ -0,0 +1,65 @@
import 'package:Medito/constants/constants.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:go_router/go_router.dart';
class HomeHeaderWidget extends StatelessWidget {
const HomeHeaderWidget({
super.key,
this.streakCount,
});
final String? streakCount;
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 15),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SvgPicture.asset(AssetConstants.icLogo),
Row(
children: [
_streakWidget(context, streakCount: streakCount),
width16,
_downloadWidget(context),
width16,
SvgPicture.asset(AssetConstants.icMenu),
],
),
],
),
);
}
InkWell _downloadWidget(BuildContext context) {
return InkWell(
onTap: () => context.push(RouteConstants.collectionPath),
child: SvgPicture.asset(
AssetConstants.icDownload,
),
);
}
Container _streakWidget(BuildContext context, {String? streakCount}) {
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(14),
border: Border.all(
width: 1,
color: ColorConstants.walterWhite,
),
),
padding: EdgeInsets.symmetric(horizontal: 7, vertical: 1),
child: Row(
children: [
SvgPicture.asset(AssetConstants.icStreak),
width4,
Text(
streakCount ?? '0',
style: Theme.of(context).textTheme.titleMedium,
),
],
),
);
}
}

View File

@ -0,0 +1,39 @@
import 'package:Medito/constants/constants.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
class SearchWidget extends StatelessWidget {
const SearchWidget({super.key});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(left: 15, right: 15, top: 20),
child: TextFormField(
// textAlign: TextAlign.center,
cursorColor: ColorConstants.walterWhite,
cursorWidth: 1,
decoration: InputDecoration(
prefixIcon: Padding(
padding: const EdgeInsets.all(10.0),
child: SvgPicture.asset(
AssetConstants.icSearch,
),
),
hintText: StringConstants.search,
hintStyle: Theme.of(context).textTheme.bodyLarge?.copyWith(
color: ColorConstants.walterWhite,
fontFamily: DmSans,
fontSize: 16,
),
),
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
color: ColorConstants.walterWhite,
fontFamily: DmSans,
fontSize: 16,
),
onChanged: (val) => {},
),
);
}
}

View File

@ -1,7 +1,7 @@
import 'package:Medito/network/home/courses_response.dart';
import 'package:Medito/constants/constants.dart';
import 'package:Medito/utils/utils.dart';
import 'package:Medito/views/home/loading_text_box_widget.dart';
import 'package:Medito/views/home_old/loading_text_box_widget.dart';
import 'package:flutter/material.dart';
class CoursesRowItemWidget extends StatelessWidget {

View File

@ -1,7 +1,7 @@
import 'package:Medito/network/api_response.dart';
import 'package:Medito/network/home/courses_bloc.dart';
import 'package:Medito/network/home/courses_response.dart';
import 'package:Medito/views/home/courses_row_item_widget.dart';
import 'package:Medito/views/home_old/courses_row_item_widget.dart';
import 'package:flutter/material.dart';
class CoursesRowWidget extends StatefulWidget {

View File

@ -1,7 +1,7 @@
import 'package:Medito/network/home/daily_message_response.dart';
import 'package:Medito/constants/constants.dart';
import 'package:Medito/utils/utils.dart';
import 'package:Medito/views/home/loading_text_box_widget.dart';
import 'package:Medito/views/home_old/loading_text_box_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:share/share.dart';

View File

@ -1,7 +1,7 @@
import 'package:Medito/network/api_response.dart';
import 'package:Medito/network/home/daily_message_bloc.dart';
import 'package:Medito/network/home/daily_message_response.dart';
import 'package:Medito/views/home/daily_message_item_widget.dart';
import 'package:Medito/views/home_old/daily_message_item_widget.dart';
import 'package:flutter/material.dart';
//This widget is the quote box on the home screen

View File

@ -36,42 +36,50 @@ class SmallShortcutsRowWidgetState extends State<SmallShortcutsRowWidget> {
} else {
isLandscape = false;
}
return SizeChangedLayoutNotifier(
child: StreamBuilder<ApiResponse<ShortcutsResponse>>(
stream: _bloc.shortcutList.stream,
initialData: ApiResponse.loading(),
builder: (context, snapshot) {
switch (snapshot.data?.status) {
case Status.LOADING:
return _getLoadingWidget();
case Status.COMPLETED:
return GridView.count(
crossAxisCount: isLandscape ? 4 : 2,
padding: const EdgeInsets.only(
left: 12.0, right: 12.0, top: 8.0),
scrollDirection: Axis.vertical,
childAspectRatio: 2.6,
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
children: List.generate(
snapshot.data?.body?.data?.length ?? 0, (index) {
return Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(6)),
clipBehavior: Clip.antiAlias,
color: ColorConstants.deepNight,
child: SmallShortcutWidget(
snapshot.data?.body?.data?[index],
widget.onTap),
);
}),
);
case Status.ERROR:
return Icon(Icons.error);
case null:
}
return Container();
}));
child: StreamBuilder<ApiResponse<ShortcutsResponse>>(
stream: _bloc.shortcutList.stream,
initialData: ApiResponse.loading(),
builder: (context, snapshot) {
switch (snapshot.data?.status) {
case Status.LOADING:
return _getLoadingWidget();
case Status.COMPLETED:
return GridView.count(
crossAxisCount: isLandscape ? 4 : 2,
padding:
const EdgeInsets.only(left: 12.0, right: 12.0, top: 8.0),
scrollDirection: Axis.vertical,
childAspectRatio: 2.6,
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
children: List.generate(
snapshot.data?.body?.data?.length ?? 0,
(index) {
return Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(6),
),
clipBehavior: Clip.antiAlias,
color: ColorConstants.deepNight,
child: SmallShortcutWidget(
snapshot.data?.body?.data?[index],
widget.onTap,
),
);
},
),
);
case Status.ERROR:
return Icon(Icons.error);
case null:
}
return Container();
},
),
);
});
}
@ -94,7 +102,7 @@ class SmallShortcutsRowWidgetState extends State<SmallShortcutsRowWidget> {
);
}
}),
);
);
Card _getLocalDownloadsWidget() {
return Card(
@ -109,8 +117,7 @@ class SmallShortcutsRowWidgetState extends State<SmallShortcutsRowWidget> {
cover: null,
backgroundImage: null,
colorPrimary: '#ff282828'),
widget.onTap)
);
widget.onTap));
}
}
@ -164,7 +171,8 @@ class SmallShortcutWidget extends StatelessWidget {
),
);
Widget _getBackgroundImage() => data?.backgroundImage?.isNotNullAndNotEmpty() == true
? getNetworkImageWidget(data?.bgImageUrl)
: Container();
Widget _getBackgroundImage() =>
data?.backgroundImage?.isNotNullAndNotEmpty() == true
? getNetworkImageWidget(data?.bgImageUrl)
: Container();
}

View File

@ -1,7 +1,7 @@
import 'package:Medito/constants/constants.dart';
import 'package:Medito/utils/stats_utils.dart';
import 'package:Medito/providers/stats/stats_provider.dart';
import 'package:Medito/views/home/streak_tile_widget.dart';
import 'package:Medito/views/home_old/streak_tile_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:pedantic/pedantic.dart';