diff --git a/lib/golektruk.dart b/lib/golektruk.dart index c1f1937..9f0519a 100644 --- a/lib/golektruk.dart +++ b/lib/golektruk.dart @@ -1,17 +1,46 @@ +import 'package:component_library/component_library.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:golek_flutter_new/routes/app_router.gr.dart'; -class GolekTruk extends StatelessWidget { +import 'l10n/app_localizations.dart'; + +class GolekTruk extends StatefulWidget { const GolekTruk({Key? key}) : super(key: key); + @override + State createState() => _GolekTrukState(); +} + +class _GolekTrukState extends State { + final _lightTheme = LightGolekThemeData(); + final _darkTheme = DarkGolekThemeData(); + final _appRouter = AppRouter(); + @override Widget build(BuildContext context) { - return MaterialApp( - title: 'Flutter Demo', - theme: ThemeData( - primarySwatch: Colors.blue, - ), - home: const Scaffold( - body: Text('HomePage GolekTruk'), + return GolekTheme( + darkTheme: _darkTheme, + lightTheme: _lightTheme, + child: MaterialApp.router( + debugShowCheckedModeBanner: false, + title: 'GolekTruk', + darkTheme: _darkTheme.materialThemeData, + theme: _lightTheme.materialThemeData, + themeMode: ThemeMode.light, + localizationsDelegates: const [ + GlobalCupertinoLocalizations.delegate, + GlobalMaterialLocalizations.delegate, + AppLocalizations.delegate, + ComponentLibraryLocalizations.delegate, + ], + supportedLocales: const [ + Locale('en', ''), + Locale('id', 'ID'), + ], + backButtonDispatcher: RootBackButtonDispatcher(), + routeInformationParser: _appRouter.defaultRouteParser(), + routerDelegate: _appRouter.delegate(), ), ); } diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index e47fb9f..187edcc 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -6,7 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'app_localizations_en.dart'; -import 'app_localizations_pt.dart'; +import 'app_localizations_id.dart'; /// Callers can lookup localized strings with an instance of AppLocalizations /// returned by `AppLocalizations.of(context)`. @@ -90,7 +90,7 @@ abstract class AppLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ Locale('en'), - Locale('pt') + Locale('id') ]; /// No description provided for @quotesBottomNavigationBarItemLabel. @@ -115,7 +115,7 @@ class _AppLocalizationsDelegate extends LocalizationsDelegate } @override - bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'id'].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; @@ -127,7 +127,7 @@ AppLocalizations lookupAppLocalizations(Locale locale) { // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return AppLocalizationsEn(); - case 'pt': return AppLocalizationsPt(); + case 'id': return AppLocalizationsId(); } throw FlutterError( diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_id.dart similarity index 53% rename from lib/l10n/app_localizations_pt.dart rename to lib/l10n/app_localizations_id.dart index 858f588..6b5d976 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_id.dart @@ -1,8 +1,8 @@ import 'app_localizations.dart'; -/// The translations for Portuguese (`pt`). -class AppLocalizationsPt extends AppLocalizations { - AppLocalizationsPt([String locale = 'pt']) : super(locale); +/// The translations for Indonesian (`id`). +class AppLocalizationsId extends AppLocalizations { + AppLocalizationsId([String locale = 'id']) : super(locale); @override String get quotesBottomNavigationBarItemLabel => 'Frases'; diff --git a/lib/l10n/messages_pt.arb b/lib/l10n/messages_id.arb similarity index 100% rename from lib/l10n/messages_pt.arb rename to lib/l10n/messages_id.arb diff --git a/lib/routes/app_router.dart b/lib/routes/app_router.dart new file mode 100644 index 0000000..38bc9f3 --- /dev/null +++ b/lib/routes/app_router.dart @@ -0,0 +1,10 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:landing_menu/landing_menu.dart'; + +@MaterialAutoRouter( + replaceInRouteName: 'Page,Route', + routes: [ + AutoRoute(page: LandingPage, initial: true), + ], +) +class $AppRouter {} \ No newline at end of file diff --git a/lib/routes/app_router.gr.dart b/lib/routes/app_router.gr.dart new file mode 100644 index 0000000..50a699f --- /dev/null +++ b/lib/routes/app_router.gr.dart @@ -0,0 +1,51 @@ +// ************************************************************************** +// AutoRouteGenerator +// ************************************************************************** + +// GENERATED CODE - DO NOT MODIFY BY HAND + +// ************************************************************************** +// AutoRouteGenerator +// ************************************************************************** +// +// ignore_for_file: type=lint + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:auto_route/auto_route.dart' as _i2; +import 'package:flutter/material.dart' as _i3; +import 'package:landing_menu/landing_menu.dart' as _i1; + +class AppRouter extends _i2.RootStackRouter { + AppRouter([_i3.GlobalKey<_i3.NavigatorState>? navigatorKey]) + : super(navigatorKey); + + @override + final Map pagesMap = { + LandingRoute.name: (routeData) { + return _i2.MaterialPageX( + routeData: routeData, + child: const _i1.LandingPage(), + ); + } + }; + + @override + List<_i2.RouteConfig> get routes => [ + _i2.RouteConfig( + LandingRoute.name, + path: '/', + ) + ]; +} + +/// generated route for +/// [_i1.LandingPage] +class LandingRoute extends _i2.PageRouteInfo { + const LandingRoute() + : super( + LandingRoute.name, + path: '/', + ); + + static const String name = 'LandingRoute'; +} diff --git a/makefile b/makefile index 8ec612b..b5a4588 100644 --- a/makefile +++ b/makefile @@ -1,9 +1,15 @@ PACKAGES := $(wildcard packages/*) FEATURES := $(wildcard packages/features/*) -BUILD-RUNNER := packages/fav_qs_api packages/key_value_storage +BUILD-RUNNER := packages/golektruk_api intl: flutter gen-l10n + + cd packages/component_library ; \ + flutter gen-l10n ; \ + cd ../../ ; \ + + for feature in $(FEATURES); do \ cd $${feature} ; \ echo "Generate localization on $${feature}" ; \ diff --git a/packages/component_library/assets/Fondamento-Regular.ttf b/packages/component_library/assets/Fondamento-Regular.ttf deleted file mode 100644 index d0489b2..0000000 Binary files a/packages/component_library/assets/Fondamento-Regular.ttf and /dev/null differ diff --git a/packages/component_library/assets/closing-quote.svg b/packages/component_library/assets/closing-quote.svg deleted file mode 100644 index dabb238..0000000 --- a/packages/component_library/assets/closing-quote.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/component_library/assets/fonts/Montserrat-Bold.ttf b/packages/component_library/assets/fonts/Montserrat-Bold.ttf new file mode 100644 index 0000000..55e0b1a Binary files /dev/null and b/packages/component_library/assets/fonts/Montserrat-Bold.ttf differ diff --git a/packages/component_library/assets/fonts/Montserrat-BoldItalic.ttf b/packages/component_library/assets/fonts/Montserrat-BoldItalic.ttf new file mode 100644 index 0000000..6b4541d Binary files /dev/null and b/packages/component_library/assets/fonts/Montserrat-BoldItalic.ttf differ diff --git a/packages/component_library/assets/fonts/Montserrat-Medium.ttf b/packages/component_library/assets/fonts/Montserrat-Medium.ttf new file mode 100644 index 0000000..0f0fd1d Binary files /dev/null and b/packages/component_library/assets/fonts/Montserrat-Medium.ttf differ diff --git a/packages/component_library/assets/fonts/Montserrat-MediumItalic.ttf b/packages/component_library/assets/fonts/Montserrat-MediumItalic.ttf new file mode 100644 index 0000000..5bd6dd2 Binary files /dev/null and b/packages/component_library/assets/fonts/Montserrat-MediumItalic.ttf differ diff --git a/packages/component_library/assets/fonts/Montserrat-Regular.ttf b/packages/component_library/assets/fonts/Montserrat-Regular.ttf new file mode 100644 index 0000000..1cd0259 Binary files /dev/null and b/packages/component_library/assets/fonts/Montserrat-Regular.ttf differ diff --git a/packages/component_library/assets/fonts/Montserrat-SemiBold.ttf b/packages/component_library/assets/fonts/Montserrat-SemiBold.ttf new file mode 100644 index 0000000..ccaba1a Binary files /dev/null and b/packages/component_library/assets/fonts/Montserrat-SemiBold.ttf differ diff --git a/packages/component_library/assets/fonts/Montserrat-SemiBoldItalic.ttf b/packages/component_library/assets/fonts/Montserrat-SemiBoldItalic.ttf new file mode 100644 index 0000000..b8278b9 Binary files /dev/null and b/packages/component_library/assets/fonts/Montserrat-SemiBoldItalic.ttf differ diff --git a/packages/component_library/assets/opening-quote.svg b/packages/component_library/assets/opening-quote.svg deleted file mode 100644 index c32e06d..0000000 --- a/packages/component_library/assets/opening-quote.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/component_library/example/lib/component_storybook.dart b/packages/component_library/example/lib/component_storybook.dart index 13eaf55..1e79582 100644 --- a/packages/component_library/example/lib/component_storybook.dart +++ b/packages/component_library/example/lib/component_storybook.dart @@ -15,7 +15,7 @@ class ComponentStorybook extends StatelessWidget { @override Widget build(BuildContext context) { - final theme = WonderTheme.of(context); + final theme = GolekTheme.of(context); return Storybook( theme: lightThemeData, darkTheme: darkThemeData, diff --git a/packages/component_library/example/lib/stories.dart b/packages/component_library/example/lib/stories.dart index 84b8d90..365a79e 100644 --- a/packages/component_library/example/lib/stories.dart +++ b/packages/component_library/example/lib/stories.dart @@ -2,7 +2,7 @@ import 'package:component_library/component_library.dart'; import 'package:flutter/material.dart'; import 'package:storybook_flutter/storybook_flutter.dart'; -List getStories(WonderThemeData theme) { +List getStories(GolekThemeData theme) { return [ Story.simple( name: 'Simple Expanded Elevated Button', @@ -111,24 +111,6 @@ List getStories(WonderThemeData theme) { ), ), ), - Story( - name: 'Upvote Icon Button', - section: 'Count Indicator Buttons', - builder: (_, k) => UpvoteIconButton( - count: k.sliderInt( - label: 'count', - max: 10, - min: 0, - initial: 0, - divisions: 9, - ), - onTap: () {}, - isUpvoted: k.boolean( - label: 'isUpvoted', - initial: false, - ), - ), - ), Story( name: 'Exception Indicator', section: 'Indicators', @@ -149,80 +131,6 @@ List getStories(WonderThemeData theme) { : null, ), ), - Story( - name: 'QuoteCard', - section: 'Quote', - builder: (_, k) => QuoteCard( - isFavorite: k.boolean( - label: 'Is Favorite', - initial: false, - ), - statement: k.text( - label: 'Statement', - initial: - 'Wherever you go, no matter what the weather, always bring your own sunshine.', - ), - author: k.text( - label: 'Author', - initial: 'Author name', - ), - ), - ), - Story( - name: 'Quotes in List', - section: 'Quote', - wrapperBuilder: (context, story, child) => Padding( - padding: const EdgeInsets.all(8.0), - child: ListView.separated( - itemCount: 15, - itemBuilder: (_, __) => child, - separatorBuilder: (_, __) => const Divider( - height: 16.0, - ), - ), - ), - builder: (_, k) => QuoteCard( - isFavorite: k.boolean( - label: 'Is Favorite', - initial: false, - ), - statement: k.text( - label: 'Statement', - initial: 'The finest steel has to go through the hottest fire.', - ), - author: k.text( - label: 'Author', - initial: 'Author name', - ), - ), - ), - Story( - name: 'Quotes in Grid', - section: 'Quote', - wrapperBuilder: (context, story, child) => Padding( - padding: const EdgeInsets.all(8.0), - child: GridView.count( - crossAxisCount: 2, - crossAxisSpacing: theme.gridSpacing, - mainAxisSpacing: theme.gridSpacing, - children: [for (int i = 0; i < 15; i++) child], - ), - ), - builder: (_, k) => QuoteCard( - isFavorite: k.boolean( - label: 'Is Favorite', - initial: false, - ), - statement: k.text( - label: 'Statement', - initial: 'A quote statement', - ), - author: k.text( - label: 'Author', - initial: 'Author name', - ), - ), - ), Story.simple( name: 'Centered Circular Progress Indicator', child: const CenteredCircularProgressIndicator(), @@ -247,7 +155,7 @@ List getStories(WonderThemeData theme) { ) ? Icon( Icons.favorite, - color: theme.roundedChoiceChipSelectedAvatarColor, + color: theme.warningMainColor, ) : null, onSelected: k.boolean( @@ -330,24 +238,6 @@ List getStories(WonderThemeData theme) { name: 'Search Bar', child: const SearchBar(), ), - Story.simple( - name: 'Row App Bar', - child: const RowAppBar( - children: [ - FavoriteIconButton( - isFavorite: true, - ), - UpvoteIconButton( - count: 10, - isUpvoted: true, - ), - DownvoteIconButton( - count: 5, - isDownvoted: false, - ), - ], - ), - ), Story( name: 'Shrinkable Text', builder: (_, k) => SafeArea( @@ -359,20 +249,20 @@ List getStories(WonderThemeData theme) { ), style: k.options( label: 'style', - initial: theme.quoteTextStyle.copyWith( - fontSize: FontSize.xxLarge, + initial: theme.textStyle.copyWith( + fontSize: FontSize.style24, ), options: [ Option( 'XX large', - theme.quoteTextStyle.copyWith( - fontSize: FontSize.xxLarge, + theme.textStyle.copyWith( + fontSize: FontSize.style24, ), ), Option( 'Small', - theme.quoteTextStyle.copyWith( - fontSize: FontSize.small, + theme.textStyle.copyWith( + fontSize: FontSize.style12, ), ), ], diff --git a/packages/component_library/example/lib/story_app.dart b/packages/component_library/example/lib/story_app.dart index 1c1b2ad..5ef9709 100644 --- a/packages/component_library/example/lib/story_app.dart +++ b/packages/component_library/example/lib/story_app.dart @@ -5,12 +5,12 @@ import 'package:flutter/material.dart'; class StoryApp extends StatelessWidget { StoryApp({Key? key}) : super(key: key); - final _lightTheme = LightWonderThemeData(); - final _darkTheme = DarkWonderThemeData(); + final _lightTheme = LightGolekThemeData(); + final _darkTheme = DarkGolekThemeData(); @override Widget build(BuildContext context) { - return WonderTheme( + return GolekTheme( lightTheme: _lightTheme, darkTheme: _darkTheme, child: ComponentStorybook( diff --git a/packages/component_library/lib/component_library.dart b/packages/component_library/lib/component_library.dart index 90c09be..468c7de 100644 --- a/packages/component_library/lib/component_library.dart +++ b/packages/component_library/lib/component_library.dart @@ -6,7 +6,6 @@ export 'src/expanded_elevated_button.dart'; export 'src/in_progress_text_button.dart'; export 'src/favorite_icon_button.dart'; export 'src/l10n/component_library_localizations.dart'; -export 'src/quote_card.dart'; export 'src/centered_circular_progress_indicator.dart'; export 'src/rounded_choice_chip.dart'; export 'src/generic_error_snack_bar.dart'; @@ -16,9 +15,7 @@ export 'src/search_bar.dart'; export 'src/share_icon_button.dart'; export 'src/shrinkable_text.dart'; export 'src/styled_status_bar.dart'; -export 'src/svg_asset.dart'; export 'src/theme/font_size.dart'; export 'src/theme/spacing.dart'; -export 'src/theme/wonder_theme.dart'; -export 'src/theme/wonder_theme_data.dart'; -export 'src/upvote_icon_button.dart'; +export 'src/theme/golek_theme.dart'; +export 'src/theme/golek_theme_data.dart'; diff --git a/packages/component_library/lib/src/chevron_list_tile.dart b/packages/component_library/lib/src/chevron_list_tile.dart index 45a66a6..36d63c3 100644 --- a/packages/component_library/lib/src/chevron_list_tile.dart +++ b/packages/component_library/lib/src/chevron_list_tile.dart @@ -17,7 +17,7 @@ class ChevronListTile extends StatelessWidget { title: Text( label, style: const TextStyle( - fontSize: FontSize.mediumLarge, + fontSize: FontSize.style18, ), ), trailing: const Icon( diff --git a/packages/component_library/lib/src/count_indicator_icon_button.dart b/packages/component_library/lib/src/count_indicator_icon_button.dart index 66558e2..1cfb4f1 100644 --- a/packages/component_library/lib/src/count_indicator_icon_button.dart +++ b/packages/component_library/lib/src/count_indicator_icon_button.dart @@ -33,7 +33,7 @@ class CountIndicatorIconButton extends StatelessWidget { Text( count.toString(), style: const TextStyle( - fontSize: FontSize.small, + fontSize: FontSize.style12, ), ), ], diff --git a/packages/component_library/lib/src/downvote_icon_button.dart b/packages/component_library/lib/src/downvote_icon_button.dart index ccb721b..e0441c6 100644 --- a/packages/component_library/lib/src/downvote_icon_button.dart +++ b/packages/component_library/lib/src/downvote_icon_button.dart @@ -16,13 +16,13 @@ class DownvoteIconButton extends StatelessWidget { @override Widget build(BuildContext context) { final l10n = ComponentLibraryLocalizations.of(context); - final theme = WonderTheme.of(context); + final theme = GolekTheme.of(context); return CountIndicatorIconButton( onTap: onTap, tooltip: l10n.downvoteIconButtonTooltip, iconData: Icons.arrow_downward_sharp, iconColor: - isDownvoted ? theme.votedButtonColor : theme.unvotedButtonColor, + isDownvoted ? theme.warningMainColor : theme.neutral20Color, count: count, ); } diff --git a/packages/component_library/lib/src/exception_indicator.dart b/packages/component_library/lib/src/exception_indicator.dart index 9a2259e..9e7beee 100644 --- a/packages/component_library/lib/src/exception_indicator.dart +++ b/packages/component_library/lib/src/exception_indicator.dart @@ -36,7 +36,7 @@ class ExceptionIndicator extends StatelessWidget { title ?? l10n.exceptionIndicatorGenericTitle, textAlign: TextAlign.center, style: const TextStyle( - fontSize: FontSize.mediumLarge, + fontSize: FontSize.style16, fontWeight: FontWeight.bold, ), ), diff --git a/packages/component_library/lib/src/l10n/component_library_localizations.dart b/packages/component_library/lib/src/l10n/component_library_localizations.dart index 9c334bc..56abdfe 100644 --- a/packages/component_library/lib/src/l10n/component_library_localizations.dart +++ b/packages/component_library/lib/src/l10n/component_library_localizations.dart @@ -6,16 +6,16 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'component_library_localizations_en.dart'; -import 'component_library_localizations_pt.dart'; +import 'component_library_localizations_id.dart'; -/// Callers can lookup localized strings with an instance of ComponentLibraryLocalizations returned -/// by `ComponentLibraryLocalizations.of(context)`. +/// Callers can lookup localized strings with an instance of ComponentLibraryLocalizations +/// returned by `ComponentLibraryLocalizations.of(context)`. /// /// Applications need to include `ComponentLibraryLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: /// -/// ``` +/// ```dart /// import 'l10n/component_library_localizations.dart'; /// /// return MaterialApp( @@ -30,14 +30,14 @@ import 'component_library_localizations_pt.dart'; /// Please make sure to update your pubspec.yaml to include the following /// packages: /// -/// ``` +/// ```yaml /// dependencies: /// # Internationalization support. /// flutter_localizations: /// sdk: flutter /// intl: any # Use the pinned version from flutter_localizations /// -/// # rest of dependencies +/// # Rest of dependencies /// ``` /// /// ## iOS Applications @@ -60,18 +60,15 @@ import 'component_library_localizations_pt.dart'; /// be consistent with the languages listed in the ComponentLibraryLocalizations.supportedLocales /// property. abstract class ComponentLibraryLocalizations { - ComponentLibraryLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + ComponentLibraryLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; static ComponentLibraryLocalizations of(BuildContext context) { - return Localizations.of( - context, ComponentLibraryLocalizations)!; + return Localizations.of(context, ComponentLibraryLocalizations)!; } - static const LocalizationsDelegate delegate = - _ComponentLibraryLocalizationsDelegate(); + static const LocalizationsDelegate delegate = _ComponentLibraryLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -83,8 +80,7 @@ abstract class ComponentLibraryLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ + static const List> localizationsDelegates = >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -94,7 +90,7 @@ abstract class ComponentLibraryLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ Locale('en'), - Locale('pt') + Locale('id') ]; /// No description provided for @downvoteIconButtonTooltip. @@ -164,37 +160,34 @@ abstract class ComponentLibraryLocalizations { String get authenticationRequiredErrorSnackbarMessage; } -class _ComponentLibraryLocalizationsDelegate - extends LocalizationsDelegate { +class _ComponentLibraryLocalizationsDelegate extends LocalizationsDelegate { const _ComponentLibraryLocalizationsDelegate(); @override Future load(Locale locale) { - return SynchronousFuture( - lookupComponentLibraryLocalizations(locale)); + return SynchronousFuture(lookupComponentLibraryLocalizations(locale)); } @override - bool isSupported(Locale locale) => - ['en', 'pt'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'id'].contains(locale.languageCode); @override bool shouldReload(_ComponentLibraryLocalizationsDelegate old) => false; } -ComponentLibraryLocalizations lookupComponentLibraryLocalizations( - Locale locale) { +ComponentLibraryLocalizations lookupComponentLibraryLocalizations(Locale locale) { + + // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': - return ComponentLibraryLocalizationsEn(); - case 'pt': - return ComponentLibraryLocalizationsPt(); + case 'en': return ComponentLibraryLocalizationsEn(); + case 'id': return ComponentLibraryLocalizationsId(); } throw FlutterError( - 'ComponentLibraryLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); + 'ComponentLibraryLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); } diff --git a/packages/component_library/lib/src/l10n/component_library_localizations_en.dart b/packages/component_library/lib/src/l10n/component_library_localizations_en.dart index bb2968c..13dfdca 100644 --- a/packages/component_library/lib/src/l10n/component_library_localizations_en.dart +++ b/packages/component_library/lib/src/l10n/component_library_localizations_en.dart @@ -29,14 +29,11 @@ class ComponentLibraryLocalizationsEn extends ComponentLibraryLocalizations { String get exceptionIndicatorTryAgainButton => 'Try Again'; @override - String get exceptionIndicatorGenericMessage => - 'There has been an error.\nPlease, check your internet connection and try again later.'; + String get exceptionIndicatorGenericMessage => 'There has been an error.\nPlease, check your internet connection and try again later.'; @override - String get genericErrorSnackbarMessage => - 'There has been an error. Please, check your internet connection.'; + String get genericErrorSnackbarMessage => 'There has been an error. Please, check your internet connection.'; @override - String get authenticationRequiredErrorSnackbarMessage => - 'You need to sign in before performing this action.'; + String get authenticationRequiredErrorSnackbarMessage => 'You need to sign in before performing this action.'; } diff --git a/packages/component_library/lib/src/l10n/component_library_localizations_id.dart b/packages/component_library/lib/src/l10n/component_library_localizations_id.dart new file mode 100644 index 0000000..2721661 --- /dev/null +++ b/packages/component_library/lib/src/l10n/component_library_localizations_id.dart @@ -0,0 +1,39 @@ +import 'component_library_localizations.dart'; + +/// The translations for Indonesian (`id`). +class ComponentLibraryLocalizationsId extends ComponentLibraryLocalizations { + ComponentLibraryLocalizationsId([String locale = 'id']) : super(locale); + + @override + String get downvoteIconButtonTooltip => 'Downvote'; + + @override + String get upvoteIconButtonTooltip => 'Upvote'; + + @override + String get searchBarHintText => 'journey'; + + @override + String get searchBarLabelText => 'Search'; + + @override + String get shareIconButtonTooltip => 'Share'; + + @override + String get favoriteIconButtonTooltip => 'Favorite'; + + @override + String get exceptionIndicatorGenericTitle => 'Something went wrong'; + + @override + String get exceptionIndicatorTryAgainButton => 'Try Again'; + + @override + String get exceptionIndicatorGenericMessage => 'There has been an error.\nPlease, check your internet connection and try again later.'; + + @override + String get genericErrorSnackbarMessage => 'There has been an error. Please, check your internet connection.'; + + @override + String get authenticationRequiredErrorSnackbarMessage => 'You need to sign in before performing this action.'; +} diff --git a/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart b/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart deleted file mode 100644 index ef10323..0000000 --- a/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'component_library_localizations.dart'; - -/// The translations for Portuguese (`pt`). -class ComponentLibraryLocalizationsPt extends ComponentLibraryLocalizations { - ComponentLibraryLocalizationsPt([String locale = 'pt']) : super(locale); - - @override - String get downvoteIconButtonTooltip => 'Negativo'; - - @override - String get upvoteIconButtonTooltip => 'Positivo'; - - @override - String get searchBarHintText => 'jornada'; - - @override - String get searchBarLabelText => 'Pesquisar'; - - @override - String get shareIconButtonTooltip => 'Compartilhar'; - - @override - String get favoriteIconButtonTooltip => 'Favoritar'; - - @override - String get exceptionIndicatorGenericTitle => 'Algo deu errado'; - - @override - String get exceptionIndicatorTryAgainButton => 'Tentar Novamente'; - - @override - String get exceptionIndicatorGenericMessage => - 'Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; - - @override - String get genericErrorSnackbarMessage => - 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; - - @override - String get authenticationRequiredErrorSnackbarMessage => - 'Você precisa estar logado para executar essa ação.'; -} diff --git a/packages/component_library/lib/src/l10n/messages_id.arb b/packages/component_library/lib/src/l10n/messages_id.arb new file mode 100644 index 0000000..e2b441e --- /dev/null +++ b/packages/component_library/lib/src/l10n/messages_id.arb @@ -0,0 +1,13 @@ +{ + "downvoteIconButtonTooltip": "Downvote", + "upvoteIconButtonTooltip": "Upvote", + "searchBarHintText": "journey", + "searchBarLabelText": "Search", + "shareIconButtonTooltip": "Share", + "favoriteIconButtonTooltip": "Favorite", + "exceptionIndicatorGenericTitle": "Something went wrong", + "exceptionIndicatorTryAgainButton": "Try Again", + "exceptionIndicatorGenericMessage": "There has been an error.\nPlease, check your internet connection and try again later.", + "genericErrorSnackbarMessage": "There has been an error. Please, check your internet connection.", + "authenticationRequiredErrorSnackbarMessage": "You need to sign in before performing this action." +} \ No newline at end of file diff --git a/packages/component_library/lib/src/l10n/messages_pt.arb b/packages/component_library/lib/src/l10n/messages_pt.arb deleted file mode 100644 index c359d2b..0000000 --- a/packages/component_library/lib/src/l10n/messages_pt.arb +++ /dev/null @@ -1,13 +0,0 @@ -{ - "downvoteIconButtonTooltip": "Negativo", - "upvoteIconButtonTooltip": "Positivo", - "searchBarHintText": "jornada", - "searchBarLabelText": "Pesquisar", - "shareIconButtonTooltip": "Compartilhar", - "favoriteIconButtonTooltip": "Favoritar", - "exceptionIndicatorGenericTitle": "Algo deu errado", - "exceptionIndicatorTryAgainButton": "Tentar Novamente", - "exceptionIndicatorGenericMessage": "Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", - "genericErrorSnackbarMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet.", - "authenticationRequiredErrorSnackbarMessage": "Você precisa estar logado para executar essa ação." -} \ No newline at end of file diff --git a/packages/component_library/lib/src/quote_card.dart b/packages/component_library/lib/src/quote_card.dart deleted file mode 100644 index 5428cb3..0000000 --- a/packages/component_library/lib/src/quote_card.dart +++ /dev/null @@ -1,91 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:flutter/material.dart'; - -class QuoteCard extends StatelessWidget { - const QuoteCard({ - required this.statement, - required this.isFavorite, - this.author, - this.top, - this.bottom, - this.onTap, - this.onFavorite, - Key? key, - }) : super(key: key); - - final String statement; - final String? author; - final bool isFavorite; - final Widget? top; - final Widget? bottom; - final VoidCallback? onTap; - final VoidCallback? onFavorite; - - @override - Widget build(BuildContext context) { - final top = this.top; - final bottom = this.bottom; - final theme = WonderTheme.of(context); - final author = this.author; - return Card( - margin: const EdgeInsets.all(0), - child: InkWell( - onTap: onTap, - child: Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Row( - children: [ - if (top != null) - Padding( - padding: const EdgeInsets.only( - left: Spacing.medium, - ), - child: top, - ), - const Spacer(), - IconButton( - onPressed: onFavorite, - icon: Icon( - isFavorite - ? Icons.favorite - : Icons.favorite_border_outlined, - ), - ) - ], - ), - Padding( - padding: const EdgeInsets.symmetric( - horizontal: Spacing.xLarge, - ), - child: Text( - statement, - style: theme.quoteTextStyle.copyWith( - fontSize: FontSize.large, - ), - ), - ), - if (bottom != null) - Padding( - padding: const EdgeInsets.only( - right: Spacing.medium, - ), - child: bottom, - ), - const SizedBox( - height: Spacing.mediumLarge, - ), - if (author != null) - Padding( - padding: const EdgeInsets.only( - bottom: Spacing.medium, - right: Spacing.medium, - ), - child: Text(author), - ), - ], - ), - ), - ); - } -} diff --git a/packages/component_library/lib/src/rounded_choice_chip.dart b/packages/component_library/lib/src/rounded_choice_chip.dart index 46806b5..777efff 100644 --- a/packages/component_library/lib/src/rounded_choice_chip.dart +++ b/packages/component_library/lib/src/rounded_choice_chip.dart @@ -25,7 +25,7 @@ class RoundedChoiceChip extends StatelessWidget { @override Widget build(BuildContext context) { - final theme = WonderTheme.of(context); + final theme = GolekTheme.of(context); return ChoiceChip( shape: const StadiumBorder( side: BorderSide(), @@ -35,17 +35,16 @@ class RoundedChoiceChip extends StatelessWidget { label, style: TextStyle( color: isSelected - ? (selectedLabelColor ?? - theme.roundedChoiceChipSelectedLabelColor) - : (labelColor ?? theme.roundedChoiceChipLabelColor), + ? (selectedLabelColor ?? theme.primaryMainColor) + : (labelColor ?? theme.primarySurfaceColor), ), ), onSelected: onSelected, selected: isSelected, backgroundColor: - (backgroundColor ?? theme.roundedChoiceChipBackgroundColor), + (backgroundColor ?? theme.primaryMainColor), selectedColor: (selectedBackgroundColor ?? - theme.roundedChoiceChipSelectedBackgroundColor), + theme.primarySurfaceColor), ); } } diff --git a/packages/component_library/lib/src/svg_asset.dart b/packages/component_library/lib/src/svg_asset.dart deleted file mode 100644 index d707332..0000000 --- a/packages/component_library/lib/src/svg_asset.dart +++ /dev/null @@ -1,78 +0,0 @@ -import 'package:component_library/src/theme/wonder_theme.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_svg/flutter_svg.dart'; - -class _SvgAsset extends StatelessWidget { - const _SvgAsset( - this.assetPath, { - this.width, - this.height, - this.color, - Key? key, - }) : super(key: key); - - final String assetPath; - final double? width; - final double? height; - final Color? color; - - @override - Widget build(BuildContext context) { - return SvgPicture.asset( - 'assets/$assetPath', - width: width, - height: height, - color: color, - package: 'component_library', - ); - } -} - -class OpeningQuoteSvgAsset extends StatelessWidget { - const OpeningQuoteSvgAsset({ - this.width, - this.height, - this.color, - Key? key, - }) : super(key: key); - - final double? width; - final double? height; - final Color? color; - - @override - Widget build(BuildContext context) { - final theme = WonderTheme.of(context); - return _SvgAsset( - 'opening-quote.svg', - width: width, - height: height, - color: theme.quoteSvgColor, - ); - } -} - -class ClosingQuoteSvgAsset extends StatelessWidget { - const ClosingQuoteSvgAsset({ - this.width, - this.height, - this.color, - Key? key, - }) : super(key: key); - - final double? width; - final double? height; - final Color? color; - - @override - Widget build(BuildContext context) { - final theme = WonderTheme.of(context); - return _SvgAsset( - 'closing-quote.svg', - width: width, - height: height, - color: theme.quoteSvgColor, - ); - } -} diff --git a/packages/component_library/lib/src/theme/font_size.dart b/packages/component_library/lib/src/theme/font_size.dart index 0bd0d1d..92cec9e 100644 --- a/packages/component_library/lib/src/theme/font_size.dart +++ b/packages/component_library/lib/src/theme/font_size.dart @@ -1,8 +1,14 @@ abstract class FontSize { - static const double small = 11; - static const double medium = 14; - static const double mediumLarge = 18; - static const double large = 22; - static const double xLarge = 64; - static const double xxLarge = 192; + static const double style24 = 24; + static const double style20 = 20; + static const double style18 = 18; + static const double style16 = 16; + static const double style15 = 15; + static const double style14 = 14; + static const double style13 = 13; + static const double style12 = 12; + static const double style11 = 11; + static const double style10 = 10; } + + diff --git a/packages/component_library/lib/src/theme/wonder_theme.dart b/packages/component_library/lib/src/theme/golek_theme.dart similarity index 53% rename from packages/component_library/lib/src/theme/wonder_theme.dart rename to packages/component_library/lib/src/theme/golek_theme.dart index 79d43d5..42bf524 100644 --- a/packages/component_library/lib/src/theme/wonder_theme.dart +++ b/packages/component_library/lib/src/theme/golek_theme.dart @@ -1,8 +1,8 @@ -import 'package:component_library/src/theme/wonder_theme_data.dart'; +import 'package:component_library/src/theme/golek_theme_data.dart'; import 'package:flutter/material.dart'; -class WonderTheme extends InheritedWidget { - const WonderTheme({ +class GolekTheme extends InheritedWidget { + const GolekTheme({ required Widget child, required this.lightTheme, required this.darkTheme, @@ -12,19 +12,19 @@ class WonderTheme extends InheritedWidget { child: child, ); - final WonderThemeData lightTheme; - final WonderThemeData darkTheme; + final GolekThemeData lightTheme; + final GolekThemeData darkTheme; @override bool updateShouldNotify( - WonderTheme oldWidget, + GolekTheme oldWidget, ) => oldWidget.lightTheme != lightTheme || oldWidget.darkTheme != darkTheme; - static WonderThemeData of(BuildContext context) { - final WonderTheme? inheritedTheme = - context.dependOnInheritedWidgetOfExactType(); - assert(inheritedTheme != null, 'No WonderTheme found in context'); + static GolekThemeData of(BuildContext context) { + final GolekTheme? inheritedTheme = + context.dependOnInheritedWidgetOfExactType(); + assert(inheritedTheme != null, 'No GolekTheme found in context'); final currentBrightness = Theme.of(context).brightness; return currentBrightness == Brightness.dark ? inheritedTheme!.darkTheme diff --git a/packages/component_library/lib/src/theme/golek_theme_data.dart b/packages/component_library/lib/src/theme/golek_theme_data.dart new file mode 100644 index 0000000..0e35e1e --- /dev/null +++ b/packages/component_library/lib/src/theme/golek_theme_data.dart @@ -0,0 +1,466 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library/src/theme/spacing.dart'; +import 'package:flutter/material.dart'; + +const _dividerThemeData = DividerThemeData( + space: 0, +); + +// If the number of properties get too big, we can start grouping them in +// classes like Flutter does with TextTheme, ButtonTheme, etc, inside ThemeData. +abstract class GolekThemeData { + ThemeData get materialThemeData; + + double screenMargin = Spacing.mediumLarge; + + double gridSpacing = Spacing.mediumLarge; + + Color get primaryMainColor; + + Color get primaryOldColor; + + Color get primarySurfaceColor; + + Color get primaryBorderColor; + + Color get primaryHoverColor; + + Color get primaryPressedColor; + + Color get primaryFocusColor; + + Color get secondaryMainColor; + + Color get secondarySurfaceColor; + + Color get secondaryBorderColor; + + Color get secondaryHoverColor; + + Color get secondaryPressedColor; + + Color get secondaryFocusColor; + + Color get tertiaryMainColor; + + Color get tertiarySurfaceColor; + + Color get tertiaryBorderColor; + + Color get tertiaryHoverColor; + + Color get tertiaryPressedColor; + + Color get tertiaryFocusColor; + + Color get disabledColor; + + Color get neutral10Color; + + Color get neutral20Color; + + Color get neutral30Color; + + Color get neutral40Color; + + Color get neutral50Color; + + Color get neutral60Color; + + Color get neutral70Color; + + Color get neutral80Color; + + Color get neutral90Color; + + Color get neutral100Color; + + Color get dangerMainColor; + + Color get dangerSurfaceColor; + + Color get dangerBorderColor; + + Color get dangerHoverColor; + + Color get dangerPressedColor; + + Color get successMainColor; + + Color get successSurfaceColor; + + Color get successBorderColor; + + Color get successHoverColor; + + Color get successPressedColor; + + Color get warningMainColor; + + Color get warningSurfaceColor; + + Color get warningBorderColor; + + Color get warningHoverColor; + + Color get warningPressedColor; + + TextStyle textStyle = const TextStyle( + fontFamily: 'Montserrat', + package: 'component_library', + ); +} + +class LightGolekThemeData extends GolekThemeData { + @override + ThemeData get materialThemeData => ThemeData( + brightness: Brightness.light, + primarySwatch: Colors.black.toMaterialColor(), + dividerTheme: _dividerThemeData, + ); + + @override + Color get dangerBorderColor => const Color(0xffFEC4C4); + + @override + Color get dangerHoverColor => const Color(0xffFA2020); + + @override + Color get dangerMainColor => const Color(0xffFA2020); + + @override + Color get dangerPressedColor => const Color(0xffE11D1D); + + @override + Color get dangerSurfaceColor => const Color(0xffFED2D2); + + @override + Color get disabledColor => const Color(0xffededed); + + @override + Color get neutral10Color => Colors.white; + + @override + Color get neutral20Color => const Color(0xffEAF2FF); + + @override + Color get neutral30Color => const Color(0xffC6CFDD); + + @override + Color get neutral40Color => const Color(0xffB0B8C5); + + @override + Color get neutral50Color => const Color(0xff9AA1AC); + + @override + Color get neutral60Color => const Color(0xff848A94); + + @override + Color get neutral70Color => const Color(0xff6E737B); + + @override + Color get neutral80Color => const Color(0xff585C62); + + @override + Color get neutral90Color => const Color(0xff585C62); + + @override + Color get neutral100Color => const Color(0xff3E3E3E); + + @override + Color get primaryBorderColor => const Color(0xff9EF3D4); + + @override + Color get primaryFocusColor => const Color(0xff5EEBB7).withOpacity(0.2); + + @override + Color get primaryHoverColor => const Color(0xff4BBC92); + + @override + Color get primaryMainColor => const Color(0xff4BBC92); + + @override + Color get primaryOldColor => const Color(0xff5EEBB7); + + @override + Color get primaryPressedColor => const Color(0xff388D6E); + + @override + Color get primarySurfaceColor => const Color(0xffEFFDF8); + + @override + Color get secondaryBorderColor => const Color(0xffFFECAA); + + @override + Color get secondaryFocusColor => const Color.fromRGBO(255, 199, 0, 0.2); + + @override + Color get secondaryHoverColor => const Color(0xffE6B300); + + @override + Color get secondaryMainColor => const Color(0xff122307); + + @override + Color get secondaryPressedColor => const Color(0xffCC9F00); + + @override + Color get secondarySurfaceColor => const Color(0xffFFF2C3); + + @override + Color get successBorderColor => const Color(0xffD8FFF0); + + @override + Color get successHoverColor => const Color(0xff3DFFB5); + + @override + Color get successMainColor => const Color(0xff8BFFD3); + + @override + Color get successPressedColor => const Color(0xff18D48C); + + @override + Color get successSurfaceColor => const Color(0xffECFFF8); + + @override + Color get tertiaryBorderColor => const Color(0xffDCE6F6); + + @override + Color get tertiaryFocusColor => const Color.fromRGBO(198, 207, 221, 0.2); + + @override + Color get tertiaryHoverColor => const Color(0xffB0B8C5); + + @override + Color get tertiaryMainColor => const Color(0xff1A82E4); + + @override + Color get tertiaryPressedColor => const Color(0xff9AA1AC); + + @override + Color get tertiarySurfaceColor =>const Color(0xffF5F5F5); + + @override + Color get warningBorderColor => const Color(0xffFFF9CF); + + @override + Color get warningHoverColor => const Color(0xffFEE31A); + + @override + Color get warningMainColor => const Color(0xffFFEE6E); + + @override + Color get warningPressedColor => const Color(0xffCBB511); + + @override + Color get warningSurfaceColor => const Color(0xffFFFCE2); +} + +class DarkGolekThemeData extends GolekThemeData { + @override + ThemeData get materialThemeData => ThemeData( + brightness: Brightness.dark, + toggleableActiveColor: Colors.white, + primarySwatch: Colors.white.toMaterialColor(), + dividerTheme: _dividerThemeData, + ); + + @override + // TODO: implement dangerBorderColor + Color get dangerBorderColor => throw UnimplementedError(); + + @override + // TODO: implement dangerHoverColor + Color get dangerHoverColor => throw UnimplementedError(); + + @override + // TODO: implement dangerMainColor + Color get dangerMainColor => throw UnimplementedError(); + + @override + // TODO: implement dangerPressedColor + Color get dangerPressedColor => throw UnimplementedError(); + + @override + // TODO: implement dangerSurfaceColor + Color get dangerSurfaceColor => throw UnimplementedError(); + + @override + // TODO: implement disabledColor + Color get disabledColor => throw UnimplementedError(); + + @override + // TODO: implement neutral100Color + Color get neutral100Color => throw UnimplementedError(); + + @override + // TODO: implement neutral10Color + Color get neutral10Color => throw UnimplementedError(); + + @override + // TODO: implement neutral20Color + Color get neutral20Color => throw UnimplementedError(); + + @override + // TODO: implement neutral30Color + Color get neutral30Color => throw UnimplementedError(); + + @override + // TODO: implement neutral40Color + Color get neutral40Color => throw UnimplementedError(); + + @override + // TODO: implement neutral50Color + Color get neutral50Color => throw UnimplementedError(); + + @override + // TODO: implement neutral60Color + Color get neutral60Color => throw UnimplementedError(); + + @override + // TODO: implement neutral70Color + Color get neutral70Color => throw UnimplementedError(); + + @override + // TODO: implement neutral80Color + Color get neutral80Color => throw UnimplementedError(); + + @override + // TODO: implement neutral90Color + Color get neutral90Color => throw UnimplementedError(); + + @override + // TODO: implement primaryBorderColor + Color get primaryBorderColor => throw UnimplementedError(); + + @override + // TODO: implement primaryFocusColor + Color get primaryFocusColor => throw UnimplementedError(); + + @override + // TODO: implement primaryHoverColor + Color get primaryHoverColor => throw UnimplementedError(); + + @override + // TODO: implement primaryMainColor + Color get primaryMainColor => throw UnimplementedError(); + + @override + // TODO: implement primaryOldColor + Color get primaryOldColor => throw UnimplementedError(); + + @override + // TODO: implement primaryPressedColor + Color get primaryPressedColor => throw UnimplementedError(); + + @override + // TODO: implement primarySurfaceColor + Color get primarySurfaceColor => throw UnimplementedError(); + + @override + // TODO: implement secondaryBorderColor + Color get secondaryBorderColor => throw UnimplementedError(); + + @override + // TODO: implement secondaryFocusColor + Color get secondaryFocusColor => throw UnimplementedError(); + + @override + // TODO: implement secondaryHoverColor + Color get secondaryHoverColor => throw UnimplementedError(); + + @override + // TODO: implement secondaryMainColor + Color get secondaryMainColor => throw UnimplementedError(); + + @override + // TODO: implement secondaryPressedColor + Color get secondaryPressedColor => throw UnimplementedError(); + + @override + // TODO: implement secondarySurfaceColor + Color get secondarySurfaceColor => throw UnimplementedError(); + + @override + // TODO: implement successBorderColor + Color get successBorderColor => throw UnimplementedError(); + + @override + // TODO: implement successHoverColor + Color get successHoverColor => throw UnimplementedError(); + + @override + // TODO: implement successMainColor + Color get successMainColor => throw UnimplementedError(); + + @override + // TODO: implement successPressedColor + Color get successPressedColor => throw UnimplementedError(); + + @override + // TODO: implement successSurfaceColor + Color get successSurfaceColor => throw UnimplementedError(); + + @override + // TODO: implement tertiaryBorderColor + Color get tertiaryBorderColor => throw UnimplementedError(); + + @override + // TODO: implement tertiaryFocusColor + Color get tertiaryFocusColor => throw UnimplementedError(); + + @override + // TODO: implement tertiaryHoverColor + Color get tertiaryHoverColor => throw UnimplementedError(); + + @override + // TODO: implement tertiaryMainColor + Color get tertiaryMainColor => throw UnimplementedError(); + + @override + // TODO: implement tertiaryPressedColor + Color get tertiaryPressedColor => throw UnimplementedError(); + + @override + // TODO: implement tertiarySurfaceColor + Color get tertiarySurfaceColor => throw UnimplementedError(); + + @override + // TODO: implement warningBorderColor + Color get warningBorderColor => throw UnimplementedError(); + + @override + // TODO: implement warningHoverColor + Color get warningHoverColor => throw UnimplementedError(); + + @override + // TODO: implement warningMainColor + Color get warningMainColor => throw UnimplementedError(); + + @override + // TODO: implement warningPressedColor + Color get warningPressedColor => throw UnimplementedError(); + + @override + // TODO: implement warningSurfaceColor + Color get warningSurfaceColor => throw UnimplementedError(); +} + +extension on Color { + Map _toSwatch() => { + 50: withOpacity(0.1), + 100: withOpacity(0.2), + 200: withOpacity(0.3), + 300: withOpacity(0.4), + 400: withOpacity(0.5), + 500: withOpacity(0.6), + 600: withOpacity(0.7), + 700: withOpacity(0.8), + 800: withOpacity(0.9), + 900: this, + }; + + MaterialColor toMaterialColor() => MaterialColor( + value, + _toSwatch(), + ); +} diff --git a/packages/component_library/lib/src/theme/wonder_theme_data.dart b/packages/component_library/lib/src/theme/wonder_theme_data.dart deleted file mode 100644 index fab49c3..0000000 --- a/packages/component_library/lib/src/theme/wonder_theme_data.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:component_library/src/theme/spacing.dart'; -import 'package:flutter/material.dart'; - -const _dividerThemeData = DividerThemeData( - space: 0, -); - -// If the number of properties get too big, we can start grouping them in -// classes like Flutter does with TextTheme, ButtonTheme, etc, inside ThemeData. -abstract class WonderThemeData { - ThemeData get materialThemeData; - - double screenMargin = Spacing.mediumLarge; - - double gridSpacing = Spacing.mediumLarge; - - Color get roundedChoiceChipBackgroundColor; - - Color get roundedChoiceChipSelectedBackgroundColor; - - Color get roundedChoiceChipLabelColor; - - Color get roundedChoiceChipSelectedLabelColor; - - Color get roundedChoiceChipAvatarColor; - - Color get roundedChoiceChipSelectedAvatarColor; - - Color get quoteSvgColor; - - Color get unvotedButtonColor; - - Color get votedButtonColor; - - TextStyle quoteTextStyle = const TextStyle( - fontFamily: 'Fondamento', - package: 'component_library', - ); -} - -class LightWonderThemeData extends WonderThemeData { - @override - ThemeData get materialThemeData => ThemeData( - brightness: Brightness.light, - primarySwatch: Colors.black.toMaterialColor(), - dividerTheme: _dividerThemeData, - ); - - @override - Color get roundedChoiceChipBackgroundColor => Colors.white; - - @override - Color get roundedChoiceChipLabelColor => Colors.black; - - @override - Color get roundedChoiceChipSelectedBackgroundColor => Colors.black; - - @override - Color get roundedChoiceChipSelectedLabelColor => Colors.white; - - @override - Color get quoteSvgColor => Colors.black; - - @override - Color get roundedChoiceChipAvatarColor => Colors.black; - - @override - Color get roundedChoiceChipSelectedAvatarColor => Colors.white; - - @override - Color get unvotedButtonColor => Colors.black54; - - @override - Color get votedButtonColor => Colors.black; -} - -class DarkWonderThemeData extends WonderThemeData { - @override - ThemeData get materialThemeData => ThemeData( - brightness: Brightness.dark, - toggleableActiveColor: Colors.white, - primarySwatch: Colors.white.toMaterialColor(), - dividerTheme: _dividerThemeData, - ); - - @override - Color get roundedChoiceChipBackgroundColor => Colors.black; - - @override - Color get roundedChoiceChipLabelColor => Colors.white; - - @override - Color get roundedChoiceChipSelectedBackgroundColor => Colors.white; - - @override - Color get roundedChoiceChipSelectedLabelColor => Colors.black; - - @override - Color get quoteSvgColor => Colors.white; - - @override - Color get roundedChoiceChipAvatarColor => Colors.white; - - @override - Color get roundedChoiceChipSelectedAvatarColor => Colors.black; - - @override - Color get unvotedButtonColor => Colors.white54; - - @override - Color get votedButtonColor => Colors.white; -} - -extension on Color { - Map _toSwatch() => { - 50: withOpacity(0.1), - 100: withOpacity(0.2), - 200: withOpacity(0.3), - 300: withOpacity(0.4), - 400: withOpacity(0.5), - 500: withOpacity(0.6), - 600: withOpacity(0.7), - 700: withOpacity(0.8), - 800: withOpacity(0.9), - 900: this, - }; - - MaterialColor toMaterialColor() => MaterialColor( - value, - _toSwatch(), - ); -} diff --git a/packages/component_library/lib/src/upvote_icon_button.dart b/packages/component_library/lib/src/upvote_icon_button.dart deleted file mode 100644 index 06a28ad..0000000 --- a/packages/component_library/lib/src/upvote_icon_button.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:flutter/material.dart'; - -class UpvoteIconButton extends StatelessWidget { - const UpvoteIconButton({ - required this.count, - required this.isUpvoted, - this.onTap, - Key? key, - }) : super(key: key); - - final int count; - final bool isUpvoted; - final VoidCallback? onTap; - - @override - Widget build(BuildContext context) { - final l10n = ComponentLibraryLocalizations.of(context); - final theme = WonderTheme.of(context); - return CountIndicatorIconButton( - onTap: onTap, - tooltip: l10n.upvoteIconButtonTooltip, - iconData: Icons.arrow_upward_sharp, - iconColor: isUpvoted ? theme.votedButtonColor : theme.unvotedButtonColor, - count: count, - ); - } -} diff --git a/packages/component_library/pubspec.yaml b/packages/component_library/pubspec.yaml index fae4797..92de0e9 100644 --- a/packages/component_library/pubspec.yaml +++ b/packages/component_library/pubspec.yaml @@ -25,6 +25,22 @@ flutter: assets: - assets/ fonts: - - family: Fondamento + - family: Montserrat fonts: - - asset: assets/Fondamento-Regular.ttf \ No newline at end of file + - asset: assets/fonts/Montserrat-Regular.ttf + weight: 400 + - asset: assets/fonts/Montserrat-Medium.ttf + weight: 500 + - asset: assets/fonts/Montserrat-MediumItalic.ttf + weight: 500 + style: italic + - asset: assets/fonts/Montserrat-SemiBold.ttf + weight: 600 + - asset: assets/fonts/Montserrat-SemiBoldItalic.ttf + weight: 600 + style: italic + - asset: assets/fonts/Montserrat-Bold.ttf + weight: 700 + - asset: assets/fonts/Montserrat-BoldItalic.ttf + weight: 700 + style: italic diff --git a/packages/features/landing_menu/analysis_options.yaml b/packages/features/landing_menu/analysis_options.yaml new file mode 100644 index 0000000..a3be6b8 --- /dev/null +++ b/packages/features/landing_menu/analysis_options.yaml @@ -0,0 +1 @@ +include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/packages/features/landing_menu/l10n.yaml b/packages/features/landing_menu/l10n.yaml new file mode 100644 index 0000000..4d366e5 --- /dev/null +++ b/packages/features/landing_menu/l10n.yaml @@ -0,0 +1,6 @@ +arb-dir: lib/src/l10n +template-arb-file: messages_id.arb +output-localization-file: landing_menu_localizations.dart +output-class: LandingMenuLocalizations +synthetic-package: false +nullable-getter: false \ No newline at end of file diff --git a/packages/features/landing_menu/lib/landing_menu.dart b/packages/features/landing_menu/lib/landing_menu.dart new file mode 100644 index 0000000..b14fdec --- /dev/null +++ b/packages/features/landing_menu/lib/landing_menu.dart @@ -0,0 +1 @@ +export 'src/landing_page.dart'; \ No newline at end of file diff --git a/packages/features/landing_menu/lib/src/l10n/landing_menu_localizations.dart b/packages/features/landing_menu/lib/src/l10n/landing_menu_localizations.dart new file mode 100644 index 0000000..2964890 --- /dev/null +++ b/packages/features/landing_menu/lib/src/l10n/landing_menu_localizations.dart @@ -0,0 +1,175 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:intl/intl.dart' as intl; + +import 'landing_menu_localizations_en.dart'; +import 'landing_menu_localizations_id.dart'; + +/// Callers can lookup localized strings with an instance of LandingMenuLocalizations +/// returned by `LandingMenuLocalizations.of(context)`. +/// +/// Applications need to include `LandingMenuLocalizations.delegate()` in their app's +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: +/// +/// ```dart +/// import 'l10n/landing_menu_localizations.dart'; +/// +/// return MaterialApp( +/// localizationsDelegates: LandingMenuLocalizations.localizationsDelegates, +/// supportedLocales: LandingMenuLocalizations.supportedLocales, +/// home: MyApplicationHome(), +/// ); +/// ``` +/// +/// ## Update pubspec.yaml +/// +/// Please make sure to update your pubspec.yaml to include the following +/// packages: +/// +/// ```yaml +/// dependencies: +/// # Internationalization support. +/// flutter_localizations: +/// sdk: flutter +/// intl: any # Use the pinned version from flutter_localizations +/// +/// # Rest of dependencies +/// ``` +/// +/// ## iOS Applications +/// +/// iOS applications define key application metadata, including supported +/// locales, in an Info.plist file that is built into the application bundle. +/// To configure the locales supported by your app, you’ll need to edit this +/// file. +/// +/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. +/// Then, in the Project Navigator, open the Info.plist file under the Runner +/// project’s Runner folder. +/// +/// Next, select the Information Property List item, select Add Item from the +/// Editor menu, then select Localizations from the pop-up menu. +/// +/// Select and expand the newly-created Localizations item then, for each +/// locale your application supports, add a new item and select the locale +/// you wish to add from the pop-up menu in the Value field. This list should +/// be consistent with the languages listed in the LandingMenuLocalizations.supportedLocales +/// property. +abstract class LandingMenuLocalizations { + LandingMenuLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + + final String localeName; + + static LandingMenuLocalizations of(BuildContext context) { + return Localizations.of(context, LandingMenuLocalizations)!; + } + + static const LocalizationsDelegate delegate = _LandingMenuLocalizationsDelegate(); + + /// A list of this localizations delegate along with the default localizations + /// delegates. + /// + /// Returns a list of localizations delegates containing this delegate along with + /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, + /// and GlobalWidgetsLocalizations.delegate. + /// + /// Additional delegates can be added by appending to this list in + /// MaterialApp. This list does not have to be used at all if a custom list + /// of delegates is preferred or required. + static const List> localizationsDelegates = >[ + delegate, + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ]; + + /// A list of this localizations delegate's supported locales. + static const List supportedLocales = [ + Locale('en'), + Locale('id') + ]; + + /// No description provided for @dialogTitle. + /// + /// In id, this message translates to: + /// **'Esqueci Minha Senha'** + String get dialogTitle; + + /// No description provided for @emailTextFieldLabel. + /// + /// In id, this message translates to: + /// **'Email'** + String get emailTextFieldLabel; + + /// No description provided for @emailTextFieldEmptyErrorMessage. + /// + /// In id, this message translates to: + /// **'Seu email não pode ser vazio.'** + String get emailTextFieldEmptyErrorMessage; + + /// No description provided for @emailTextFieldInvalidErrorMessage. + /// + /// In id, this message translates to: + /// **'Este email não é válido.'** + String get emailTextFieldInvalidErrorMessage; + + /// No description provided for @emailRequestSuccessMessage. + /// + /// In id, this message translates to: + /// **'Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.'** + String get emailRequestSuccessMessage; + + /// No description provided for @confirmButtonLabel. + /// + /// In id, this message translates to: + /// **'Confirmar'** + String get confirmButtonLabel; + + /// No description provided for @cancelButtonLabel. + /// + /// In id, this message translates to: + /// **'Cancelar'** + String get cancelButtonLabel; + + /// No description provided for @errorMessage. + /// + /// In id, this message translates to: + /// **'Ocorreu um erro. Por favor, confira sua conexão com a internet.'** + String get errorMessage; +} + +class _LandingMenuLocalizationsDelegate extends LocalizationsDelegate { + const _LandingMenuLocalizationsDelegate(); + + @override + Future load(Locale locale) { + return SynchronousFuture(lookupLandingMenuLocalizations(locale)); + } + + @override + bool isSupported(Locale locale) => ['en', 'id'].contains(locale.languageCode); + + @override + bool shouldReload(_LandingMenuLocalizationsDelegate old) => false; +} + +LandingMenuLocalizations lookupLandingMenuLocalizations(Locale locale) { + + + // Lookup logic when only language code is specified. + switch (locale.languageCode) { + case 'en': return LandingMenuLocalizationsEn(); + case 'id': return LandingMenuLocalizationsId(); + } + + throw FlutterError( + 'LandingMenuLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); +} diff --git a/packages/features/landing_menu/lib/src/l10n/landing_menu_localizations_en.dart b/packages/features/landing_menu/lib/src/l10n/landing_menu_localizations_en.dart new file mode 100644 index 0000000..0941b10 --- /dev/null +++ b/packages/features/landing_menu/lib/src/l10n/landing_menu_localizations_en.dart @@ -0,0 +1,30 @@ +import 'landing_menu_localizations.dart'; + +/// The translations for English (`en`). +class LandingMenuLocalizationsEn extends LandingMenuLocalizations { + LandingMenuLocalizationsEn([String locale = 'en']) : super(locale); + + @override + String get dialogTitle => 'Forgot My Password'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Your email can\'t be empty.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'This email is not valid.'; + + @override + String get emailRequestSuccessMessage => 'If this email is registered in our systems, a link will be sent to you with instructions on how to reset your password.'; + + @override + String get confirmButtonLabel => 'Confirm'; + + @override + String get cancelButtonLabel => 'Cancel'; + + @override + String get errorMessage => 'There has been an error. Please, check your internet connection.'; +} diff --git a/packages/features/landing_menu/lib/src/l10n/landing_menu_localizations_id.dart b/packages/features/landing_menu/lib/src/l10n/landing_menu_localizations_id.dart new file mode 100644 index 0000000..8520d34 --- /dev/null +++ b/packages/features/landing_menu/lib/src/l10n/landing_menu_localizations_id.dart @@ -0,0 +1,30 @@ +import 'landing_menu_localizations.dart'; + +/// The translations for Indonesian (`id`). +class LandingMenuLocalizationsId extends LandingMenuLocalizations { + LandingMenuLocalizationsId([String locale = 'id']) : super(locale); + + @override + String get dialogTitle => 'Esqueci Minha Senha'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailRequestSuccessMessage => 'Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.'; + + @override + String get confirmButtonLabel => 'Confirmar'; + + @override + String get cancelButtonLabel => 'Cancelar'; + + @override + String get errorMessage => 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; +} diff --git a/packages/features/landing_menu/lib/src/l10n/messages_en.arb b/packages/features/landing_menu/lib/src/l10n/messages_en.arb new file mode 100644 index 0000000..957d07a --- /dev/null +++ b/packages/features/landing_menu/lib/src/l10n/messages_en.arb @@ -0,0 +1,10 @@ +{ + "dialogTitle": "Forgot My Password", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Your email can't be empty.", + "emailTextFieldInvalidErrorMessage": "This email is not valid.", + "emailRequestSuccessMessage": "If this email is registered in our systems, a link will be sent to you with instructions on how to reset your password.", + "confirmButtonLabel": "Confirm", + "cancelButtonLabel": "Cancel", + "errorMessage": "There has been an error. Please, check your internet connection." +} \ No newline at end of file diff --git a/packages/features/landing_menu/lib/src/l10n/messages_id.arb b/packages/features/landing_menu/lib/src/l10n/messages_id.arb new file mode 100644 index 0000000..c7ea339 --- /dev/null +++ b/packages/features/landing_menu/lib/src/l10n/messages_id.arb @@ -0,0 +1,10 @@ +{ + "dialogTitle": "Esqueci Minha Senha", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailRequestSuccessMessage": "Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.", + "confirmButtonLabel": "Confirmar", + "cancelButtonLabel": "Cancelar", + "errorMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet." +} \ No newline at end of file diff --git a/packages/features/landing_menu/lib/src/landing_cubit.dart b/packages/features/landing_menu/lib/src/landing_cubit.dart new file mode 100644 index 0000000..e69de29 diff --git a/packages/features/landing_menu/lib/src/landing_page.dart b/packages/features/landing_menu/lib/src/landing_page.dart new file mode 100644 index 0000000..9f31945 --- /dev/null +++ b/packages/features/landing_menu/lib/src/landing_page.dart @@ -0,0 +1,206 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; + +import 'package:landing_menu/src/widgets/landing_app_bar.dart'; + +class LandingPage extends StatefulWidget { + const LandingPage({Key? key}) : super(key: key); + + @override + State createState() => _LandingPageState(); +} + +class _LandingPageState extends State { + @override + void initState() { + super.initState(); + + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + // TODO: check for new version of application + }); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final theme = GolekTheme.of(context); + + return Scaffold( + appBar: LandingAppBar(), + body: SafeArea( + child: Stack( + children: [ + Container( + width: double.infinity, + height: 497, + decoration: BoxDecoration( + color: theme.primaryMainColor, + borderRadius: const BorderRadius.vertical( + bottom: Radius.circular(25), + ), + ), + ), + Container( + padding: const EdgeInsets.only( + right: 20, + left: 20, + bottom: 80, + ), + width: double.infinity, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Image.asset( + 'assets/images/truckershipper.png', + width: 300, + height: 200, + ), + const SizedBox(height: 12), + Text( + 'Cari, Muat, Jalan.\nPraktis kan ?', + textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis, + maxLines: 2, + style: theme.textStyle.copyWith( + fontSize: FontSize.style24, + color: theme.neutral10Color, + fontWeight: FontWeight.w600, + letterSpacing: 1, + ), + ), + const SizedBox(height: 21), + GestureDetector( + onTap: () async {}, + child: Text( + 'GolekTruk memberikan kebebasan\nberlogistik menggunakan budaya\nperusahaan sendiri.', + textAlign: TextAlign.center, + style: theme.textStyle.copyWith( + fontSize: FontSize.style14, + color: theme.neutral10Color, + fontWeight: FontWeight.w500, + ), + ), + ), + SizedBox(height: 21), + Row( + children: [ + CardProduct( + onClickInfo: () => {}, + label: 'Cari Truk', + description: 'Pengirim Muatan', + assets: 'assets/images/box_shipper.png', + onTap: () {}, + ), + const SizedBox(width: 14), + CardProduct( + onClickInfo: () => {}, + label: 'Cari Muatan', + description: 'Penyedia Angkutan', + assets: 'assets/images/truk_trucker.png', + onTap: () async {}, + ), + ], + ), + ], + ), + ), + ], + ), + ), + ); + } +} + +class CardProduct extends StatelessWidget { + final String assets; + final String label; + final String description; + final Function() onTap; + final Function() onClickInfo; + + const CardProduct({ + Key? key, + required this.assets, + required this.label, + required this.description, + required this.onTap, + required this.onClickInfo, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = GolekTheme.of(context); + return Expanded( + child: Container( + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: theme.neutral10Color, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Material( + borderRadius: BorderRadius.circular(10), + child: InkWell( + splashColor: theme.primaryMainColor, + onTap: onTap, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Align( + alignment: Alignment.topRight, + child: GestureDetector( + onTap: onClickInfo, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Icon( + Icons.info_outline, + color: theme.neutral70Color, + ), + ), + ), + ), + const SizedBox(height: 8), + Image( + image: AssetImage(assets), + width: 131, + height: 100, + fit: BoxFit.contain, + ), + const SizedBox(height: 15), + Text( + label, + style: theme.textStyle.copyWith( + fontSize: FontSize.style15, + color: theme.neutral100Color, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 2), + Text( + description, + style: theme.textStyle.copyWith( + fontSize: FontSize.style12, + color: theme.neutral100Color, + ), + ), + const SizedBox(height: 14), + ], + ), + ), + ), + ), + ); + } +} diff --git a/packages/features/landing_menu/lib/src/landing_state.dart b/packages/features/landing_menu/lib/src/landing_state.dart new file mode 100644 index 0000000..e69de29 diff --git a/packages/features/landing_menu/lib/src/widgets/landing_app_bar.dart b/packages/features/landing_menu/lib/src/widgets/landing_app_bar.dart new file mode 100644 index 0000000..9b5829d --- /dev/null +++ b/packages/features/landing_menu/lib/src/widgets/landing_app_bar.dart @@ -0,0 +1,63 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; + +class LandingAppBar extends StatelessWidget with PreferredSizeWidget { + LandingAppBar({Key? key}) : super(key: key); + + final LayerLink _link = LayerLink(); + + @override + Widget build(BuildContext context) { + final theme = GolekTheme.of(context); + + return AppBar( + backgroundColor: theme.primaryMainColor, + actions: [ + CompositedTransformTarget( + link: _link, + child: GestureDetector( + onTap: () {}, + child: Container( + color: theme.primaryMainColor, + width: 60, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: 4, + height: 4, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(9999), + color: theme.neutral10Color, + ), + ), + const SizedBox(height: 4), + Container( + width: 4, + height: 4, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(9999), + color: theme.neutral10Color, + ), + ), + const SizedBox(height: 4), + Container( + width: 4, + height: 4, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(9999), + color: theme.neutral10Color, + ), + ), + ], + ), + ), + ), + ), + ], + ); + } + + @override + Size get preferredSize => const Size.fromHeight(kToolbarHeight); +} diff --git a/packages/features/landing_menu/pubspec.lock b/packages/features/landing_menu/pubspec.lock new file mode 100644 index 0000000..d776035 --- /dev/null +++ b/packages/features/landing_menu/pubspec.lock @@ -0,0 +1,488 @@ +# 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: "47.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + url: "https://pub.dartlang.org" + source: hosted + version: "4.7.0" + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.1" + async: + dependency: transitive + description: + name: async + url: "https://pub.dartlang.org" + source: hosted + version: "2.9.0" + auto_size_text: + dependency: transitive + description: + name: auto_size_text + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" + bloc: + dependency: transitive + description: + name: bloc + url: "https://pub.dartlang.org" + source: hosted + version: "8.1.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.1" + clock: + dependency: transitive + description: + name: clock + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.16.0" + component_library: + dependency: "direct main" + description: + path: "../../component_library" + relative: true + source: path + version: "0.0.0" + convert: + dependency: transitive + description: + name: convert + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.1" + coverage: + dependency: transitive + description: + name: coverage + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.1" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.2" + fake_async: + dependency: transitive + description: + name: fake_async + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.1" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.4" + 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.1.1" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + flutter_localizations: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + flutter_svg: + dependency: transitive + description: + name: flutter_svg + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.6" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + form_fields: + dependency: "direct main" + description: + path: "../../form_fields" + relative: true + source: path + version: "1.0.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.3" + glob: + dependency: transitive + description: + name: glob + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.2" + intl: + dependency: transitive + 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.5" + 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.1.0" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.12" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.5" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.0" + mime: + dependency: transitive + description: + name: mime + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.3" + mocktail: + dependency: "direct dev" + description: + name: mocktail + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.4" + nested: + dependency: transitive + description: + name: nested + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + node_preamble: + dependency: transitive + description: + name: node_preamble + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + package_config: + dependency: transitive + description: + name: package_config + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + path: + dependency: transitive + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.2" + path_drawing: + dependency: transitive + description: + name: path_drawing + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + path_parsing: + dependency: transitive + description: + name: path_parsing + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + petitparser: + dependency: transitive + description: + name: petitparser + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.0" + pool: + dependency: transitive + description: + name: pool + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.1" + provider: + dependency: transitive + description: + name: provider + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.4" + pub_semver: + dependency: transitive + description: + name: pub_semver + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.3" + shelf: + dependency: transitive + description: + name: shelf + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + shelf_static: + dependency: transitive + description: + name: shelf_static + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.3" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + source_maps: + dependency: transitive + description: + name: source_maps + url: "https://pub.dartlang.org" + source: hosted + version: "0.10.11" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.dartlang.org" + source: hosted + version: "1.9.0" + 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" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.1" + test: + dependency: "direct dev" + description: + name: test + url: "https://pub.dartlang.org" + source: hosted + version: "1.21.4" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.12" + test_core: + dependency: transitive + description: + name: test_core + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.16" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.1" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.2" + vm_service: + dependency: transitive + description: + name: vm_service + url: "https://pub.dartlang.org" + source: hosted + version: "9.4.0" + watcher: + dependency: transitive + description: + name: watcher + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + xml: + dependency: transitive + description: + name: xml + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.0" + yaml: + dependency: transitive + description: + name: yaml + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.1" +sdks: + dart: ">=2.18.2 <3.0.0" + flutter: ">=2.11.0-0.1.pre" diff --git a/packages/features/landing_menu/pubspec.yaml b/packages/features/landing_menu/pubspec.yaml new file mode 100644 index 0000000..bef557b --- /dev/null +++ b/packages/features/landing_menu/pubspec.yaml @@ -0,0 +1,24 @@ +name: landing_menu +publish_to: none + +environment: + sdk: ">=2.14.0 <3.0.0" + +dependencies: + component_library: + path: ../../component_library + flutter_bloc: ^8.0.1 + flutter: + sdk: flutter + form_fields: + path: ../../form_fields + +dev_dependencies: + flutter_test: + sdk: flutter + mocktail: 0.1.4 + test: ^1.16.8 + flutter_lints: ^1.0.4 + +flutter: + uses-material-design: true \ No newline at end of file diff --git a/packages/features/landing_menu/test/widget_test.dart b/packages/features/landing_menu/test/widget_test.dart new file mode 100644 index 0000000..7cedf99 --- /dev/null +++ b/packages/features/landing_menu/test/widget_test.dart @@ -0,0 +1,14 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('Forgot my password', (WidgetTester tester) async { + // Build our app and trigger a frame. + }); +} diff --git a/pubspec.lock b/pubspec.lock index c91af55..4582a63 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -427,6 +427,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.7.0" + landing_menu: + dependency: "direct main" + description: + path: "packages/features/landing_menu" + relative: true + source: path + version: "0.0.0" lints: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 1ee6cca..1e54076 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -24,7 +24,8 @@ dependencies: path: packages/component_library subscription_menu: path: packages/features/subscription_menu - + landing_menu: + path: packages/features/landing_menu dev_dependencies: flutter_test: sdk: flutter