From 80dee9dbab7b05a1f4cc6bcdbcf18d48918d8937 Mon Sep 17 00:00:00 2001 From: Kherel Date: Thu, 3 Dec 2020 17:52:53 +0100 Subject: [PATCH] add users --- assets/fonts/BrandIcons.ttf | Bin 7116 -> 7308 bytes lib/config/bloc_config.dart | 4 + lib/config/brand_theme.dart | 13 + lib/config/text_themes.dart | 2 + lib/logic/cubit/users/users_cubit.dart | 43 + lib/logic/cubit/users/users_state.dart | 10 + lib/logic/models/user.dart | 20 + lib/main.dart | 5 +- .../components/brand_button/brand_button.dart | 61 +- .../components/brand_header/brand_header.dart | 4 +- .../components/brand_icons/brand_icons.dart | 2 + .../brand_modal_sheet/brand_modal_sheet.dart | 60 +- .../brand_tab_bar/brand_tab_bar.dart | 2 +- lib/ui/pages/about/about.dart | 64 +- lib/ui/pages/info/info.dart | 33 +- lib/ui/pages/more/more.dart | 65 +- lib/ui/pages/onboarding/onboarding.dart | 243 ++- lib/ui/pages/providers/providers.dart | 114 ++ lib/ui/pages/rootRoute.dart | 7 +- lib/ui/pages/servers/servers.dart | 230 --- lib/ui/pages/services/services.dart | 8 +- lib/ui/pages/settings/setting.dart | 84 +- lib/ui/pages/users/users.dart | 288 ++++ lib/utils/color_utils.dart | 1471 +++++++++++++++++ lib/utils/extensions/text_extension.dart | 1 + lib/utils/password_generator.dart | 138 ++ 26 files changed, 2547 insertions(+), 425 deletions(-) create mode 100644 lib/logic/cubit/users/users_cubit.dart create mode 100644 lib/logic/cubit/users/users_state.dart create mode 100644 lib/logic/models/user.dart create mode 100644 lib/ui/pages/providers/providers.dart delete mode 100644 lib/ui/pages/servers/servers.dart create mode 100644 lib/ui/pages/users/users.dart create mode 100644 lib/utils/color_utils.dart create mode 100644 lib/utils/password_generator.dart diff --git a/assets/fonts/BrandIcons.ttf b/assets/fonts/BrandIcons.ttf index 3a5b43e2a751ceaff4fa6b9e63bbf05783419500..7c9759696eab2556c10d66864de6b7a1311a12cd 100644 GIT binary patch delta 722 zcmXw#UuaTs6vxl+{;vPc>GjX?ID(dPZ5lu=)ump`Fj!2brYK1n8G)6R|fXY_tW`jWWN_VQ=3Uqf~# zQ~AQFh2~GZSI2pLJ{^zk6%Jg+d=2M7Dptsl0BqvBh;!%FSSs;BkRD9}h-CmOX41L* ziBC7*061Tw;oHMC-w`_yY>~o-XZS+f;4d)H25#WXk8`0q4|vlckE#bP?YU9AGu7fvy{wpM|&!*7l0DbRu@3kqrCz=T*QpNb%SeY> zk?7gkR@vl_bfTyMXdsw@23}!+4t1LXyWB7-fC05l0gR{?1z=u50hrgS0L*Js05hsx z0a(tVFaj*tt^h2EU&{atwkirwi9~LbO)g8d^bD=?HPt!QJ@qRMXk41-+MxEmuBxl8 z)_Fl)1ZcjdE0jV6Kg6rHJ4`gl4^cO1_j%Pe#{dcS9VX!}uX;NPawh7=x8AV7i(avG z5dUaApPL;E@V?{mY<{kLS`bCyokf&9Qut1JsW9%>MlKbX@86o*XEc$;4$GnRWWSnlV%un1Lz-3 z+Ns@0@EG9j#Og$1F?RC!{14C{0be#gZjXhpN)KrFp6HCz!0gZmsU{EV;>q;F&yCzG z<@KmZ}J#T#hZ5a;|u+;huYD8nHiC{LNV z)&`a-!;!BsNsAP)NQ)Kn4#%s2hqP1y%5r=PNMD%((&tw|`pOk3Aq^-XGb$84kRkL_ zC7=*GQEamiTVW4;Rx`DjzT|SdI*lRYk8xHIEx0pht(dh09A$N%akTHLE@6Ig8m<>_ K;Wp7)IrIgyX?PO= diff --git a/lib/config/bloc_config.dart b/lib/config/bloc_config.dart index 88bc3903c9..d1ccd2f42f 100644 --- a/lib/config/bloc_config.dart +++ b/lib/config/bloc_config.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:selfprivacy/logic/cubit/services/services_cubit.dart'; +import 'package:selfprivacy/logic/cubit/users/users_cubit.dart'; class BlocAndProviderConfig extends StatelessWidget { const BlocAndProviderConfig({Key key, this.child}) : super(key: key); @@ -14,6 +15,9 @@ class BlocAndProviderConfig extends StatelessWidget { BlocProvider( create: (BuildContext context) => ServicesCubit(), ), + BlocProvider( + create: (BuildContext context) => UsersCubit(), + ), ], child: child, ); diff --git a/lib/config/brand_theme.dart b/lib/config/brand_theme.dart index 0be8b325ac..954f7a6af8 100644 --- a/lib/config/brand_theme.dart +++ b/lib/config/brand_theme.dart @@ -8,12 +8,25 @@ final theme = ThemeData( primaryColor: BrandColors.primary, brightness: Brightness.light, scaffoldBackgroundColor: BrandColors.scaffoldBackground, + inputDecorationTheme: InputDecorationTheme( + border: InputBorder.none, + contentPadding: EdgeInsets.all(16), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(4)), + borderSide: BorderSide(color: BrandColors.inputInactive), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(4)), + borderSide: BorderSide(color: BrandColors.blue), + ), + ), textTheme: GoogleFonts.interTextTheme( TextTheme( headline1: headline1Style, headline2: headline2Style, caption: captionStyle, bodyText1: body1Style, + subtitle1: TextStyle(fontSize: 15, height: 1.6), // text input style ), ), ); diff --git a/lib/config/text_themes.dart b/lib/config/text_themes.dart index 3a6a188b3f..17a95ef6af 100644 --- a/lib/config/text_themes.dart +++ b/lib/config/text_themes.dart @@ -39,3 +39,5 @@ final body1Style = defaultTextStyle; final body2Style = defaultTextStyle.copyWith( color: BrandColors.textColor2, ); + +final smallStyle = defaultTextStyle.copyWith(fontSize: 11, height: 1.45); diff --git a/lib/logic/cubit/users/users_cubit.dart b/lib/logic/cubit/users/users_cubit.dart new file mode 100644 index 0000000000..6febf023b7 --- /dev/null +++ b/lib/logic/cubit/users/users_cubit.dart @@ -0,0 +1,43 @@ +import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.dart'; +import 'package:selfprivacy/logic/models/user.dart'; +import 'package:selfprivacy/utils/password_generator.dart'; +export 'package:provider/provider.dart'; + +part 'users_state.dart'; + +class UsersCubit extends Cubit { + UsersCubit() : super(UsersState(initMockUsers)); + + void add(User user) { + var users = state.users; + users.add(user); + + emit(UsersState(users)); + } + + void remove(User user) { + var users = state.users; + users.remove(user); + + emit(UsersState(users)); + } +} + +final initMockUsers = [ + User(login: 'Heartbreaking.Goose', password: genPass()), + User(login: 'Alma.lawson', password: genPass()), + User(login: 'Bee.gees', password: genPass()), + User(login: 'Bim.jennings', password: genPass()), + User(login: 'Debra.holt', password: genPass()), + User(login: 'Georgia.young', password: genPass()), + User(login: 'Kenzi.lawson', password: genPass()), + User(login: 'Le.jennings', password: genPass()), + User(login: 'Kirill.Zh', password: genPass()), + User(login: 'Tina.Bolton', password: genPass()), + User(login: 'Rebekah.Lynn', password: genPass()), + User(login: 'Aleena.Armstrong', password: genPass()), + User(login: 'Rosemary.Williams', password: genPass()), + User(login: 'Sullivan.Nixon', password: genPass()), + User(login: 'Aleena.Armstrong', password: genPass()), +]; diff --git a/lib/logic/cubit/users/users_state.dart b/lib/logic/cubit/users/users_state.dart new file mode 100644 index 0000000000..a7412631d9 --- /dev/null +++ b/lib/logic/cubit/users/users_state.dart @@ -0,0 +1,10 @@ +part of 'users_cubit.dart'; + +class UsersState extends Equatable { + const UsersState(this.users); + + final List users; + + @override + List get props => users; +} diff --git a/lib/logic/models/user.dart b/lib/logic/models/user.dart new file mode 100644 index 0000000000..4a96cee614 --- /dev/null +++ b/lib/logic/models/user.dart @@ -0,0 +1,20 @@ +import 'dart:ui'; + +import 'package:equatable/equatable.dart'; +import 'package:flutter/foundation.dart'; +import 'package:selfprivacy/utils/color_utils.dart'; + +class User extends Equatable { + User({ + @required this.login, + @required this.password, + }); + + final String login; + final String password; + + @override + List get props => [login, password]; + + Color get color => stringToColor(login); +} diff --git a/lib/main.dart b/lib/main.dart index e2c11ca208..d6f113bf7d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:selfprivacy/ui/pages/onboarding/onboarding.dart'; import 'package:easy_localization/easy_localization.dart'; +import 'package:selfprivacy/ui/pages/rootRoute.dart'; import 'config/bloc_config.dart'; import 'config/brand_theme.dart'; @@ -19,6 +20,8 @@ void main() { ); } +var _showOnbording = false; + class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { @@ -32,7 +35,7 @@ class MyApp extends StatelessWidget { debugShowCheckedModeBanner: false, title: 'SelfPrivacy', theme: theme, - home: OnboardingPage(), + home: _showOnbording ? OnboardingPage() : RootPage(), ), ); } diff --git a/lib/ui/components/brand_button/brand_button.dart b/lib/ui/components/brand_button/brand_button.dart index 273c04ce1d..b594553d56 100644 --- a/lib/ui/components/brand_button/brand_button.dart +++ b/lib/ui/components/brand_button/brand_button.dart @@ -2,8 +2,9 @@ import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:selfprivacy/config/brand_colors.dart'; +import 'package:selfprivacy/utils/extensions/text_extension.dart'; -enum BrandButtonTypes { rised, text } +enum BrandButtonTypes { rised, text, iconText } class BrandButton extends StatelessWidget { const BrandButton({ @@ -11,11 +12,13 @@ class BrandButton extends StatelessWidget { this.onPressed, this.type, this.title, + this.icon, }) : super(key: key); final VoidCallback onPressed; final BrandButtonTypes type; final String title; + final Icon icon; static rised({ Key key, @@ -41,6 +44,19 @@ class BrandButton extends StatelessWidget { type: BrandButtonTypes.text, ); + static iconText({ + Key key, + @required VoidCallback onPressed, + @required String title, + @required Icon icon, + }) => + BrandButton( + key: key, + onPressed: onPressed, + title: title, + type: BrandButtonTypes.iconText, + icon: icon, + ); @override Widget build(BuildContext context) { switch (type) { @@ -55,6 +71,13 @@ class BrandButton extends StatelessWidget { onPressed: onPressed, ); break; + case BrandButtonTypes.iconText: + return _IconTextButton( + title: title, + onPressed: onPressed, + icon: icon, + ); + break; } return null; @@ -135,3 +158,39 @@ class _TextButton extends StatelessWidget { ); } } + +class _IconTextButton extends StatelessWidget { + const _IconTextButton({Key key, this.onPressed, this.title, this.icon}) + : super(key: key); + + final VoidCallback onPressed; + final String title; + final Icon icon; + + @override + Widget build(BuildContext context) { + return Material( + color: Colors.transparent, + child: InkWell( + onTap: onPressed, + child: Container( + height: 48, + width: double.infinity, + alignment: Alignment.center, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + title, + ).body1, + Padding( + padding: const EdgeInsets.all(12.0), + child: icon, + ) + ], + ), + ), + ), + ); + } +} diff --git a/lib/ui/components/brand_header/brand_header.dart b/lib/ui/components/brand_header/brand_header.dart index 52a820109b..0c2bc5d442 100644 --- a/lib/ui/components/brand_header/brand_header.dart +++ b/lib/ui/components/brand_header/brand_header.dart @@ -15,9 +15,9 @@ class BrandHeader extends StatelessWidget { @override Widget build(BuildContext context) { return Container( + height: 52, + alignment: Alignment.centerLeft, padding: EdgeInsets.only( - top: hasBackButton ? 4 : 17, - bottom: hasBackButton ? 7 : 20, left: hasBackButton ? 1 : 15, ), child: Container( diff --git a/lib/ui/components/brand_icons/brand_icons.dart b/lib/ui/components/brand_icons/brand_icons.dart index a6d3db1f8f..fa198d3a9e 100644 --- a/lib/ui/components/brand_icons/brand_icons.dart +++ b/lib/ui/components/brand_icons/brand_icons.dart @@ -35,6 +35,8 @@ class BrandIcons { IconData(0xe805, fontFamily: _kFontFam, fontPackage: _kFontPkg); static const IconData help = IconData(0xe806, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData refresh_1 = + IconData(0xe807, fontFamily: _kFontFam, fontPackage: _kFontPkg); static const IconData refresh = IconData(0xe80a, fontFamily: _kFontFam, fontPackage: _kFontPkg); static const IconData settings = diff --git a/lib/ui/components/brand_modal_sheet/brand_modal_sheet.dart b/lib/ui/components/brand_modal_sheet/brand_modal_sheet.dart index fb5ed4687f..a247ee778b 100644 --- a/lib/ui/components/brand_modal_sheet/brand_modal_sheet.dart +++ b/lib/ui/components/brand_modal_sheet/brand_modal_sheet.dart @@ -10,32 +10,44 @@ class BrandModalSheet extends StatelessWidget { final Widget child; @override Widget build(BuildContext context) { - return SingleChildScrollView( - child: Column( - children: [ - Padding( - padding: EdgeInsets.only(top: 32, bottom: 6), + return DraggableScrollableSheet( + minChildSize: 0.5, + initialChildSize: 1, + maxChildSize: 1, + builder: (context, scrollController) { + return SingleChildScrollView( + controller: scrollController, + physics: ClampingScrollPhysics(), child: Container( - height: 4, - width: 30, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(2), - color: Color(0xFFE3E3E3).withOpacity(0.65), + child: Column( + children: [ + Padding( + padding: EdgeInsets.only(top: 32, bottom: 6), + child: Container( + height: 4, + width: 30, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(2), + color: Color(0xFFE3E3E3).withOpacity(0.65), + ), + ), + ), + Container( + constraints: BoxConstraints( + minHeight: MediaQuery.of(context).size.height - 32 - 4, + ), + decoration: BoxDecoration( + borderRadius: + BorderRadius.vertical(top: Radius.circular(20)), + color: BrandColors.white, + ), + width: double.infinity, + child: child, + ), + ], ), ), - ), - Container( - constraints: BoxConstraints(minHeight: 400), - decoration: BoxDecoration( - borderRadius: BorderRadius.vertical(top: Radius.circular(20)), - color: BrandColors.white, - ), - width: double.infinity, - padding: EdgeInsets.symmetric(vertical: 40, horizontal: 15), - child: child, - ), - ], - ), - ); + ); + }); } } diff --git a/lib/ui/components/brand_tab_bar/brand_tab_bar.dart b/lib/ui/components/brand_tab_bar/brand_tab_bar.dart index d9cf8d2fac..18e35b857c 100644 --- a/lib/ui/components/brand_tab_bar/brand_tab_bar.dart +++ b/lib/ui/components/brand_tab_bar/brand_tab_bar.dart @@ -39,7 +39,7 @@ class _BottomTabBarState extends State { crossAxisAlignment: CrossAxisAlignment.stretch, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - _getIconButton('Серверы', BrandIcons.server, 0), + _getIconButton('Провайдеры', BrandIcons.server, 0), _getIconButton('Сервисы', BrandIcons.box, 1), _getIconButton('Пользователи', BrandIcons.users, 2), _getIconButton('Еще', BrandIcons.menu, 3), diff --git a/lib/ui/pages/about/about.dart b/lib/ui/pages/about/about.dart index 2c61ea0b9b..0f7e6fa505 100644 --- a/lib/ui/pages/about/about.dart +++ b/lib/ui/pages/about/about.dart @@ -11,43 +11,37 @@ class AboutPage extends StatelessWidget { Widget build(BuildContext context) { return SafeArea( child: Scaffold( + appBar: PreferredSize( + child: BrandHeader(title: 'О проекте', hasBackButton: true), + preferredSize: Size.fromHeight(52), + ), body: ListView( + padding: brandPagePadding2, children: [ - BrandHeader(title: 'О проекте', hasBackButton: true), - Padding( - padding: brandPagePadding2, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - BrandDivider(), - SizedBox(height: 20), - Text('О проекте').h3, - SizedBox(height: 10), - Text('Всё больше организаций хотят владеть нашими данными') - .body1, - SizedBox(height: 10), - Text('А мы сами хотим распоряжаться своими данными на своем сервере.') - .body1, - SizedBox(height: 20), - BrandDivider(), - SizedBox(height: 10), - Text('Миссия проекта').h3, - SizedBox(height: 10), - Text( - 'Цифровая независимость и приватность доступная каждому'), - SizedBox(height: 20), - BrandDivider(), - SizedBox(height: 10), - Text('Цель').h3, - SizedBox(height: 10), - Text( - 'Развивать программу, которая позволит каждому создавать приватные сервисы для себя и своих близких'), - SizedBox(height: 10), - Text( - 'Развивать программу, которая позволит каждому создавать приватные сервисы для себя и своих близких'), - ], - ), - ), + BrandDivider(), + SizedBox(height: 20), + Text('О проекте').h3, + SizedBox(height: 10), + Text('Всё больше организаций хотят владеть нашими данными').body1, + SizedBox(height: 10), + Text('А мы сами хотим распоряжаться своими данными на своем сервере.') + .body1, + SizedBox(height: 20), + BrandDivider(), + SizedBox(height: 10), + Text('Миссия проекта').h3, + SizedBox(height: 10), + Text('Цифровая независимость и приватность доступная каждому'), + SizedBox(height: 20), + BrandDivider(), + SizedBox(height: 10), + Text('Цель').h3, + SizedBox(height: 10), + Text( + 'Развивать программу, которая позволит каждому создавать приватные сервисы для себя и своих близких'), + SizedBox(height: 10), + Text( + 'Развивать программу, которая позволит каждому создавать приватные сервисы для себя и своих близких'), ], ), ), diff --git a/lib/ui/pages/info/info.dart b/lib/ui/pages/info/info.dart index 6a89799585..e2506b00bd 100644 --- a/lib/ui/pages/info/info.dart +++ b/lib/ui/pages/info/info.dart @@ -12,27 +12,22 @@ class InfoPage extends StatelessWidget { Widget build(BuildContext context) { return SafeArea( child: Scaffold( + appBar: PreferredSize( + child: BrandHeader(title: 'О приложении', hasBackButton: true), + preferredSize: Size.fromHeight(52), + ), body: ListView( + padding: brandPagePadding2, children: [ - BrandHeader(title: 'О приложении', hasBackButton: true), - Padding( - padding: brandPagePadding2, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - BrandDivider(), - SizedBox(height: 10), - FutureBuilder( - future: _version(), - builder: (context, snapshot) { - return Text( - 'Тут любая служебная информация, v.${snapshot.data}') - .body1; - }), - ], - ), - ), + BrandDivider(), + SizedBox(height: 10), + FutureBuilder( + future: _version(), + builder: (context, snapshot) { + return Text( + 'Тут любая служебная информация, v.${snapshot.data}') + .body1; + }), ], ), ), diff --git a/lib/ui/pages/more/more.dart b/lib/ui/pages/more/more.dart index 2ded231cbd..8a4e6ff20d 100644 --- a/lib/ui/pages/more/more.dart +++ b/lib/ui/pages/more/more.dart @@ -15,33 +15,38 @@ class MorePage extends StatelessWidget { @override Widget build(BuildContext context) { - return ListView( - children: [ - BrandHeader(title: 'Еще'), - Padding( - padding: brandPagePadding2, - child: Column( - children: [ - BrandDivider(), - _NavItem( - title: 'Настройки', - iconData: BrandIcons.settings, - goTo: SettingsPage(), - ), - _NavItem( - title: 'О проекте Selfprivacy', - iconData: BrandIcons.triangle, - goTo: AboutPage(), - ), - _NavItem( - title: 'О приложении', - iconData: BrandIcons.help, - goTo: InfoPage(), - ), - ], - ), - ) - ], + return Scaffold( + appBar: PreferredSize( + child: BrandHeader(title: 'Еще'), + preferredSize: Size.fromHeight(52), + ), + body: ListView( + children: [ + Padding( + padding: brandPagePadding2, + child: Column( + children: [ + BrandDivider(), + _NavItem( + title: 'Настройки', + iconData: BrandIcons.settings, + goTo: SettingsPage(), + ), + _NavItem( + title: 'О проекте Selfprivacy', + iconData: BrandIcons.triangle, + goTo: AboutPage(), + ), + _NavItem( + title: 'О приложении', + iconData: BrandIcons.help, + goTo: InfoPage(), + ), + ], + ), + ) + ], + ), ); } } @@ -76,8 +81,10 @@ class _NavItem extends StatelessWidget { children: [ Text(title).body1, Spacer(), - Icon(iconData, size: 20), - SizedBox(width: 18), + SizedBox( + width: 56, + child: Icon(iconData, size: 20), + ), ], ), ), diff --git a/lib/ui/pages/onboarding/onboarding.dart b/lib/ui/pages/onboarding/onboarding.dart index 6b72eb7a77..1a4685fb1d 100644 --- a/lib/ui/pages/onboarding/onboarding.dart +++ b/lib/ui/pages/onboarding/onboarding.dart @@ -1,7 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:selfprivacy/config/brand_theme.dart'; +import 'package:selfprivacy/config/text_themes.dart'; import 'package:selfprivacy/ui/components/brand_button/brand_button.dart'; -import 'package:selfprivacy/ui/pages/rootRoute.dart'; -import 'package:selfprivacy/utils/route_transitions/basic.dart'; +import 'package:selfprivacy/ui/components/brand_card/brand_card.dart'; +import 'package:selfprivacy/ui/components/brand_modal_sheet/brand_modal_sheet.dart'; +import 'package:selfprivacy/ui/components/brand_span_button/brand_span_button.dart'; import 'package:selfprivacy/utils/extensions/text_extension.dart'; class OnboardingPage extends StatelessWidget { @@ -9,45 +12,217 @@ class OnboardingPage extends StatelessWidget { @override Widget build(BuildContext context) { - return SafeArea( - child: Scaffold( - body: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 15, - vertical: 45, + return Scaffold( + body: ListView( + padding: brandPagePadding1, + children: [ + Text('Начало').caption, + Text('SelfPrivacy').h1, + SizedBox( + height: 10, ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: Align( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, + RichText( + text: TextSpan( + children: [ + TextSpan( + text: + 'Для устойчивости и приватности требует много учёток. Полная инструкция на ', + style: body2Style, + ), + BrandSpanButton.link( + text: 'selfprivacy.org/start', + urlString: 'https://selfprivacy.org/start', + ), + ], + ), + ), + SizedBox(height: 50), + BrandCard( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset('assets/images/logos/hetzner.png'), + SizedBox(height: 10), + Text('1. Подключите сервер Hetzner').h2, + SizedBox(height: 10), + Text('Здесь будут жить наши данные и SelfPrivacy-сервисы') + .body2, + _MockForm( + hintText: 'Hetzner API Token', + ), + SizedBox(height: 20), + BrandButton.text( + onPressed: () => _showModal(context, _HowHetzner()), + title: 'Как получить API Token', + ), + ], + ), + ), + BrandCard( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset('assets/images/logos/namecheap.png'), + SizedBox(height: 10), + Text('2. Настройте домен ').h2, + SizedBox(height: 10), + RichText( + text: TextSpan( children: [ - Text( - 'Онбординг', - ).h1, - SizedBox(height: 20), - Text( - 'Тут рассказ на 1-2 слайда о том, что делает это приложение, какие твои проблемы решает и как (в общем чего ожидать от сервиса).', - ).body2, + TextSpan( + text: 'Зарегистрируйте домен в ', + style: body2Style, + ), + BrandSpanButton.link( + text: 'NameCheap', + urlString: 'https://www.namecheap.com', + ), + TextSpan( + text: + ' или у любого другого регистратора. После этого настройте его на DNS-сервер CloudFlare', + style: body2Style, + ), ], ), ), - ), - BrandButton.rised( - onPressed: () { - Navigator.of(context) - .pushReplacement(materialRoute(RootPage())); - }, - title: 'Приступим!', - ) - ], + _MockForm( + hintText: 'Домен, например, selfprivacy.org', + submitButtonText: 'Проверить DNS', + ), + SizedBox(height: 20), + BrandButton.text( + onPressed: () {}, + title: 'Как настроить DNS CloudFlare', + ), + ], + ), ), - ), + BrandCard( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset('assets/images/logos/cloudflare.png'), + SizedBox(height: 10), + Text('3. Подключите CloudFlare DNS').h2, + SizedBox(height: 10), + Text('Для управления DNS вашего домена').body2, + _MockForm( + hintText: 'CloudFlare API Token', + ), + SizedBox(height: 20), + BrandButton.text( + onPressed: () {}, + title: 'Как получить API Token', + ), + ], + ), + ), + BrandCard( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset('assets/images/logos/aws.png'), + SizedBox(height: 10), + Text('4. Подключите Amazon AWS для бекапа').h2, + SizedBox(height: 10), + Text('IaaS-провайдер, для бесплатного хранения резервных копии ваших данных в зашифрованном виде') + .body2, + _MockForm( + hintText: 'Amazon AWS Access Key', + ), + SizedBox(height: 20), + BrandButton.text( + onPressed: () {}, + title: 'Как получить API Token', + ), + ], + ), + ) + ], + ), + ); + } + + void _showModal(BuildContext context, Widget widget) { + showModalBottomSheet( + context: context, + isScrollControlled: true, + backgroundColor: Colors.transparent, + builder: (BuildContext context) { + return widget; + }, + ); + } +} + +class _HowHetzner extends StatelessWidget { + const _HowHetzner({ + Key key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return BrandModalSheet( + child: Column( + children: [ + SizedBox(height: 40), + Text('Как получить Hetzner API Token').h2, + SizedBox(height: 20), + RichText( + text: TextSpan( + children: [ + TextSpan( + text: '1 Переходим по ссылке ', + style: body1Style, + ), + BrandSpanButton.link( + text: 'hetzner.com/sdfsdfsdfsdf', + urlString: 'https://hetzner.com/sdfsdfsdfsdf', + ), + TextSpan( + text: ''' + +2 Заходим в созданный нами проект. Если такового - нет, значит создаём. + +3 Наводим мышкой на боковую панель. Она должна раскрыться, показав нам пункты меню. Нас интересует последний — Security (с иконкой ключика). + +4 Далее, в верхней части интерфейса видим примерно такой список: SSH Keys, API Tokens, Certificates, Members. Нам нужен API Tokens. Переходим по нему. + +5 В правой части интерфейса, нас будет ожидать кнопка Generate API token. Если же вы используете мобильную версию сайта, в нижнем правом углу вы увидите красный плюсик. Нажимаем на эту кнопку. + +6 В поле Description, даём нашему токену название (это может быть любое название, которые вам нравиться. Сути оно не меняет. + + ''', + style: body1Style, + ), + ], + ), + ), + ], ), ); } } + +class _MockForm extends StatelessWidget { + const _MockForm({ + Key key, + @required this.hintText, + this.submitButtonText = 'Подключить', + }) : super(key: key); + + final String hintText; + final String submitButtonText; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + SizedBox(height: 20), + TextField(decoration: InputDecoration(hintText: hintText)), + SizedBox(height: 20), + BrandButton.rised(onPressed: () {}, title: submitButtonText), + ], + ); + } +} diff --git a/lib/ui/pages/providers/providers.dart b/lib/ui/pages/providers/providers.dart new file mode 100644 index 0000000000..0ee08f07de --- /dev/null +++ b/lib/ui/pages/providers/providers.dart @@ -0,0 +1,114 @@ +import 'package:flutter/material.dart'; +import 'package:selfprivacy/config/brand_theme.dart'; +import 'package:selfprivacy/logic/cubit/services/services_cubit.dart'; +import 'package:selfprivacy/logic/models/service.dart'; +import 'package:selfprivacy/ui/components/brand_button/brand_button.dart'; +import 'package:selfprivacy/ui/components/brand_card/brand_card.dart'; +import 'package:selfprivacy/ui/components/brand_header/brand_header.dart'; +import 'package:selfprivacy/ui/components/brand_icons/brand_icons.dart'; +import 'package:selfprivacy/ui/components/icon_status_mask/icon_status_mask.dart'; +import 'package:selfprivacy/utils/extensions/text_extension.dart'; + +class ProvidersPage extends StatefulWidget { + ProvidersPage({Key key}) : super(key: key); + + @override + _ProvidersPageState createState() => _ProvidersPageState(); +} + +class _ProvidersPageState extends State { + @override + Widget build(BuildContext context) { + final serviceCubit = context.watch(); + final connected = serviceCubit.state.connected; + final uninitialized = serviceCubit.state.uninitialized; + return Scaffold( + appBar: PreferredSize( + child: BrandHeader(title: 'Провайдеры'), + preferredSize: Size.fromHeight(52), + ), + body: ListView( + padding: brandPagePadding2, + children: [ + SizedBox(height: 24), + ...connected.map((service) => _Card(service: service)).toList(), + if (uninitialized.isNotEmpty) ...[ + Text('не подключены').body1, + SizedBox(height: 30), + ], + ...uninitialized.map((service) => _Card(service: service)).toList() + ], + ), + ); + } +} + +class _Card extends StatelessWidget { + const _Card({Key key, @required this.service}) : super(key: key); + + final Service service; + @override + Widget build(BuildContext context) { + String title; + IconData iconData; + String description; + + switch (service.type) { + case ServiceTypes.messanger: + iconData = BrandIcons.messanger; + title = 'Мессенджер'; + description = + 'Delta Chat срфеТекст-текст описание. Если бы мне надо было обсудить что-то от чего зависит жизнь. Я бы выбрал Delta.Chat + свой почтовый сервер.'; + break; + case ServiceTypes.mail: + iconData = BrandIcons.envelope; + title = 'Почта'; + description = 'Электронная почта для семьи или компании '; + break; + case ServiceTypes.passwordManager: + iconData = BrandIcons.key; + title = 'Менеджер паролей'; + description = 'Надёжное хранилище для ваших паролей и ключей доступа'; + break; + case ServiceTypes.github: + iconData = BrandIcons.github; + title = 'Git сервер'; + description = 'Сервис для приватного хранения своих разработок'; + break; + case ServiceTypes.backup: + iconData = BrandIcons.save; + title = 'Резервное копирование'; + description = 'Обеспеченье целосности и сохранности ваших данных'; + break; + case ServiceTypes.cloud: + iconData = BrandIcons.upload; + title = 'Файловое Облако'; + description = 'Сервис для доступа к вашим файлам в любой точке мира'; + break; + } + return BrandCard( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + IconStatusMaks( + status: service.state, + child: Icon(iconData, size: 30, color: Colors.white), + ), + SizedBox(height: 10), + Text(title).h2, + SizedBox(height: 10), + if (service.state == ServiceStateType.uninitialized) ...[ + Text(description).body1, + SizedBox(height: 10), + BrandButton.text( + title: 'Подключить', + onPressed: () { + context.read().connect(service); + }) + ], + if (service.state == ServiceStateType.stable) Text('Подключен').body1, + ], + ), + ); + } +} diff --git a/lib/ui/pages/rootRoute.dart b/lib/ui/pages/rootRoute.dart index 514b34fc54..5fc59df588 100644 --- a/lib/ui/pages/rootRoute.dart +++ b/lib/ui/pages/rootRoute.dart @@ -2,8 +2,9 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:selfprivacy/ui/components/brand_tab_bar/brand_tab_bar.dart'; import 'package:selfprivacy/ui/pages/more/more.dart'; -import 'package:selfprivacy/ui/pages/servers/servers.dart'; +import 'package:selfprivacy/ui/pages/providers/providers.dart'; import 'package:selfprivacy/ui/pages/services/services.dart'; +import 'package:selfprivacy/ui/pages/users/users.dart'; class RootPage extends StatefulWidget { const RootPage({Key key}) : super(key: key); @@ -35,9 +36,9 @@ class _RootPageState extends State body: TabBarView( controller: tabController, children: [ - ServersPage(), + ProvidersPage(), ServicesPage(), - Text('users'), + UsersPage(), MorePage(), ], ), diff --git a/lib/ui/pages/servers/servers.dart b/lib/ui/pages/servers/servers.dart deleted file mode 100644 index dd182e250f..0000000000 --- a/lib/ui/pages/servers/servers.dart +++ /dev/null @@ -1,230 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:selfprivacy/config/brand_colors.dart'; -import 'package:selfprivacy/config/brand_theme.dart'; -import 'package:selfprivacy/config/text_themes.dart'; -import 'package:selfprivacy/ui/components/brand_button/brand_button.dart'; -import 'package:selfprivacy/ui/components/brand_card/brand_card.dart'; -import 'package:selfprivacy/ui/components/brand_modal_sheet/brand_modal_sheet.dart'; -import 'package:selfprivacy/ui/components/brand_span_button/brand_span_button.dart'; -import 'package:selfprivacy/utils/extensions/text_extension.dart'; -export 'package:bloc/bloc.dart'; - -class ServersPage extends StatelessWidget { - const ServersPage({Key key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - body: ListView( - padding: brandPagePadding1, - children: [ - Text('Начало').caption, - Text('SelfPrivacy').h1, - SizedBox( - height: 10, - ), - RichText( - text: TextSpan( - children: [ - TextSpan( - text: - 'Для устойчивости и приватности требует много учёток. Полная инструкция на ', - style: body2Style, - ), - BrandSpanButton.link( - text: 'selfprivacy.org/start', - urlString: 'https://selfprivacy.org/start', - ), - ], - ), - ), - SizedBox(height: 50), - BrandCard( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Image.asset('assets/images/logos/hetzner.png'), - SizedBox(height: 10), - Text('1. Подключите сервер Hetzner').h2, - SizedBox(height: 10), - Text('Здесь будут жить наши данные и SelfPrivacy-сервисы') - .body2, - _MockForm( - hintText: 'Hetzner API Token', - ), - SizedBox(height: 20), - BrandButton.text( - onPressed: () => showModalBottomSheet( - context: context, - isScrollControlled: true, - backgroundColor: Colors.transparent, - builder: (BuildContext context) { - return BrandModalSheet( - child: Column( - children: [ - Text('Как получить Hetzner API Token').h2, - SizedBox(height: 20), - RichText( - text: TextSpan( - children: [ - TextSpan( - text: '1 Переходим по ссылке ', - style: body1Style, - ), - BrandSpanButton.link( - text: 'hetzner.com/sdfsdfsdfsdf', - urlString: - 'https://hetzner.com/sdfsdfsdfsdf', - ), - TextSpan( - text: ''' - -2 Заходим в созданный нами проект. Если такового - нет, значит создаём. - -3 Наводим мышкой на боковую панель. Она должна раскрыться, показав нам пункты меню. Нас интересует последний — Security (с иконкой ключика). - -4 Далее, в верхней части интерфейса видим примерно такой список: SSH Keys, API Tokens, Certificates, Members. Нам нужен API Tokens. Переходим по нему. - -5 В правой части интерфейса, нас будет ожидать кнопка Generate API token. Если же вы используете мобильную версию сайта, в нижнем правом углу вы увидите красный плюсик. Нажимаем на эту кнопку. - -6 В поле Description, даём нашему токену название (это может быть любое название, которые вам нравиться. Сути оно не меняет. - - ''', - style: body1Style, - ), - ], - ), - ), - ], - ), - ); - }, - ), - title: 'Как получить API Token', - ), - ], - ), - ), - BrandCard( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Image.asset('assets/images/logos/namecheap.png'), - SizedBox(height: 10), - Text('2. Настройте домен ').h2, - SizedBox(height: 10), - RichText( - text: TextSpan( - children: [ - TextSpan( - text: 'Зарегистрируйте домен в ', - style: body2Style, - ), - BrandSpanButton.link( - text: 'NameCheap', - urlString: 'https://www.namecheap.com', - ), - TextSpan( - text: - ' или у любого другого регистратора. После этого настройте его на DNS-сервер CloudFlare', - style: body2Style, - ), - ], - ), - ), - _MockForm( - hintText: 'Домен, например, selfprivacy.org', - submitButtonText: 'Проверить DNS', - ), - SizedBox(height: 20), - BrandButton.text( - onPressed: () {}, - title: 'Как настроить DNS CloudFlare', - ), - ], - ), - ), - BrandCard( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Image.asset('assets/images/logos/cloudflare.png'), - SizedBox(height: 10), - Text('3. Подключите CloudFlare DNS').h2, - SizedBox(height: 10), - Text('Для управления DNS вашего домена').body2, - _MockForm( - hintText: 'CloudFlare API Token', - ), - SizedBox(height: 20), - BrandButton.text( - onPressed: () {}, - title: 'Как получить API Token', - ), - ], - ), - ), - BrandCard( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Image.asset('assets/images/logos/aws.png'), - SizedBox(height: 10), - Text('4. Подключите Amazon AWS для бекапа').h2, - SizedBox(height: 10), - Text('IaaS-провайдер, для бесплатного хранения резервных копии ваших данных в зашифрованном виде') - .body2, - _MockForm( - hintText: 'Amazon AWS Access Key', - ), - SizedBox(height: 20), - BrandButton.text( - onPressed: () {}, - title: 'Как получить API Token', - ), - ], - ), - ) - ], - ), - ); - } -} - -class _MockForm extends StatelessWidget { - const _MockForm({ - Key key, - @required this.hintText, - this.submitButtonText = 'Подключить', - }) : super(key: key); - - final String hintText; - final String submitButtonText; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - SizedBox(height: 20), - TextField( - style: TextStyle(fontSize: 15, height: 1.6), - decoration: InputDecoration( - hintText: hintText, - contentPadding: EdgeInsets.all(16), - border: InputBorder.none, - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.all(Radius.circular(4)), - borderSide: BorderSide(color: BrandColors.inputInactive), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.all(Radius.circular(4)), - borderSide: BorderSide(color: BrandColors.blue), - ), - ), - ), - SizedBox(height: 20), - BrandButton.rised(onPressed: () {}, title: submitButtonText), - ], - ); - } -} diff --git a/lib/ui/pages/services/services.dart b/lib/ui/pages/services/services.dart index 20e612c1a4..22c4d89bed 100644 --- a/lib/ui/pages/services/services.dart +++ b/lib/ui/pages/services/services.dart @@ -4,6 +4,7 @@ import 'package:selfprivacy/logic/cubit/services/services_cubit.dart'; import 'package:selfprivacy/logic/models/service.dart'; import 'package:selfprivacy/ui/components/brand_button/brand_button.dart'; import 'package:selfprivacy/ui/components/brand_card/brand_card.dart'; +import 'package:selfprivacy/ui/components/brand_header/brand_header.dart'; import 'package:selfprivacy/ui/components/brand_icons/brand_icons.dart'; import 'package:selfprivacy/ui/components/icon_status_mask/icon_status_mask.dart'; import 'package:selfprivacy/utils/extensions/text_extension.dart'; @@ -22,10 +23,13 @@ class _ServicesPageState extends State { final connected = serviceCubit.state.connected; final uninitialized = serviceCubit.state.uninitialized; return Scaffold( + appBar: PreferredSize( + child: BrandHeader(title: 'Сервисы'), + preferredSize: Size.fromHeight(52), + ), body: ListView( - padding: brandPagePadding1, + padding: brandPagePadding2, children: [ - Text('Сервисы').caption, SizedBox(height: 24), ...connected.map((service) => _Card(service: service)).toList(), if (uninitialized.isNotEmpty) ...[ diff --git a/lib/ui/pages/settings/setting.dart b/lib/ui/pages/settings/setting.dart index a5010edff5..4316c47d34 100644 --- a/lib/ui/pages/settings/setting.dart +++ b/lib/ui/pages/settings/setting.dart @@ -12,52 +12,48 @@ class SettingsPage extends StatelessWidget { Widget build(BuildContext context) { return SafeArea( child: Scaffold( + appBar: PreferredSize( + child: BrandHeader(title: 'Настройки', hasBackButton: true), + preferredSize: Size.fromHeight(52), + ), body: ListView( + padding: brandPagePadding2, children: [ - BrandHeader(title: 'Настройки', hasBackButton: true), - Padding( - padding: brandPagePadding2, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - BrandDivider(), - _SwitcherBlock( - child: _TextColumn( - title: 'Allow Auto-upgrade', - value: 'Wether to allow automatic packages upgrades', - ), - isActive: true, - ), - _SwitcherBlock( - child: _TextColumn( - title: 'Reboot after upgrade', - value: 'Reboot without prompt after applying updates', - ), - isActive: false, - ), - _Button( - onTap: () {}, - child: _TextColumn( - title: 'Server Timezone', - value: 'Europe/Kyiv', - ), - ), - _Button( - onTap: () {}, - child: _TextColumn( - title: 'Server Locale', - value: 'Default', - ), - ), - _Button( - onTap: () {}, - child: _TextColumn( - hasWarning: true, - title: 'Factory Reset', - value: 'Restore default settings on your server', - ), - ) - ], + BrandDivider(), + _SwitcherBlock( + child: _TextColumn( + title: 'Allow Auto-upgrade', + value: 'Wether to allow automatic packages upgrades', + ), + isActive: true, + ), + _SwitcherBlock( + child: _TextColumn( + title: 'Reboot after upgrade', + value: 'Reboot without prompt after applying updates', + ), + isActive: false, + ), + _Button( + onTap: () {}, + child: _TextColumn( + title: 'Server Timezone', + value: 'Europe/Kyiv', + ), + ), + _Button( + onTap: () {}, + child: _TextColumn( + title: 'Server Locale', + value: 'Default', + ), + ), + _Button( + onTap: () {}, + child: _TextColumn( + hasWarning: true, + title: 'Factory Reset', + value: 'Restore default settings on your server', ), ) ], diff --git a/lib/ui/pages/users/users.dart b/lib/ui/pages/users/users.dart new file mode 100644 index 0000000000..151e998dc3 --- /dev/null +++ b/lib/ui/pages/users/users.dart @@ -0,0 +1,288 @@ +import 'package:flutter/material.dart'; +import 'package:selfprivacy/config/brand_colors.dart'; +import 'package:selfprivacy/config/brand_theme.dart'; +import 'package:selfprivacy/logic/cubit/users/users_cubit.dart'; +import 'package:selfprivacy/logic/models/user.dart'; +import 'package:selfprivacy/ui/components/brand_button/brand_button.dart'; +import 'package:selfprivacy/ui/components/brand_divider/brand_divider.dart'; +import 'package:selfprivacy/ui/components/brand_header/brand_header.dart'; +import 'package:selfprivacy/ui/components/brand_icons/brand_icons.dart'; +import 'package:selfprivacy/ui/components/brand_modal_sheet/brand_modal_sheet.dart'; +import 'package:selfprivacy/utils/extensions/text_extension.dart'; +import 'package:selfprivacy/utils/password_generator.dart'; + +class UsersPage extends StatelessWidget { + const UsersPage({Key key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final usersCubit = context.watch(); + final users = usersCubit.state.users; + return Scaffold( + appBar: PreferredSize( + child: BrandHeader(title: 'Пользователи'), + preferredSize: Size.fromHeight(52), + ), + floatingActionButton: Container( + width: 48.0, + height: 48.0, + child: RawMaterialButton( + fillColor: BrandColors.blue, + shape: CircleBorder(), + elevation: 0.0, + highlightElevation: 2, + child: Icon( + Icons.add, + color: Colors.white, + size: 34, + ), + onPressed: () { + showModalBottomSheet( + context: context, + isScrollControlled: true, + backgroundColor: Colors.transparent, + builder: (BuildContext context) { + return _NewUser(); + }, + ); + }, + ), + ), + body: ListView( + children: [ + ...users.map((user) => _User(user: user)), + ], + ), + ); + } +} + +class _User extends StatelessWidget { + const _User({Key key, this.user}) : super(key: key); + + final User user; + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () { + showModalBottomSheet( + context: context, + isScrollControlled: true, + backgroundColor: Colors.transparent, + builder: (BuildContext context) { + return _UserDetails(user: user); + }, + ); + }, + child: Container( + padding: brandPagePadding2, + height: 48, + child: Row( + children: [ + Container( + width: 17, + height: 17, + decoration: BoxDecoration( + color: user.color, + shape: BoxShape.circle, + ), + ), + SizedBox(width: 20), + Text(user.login).caption, + ], + ), + ), + ); + } +} + +class _NewUser extends StatefulWidget { + const _NewUser({Key key}) : super(key: key); + + @override + __NewUserState createState() => __NewUserState(); +} + +class __NewUserState extends State<_NewUser> { + var passController = TextEditingController(text: genPass()); + + @override + Widget build(BuildContext context) { + return BrandModalSheet( + child: Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + BrandHeader(title: 'Новый пользователь'), + SizedBox(width: 14), + Padding( + padding: brandPagePadding2, + child: Column( + children: [ + TextField( + decoration: InputDecoration( + labelText: 'Логин', + suffixText: '@example', + ), + ), + SizedBox(height: 20), + TextField( + controller: passController, + decoration: InputDecoration( + alignLabelWithHint: false, + labelText: 'Пароль', + suffixIcon: Padding( + padding: const EdgeInsets.only(right: 8), + child: IconButton( + icon: Icon( + BrandIcons.refresh, + color: BrandColors.blue, + ), + onPressed: () { + passController.value = + TextEditingValue(text: genPass()); + }, + ), + ), + ), + ), + SizedBox(height: 30), + BrandButton.rised( + onPressed: () { + Navigator.pop(context); + }, + title: 'Создать', + ), + SizedBox(height: 40), + Text( + 'Новый пользователь автоматически получит доступ ко всем сервисам. Ещё какое-то описание.'), + SizedBox(height: 30), + ], + ), + ), + ], + ), + ), + ); + } +} + +class _UserDetails extends StatelessWidget { + const _UserDetails({ + Key key, + this.user, + }) : super(key: key); + + final User user; + + @override + Widget build(BuildContext context) { + return BrandModalSheet( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: 200, + decoration: BoxDecoration( + color: user.color, + borderRadius: BorderRadius.vertical( + top: Radius.circular(20), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Align( + alignment: Alignment.centerRight, + child: Padding( + padding: EdgeInsets.symmetric( + vertical: 4, + horizontal: 2, + ), + child: PopupMenuButton( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), + ), + // onSelected: (WhyFarther result) { + // setState(() { + // _selection = result; + // }); + // }, + icon: Icon(Icons.more_vert), + itemBuilder: (BuildContext context) => [ + PopupMenuItem( + value: 1, + child: Container( + padding: EdgeInsets.only(left: 5), + child: Text('Сбросить пароль'), + ), + ), + PopupMenuItem( + value: 2, + child: Container( + padding: EdgeInsets.only(left: 5), + child: Text( + 'Удалить', + style: TextStyle(color: BrandColors.red), + ), + ), + ), + ], + ), + ), + ), + Spacer(), + Padding( + padding: EdgeInsets.symmetric( + vertical: 20, + horizontal: 15, + ), + child: Text( + user.login, + softWrap: true, + overflow: TextOverflow.ellipsis, + ).h1, + ), + ], + ), + ), + SizedBox(height: 20), + Padding( + padding: brandPagePadding2.copyWith(bottom: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Учетная запись').small, + Container( + height: 40, + alignment: Alignment.centerLeft, + child: Text('${user.login}@example.com').caption, + ), + SizedBox(height: 14), + Text('Пароль').small, + Container( + height: 40, + alignment: Alignment.centerLeft, + child: Text(user.password).caption, + ), + SizedBox(height: 24), + BrandDivider(), + SizedBox(height: 20), + BrandButton.iconText( + title: 'Отправить реквизиты для входа', + icon: Icon(BrandIcons.share), + onPressed: () {}, + ), + SizedBox(height: 20), + BrandDivider(), + SizedBox(height: 20), + Text( + 'Вам был создан доступ к сервисам с логином и паролем к сервисам:
- E-mail с адресом 
- Менеджер паролей: 
- Файловое облако: 
- Видеоконференция 
- Git сервер '), + ], + ), + ) + ], + ), + ); + } +} diff --git a/lib/utils/color_utils.dart b/lib/utils/color_utils.dart new file mode 100644 index 0000000000..de7bcae867 --- /dev/null +++ b/lib/utils/color_utils.dart @@ -0,0 +1,1471 @@ +import 'package:flutter/material.dart'; + +Color stringToColor(String string) { + var number = string.codeUnits.reduce((a, b) => a + b); + var index = number % colorPallete.length; + return colorPallete[index]; +} + +var colorPallete = [ + Color(0xFF000080), + Color(0xFF0000C8), + Color(0xFF0000FF), + Color(0xFF000741), + Color(0xFF001B1C), + Color(0xFF002387), + Color(0xFF002900), + Color(0xFF002E20), + Color(0xFF002FA7), + Color(0xFF003153), + Color(0xFF003366), + Color(0xFF003399), + Color(0xFF003532), + Color(0xFF003E40), + Color(0xFF004620), + Color(0xFF0047AB), + Color(0xFF004816), + Color(0xFF004950), + Color(0xFF0056A7), + Color(0xFF00581A), + Color(0xFF0066CC), + Color(0xFF0066FF), + Color(0xFF00755E), + Color(0xFF0076A3), + Color(0xFF007BA7), + Color(0xFF007EC7), + Color(0xFF007FFF), + Color(0xFF008080), + Color(0xFF0095B6), + Color(0xFF009DC4), + Color(0xFF00A693), + Color(0xFF00A86B), + Color(0xFF00CC99), + Color(0xFF00CCCC), + Color(0xFF00FF00), + Color(0xFF00FF7F), + Color(0xFF00FFFF), + Color(0xFF010D1A), + Color(0xFF011635), + Color(0xFF011D13), + Color(0xFF012731), + Color(0xFF01361C), + Color(0xFF01371A), + Color(0xFF013E62), + Color(0xFF013F6A), + Color(0xFF014B43), + Color(0xFF015E85), + Color(0xFF016162), + Color(0xFF016D39), + Color(0xFF01796F), + Color(0xFF017987), + Color(0xFF01826B), + Color(0xFF01A368), + Color(0xFF022D15), + Color(0xFF02402C), + Color(0xFF02478E), + Color(0xFF024E46), + Color(0xFF026395), + Color(0xFF02866F), + Color(0xFF02A4D3), + Color(0xFF03163C), + Color(0xFF032B52), + Color(0xFF036A6E), + Color(0xFF041004), + Color(0xFF041322), + Color(0xFF042E4C), + Color(0xFF044022), + Color(0xFF044259), + Color(0xFF051040), + Color(0xFF051657), + Color(0xFF055989), + Color(0xFF056F57), + Color(0xFF062A78), + Color(0xFF063537), + Color(0xFF069B81), + Color(0xFF06A189), + Color(0xFF073A50), + Color(0xFF080110), + Color(0xFF081910), + Color(0xFF082567), + Color(0xFF088370), + Color(0xFF08E8DE), + Color(0xFF092256), + Color(0xFF09230F), + Color(0xFF09255D), + Color(0xFF093624), + Color(0xFF095859), + Color(0xFF097F4B), + Color(0xFF0A001C), + Color(0xFF0A480D), + Color(0xFF0A6906), + Color(0xFF0A6F75), + Color(0xFF0B0B0B), + Color(0xFF0B0F08), + Color(0xFF0B1107), + Color(0xFF0B1304), + Color(0xFF0B6207), + Color(0xFF0BDA51), + Color(0xFF0C0B1D), + Color(0xFF0C0D0F), + Color(0xFF0C1911), + Color(0xFF0C7A79), + Color(0xFF0C8990), + Color(0xFF0D0332), + Color(0xFF0D1117), + Color(0xFF0D1C19), + Color(0xFF0D2E1C), + Color(0xFF0E0E18), + Color(0xFF0E2A30), + Color(0xFF0F2D9E), + Color(0xFF10121D), + Color(0xFF101405), + Color(0xFF105852), + Color(0xFF110C6C), + Color(0xFF120A8F), + Color(0xFF123447), + Color(0xFF126B40), + Color(0xFF130000), + Color(0xFF130A06), + Color(0xFF13264D), + Color(0xFF134F19), + Color(0xFF140600), + Color(0xFF1450AA), + Color(0xFF151F4C), + Color(0xFF1560BD), + Color(0xFF15736B), + Color(0xFF161928), + Color(0xFF161D10), + Color(0xFF162A40), + Color(0xFF163222), + Color(0xFF16322C), + Color(0xFF163531), + Color(0xFF171F04), + Color(0xFF175579), + Color(0xFF182D09), + Color(0xFF18587A), + Color(0xFF19330E), + Color(0xFF193751), + Color(0xFF1959A8), + Color(0xFF1A1A68), + Color(0xFF1AB385), + Color(0xFF1B0245), + Color(0xFF1B1035), + Color(0xFF1B127B), + Color(0xFF1B1404), + Color(0xFF1B2F11), + Color(0xFF1B3162), + Color(0xFF1B659D), + Color(0xFF1C1208), + Color(0xFF1C1E13), + Color(0xFF1C39BB), + Color(0xFF1C402E), + Color(0xFF1C7C7D), + Color(0xFF1D6142), + Color(0xFF1E0F04), + Color(0xFF1E1609), + Color(0xFF1E1708), + Color(0xFF1E385B), + Color(0xFF1E433C), + Color(0xFF1E90FF), + Color(0xFF1E9AB0), + Color(0xFF1F120F), + Color(0xFF1FC2C2), + Color(0xFF20208D), + Color(0xFF202E54), + Color(0xFF204852), + Color(0xFF211A0E), + Color(0xFF220878), + Color(0xFF228B22), + Color(0xFF233418), + Color(0xFF240A40), + Color(0xFF240C02), + Color(0xFF242A1D), + Color(0xFF242E16), + Color(0xFF24500F), + Color(0xFF251607), + Color(0xFF251706), + Color(0xFF251F4F), + Color(0xFF25272C), + Color(0xFF25311C), + Color(0xFF2596D1), + Color(0xFF260368), + Color(0xFF26056A), + Color(0xFF261105), + Color(0xFF261414), + Color(0xFF262335), + Color(0xFF26283B), + Color(0xFF273A81), + Color(0xFF27504B), + Color(0xFF278A5B), + Color(0xFF281E15), + Color(0xFF283A77), + Color(0xFF286ACD), + Color(0xFF290C5E), + Color(0xFF292130), + Color(0xFF292319), + Color(0xFF292937), + Color(0xFF297B9A), + Color(0xFF29AB87), + Color(0xFF2A0359), + Color(0xFF2A140E), + Color(0xFF2A2630), + Color(0xFF2A380B), + Color(0xFF2A52BE), + Color(0xFF2B0202), + Color(0xFF2B194F), + Color(0xFF2B3228), + Color(0xFF2C0E8C), + Color(0xFF2C1632), + Color(0xFF2C2133), + Color(0xFF2C8C84), + Color(0xFF2D2510), + Color(0xFF2D383A), + Color(0xFF2D569B), + Color(0xFF2E0329), + Color(0xFF2E1905), + Color(0xFF2E3222), + Color(0xFF2E3F62), + Color(0xFF2E8B57), + Color(0xFF2EBFD4), + Color(0xFF2F270E), + Color(0xFF2F3CB3), + Color(0xFF2F519E), + Color(0xFF2F5A57), + Color(0xFF2F6168), + Color(0xFF300529), + Color(0xFF301F1E), + Color(0xFF302A0F), + Color(0xFF304B6A), + Color(0xFF30D5C8), + Color(0xFF311C17), + Color(0xFF314459), + Color(0xFF315BA1), + Color(0xFF31728D), + Color(0xFF317D82), + Color(0xFF32127A), + Color(0xFF32293A), + Color(0xFF323232), + Color(0xFF325D52), + Color(0xFF327C14), + Color(0xFF327DA0), + Color(0xFF33036B), + Color(0xFF33292F), + Color(0xFF33CC99), + Color(0xFF341515), + Color(0xFF350036), + Color(0xFF350E42), + Color(0xFF350E57), + Color(0xFF353542), + Color(0xFF354E8C), + Color(0xFF363050), + Color(0xFF363534), + Color(0xFF363C0D), + Color(0xFF36747D), + Color(0xFF368716), + Color(0xFF370202), + Color(0xFF371D09), + Color(0xFF37290E), + Color(0xFF373021), + Color(0xFF377475), + Color(0xFF380474), + Color(0xFF381A51), + Color(0xFF383533), + Color(0xFF384555), + Color(0xFF384910), + Color(0xFF394851), + Color(0xFF396413), + Color(0xFF3A0020), + Color(0xFF3A2010), + Color(0xFF3A2A6A), + Color(0xFF3A686C), + Color(0xFF3A6A47), + Color(0xFF3AB09E), + Color(0xFF3B000B), + Color(0xFF3B0910), + Color(0xFF3B1F1F), + Color(0xFF3B2820), + Color(0xFF3B7A57), + Color(0xFF3B91B4), + Color(0xFF3C0878), + Color(0xFF3C1206), + Color(0xFF3C1F76), + Color(0xFF3C2005), + Color(0xFF3C3910), + Color(0xFF3C4151), + Color(0xFF3C4443), + Color(0xFF3C493A), + Color(0xFF3D0C02), + Color(0xFF3D2B1F), + Color(0xFF3D7D52), + Color(0xFF3E0480), + Color(0xFF3E1C14), + Color(0xFF3E2B23), + Color(0xFF3E2C1C), + Color(0xFF3E3A44), + Color(0xFF3EABBF), + Color(0xFF3F2109), + Color(0xFF3F2500), + Color(0xFF3F3002), + Color(0xFF3F307F), + Color(0xFF3F4C3A), + Color(0xFF3F583B), + Color(0xFF3F5D53), + Color(0xFF3FC1AA), + Color(0xFF3FFF00), + Color(0xFF401801), + Color(0xFF40291D), + Color(0xFF403B38), + Color(0xFF403D19), + Color(0xFF405169), + Color(0xFF40826D), + Color(0xFF40A860), + Color(0xFF410056), + Color(0xFF411F10), + Color(0xFF412010), + Color(0xFF413C37), + Color(0xFF414257), + Color(0xFF414C7D), + Color(0xFF4169E1), + Color(0xFF41AA78), + Color(0xFF420303), + Color(0xFF423921), + Color(0xFF427977), + Color(0xFF431560), + Color(0xFF433120), + Color(0xFF433E37), + Color(0xFF434C59), + Color(0xFF436A0D), + Color(0xFF44012D), + Color(0xFF441D00), + Color(0xFF444954), + Color(0xFF454936), + Color(0xFF456CAC), + Color(0xFF45B1E8), + Color(0xFF460B41), + Color(0xFF462425), + Color(0xFF465945), + Color(0xFF4682B4), + Color(0xFF480404), + Color(0xFF480607), + Color(0xFF480656), + Color(0xFF481C1C), + Color(0xFF483131), + Color(0xFF483C32), + Color(0xFF49170C), + Color(0xFF492615), + Color(0xFF49371B), + Color(0xFF495400), + Color(0xFF496679), + Color(0xFF497183), + Color(0xFF4A2A04), + Color(0xFF4A3004), + Color(0xFF4A3C30), + Color(0xFF4A4244), + Color(0xFF4A444B), + Color(0xFF4A4E5A), + Color(0xFF4B0082), + Color(0xFF4B5D52), + Color(0xFF4C3024), + Color(0xFF4C4F56), + Color(0xFF4D0135), + Color(0xFF4D0A18), + Color(0xFF4D1E01), + Color(0xFF4D282D), + Color(0xFF4D282E), + Color(0xFF4D3833), + Color(0xFF4D3D14), + Color(0xFF4D400F), + Color(0xFF4D5328), + Color(0xFF4E0606), + Color(0xFF4E2A5A), + Color(0xFF4E3B41), + Color(0xFF4E420C), + Color(0xFF4E4562), + Color(0xFF4E6649), + Color(0xFF4E7F9E), + Color(0xFF4EABD1), + Color(0xFF4F1C70), + Color(0xFF4F2398), + Color(0xFF4F69C6), + Color(0xFF4F7942), + Color(0xFF4F9D5D), + Color(0xFF4FA83D), + Color(0xFF504351), + Color(0xFF507096), + Color(0xFF507672), + Color(0xFF50C878), + Color(0xFF514649), + Color(0xFF516E3D), + Color(0xFF517C66), + Color(0xFF51808F), + Color(0xFF52001F), + Color(0xFF520C17), + Color(0xFF523C94), + Color(0xFF533455), + Color(0xFF534491), + Color(0xFF53824B), + Color(0xFF541012), + Color(0xFF544333), + Color(0xFF54534D), + Color(0xFF549019), + Color(0xFF55280C), + Color(0xFF555B10), + Color(0xFF556D56), + Color(0xFF5590D9), + Color(0xFF56B4BE), + Color(0xFF578363), + Color(0xFF583401), + Color(0xFF585562), + Color(0xFF587156), + Color(0xFF589AAF), + Color(0xFF591D35), + Color(0xFF592804), + Color(0xFF593737), + Color(0xFF594433), + Color(0xFF5A6E9C), + Color(0xFF5A87A0), + Color(0xFF5B3013), + Color(0xFF5C0120), + Color(0xFF5C0536), + Color(0xFF5C2E01), + Color(0xFF5C5D75), + Color(0xFF5D1E0F), + Color(0xFF5D4C51), + Color(0xFF5D5C58), + Color(0xFF5D5E37), + Color(0xFF5D7747), + Color(0xFF5DA19F), + Color(0xFF5E483E), + Color(0xFF5E5D3B), + Color(0xFF5F3D26), + Color(0xFF5F5F6E), + Color(0xFF5F6672), + Color(0xFF5FA777), + Color(0xFF5FB3AC), + Color(0xFF604913), + Color(0xFF605B73), + Color(0xFF606E68), + Color(0xFF6093D1), + Color(0xFF612718), + Color(0xFF614051), + Color(0xFF615D30), + Color(0xFF61845F), + Color(0xFF622F30), + Color(0xFF623F2D), + Color(0xFF624E9A), + Color(0xFF625119), + Color(0xFF626649), + Color(0xFF639A8F), + Color(0xFF63B76C), + Color(0xFF6456B7), + Color(0xFF646077), + Color(0xFF646463), + Color(0xFF646A54), + Color(0xFF646E75), + Color(0xFF6495ED), + Color(0xFF64CCDB), + Color(0xFF65000B), + Color(0xFF651A14), + Color(0xFF652DC1), + Color(0xFF657220), + Color(0xFF65745D), + Color(0xFF65869F), + Color(0xFF660045), + Color(0xFF660099), + Color(0xFF66023C), + Color(0xFF661010), + Color(0xFF66B58F), + Color(0xFF66FF00), + Color(0xFF66FF66), + Color(0xFF67032D), + Color(0xFF675FA6), + Color(0xFF676662), + Color(0xFF678975), + Color(0xFF67A712), + Color(0xFF683600), + Color(0xFF685558), + Color(0xFF685E6E), + Color(0xFF692545), + Color(0xFF692D54), + Color(0xFF695F62), + Color(0xFF697E9A), + Color(0xFF6A442E), + Color(0xFF6A5D1B), + Color(0xFF6A6051), + Color(0xFF6B2A14), + Color(0xFF6B3FA0), + Color(0xFF6B4E31), + Color(0xFF6B5755), + Color(0xFF6B8BA2), + Color(0xFF6B8E23), + Color(0xFF6C3082), + Color(0xFF6CDAE7), + Color(0xFF6D0101), + Color(0xFF6D5E54), + Color(0xFF6D6C6C), + Color(0xFF6D9292), + Color(0xFF6D92A1), + Color(0xFF6E0902), + Color(0xFF6E1D14), + Color(0xFF6E4826), + Color(0xFF6E4B26), + Color(0xFF6E6D57), + Color(0xFF6E7783), + Color(0xFF6F440C), + Color(0xFF6F6A61), + Color(0xFF6F8E63), + Color(0xFF6F9D02), + Color(0xFF6FD0C5), + Color(0xFF701C1C), + Color(0xFF704214), + Color(0xFF704A07), + Color(0xFF704F50), + Color(0xFF706555), + Color(0xFF708090), + Color(0xFF711A00), + Color(0xFF71291D), + Color(0xFF714693), + Color(0xFF714AB2), + Color(0xFF715D47), + Color(0xFF716338), + Color(0xFF716B56), + Color(0xFF716E10), + Color(0xFF717486), + Color(0xFF718080), + Color(0xFF71D9E2), + Color(0xFF72010F), + Color(0xFF724A2F), + Color(0xFF726D4E), + Color(0xFF727B89), + Color(0xFF731E8F), + Color(0xFF734A12), + Color(0xFF736C9F), + Color(0xFF736D58), + Color(0xFF737829), + Color(0xFF738678), + Color(0xFF74640D), + Color(0xFF747D63), + Color(0xFF747D83), + Color(0xFF748881), + Color(0xFF749378), + Color(0xFF74C365), + Color(0xFF755A57), + Color(0xFF7563A8), + Color(0xFF76395D), + Color(0xFF7666C6), + Color(0xFF76BD17), + Color(0xFF76D7EA), + Color(0xFF770F05), + Color(0xFF771F1F), + Color(0xFF773F1A), + Color(0xFF776F61), + Color(0xFF778120), + Color(0xFF779E86), + Color(0xFF77DD77), + Color(0xFF780109), + Color(0xFF782D19), + Color(0xFF782F16), + Color(0xFF78866B), + Color(0xFF788A25), + Color(0xFF788BBA), + Color(0xFF78A39C), + Color(0xFF795D4C), + Color(0xFF796878), + Color(0xFF796989), + Color(0xFF796A78), + Color(0xFF796D62), + Color(0xFF79DEEC), + Color(0xFF7A013A), + Color(0xFF7A58C1), + Color(0xFF7A7A7A), + Color(0xFF7A89B8), + Color(0xFF7AC488), + Color(0xFF7B3801), + Color(0xFF7B3F00), + Color(0xFF7B6608), + Color(0xFF7B7874), + Color(0xFF7B7C94), + Color(0xFF7B8265), + Color(0xFF7B9F80), + Color(0xFF7BA05B), + Color(0xFF7C1C05), + Color(0xFF7C7631), + Color(0xFF7C778A), + Color(0xFF7C7B7A), + Color(0xFF7C7B82), + Color(0xFF7C881A), + Color(0xFF7CA1A6), + Color(0xFF7CB0A1), + Color(0xFF7CB7BB), + Color(0xFF7D2C14), + Color(0xFF7DA98D), + Color(0xFF7DC8F7), + Color(0xFF7DD8C6), + Color(0xFF7E3A15), + Color(0xFF7F1734), + Color(0xFF7F3A02), + Color(0xFF7F626D), + Color(0xFF7F7589), + Color(0xFF7F76D3), + Color(0xFF7FFF00), + Color(0xFF7FFFD4), + Color(0xFF800000), + Color(0xFF800B47), + Color(0xFF801818), + Color(0xFF80341F), + Color(0xFF803790), + Color(0xFF80461B), + Color(0xFF807E79), + Color(0xFF808000), + Color(0xFF808080), + Color(0xFF80B3AE), + Color(0xFF80B3C4), + Color(0xFF80CCEA), + Color(0xFF81422C), + Color(0xFF816E71), + Color(0xFF817377), + Color(0xFF819885), + Color(0xFF826F65), + Color(0xFF828685), + Color(0xFF828F72), + Color(0xFF831923), + Color(0xFF837050), + Color(0xFF83AA5D), + Color(0xFF83D0C6), + Color(0xFF843179), + Color(0xFF84A0A0), + Color(0xFF8581D9), + Color(0xFF858470), + Color(0xFF859FAF), + Color(0xFF85C4CC), + Color(0xFF860111), + Color(0xFF863C3C), + Color(0xFF86483C), + Color(0xFF864D1E), + Color(0xFF86560A), + Color(0xFF868974), + Color(0xFF86949F), + Color(0xFF871550), + Color(0xFF87756E), + Color(0xFF877C7B), + Color(0xFF878D91), + Color(0xFF87AB39), + Color(0xFF885342), + Color(0xFF886221), + Color(0xFF888387), + Color(0xFF888D65), + Color(0xFF893456), + Color(0xFF893843), + Color(0xFF894367), + Color(0xFF897D6D), + Color(0xFF8A3324), + Color(0xFF8A73D6), + Color(0xFF8A8360), + Color(0xFF8A8389), + Color(0xFF8A8F8A), + Color(0xFF8AB9F1), + Color(0xFF8B00FF), + Color(0xFF8B0723), + Color(0xFF8B6B0B), + Color(0xFF8B8470), + Color(0xFF8B847E), + Color(0xFF8B8680), + Color(0xFF8B9C90), + Color(0xFF8B9FEE), + Color(0xFF8BA690), + Color(0xFF8BA9A5), + Color(0xFF8BE6D8), + Color(0xFF8C055E), + Color(0xFF8C472F), + Color(0xFF8C5738), + Color(0xFF8C6495), + Color(0xFF8D0226), + Color(0xFF8D3D38), + Color(0xFF8D3F3F), + Color(0xFF8D7662), + Color(0xFF8D8974), + Color(0xFF8D90A1), + Color(0xFF8DA8CC), + Color(0xFF8E0000), + Color(0xFF8E4D1E), + Color(0xFF8E6F70), + Color(0xFF8E775E), + Color(0xFF8E8190), + Color(0xFF8EABC1), + Color(0xFF8F021C), + Color(0xFF8F3E33), + Color(0xFF8F4B0E), + Color(0xFF8F8176), + Color(0xFF8FD6B4), + Color(0xFF900020), + Color(0xFF901E1E), + Color(0xFF907874), + Color(0xFF907B71), + Color(0xFF908D39), + Color(0xFF92000A), + Color(0xFF924321), + Color(0xFF926F5B), + Color(0xFF928573), + Color(0xFF928590), + Color(0xFF9370DB), + Color(0xFF93CCEA), + Color(0xFF93DFB8), + Color(0xFF944747), + Color(0xFF948771), + Color(0xFF950015), + Color(0xFF956387), + Color(0xFF959396), + Color(0xFF960018), + Color(0xFF964B00), + Color(0xFF967059), + Color(0xFF9678B6), + Color(0xFF967BB6), + Color(0xFF96A8A1), + Color(0xFF96BBAB), + Color(0xFF97605D), + Color(0xFF9771B5), + Color(0xFF97CD2D), + Color(0xFF983D61), + Color(0xFF9874D3), + Color(0xFF98777B), + Color(0xFF98811B), + Color(0xFF988D77), + Color(0xFF98FF98), + Color(0xFF990066), + Color(0xFF991199), + Color(0xFF991613), + Color(0xFF991B07), + Color(0xFF996666), + Color(0xFF9966CC), + Color(0xFF997A8D), + Color(0xFF9999CC), + Color(0xFF9A3820), + Color(0xFF9A6E61), + Color(0xFF9A9577), + Color(0xFF9AB973), + Color(0xFF9AC2B8), + Color(0xFF9B4703), + Color(0xFF9B9E8F), + Color(0xFF9C3336), + Color(0xFF9D5616), + Color(0xFF9DACB7), + Color(0xFF9DC209), + Color(0xFF9DE093), + Color(0xFF9DE5FF), + Color(0xFF9E5302), + Color(0xFF9E5B40), + Color(0xFF9EA587), + Color(0xFF9EA91F), + Color(0xFF9EB1CD), + Color(0xFF9EDEE0), + Color(0xFF9F381D), + Color(0xFF9F821C), + Color(0xFF9F9F9C), + Color(0xFF9FA0B1), + Color(0xFF9FD7D3), + Color(0xFF9FDD8C), + Color(0xFFA02712), + Color(0xFFA1750D), + Color(0xFFA1ADB5), + Color(0xFFA1C50A), + Color(0xFFA1DAD7), + Color(0xFFA1E9DE), + Color(0xFFA2006D), + Color(0xFFA23B6C), + Color(0xFFA26645), + Color(0xFFA2AAB3), + Color(0xFFA2AEAB), + Color(0xFFA3807B), + Color(0xFFA397B4), + Color(0xFFA3E3ED), + Color(0xFFA4A49D), + Color(0xFFA4A6D3), + Color(0xFFA4AF6E), + Color(0xFFA50B5E), + Color(0xFFA59B91), + Color(0xFFA5CB0C), + Color(0xFFA62F20), + Color(0xFFA65529), + Color(0xFFA68B5B), + Color(0xFFA69279), + Color(0xFFA6A29A), + Color(0xFFA72525), + Color(0xFFA7882C), + Color(0xFFA85307), + Color(0xFFA86515), + Color(0xFFA86B6B), + Color(0xFFA8989B), + Color(0xFFA899E6), + Color(0xFFA8A589), + Color(0xFFA8AE9C), + Color(0xFFA8AF8E), + Color(0xFFA8BD9F), + Color(0xFFA8E3BD), + Color(0xFFA9A491), + Color(0xFFA9ACB6), + Color(0xFFA9B2C3), + Color(0xFFA9B497), + Color(0xFFA9BDBF), + Color(0xFFA9BEF2), + Color(0xFFA9C6C2), + Color(0xFFAA375A), + Color(0xFFAA4203), + Color(0xFFAA8B5B), + Color(0xFFAA8D6F), + Color(0xFFAAA5A9), + Color(0xFFAAA9CD), + Color(0xFFAAABB7), + Color(0xFFAAD6E6), + Color(0xFFAAF0D1), + Color(0xFFAB0563), + Color(0xFFAB3472), + Color(0xFFAB917A), + Color(0xFFABA0D9), + Color(0xFFABA196), + Color(0xFFAC8A56), + Color(0xFFAC91CE), + Color(0xFFAC9E22), + Color(0xFFACA494), + Color(0xFFACA586), + Color(0xFFACA59F), + Color(0xFFACACAC), + Color(0xFFACB78E), + Color(0xFFACCBB1), + Color(0xFFACDD4D), + Color(0xFFACE1AF), + Color(0xFFAD781B), + Color(0xFFADBED1), + Color(0xFFADDFAD), + Color(0xFFADE6C4), + Color(0xFFADFF2F), + Color(0xFFAE4560), + Color(0xFFAE6020), + Color(0xFFAE809E), + Color(0xFFAF4035), + Color(0xFFAF4D43), + Color(0xFFAF593E), + Color(0xFFAF8751), + Color(0xFFAF8F2C), + Color(0xFFAF9F1C), + Color(0xFFAFA09E), + Color(0xFFAFB1B8), + Color(0xFFAFBDD9), + Color(0xFFB04C6A), + Color(0xFFB05D54), + Color(0xFFB05E81), + Color(0xFFB06608), + Color(0xFFB09A95), + Color(0xFFB0E0E6), + Color(0xFFB0E313), + Color(0xFFB10000), + Color(0xFFB14A0B), + Color(0xFFB1610B), + Color(0xFFB16D52), + Color(0xFFB19461), + Color(0xFFB1E2C1), + Color(0xFFB1F4E7), + Color(0xFFB20931), + Color(0xFFB2A1EA), + Color(0xFFB32D29), + Color(0xFFB35213), + Color(0xFFB38007), + Color(0xFFB3AF95), + Color(0xFFB3C110), + Color(0xFFB43332), + Color(0xFFB44668), + Color(0xFFB4CFD3), + Color(0xFFB57281), + Color(0xFFB57EDC), + Color(0xFFB5A27F), + Color(0xFFB5B35C), + Color(0xFFB5D2CE), + Color(0xFFB5ECDF), + Color(0xFFB6316C), + Color(0xFFB69D98), + Color(0xFFB6B095), + Color(0xFFB6BAA4), + Color(0xFFB6D1EA), + Color(0xFFB6D3BF), + Color(0xFFB7410E), + Color(0xFFB78E5C), + Color(0xFFB7A214), + Color(0xFFB7A458), + Color(0xFFB7B1B1), + Color(0xFFB7C3D0), + Color(0xFFB7F0BE), + Color(0xFFB81104), + Color(0xFFB87333), + Color(0xFFB8B56A), + Color(0xFFB8C1B1), + Color(0xFFB8C25D), + Color(0xFFB8E0F9), + Color(0xFFB94E48), + Color(0xFFB95140), + Color(0xFFB98D28), + Color(0xFFB9C46A), + Color(0xFFB9C8AC), + Color(0xFFBA0101), + Color(0xFFBA450C), + Color(0xFFBA6F1E), + Color(0xFFBA7F03), + Color(0xFFBAB1A2), + Color(0xFFBAC7C9), + Color(0xFFBAEEF9), + Color(0xFFBB3385), + Color(0xFFBB8983), + Color(0xFFBBD009), + Color(0xFFBBD7C1), + Color(0xFFBCC9C2), + Color(0xFFBD5E2E), + Color(0xFFBD978E), + Color(0xFFBDB1A8), + Color(0xFFBDB2A1), + Color(0xFFBDB3C7), + Color(0xFFBDBBD7), + Color(0xFFBDBDC6), + Color(0xFFBDC8B3), + Color(0xFFBDC9CE), + Color(0xFFBDEDFD), + Color(0xFFBEA6C3), + Color(0xFFBEB5B7), + Color(0xFFBEDE0D), + Color(0xFFBF5500), + Color(0xFFBFB8B0), + Color(0xFFBFBED8), + Color(0xFFBFC1C2), + Color(0xFFBFC921), + Color(0xFFBFDBE2), + Color(0xFFBFFF00), + Color(0xFFC02B18), + Color(0xFFC04737), + Color(0xFFC08081), + Color(0xFFC0C0C0), + Color(0xFFC0D3B9), + Color(0xFFC0D8B6), + Color(0xFFC1440E), + Color(0xFFC154C1), + Color(0xFFC1A004), + Color(0xFFC1B7A4), + Color(0xFFC1BAB0), + Color(0xFFC1BECD), + Color(0xFFC1D7B0), + Color(0xFFC1F07C), + Color(0xFFC26B03), + Color(0xFFC2955D), + Color(0xFFC2BDB6), + Color(0xFFC2CAC4), + Color(0xFFC2E8E5), + Color(0xFFC32148), + Color(0xFFC3B091), + Color(0xFFC3BFC1), + Color(0xFFC3C3BD), + Color(0xFFC3CDE6), + Color(0xFFC3D1D1), + Color(0xFFC3DDF9), + Color(0xFFC41E3A), + Color(0xFFC45655), + Color(0xFFC45719), + Color(0xFFC4C4BC), + Color(0xFFC4D0B0), + Color(0xFFC4F4EB), + Color(0xFFC54B8C), + Color(0xFFC59922), + Color(0xFFC5994B), + Color(0xFFC5DBCA), + Color(0xFFC5E17A), + Color(0xFFC62D42), + Color(0xFFC6726B), + Color(0xFFC69191), + Color(0xFFC6A84B), + Color(0xFFC6C3B5), + Color(0xFFC6C8BD), + Color(0xFFC6E610), + Color(0xFFC7031E), + Color(0xFFC71585), + Color(0xFFC7BCA2), + Color(0xFFC7C1FF), + Color(0xFFC7C4BF), + Color(0xFFC7C9D5), + Color(0xFFC7CD90), + Color(0xFFC7DDE5), + Color(0xFFC88A65), + Color(0xFFC8A2C8), + Color(0xFFC8A528), + Color(0xFFC8AABF), + Color(0xFFC8B568), + Color(0xFFC8E3D7), + Color(0xFFC96323), + Color(0xFFC99415), + Color(0xFFC9A0DC), + Color(0xFFC9B29B), + Color(0xFFC9B35B), + Color(0xFFC9B93B), + Color(0xFFC9C0BB), + Color(0xFFC9D9D2), + Color(0xFFC9FFA2), + Color(0xFFC9FFE5), + Color(0xFFCA3435), + Color(0xFFCABB48), + Color(0xFFCADCD4), + Color(0xFFCAE00D), + Color(0xFFCAE6DA), + Color(0xFFCB8FA9), + Color(0xFFCBCAB6), + Color(0xFFCBD3B0), + Color(0xFFCBDBD6), + Color(0xFFCC3333), + Color(0xFFCC5500), + Color(0xFFCC7722), + Color(0xFFCC8899), + Color(0xFFCCCAA8), + Color(0xFFCCCCFF), + Color(0xFFCCFF00), + Color(0xFFCD5700), + Color(0xFFCD5C5C), + Color(0xFFCD8429), + Color(0xFFCDF4FF), + Color(0xFFCEB98F), + Color(0xFFCEBABA), + Color(0xFFCEC291), + Color(0xFFCEC7A7), + Color(0xFFCFA39D), + Color(0xFFCFB53B), + Color(0xFFCFDCCF), + Color(0xFFCFE5D2), + Color(0xFFCFF9F3), + Color(0xFFCFFAF4), + Color(0xFFD05F04), + Color(0xFFD06DA1), + Color(0xFFD07D12), + Color(0xFFD0BEF8), + Color(0xFFD0C0E5), + Color(0xFFD0F0C0), + Color(0xFFD18F1B), + Color(0xFFD1BEA8), + Color(0xFFD1C6B4), + Color(0xFFD1D2CA), + Color(0xFFD1D2DD), + Color(0xFFD1E231), + Color(0xFFD2691E), + Color(0xFFD27D46), + Color(0xFFD29EAA), + Color(0xFFD2B48C), + Color(0xFFD2DA97), + Color(0xFFD2F6DE), + Color(0xFFD2F8B0), + Color(0xFFD3CBBA), + Color(0xFFD3CDC5), + Color(0xFFD47494), + Color(0xFFD4B6AF), + Color(0xFFD4BF8D), + Color(0xFFD4C4A8), + Color(0xFFD4CD16), + Color(0xFFD4D7D9), + Color(0xFFD4DFE2), + Color(0xFFD4E2FC), + Color(0xFFD54600), + Color(0xFFD591A4), + Color(0xFFD59A6F), + Color(0xFFD5D195), + Color(0xFFD5F6E3), + Color(0xFFD69188), + Color(0xFFD6C562), + Color(0xFFD6CEF6), + Color(0xFFD6D6D1), + Color(0xFFD6FFDB), + Color(0xFFD7837F), + Color(0xFFD7C498), + Color(0xFFD7D0FF), + Color(0xFFD84437), + Color(0xFFD87C63), + Color(0xFFD8BFD8), + Color(0xFFD8C2D5), + Color(0xFFD8FCFA), + Color(0xFFD94972), + Color(0xFFD99376), + Color(0xFFD9B99B), + Color(0xFFD9D6CF), + Color(0xFFD9DCC1), + Color(0xFFD9E4F5), + Color(0xFFD9F7FF), + Color(0xFFDA3287), + Color(0xFFDA5B38), + Color(0xFFDA6304), + Color(0xFFDA6A41), + Color(0xFFDA70D6), + Color(0xFFDA8A67), + Color(0xFFDAA520), + Color(0xFFDAECD6), + Color(0xFFDAF4F0), + Color(0xFFDAFAFF), + Color(0xFFDB5079), + Color(0xFFDB9690), + Color(0xFFDB995E), + Color(0xFFDBDBDB), + Color(0xFFDBFFF8), + Color(0xFFDC143C), + Color(0xFFDC4333), + Color(0xFFDCB20C), + Color(0xFFDCB4BC), + Color(0xFFDCD747), + Color(0xFFDCD9D2), + Color(0xFFDCDDCC), + Color(0xFFDCEDB4), + Color(0xFFDCF0EA), + Color(0xFFDDD6D5), + Color(0xFFDDF9F1), + Color(0xFFDE3163), + Color(0xFFDE6360), + Color(0xFFDEA681), + Color(0xFFDEBA13), + Color(0xFFDEC196), + Color(0xFFDECBC6), + Color(0xFFDED4A4), + Color(0xFFDED717), + Color(0xFFDEE5C0), + Color(0xFFDEF5FF), + Color(0xFFDF73FF), + Color(0xFFDFBE6F), + Color(0xFFDFCD6F), + Color(0xFFDFCFDB), + Color(0xFFDFECDA), + Color(0xFFDFFF00), + Color(0xFFE0B0FF), + Color(0xFFE0B646), + Color(0xFFE0B974), + Color(0xFFE0C095), + Color(0xFFE0FFFF), + Color(0xFFE16865), + Color(0xFFE1BC64), + Color(0xFFE1C0C8), + Color(0xFFE1E6D6), + Color(0xFFE1EAD4), + Color(0xFFE1F6E8), + Color(0xFFE25465), + Color(0xFFE2725B), + Color(0xFFE28913), + Color(0xFFE292C0), + Color(0xFFE29418), + Color(0xFFE29CD2), + Color(0xFFE2D8ED), + Color(0xFFE2EBED), + Color(0xFFE2F3EC), + Color(0xFFE30B5C), + Color(0xFFE32636), + Color(0xFFE34234), + Color(0xFFE3BEBE), + Color(0xFFE3F5E1), + Color(0xFFE3F988), + Color(0xFFE47698), + Color(0xFFE49B0F), + Color(0xFFE4C2D5), + Color(0xFFE4CFDE), + Color(0xFFE4D1C0), + Color(0xFFE4D422), + Color(0xFFE4D5B7), + Color(0xFFE4D69B), + Color(0xFFE4F6E7), + Color(0xFFE4FFD1), + Color(0xFFE52B50), + Color(0xFFE5841B), + Color(0xFFE5CCC9), + Color(0xFFE5D7BD), + Color(0xFFE5D8AF), + Color(0xFFE5E0E1), + Color(0xFFE5E5E5), + Color(0xFFE5F9F6), + Color(0xFFE64E03), + Color(0xFFE6BE8A), + Color(0xFFE6BEA5), + Color(0xFFE6D7B9), + Color(0xFFE6E4D4), + Color(0xFFE6F2EA), + Color(0xFFE6F8F3), + Color(0xFFE6FFE9), + Color(0xFFE6FFFF), + Color(0xFFE77200), + Color(0xFFE7730A), + Color(0xFFE79F8C), + Color(0xFFE79FC4), + Color(0xFFE7BCB4), + Color(0xFFE7BF05), + Color(0xFFE7CD8C), + Color(0xFFE7ECE6), + Color(0xFFE7F8FF), + Color(0xFFE7FEFF), + Color(0xFFE89928), + Color(0xFFE8B9B3), + Color(0xFFE8E0D5), + Color(0xFFE8EBE0), + Color(0xFFE8F1D4), + Color(0xFFE8F2EB), + Color(0xFFE8F5F2), + Color(0xFFE96E00), + Color(0xFFE97451), + Color(0xFFE97C07), + Color(0xFFE9CECD), + Color(0xFFE9D75A), + Color(0xFFE9E3E3), + Color(0xFFE9F8ED), + Color(0xFFE9FFFD), + Color(0xFFEA88A8), + Color(0xFFEAAE69), + Color(0xFFEAB33B), + Color(0xFFEAC674), + Color(0xFFEADAB8), + Color(0xFFEAE8D4), + Color(0xFFEAF6EE), + Color(0xFFEAF6FF), + Color(0xFFEAF9F5), + Color(0xFFEAFFFE), + Color(0xFFEB9373), + Color(0xFFEBC2AF), + Color(0xFFECA927), + Color(0xFFECC54E), + Color(0xFFECC7EE), + Color(0xFFECCDB9), + Color(0xFFECE090), + Color(0xFFECEBBD), + Color(0xFFECEBCE), + Color(0xFFECF245), + Color(0xFFED0A3F), + Color(0xFFED7A1C), + Color(0xFFED9121), + Color(0xFFED989E), + Color(0xFFEDB381), + Color(0xFFEDC9AF), + Color(0xFFEDCDAB), + Color(0xFFEDDCB1), + Color(0xFFEDEA99), + Color(0xFFEDF5DD), + Color(0xFFEDF5F5), + Color(0xFFEDF6FF), + Color(0xFFEDF9F1), + Color(0xFFEDFC84), + Color(0xFFEE82EE), + Color(0xFFEEC1BE), + Color(0xFFEED794), + Color(0xFFEED9C4), + Color(0xFFEEDC82), + Color(0xFFEEDEDA), + Color(0xFFEEE3AD), + Color(0xFFEEEEE8), + Color(0xFFEEEF78), + Color(0xFFEEF0C8), + Color(0xFFEEF0F3), + Color(0xFFEEF3C3), + Color(0xFFEEF4DE), + Color(0xFFEEF6F7), + Color(0xFFEEFDFF), + Color(0xFFEEFF9A), + Color(0xFFEEFFE2), + Color(0xFFEF863F), + Color(0xFFEFEFEF), + Color(0xFFEFF2F3), + Color(0xFFF091A9), + Color(0xFFF0D52D), + Color(0xFFF0DB7D), + Color(0xFFF0DC82), + Color(0xFFF0E2EC), + Color(0xFFF0E68C), + Color(0xFFF0EEFD), + Color(0xFFF0EEFF), + Color(0xFFF0F8FF), + Color(0xFFF0FCEA), + Color(0xFFF18200), + Color(0xFFF19BAB), + Color(0xFFF1E788), + Color(0xFFF1E9D2), + Color(0xFFF1E9FF), + Color(0xFFF1EEC1), + Color(0xFFF1F1F1), + Color(0xFFF1F7F2), + Color(0xFFF1FFAD), + Color(0xFFF1FFC8), + Color(0xFFF2552A), + Color(0xFFF28500), + Color(0xFFF2C3B2), + Color(0xFFF2F2F2), + Color(0xFFF2FAFA), + Color(0xFFF34723), + Color(0xFFF3AD16), + Color(0xFFF3D69D), + Color(0xFFF3D9DF), + Color(0xFFF3E7BB), + Color(0xFFF3E9E5), + Color(0xFFF3EDCF), + Color(0xFFF3FB62), + Color(0xFFF3FBD4), + Color(0xFFF3FFD8), + Color(0xFFF400A1), + Color(0xFFF4A460), + Color(0xFFF4C430), + Color(0xFFF4D81C), + Color(0xFFF57584), + Color(0xFFF5C85C), + Color(0xFFF5C999), + Color(0xFFF5D5A0), + Color(0xFFF5DEB3), + Color(0xFFF5E7A2), + Color(0xFFF64A8A), + Color(0xFFF653A6), + Color(0xFFF6A4C9), + Color(0xFFF6F0E6), + Color(0xFFF6F7F7), + Color(0xFFF6FFDC), + Color(0xFFF7468A), + Color(0xFFF77703), + Color(0xFFF77FBE), + Color(0xFFF7B668), + Color(0xFFF7C8DA), + Color(0xFFF7DBE6), + Color(0xFFF7F2E1), + Color(0xFFF7F5FA), + Color(0xFFF7FAF7), + Color(0xFFF8B853), + Color(0xFFF8C3DF), + Color(0xFFF8D9E9), + Color(0xFFF8DB9D), + Color(0xFFF8DD5C), + Color(0xFFF8E4BF), + Color(0xFFF8F0E8), + Color(0xFFF8F4FF), + Color(0xFFF8F6F1), + Color(0xFFF8F7DC), + Color(0xFFF8F7FC), + Color(0xFFF8F8F7), + Color(0xFFF8F99C), + Color(0xFFF8FACD), + Color(0xFFF8FDD3), + Color(0xFFF95A61), + Color(0xFFF9BF58), + Color(0xFFF9E0ED), + Color(0xFFF9E4BC), + Color(0xFFF9E663), + Color(0xFFF9EAF3), + Color(0xFFF9F8E4), + Color(0xFFF9FF8B), + Color(0xFFF9FFF6), + Color(0xFFFA7814), + Color(0xFFFA9D5A), + Color(0xFFFAD3A2), + Color(0xFFFADFAD), + Color(0xFFFAE600), + Color(0xFFFAEAB9), + Color(0xFFFAECCC), + Color(0xFFFAF0E6), + Color(0xFFFAF3F0), + Color(0xFFFAF7D6), + Color(0xFFFAFAFA), + Color(0xFFFAFDE4), + Color(0xFFFAFFA4), + Color(0xFFFB607F), + Color(0xFFFB8989), + Color(0xFFFBA0E3), + Color(0xFFFBA129), + Color(0xFFFBAC13), + Color(0xFFFBAED2), + Color(0xFFFBB2A3), + Color(0xFFFBBEDA), + Color(0xFFFBCCE7), + Color(0xFFFBCEB1), + Color(0xFFFBE7B2), + Color(0xFFFBE870), + Color(0xFFFBE96C), + Color(0xFFFBEA8C), + Color(0xFFFBEC5D), + Color(0xFFFBF9F9), + Color(0xFFFBFFBA), + Color(0xFFFC0FC0), + Color(0xFFFC80A5), + Color(0xFFFC9C1D), + Color(0xFFFCC01E), + Color(0xFFFCD667), + Color(0xFFFCD917), + Color(0xFFFCDA98), + Color(0xFFFCF4D0), + Color(0xFFFCF4DC), + Color(0xFFFCF8F7), + Color(0xFFFCFBF3), + Color(0xFFFCFEDA), + Color(0xFFFCFFE7), + Color(0xFFFCFFF9), + Color(0xFFFD0E35), + Color(0xFFFD5B78), + Color(0xFFFD7B33), + Color(0xFFFD7C07), + Color(0xFFFD9FA2), + Color(0xFFFDD5B1), + Color(0xFFFDD7E4), + Color(0xFFFDE1DC), + Color(0xFFFDE295), + Color(0xFFFDE910), + Color(0xFFFDF5E6), + Color(0xFFFDF6D3), + Color(0xFFFDF7AD), + Color(0xFFFDFEB8), + Color(0xFFFDFFD5), + Color(0xFFFE28A2), + Color(0xFFFE4C40), + Color(0xFFFE6F5E), + Color(0xFFFE9D04), + Color(0xFFFEA904), + Color(0xFFFEBAAD), + Color(0xFFFED33C), + Color(0xFFFED85D), + Color(0xFFFEDB8D), + Color(0xFFFEE5AC), + Color(0xFFFEEBF3), + Color(0xFFFEEFCE), + Color(0xFFFEF0EC), + Color(0xFFFEF2C7), + Color(0xFFFEF3D8), + Color(0xFFFEF4CC), + Color(0xFFFEF4DB), + Color(0xFFFEF4F8), + Color(0xFFFEF5F1), + Color(0xFFFEF7DE), + Color(0xFFFEF8E2), + Color(0xFFFEF8FF), + Color(0xFFFEF9E3), + Color(0xFFFEFCED), + Color(0xFFFF0000), + Color(0xFFFF007F), + Color(0xFFFF00CC), + Color(0xFFFF00FF), + Color(0xFFFF2400), + Color(0xFFFF3399), + Color(0xFFFF33CC), + Color(0xFFFF355E), + Color(0xFFFF3F34), + Color(0xFFFF4040), + Color(0xFFFF4D00), + Color(0xFFFF4F00), + Color(0xFFFF6037), + Color(0xFFFF6600), + Color(0xFFFF66FF), + Color(0xFFFF681F), + Color(0xFFFF69B4), + Color(0xFFFF6B53), + Color(0xFFFF6FFF), + Color(0xFFFF7034), + Color(0xFFFF7518), + Color(0xFFFF7D07), + Color(0xFFFF7F00), + Color(0xFFFF7F50), + Color(0xFFFF8C69), + Color(0xFFFF9000), + Color(0xFFFF910F), + Color(0xFFFF91A4), + Color(0xFFFF9933), + Color(0xFFFF9966), + Color(0xFFFF9980), + Color(0xFFFF9E2C), + Color(0xFFFFA000), + Color(0xFFFFA194), + Color(0xFFFFA500), + Color(0xFFFFA6C9), + Color(0xFFFFAB81), + Color(0xFFFFAE42), + Color(0xFFFFB0AC), +]; diff --git a/lib/utils/extensions/text_extension.dart b/lib/utils/extensions/text_extension.dart index 7def4aec5e..45631fd5bf 100644 --- a/lib/utils/extensions/text_extension.dart +++ b/lib/utils/extensions/text_extension.dart @@ -13,6 +13,7 @@ extension TextExtension on Text { Text get body1 => copyWith(style: body1Style); Text get body2 => copyWith(style: body2Style); + Text get small => copyWith(style: smallStyle); Text setKey(Key key) => copyWith(key: key); diff --git a/lib/utils/password_generator.dart b/lib/utils/password_generator.dart new file mode 100644 index 0000000000..6b3e909881 --- /dev/null +++ b/lib/utils/password_generator.dart @@ -0,0 +1,138 @@ +import 'dart:math'; + +var generator = PasswordGenerator(); + +String genPass() { + generator.generate(8); + return generator.getGeneratedValue(); +} + +///Generates a password. +/// +///The password [_generatedValue] is of a specified length, including letters [_letterGen] of mixed cases, +///numbers [_numGen], and symbols[_symGen] depending on user choice. +class PasswordGenerator { + bool _letterGen; + bool _numGen; + bool _symGen; + String _generatedValue; + + ///Constructor. + /// + ///[_letterGen] is true to make password generation possible from the opening of the application, and + ///[_generatedValue] is intialized to the value below so the text containing it can be first generated + ///upon users request + PasswordGenerator() { + _letterGen = true; + _numGen = true; + _symGen = false; + _generatedValue = "Press Generate"; + } + + ///Call to generate a value, of [n] length + void generate(int n) { + //Discards the old value + _generatedValue = ""; + + ///Cannot generate a value without any character types selected + if (!_letterGen && !_numGen && !_symGen) { + _generatedValue = "No character type selected"; + return; + } + + ///'Randomly' selectes caracter type to generate and append [toAppend] to [_generatedValue] + // ignore: unnecessary_statements + for (n; n > 0; n--) { + String toAppend; + var random = new Random(); + + ///loops until a valid character is generated, meaning the user has to check the character value + ///to be generated. 'Randomly' picks a character type. + while (toAppend == null) { + int selector = random.nextInt(3); + + if (selector == 0) { + toAppend = _generateLetter(); + } else if (selector == 1) { + toAppend = _generateNumber(); + } else { + toAppend = _generateSymbol(); + } + } + + _generatedValue += toAppend; + toAppend = null; + } + } + + ///Generates a letter when called. + String _generateLetter() { + if (!_letterGen) return null; + + ///Finds the integer value for the range between a-z and A-Z, with [base] UTF-16 value for lowercase letters and + ///[baseUpper] UTF-16 value for uppercase letters + int base = "a".codeUnitAt(0); + int baseUpper = "A".codeUnitAt(0); + int maxRand = ("z".codeUnitAt(0) - base) + 1; + Random random = new Random(); + + ///Randomly selects between upper and lower case generation, randomly generates value from [maxRand], then adding base, + ///which creates a UTF-16 encoded character to be converted into a string of one character between a-z/A-Z. + ///This string is then returned. + if (random.nextInt(2) == 0) { + return String.fromCharCodes([random.nextInt(maxRand) + base]); + } else { + return String.fromCharCodes([random.nextInt(maxRand) + baseUpper]); + } + } + + ///Generates a number when called + String _generateNumber() { + if (!_numGen) return null; + + ///Finds the integer value for the range between 0-9 + int base = "0".codeUnitAt(0); + int maxRand = ("9".codeUnitAt(0) - base) + 1; + Random random = new Random(); + + ///Randomly generates value from [maxRand], then adding base, which creates a UTF-16 encoded character to be converted into a + ///string of one character between 0-9. This string is then returned. + return String.fromCharCodes([random.nextInt(maxRand) + base]); + } + + ///Generates a symbol when called + String _generateSymbol() { + if (!_symGen) return null; + + ///Finds the integer value for the range between symbols !-. + + ///(note) which includes symbols !"#$%&'()*+,=. + int base = "!".codeUnitAt(0); + int maxRand = (".".codeUnitAt(0) - base) + 1; + Random random = new Random(); + + ///Randomly generates value from [maxRand], then adding base, which creates a UTF-16 encoded character to be + ///converted into a string of one character between !-. . This string is then returned. + return String.fromCharCodes([random.nextInt(maxRand) + base]); + } + + ///Toggles letter generation + void checkLetterGen(bool value) { + _letterGen = value; + } + + ///Toggles number generation + void checkNumGen(bool value) { + _numGen = value; + } + + ///Toggles symbol generation + void checkSymGen(bool value) { + _symGen = value; + } + + ///Returns the generated value to be used by generator app + String getGeneratedValue() { + return _generatedValue; + } +}