wip: add landing page refactoring
This commit is contained in:
parent
cf1af613a5
commit
70dc4ccbef
|
@ -1,17 +1,46 @@
|
||||||
|
import 'package:component_library/component_library.dart';
|
||||||
import 'package:flutter/material.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);
|
const GolekTruk({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<GolekTruk> createState() => _GolekTrukState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _GolekTrukState extends State<GolekTruk> {
|
||||||
|
final _lightTheme = LightGolekThemeData();
|
||||||
|
final _darkTheme = DarkGolekThemeData();
|
||||||
|
final _appRouter = AppRouter();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return MaterialApp(
|
return GolekTheme(
|
||||||
title: 'Flutter Demo',
|
darkTheme: _darkTheme,
|
||||||
theme: ThemeData(
|
lightTheme: _lightTheme,
|
||||||
primarySwatch: Colors.blue,
|
child: MaterialApp.router(
|
||||||
),
|
debugShowCheckedModeBanner: false,
|
||||||
home: const Scaffold(
|
title: 'GolekTruk',
|
||||||
body: Text('HomePage 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(),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart';
|
||||||
import 'package:intl/intl.dart' as intl;
|
import 'package:intl/intl.dart' as intl;
|
||||||
|
|
||||||
import 'app_localizations_en.dart';
|
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
|
/// Callers can lookup localized strings with an instance of AppLocalizations
|
||||||
/// returned by `AppLocalizations.of(context)`.
|
/// returned by `AppLocalizations.of(context)`.
|
||||||
|
@ -90,7 +90,7 @@ abstract class AppLocalizations {
|
||||||
/// A list of this localizations delegate's supported locales.
|
/// A list of this localizations delegate's supported locales.
|
||||||
static const List<Locale> supportedLocales = <Locale>[
|
static const List<Locale> supportedLocales = <Locale>[
|
||||||
Locale('en'),
|
Locale('en'),
|
||||||
Locale('pt')
|
Locale('id')
|
||||||
];
|
];
|
||||||
|
|
||||||
/// No description provided for @quotesBottomNavigationBarItemLabel.
|
/// No description provided for @quotesBottomNavigationBarItemLabel.
|
||||||
|
@ -115,7 +115,7 @@ class _AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations>
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool isSupported(Locale locale) => <String>['en', 'pt'].contains(locale.languageCode);
|
bool isSupported(Locale locale) => <String>['en', 'id'].contains(locale.languageCode);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool shouldReload(_AppLocalizationsDelegate old) => false;
|
bool shouldReload(_AppLocalizationsDelegate old) => false;
|
||||||
|
@ -127,7 +127,7 @@ AppLocalizations lookupAppLocalizations(Locale locale) {
|
||||||
// Lookup logic when only language code is specified.
|
// Lookup logic when only language code is specified.
|
||||||
switch (locale.languageCode) {
|
switch (locale.languageCode) {
|
||||||
case 'en': return AppLocalizationsEn();
|
case 'en': return AppLocalizationsEn();
|
||||||
case 'pt': return AppLocalizationsPt();
|
case 'id': return AppLocalizationsId();
|
||||||
}
|
}
|
||||||
|
|
||||||
throw FlutterError(
|
throw FlutterError(
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import 'app_localizations.dart';
|
import 'app_localizations.dart';
|
||||||
|
|
||||||
/// The translations for Portuguese (`pt`).
|
/// The translations for Indonesian (`id`).
|
||||||
class AppLocalizationsPt extends AppLocalizations {
|
class AppLocalizationsId extends AppLocalizations {
|
||||||
AppLocalizationsPt([String locale = 'pt']) : super(locale);
|
AppLocalizationsId([String locale = 'id']) : super(locale);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get quotesBottomNavigationBarItemLabel => 'Frases';
|
String get quotesBottomNavigationBarItemLabel => 'Frases';
|
|
@ -0,0 +1,10 @@
|
||||||
|
import 'package:auto_route/auto_route.dart';
|
||||||
|
import 'package:landing_menu/landing_menu.dart';
|
||||||
|
|
||||||
|
@MaterialAutoRouter(
|
||||||
|
replaceInRouteName: 'Page,Route',
|
||||||
|
routes: <AutoRoute>[
|
||||||
|
AutoRoute(page: LandingPage, initial: true),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
class $AppRouter {}
|
|
@ -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<String, _i2.PageFactory> pagesMap = {
|
||||||
|
LandingRoute.name: (routeData) {
|
||||||
|
return _i2.MaterialPageX<dynamic>(
|
||||||
|
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<void> {
|
||||||
|
const LandingRoute()
|
||||||
|
: super(
|
||||||
|
LandingRoute.name,
|
||||||
|
path: '/',
|
||||||
|
);
|
||||||
|
|
||||||
|
static const String name = 'LandingRoute';
|
||||||
|
}
|
8
makefile
8
makefile
|
@ -1,9 +1,15 @@
|
||||||
PACKAGES := $(wildcard packages/*)
|
PACKAGES := $(wildcard packages/*)
|
||||||
FEATURES := $(wildcard packages/features/*)
|
FEATURES := $(wildcard packages/features/*)
|
||||||
BUILD-RUNNER := packages/fav_qs_api packages/key_value_storage
|
BUILD-RUNNER := packages/golektruk_api
|
||||||
|
|
||||||
intl:
|
intl:
|
||||||
flutter gen-l10n
|
flutter gen-l10n
|
||||||
|
|
||||||
|
cd packages/component_library ; \
|
||||||
|
flutter gen-l10n ; \
|
||||||
|
cd ../../ ; \
|
||||||
|
|
||||||
|
|
||||||
for feature in $(FEATURES); do \
|
for feature in $(FEATURES); do \
|
||||||
cd $${feature} ; \
|
cd $${feature} ; \
|
||||||
echo "Generate localization on $${feature}" ; \
|
echo "Generate localization on $${feature}" ; \
|
||||||
|
|
Binary file not shown.
|
@ -1 +0,0 @@
|
||||||
<svg width="24" height="24" xmlns="http://www.w3.org/2000/svg"><path d="M7.5 6a2.5 2.5 0 0 1 2.495 2.336l.005.206c-.01 3.555-1.24 6.614-3.705 9.223a.75.75 0 1 1-1.09-1.03c1.64-1.737 2.66-3.674 3.077-5.859A2.5 2.5 0 1 1 7.5 6Zm9 0a2.5 2.5 0 0 1 2.495 2.336l.005.206c-.01 3.56-1.237 6.614-3.705 9.223a.75.75 0 0 1-1.09-1.03c1.643-1.738 2.662-3.672 3.078-5.859A2.5 2.5 0 1 1 16.5 6Zm-9 1.5a1 1 0 1 0 .993 1.117l.007-.124a1 1 0 0 0-1-.993Zm9 0a1 1 0 1 0 .993 1.117l.007-.124a1 1 0 0 0-1-.993Z" fill="#212121" fill-rule="nonzero"/></svg>
|
|
Before Width: | Height: | Size: 532 B |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24" xml:space="preserve"><path d="M19 8.5c0 1.4-1.1 2.5-2.5 2.5-.3 0-.5 0-.8-.1.4 2.2 1.4 4.1 3.1 5.9.3.3.3.8 0 1.1-.3.3-.8.3-1.1 0-2.5-2.6-3.7-5.7-3.7-9.2v-.2C14.1 7 15.2 6 16.5 6 17.9 6 19 7.1 19 8.5zm-9 0C10 9.9 8.9 11 7.5 11c-.3 0-.5 0-.8-.1.4 2.2 1.4 4.1 3.1 5.9.3.3.3.8 0 1.1s-.8.3-1.1 0C6.2 15.2 5 12.1 5 8.5v-.2C5.1 7 6.2 6 7.5 6 8.9 6 10 7.1 10 8.5zm5.5 0v.1c.1.5.5.9 1 .9.6 0 1-.4 1-1s-.4-1-1-1c-.5 0-1 .4-1 1zm-9 0v.1c.1.5.5.9 1 .9.6 0 1-.4 1-1s-.4-1-1-1c-.5 0-1 .4-1 1z" style="fill:#212121"/></svg>
|
|
Before Width: | Height: | Size: 607 B |
|
@ -15,7 +15,7 @@ class ComponentStorybook extends StatelessWidget {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final theme = WonderTheme.of(context);
|
final theme = GolekTheme.of(context);
|
||||||
return Storybook(
|
return Storybook(
|
||||||
theme: lightThemeData,
|
theme: lightThemeData,
|
||||||
darkTheme: darkThemeData,
|
darkTheme: darkThemeData,
|
||||||
|
|
|
@ -2,7 +2,7 @@ import 'package:component_library/component_library.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:storybook_flutter/storybook_flutter.dart';
|
import 'package:storybook_flutter/storybook_flutter.dart';
|
||||||
|
|
||||||
List<Story> getStories(WonderThemeData theme) {
|
List<Story> getStories(GolekThemeData theme) {
|
||||||
return [
|
return [
|
||||||
Story.simple(
|
Story.simple(
|
||||||
name: 'Simple Expanded Elevated Button',
|
name: 'Simple Expanded Elevated Button',
|
||||||
|
@ -111,24 +111,6 @@ List<Story> 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(
|
Story(
|
||||||
name: 'Exception Indicator',
|
name: 'Exception Indicator',
|
||||||
section: 'Indicators',
|
section: 'Indicators',
|
||||||
|
@ -149,80 +131,6 @@ List<Story> getStories(WonderThemeData theme) {
|
||||||
: null,
|
: 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(
|
Story.simple(
|
||||||
name: 'Centered Circular Progress Indicator',
|
name: 'Centered Circular Progress Indicator',
|
||||||
child: const CenteredCircularProgressIndicator(),
|
child: const CenteredCircularProgressIndicator(),
|
||||||
|
@ -247,7 +155,7 @@ List<Story> getStories(WonderThemeData theme) {
|
||||||
)
|
)
|
||||||
? Icon(
|
? Icon(
|
||||||
Icons.favorite,
|
Icons.favorite,
|
||||||
color: theme.roundedChoiceChipSelectedAvatarColor,
|
color: theme.warningMainColor,
|
||||||
)
|
)
|
||||||
: null,
|
: null,
|
||||||
onSelected: k.boolean(
|
onSelected: k.boolean(
|
||||||
|
@ -330,24 +238,6 @@ List<Story> getStories(WonderThemeData theme) {
|
||||||
name: 'Search Bar',
|
name: 'Search Bar',
|
||||||
child: const SearchBar(),
|
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(
|
Story(
|
||||||
name: 'Shrinkable Text',
|
name: 'Shrinkable Text',
|
||||||
builder: (_, k) => SafeArea(
|
builder: (_, k) => SafeArea(
|
||||||
|
@ -359,20 +249,20 @@ List<Story> getStories(WonderThemeData theme) {
|
||||||
),
|
),
|
||||||
style: k.options(
|
style: k.options(
|
||||||
label: 'style',
|
label: 'style',
|
||||||
initial: theme.quoteTextStyle.copyWith(
|
initial: theme.textStyle.copyWith(
|
||||||
fontSize: FontSize.xxLarge,
|
fontSize: FontSize.style24,
|
||||||
),
|
),
|
||||||
options: [
|
options: [
|
||||||
Option(
|
Option(
|
||||||
'XX large',
|
'XX large',
|
||||||
theme.quoteTextStyle.copyWith(
|
theme.textStyle.copyWith(
|
||||||
fontSize: FontSize.xxLarge,
|
fontSize: FontSize.style24,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Option(
|
Option(
|
||||||
'Small',
|
'Small',
|
||||||
theme.quoteTextStyle.copyWith(
|
theme.textStyle.copyWith(
|
||||||
fontSize: FontSize.small,
|
fontSize: FontSize.style12,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
@ -5,12 +5,12 @@ import 'package:flutter/material.dart';
|
||||||
class StoryApp extends StatelessWidget {
|
class StoryApp extends StatelessWidget {
|
||||||
StoryApp({Key? key}) : super(key: key);
|
StoryApp({Key? key}) : super(key: key);
|
||||||
|
|
||||||
final _lightTheme = LightWonderThemeData();
|
final _lightTheme = LightGolekThemeData();
|
||||||
final _darkTheme = DarkWonderThemeData();
|
final _darkTheme = DarkGolekThemeData();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return WonderTheme(
|
return GolekTheme(
|
||||||
lightTheme: _lightTheme,
|
lightTheme: _lightTheme,
|
||||||
darkTheme: _darkTheme,
|
darkTheme: _darkTheme,
|
||||||
child: ComponentStorybook(
|
child: ComponentStorybook(
|
||||||
|
|
|
@ -6,7 +6,6 @@ export 'src/expanded_elevated_button.dart';
|
||||||
export 'src/in_progress_text_button.dart';
|
export 'src/in_progress_text_button.dart';
|
||||||
export 'src/favorite_icon_button.dart';
|
export 'src/favorite_icon_button.dart';
|
||||||
export 'src/l10n/component_library_localizations.dart';
|
export 'src/l10n/component_library_localizations.dart';
|
||||||
export 'src/quote_card.dart';
|
|
||||||
export 'src/centered_circular_progress_indicator.dart';
|
export 'src/centered_circular_progress_indicator.dart';
|
||||||
export 'src/rounded_choice_chip.dart';
|
export 'src/rounded_choice_chip.dart';
|
||||||
export 'src/generic_error_snack_bar.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/share_icon_button.dart';
|
||||||
export 'src/shrinkable_text.dart';
|
export 'src/shrinkable_text.dart';
|
||||||
export 'src/styled_status_bar.dart';
|
export 'src/styled_status_bar.dart';
|
||||||
export 'src/svg_asset.dart';
|
|
||||||
export 'src/theme/font_size.dart';
|
export 'src/theme/font_size.dart';
|
||||||
export 'src/theme/spacing.dart';
|
export 'src/theme/spacing.dart';
|
||||||
export 'src/theme/wonder_theme.dart';
|
export 'src/theme/golek_theme.dart';
|
||||||
export 'src/theme/wonder_theme_data.dart';
|
export 'src/theme/golek_theme_data.dart';
|
||||||
export 'src/upvote_icon_button.dart';
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ class ChevronListTile extends StatelessWidget {
|
||||||
title: Text(
|
title: Text(
|
||||||
label,
|
label,
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
fontSize: FontSize.mediumLarge,
|
fontSize: FontSize.style18,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
trailing: const Icon(
|
trailing: const Icon(
|
||||||
|
|
|
@ -33,7 +33,7 @@ class CountIndicatorIconButton extends StatelessWidget {
|
||||||
Text(
|
Text(
|
||||||
count.toString(),
|
count.toString(),
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
fontSize: FontSize.small,
|
fontSize: FontSize.style12,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
@ -16,13 +16,13 @@ class DownvoteIconButton extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final l10n = ComponentLibraryLocalizations.of(context);
|
final l10n = ComponentLibraryLocalizations.of(context);
|
||||||
final theme = WonderTheme.of(context);
|
final theme = GolekTheme.of(context);
|
||||||
return CountIndicatorIconButton(
|
return CountIndicatorIconButton(
|
||||||
onTap: onTap,
|
onTap: onTap,
|
||||||
tooltip: l10n.downvoteIconButtonTooltip,
|
tooltip: l10n.downvoteIconButtonTooltip,
|
||||||
iconData: Icons.arrow_downward_sharp,
|
iconData: Icons.arrow_downward_sharp,
|
||||||
iconColor:
|
iconColor:
|
||||||
isDownvoted ? theme.votedButtonColor : theme.unvotedButtonColor,
|
isDownvoted ? theme.warningMainColor : theme.neutral20Color,
|
||||||
count: count,
|
count: count,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ class ExceptionIndicator extends StatelessWidget {
|
||||||
title ?? l10n.exceptionIndicatorGenericTitle,
|
title ?? l10n.exceptionIndicatorGenericTitle,
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
fontSize: FontSize.mediumLarge,
|
fontSize: FontSize.style16,
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -6,16 +6,16 @@ import 'package:flutter_localizations/flutter_localizations.dart';
|
||||||
import 'package:intl/intl.dart' as intl;
|
import 'package:intl/intl.dart' as intl;
|
||||||
|
|
||||||
import 'component_library_localizations_en.dart';
|
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
|
/// Callers can lookup localized strings with an instance of ComponentLibraryLocalizations
|
||||||
/// by `ComponentLibraryLocalizations.of(context)`.
|
/// returned by `ComponentLibraryLocalizations.of(context)`.
|
||||||
///
|
///
|
||||||
/// Applications need to include `ComponentLibraryLocalizations.delegate()` in their app's
|
/// Applications need to include `ComponentLibraryLocalizations.delegate()` in their app's
|
||||||
/// localizationDelegates list, and the locales they support in the app's
|
/// `localizationDelegates` list, and the locales they support in the app's
|
||||||
/// supportedLocales list. For example:
|
/// `supportedLocales` list. For example:
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```dart
|
||||||
/// import 'l10n/component_library_localizations.dart';
|
/// import 'l10n/component_library_localizations.dart';
|
||||||
///
|
///
|
||||||
/// return MaterialApp(
|
/// return MaterialApp(
|
||||||
|
@ -30,14 +30,14 @@ import 'component_library_localizations_pt.dart';
|
||||||
/// Please make sure to update your pubspec.yaml to include the following
|
/// Please make sure to update your pubspec.yaml to include the following
|
||||||
/// packages:
|
/// packages:
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```yaml
|
||||||
/// dependencies:
|
/// dependencies:
|
||||||
/// # Internationalization support.
|
/// # Internationalization support.
|
||||||
/// flutter_localizations:
|
/// flutter_localizations:
|
||||||
/// sdk: flutter
|
/// sdk: flutter
|
||||||
/// intl: any # Use the pinned version from flutter_localizations
|
/// intl: any # Use the pinned version from flutter_localizations
|
||||||
///
|
///
|
||||||
/// # rest of dependencies
|
/// # Rest of dependencies
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// ## iOS Applications
|
/// ## iOS Applications
|
||||||
|
@ -60,18 +60,15 @@ import 'component_library_localizations_pt.dart';
|
||||||
/// be consistent with the languages listed in the ComponentLibraryLocalizations.supportedLocales
|
/// be consistent with the languages listed in the ComponentLibraryLocalizations.supportedLocales
|
||||||
/// property.
|
/// property.
|
||||||
abstract class ComponentLibraryLocalizations {
|
abstract class ComponentLibraryLocalizations {
|
||||||
ComponentLibraryLocalizations(String locale)
|
ComponentLibraryLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString());
|
||||||
: localeName = intl.Intl.canonicalizedLocale(locale.toString());
|
|
||||||
|
|
||||||
final String localeName;
|
final String localeName;
|
||||||
|
|
||||||
static ComponentLibraryLocalizations of(BuildContext context) {
|
static ComponentLibraryLocalizations of(BuildContext context) {
|
||||||
return Localizations.of<ComponentLibraryLocalizations>(
|
return Localizations.of<ComponentLibraryLocalizations>(context, ComponentLibraryLocalizations)!;
|
||||||
context, ComponentLibraryLocalizations)!;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const LocalizationsDelegate<ComponentLibraryLocalizations> delegate =
|
static const LocalizationsDelegate<ComponentLibraryLocalizations> delegate = _ComponentLibraryLocalizationsDelegate();
|
||||||
_ComponentLibraryLocalizationsDelegate();
|
|
||||||
|
|
||||||
/// A list of this localizations delegate along with the default localizations
|
/// A list of this localizations delegate along with the default localizations
|
||||||
/// delegates.
|
/// delegates.
|
||||||
|
@ -83,8 +80,7 @@ abstract class ComponentLibraryLocalizations {
|
||||||
/// Additional delegates can be added by appending to this list in
|
/// 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
|
/// MaterialApp. This list does not have to be used at all if a custom list
|
||||||
/// of delegates is preferred or required.
|
/// of delegates is preferred or required.
|
||||||
static const List<LocalizationsDelegate<dynamic>> localizationsDelegates =
|
static const List<LocalizationsDelegate<dynamic>> localizationsDelegates = <LocalizationsDelegate<dynamic>>[
|
||||||
<LocalizationsDelegate<dynamic>>[
|
|
||||||
delegate,
|
delegate,
|
||||||
GlobalMaterialLocalizations.delegate,
|
GlobalMaterialLocalizations.delegate,
|
||||||
GlobalCupertinoLocalizations.delegate,
|
GlobalCupertinoLocalizations.delegate,
|
||||||
|
@ -94,7 +90,7 @@ abstract class ComponentLibraryLocalizations {
|
||||||
/// A list of this localizations delegate's supported locales.
|
/// A list of this localizations delegate's supported locales.
|
||||||
static const List<Locale> supportedLocales = <Locale>[
|
static const List<Locale> supportedLocales = <Locale>[
|
||||||
Locale('en'),
|
Locale('en'),
|
||||||
Locale('pt')
|
Locale('id')
|
||||||
];
|
];
|
||||||
|
|
||||||
/// No description provided for @downvoteIconButtonTooltip.
|
/// No description provided for @downvoteIconButtonTooltip.
|
||||||
|
@ -164,37 +160,34 @@ abstract class ComponentLibraryLocalizations {
|
||||||
String get authenticationRequiredErrorSnackbarMessage;
|
String get authenticationRequiredErrorSnackbarMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
class _ComponentLibraryLocalizationsDelegate
|
class _ComponentLibraryLocalizationsDelegate extends LocalizationsDelegate<ComponentLibraryLocalizations> {
|
||||||
extends LocalizationsDelegate<ComponentLibraryLocalizations> {
|
|
||||||
const _ComponentLibraryLocalizationsDelegate();
|
const _ComponentLibraryLocalizationsDelegate();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<ComponentLibraryLocalizations> load(Locale locale) {
|
Future<ComponentLibraryLocalizations> load(Locale locale) {
|
||||||
return SynchronousFuture<ComponentLibraryLocalizations>(
|
return SynchronousFuture<ComponentLibraryLocalizations>(lookupComponentLibraryLocalizations(locale));
|
||||||
lookupComponentLibraryLocalizations(locale));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool isSupported(Locale locale) =>
|
bool isSupported(Locale locale) => <String>['en', 'id'].contains(locale.languageCode);
|
||||||
<String>['en', 'pt'].contains(locale.languageCode);
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool shouldReload(_ComponentLibraryLocalizationsDelegate old) => false;
|
bool shouldReload(_ComponentLibraryLocalizationsDelegate old) => false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ComponentLibraryLocalizations lookupComponentLibraryLocalizations(
|
ComponentLibraryLocalizations lookupComponentLibraryLocalizations(Locale locale) {
|
||||||
Locale locale) {
|
|
||||||
|
|
||||||
// Lookup logic when only language code is specified.
|
// Lookup logic when only language code is specified.
|
||||||
switch (locale.languageCode) {
|
switch (locale.languageCode) {
|
||||||
case 'en':
|
case 'en': return ComponentLibraryLocalizationsEn();
|
||||||
return ComponentLibraryLocalizationsEn();
|
case 'id': return ComponentLibraryLocalizationsId();
|
||||||
case 'pt':
|
|
||||||
return ComponentLibraryLocalizationsPt();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
throw FlutterError(
|
throw FlutterError(
|
||||||
'ComponentLibraryLocalizations.delegate failed to load unsupported locale "$locale". This is likely '
|
'ComponentLibraryLocalizations.delegate failed to load unsupported locale "$locale". This is likely '
|
||||||
'an issue with the localizations generation tool. Please file an issue '
|
'an issue with the localizations generation tool. Please file an issue '
|
||||||
'on GitHub with a reproducible sample app and the gen-l10n configuration '
|
'on GitHub with a reproducible sample app and the gen-l10n configuration '
|
||||||
'that was used.');
|
'that was used.'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,14 +29,11 @@ class ComponentLibraryLocalizationsEn extends ComponentLibraryLocalizations {
|
||||||
String get exceptionIndicatorTryAgainButton => 'Try Again';
|
String get exceptionIndicatorTryAgainButton => 'Try Again';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get exceptionIndicatorGenericMessage =>
|
String get exceptionIndicatorGenericMessage => 'There has been an error.\nPlease, check your internet connection and try again later.';
|
||||||
'There has been an error.\nPlease, check your internet connection and try again later.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get genericErrorSnackbarMessage =>
|
String get genericErrorSnackbarMessage => 'There has been an error. Please, check your internet connection.';
|
||||||
'There has been an error. Please, check your internet connection.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get authenticationRequiredErrorSnackbarMessage =>
|
String get authenticationRequiredErrorSnackbarMessage => 'You need to sign in before performing this action.';
|
||||||
'You need to sign in before performing this action.';
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.';
|
||||||
|
}
|
|
@ -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.';
|
|
||||||
}
|
|
|
@ -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."
|
||||||
|
}
|
|
@ -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."
|
|
||||||
}
|
|
|
@ -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),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -25,7 +25,7 @@ class RoundedChoiceChip extends StatelessWidget {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final theme = WonderTheme.of(context);
|
final theme = GolekTheme.of(context);
|
||||||
return ChoiceChip(
|
return ChoiceChip(
|
||||||
shape: const StadiumBorder(
|
shape: const StadiumBorder(
|
||||||
side: BorderSide(),
|
side: BorderSide(),
|
||||||
|
@ -35,17 +35,16 @@ class RoundedChoiceChip extends StatelessWidget {
|
||||||
label,
|
label,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: isSelected
|
color: isSelected
|
||||||
? (selectedLabelColor ??
|
? (selectedLabelColor ?? theme.primaryMainColor)
|
||||||
theme.roundedChoiceChipSelectedLabelColor)
|
: (labelColor ?? theme.primarySurfaceColor),
|
||||||
: (labelColor ?? theme.roundedChoiceChipLabelColor),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
onSelected: onSelected,
|
onSelected: onSelected,
|
||||||
selected: isSelected,
|
selected: isSelected,
|
||||||
backgroundColor:
|
backgroundColor:
|
||||||
(backgroundColor ?? theme.roundedChoiceChipBackgroundColor),
|
(backgroundColor ?? theme.primaryMainColor),
|
||||||
selectedColor: (selectedBackgroundColor ??
|
selectedColor: (selectedBackgroundColor ??
|
||||||
theme.roundedChoiceChipSelectedBackgroundColor),
|
theme.primarySurfaceColor),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,8 +1,14 @@
|
||||||
abstract class FontSize {
|
abstract class FontSize {
|
||||||
static const double small = 11;
|
static const double style24 = 24;
|
||||||
static const double medium = 14;
|
static const double style20 = 20;
|
||||||
static const double mediumLarge = 18;
|
static const double style18 = 18;
|
||||||
static const double large = 22;
|
static const double style16 = 16;
|
||||||
static const double xLarge = 64;
|
static const double style15 = 15;
|
||||||
static const double xxLarge = 192;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class WonderTheme extends InheritedWidget {
|
class GolekTheme extends InheritedWidget {
|
||||||
const WonderTheme({
|
const GolekTheme({
|
||||||
required Widget child,
|
required Widget child,
|
||||||
required this.lightTheme,
|
required this.lightTheme,
|
||||||
required this.darkTheme,
|
required this.darkTheme,
|
||||||
|
@ -12,19 +12,19 @@ class WonderTheme extends InheritedWidget {
|
||||||
child: child,
|
child: child,
|
||||||
);
|
);
|
||||||
|
|
||||||
final WonderThemeData lightTheme;
|
final GolekThemeData lightTheme;
|
||||||
final WonderThemeData darkTheme;
|
final GolekThemeData darkTheme;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool updateShouldNotify(
|
bool updateShouldNotify(
|
||||||
WonderTheme oldWidget,
|
GolekTheme oldWidget,
|
||||||
) =>
|
) =>
|
||||||
oldWidget.lightTheme != lightTheme || oldWidget.darkTheme != darkTheme;
|
oldWidget.lightTheme != lightTheme || oldWidget.darkTheme != darkTheme;
|
||||||
|
|
||||||
static WonderThemeData of(BuildContext context) {
|
static GolekThemeData of(BuildContext context) {
|
||||||
final WonderTheme? inheritedTheme =
|
final GolekTheme? inheritedTheme =
|
||||||
context.dependOnInheritedWidgetOfExactType<WonderTheme>();
|
context.dependOnInheritedWidgetOfExactType<GolekTheme>();
|
||||||
assert(inheritedTheme != null, 'No WonderTheme found in context');
|
assert(inheritedTheme != null, 'No GolekTheme found in context');
|
||||||
final currentBrightness = Theme.of(context).brightness;
|
final currentBrightness = Theme.of(context).brightness;
|
||||||
return currentBrightness == Brightness.dark
|
return currentBrightness == Brightness.dark
|
||||||
? inheritedTheme!.darkTheme
|
? inheritedTheme!.darkTheme
|
|
@ -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<int, Color> _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(),
|
||||||
|
);
|
||||||
|
}
|
|
@ -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<int, Color> _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(),
|
|
||||||
);
|
|
||||||
}
|
|
|
@ -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,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -25,6 +25,22 @@ flutter:
|
||||||
assets:
|
assets:
|
||||||
- assets/
|
- assets/
|
||||||
fonts:
|
fonts:
|
||||||
- family: Fondamento
|
- family: Montserrat
|
||||||
fonts:
|
fonts:
|
||||||
- asset: assets/Fondamento-Regular.ttf
|
- 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
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
include: package:flutter_lints/flutter.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
|
|
@ -0,0 +1 @@
|
||||||
|
export 'src/landing_page.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<LandingMenuLocalizations>(context, LandingMenuLocalizations)!;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const LocalizationsDelegate<LandingMenuLocalizations> 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<LocalizationsDelegate<dynamic>> localizationsDelegates = <LocalizationsDelegate<dynamic>>[
|
||||||
|
delegate,
|
||||||
|
GlobalMaterialLocalizations.delegate,
|
||||||
|
GlobalCupertinoLocalizations.delegate,
|
||||||
|
GlobalWidgetsLocalizations.delegate,
|
||||||
|
];
|
||||||
|
|
||||||
|
/// A list of this localizations delegate's supported locales.
|
||||||
|
static const List<Locale> supportedLocales = <Locale>[
|
||||||
|
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<LandingMenuLocalizations> {
|
||||||
|
const _LandingMenuLocalizationsDelegate();
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<LandingMenuLocalizations> load(Locale locale) {
|
||||||
|
return SynchronousFuture<LandingMenuLocalizations>(lookupLandingMenuLocalizations(locale));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool isSupported(Locale locale) => <String>['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.'
|
||||||
|
);
|
||||||
|
}
|
|
@ -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.';
|
||||||
|
}
|
|
@ -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.';
|
||||||
|
}
|
|
@ -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."
|
||||||
|
}
|
|
@ -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."
|
||||||
|
}
|
|
@ -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<LandingPage> createState() => _LandingPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _LandingPageState extends State<LandingPage> {
|
||||||
|
@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),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
|
@ -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"
|
|
@ -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
|
|
@ -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.
|
||||||
|
});
|
||||||
|
}
|
|
@ -427,6 +427,13 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.7.0"
|
version: "4.7.0"
|
||||||
|
landing_menu:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
path: "packages/features/landing_menu"
|
||||||
|
relative: true
|
||||||
|
source: path
|
||||||
|
version: "0.0.0"
|
||||||
lints:
|
lints:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -24,7 +24,8 @@ dependencies:
|
||||||
path: packages/component_library
|
path: packages/component_library
|
||||||
subscription_menu:
|
subscription_menu:
|
||||||
path: packages/features/subscription_menu
|
path: packages/features/subscription_menu
|
||||||
|
landing_menu:
|
||||||
|
path: packages/features/landing_menu
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|
Loading…
Reference in New Issue