From 937b69fec9446432bc9349d4fb9994ddb16b6ab9 Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Fri, 9 Apr 2021 14:56:23 +0200 Subject: [PATCH] design: --- assets/banner_dark.png | Bin 0 -> 67719 bytes lib/components/fluffy_banner.dart | 10 ++ lib/components/one_page_card.dart | 40 +++++++ lib/config/themes.dart | 25 +++++ lib/views/chat_list.dart | 3 + lib/views/homeserver_picker.dart | 45 ++++---- lib/views/login.dart | 165 ++++++++++++++------------- lib/views/sign_up.dart | 178 +++++++++++++++--------------- lib/views/sign_up_password.dart | 103 +++++++++-------- 9 files changed, 319 insertions(+), 250 deletions(-) create mode 100644 assets/banner_dark.png create mode 100644 lib/components/fluffy_banner.dart create mode 100644 lib/components/one_page_card.dart diff --git a/assets/banner_dark.png b/assets/banner_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..3a2fb2a7c077bed12d3ff9f73cb30fbd943dcbb4 GIT binary patch literal 67719 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 literal 0 HcmV?d00001 diff --git a/lib/components/fluffy_banner.dart b/lib/components/fluffy_banner.dart new file mode 100644 index 000000000..a57ef3aa8 --- /dev/null +++ b/lib/components/fluffy_banner.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class FluffyBanner extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Image.asset(Theme.of(context).brightness == Brightness.dark + ? 'assets/banner_dark.png' + : 'assets/banner.png'); + } +} diff --git a/lib/components/one_page_card.dart b/lib/components/one_page_card.dart new file mode 100644 index 000000000..0e78e5b21 --- /dev/null +++ b/lib/components/one_page_card.dart @@ -0,0 +1,40 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +class OnePageCard extends StatelessWidget { + final Widget child; + + const OnePageCard({Key key, this.child}) : super(key: key); + + static const int alpha = 64; + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: Theme.of(context).backgroundColor, + gradient: LinearGradient( + begin: Alignment.topRight, + end: Alignment.bottomLeft, + stops: [ + 0.1, + 0.4, + 0.6, + 0.9, + ], + colors: [ + Theme.of(context).secondaryHeaderColor.withAlpha(alpha), + Theme.of(context).primaryColor.withAlpha(alpha), + Theme.of(context).accentColor.withAlpha(alpha), + Theme.of(context).backgroundColor.withAlpha(alpha), + ], + ), + ), + padding: EdgeInsets.symmetric( + horizontal: max((MediaQuery.of(context).size.width - 600) / 2, 0), + vertical: max((MediaQuery.of(context).size.height - 800) / 2, 0), + ), + child: Card(child: child), + ); + } +} diff --git a/lib/config/themes.dart b/lib/config/themes.dart index e988fbcba..7fd63550c 100644 --- a/lib/config/themes.dart +++ b/lib/config/themes.dart @@ -66,6 +66,13 @@ abstract class FluffyThemes { padding: EdgeInsets.all(12), ), ), + cardTheme: CardTheme( + elevation: 7, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + ), + clipBehavior: Clip.hardEdge, + ), inputDecorationTheme: InputDecorationTheme( border: OutlineInputBorder( borderRadius: BorderRadius.circular(AppConfig.borderRadius)), @@ -112,6 +119,13 @@ abstract class FluffyThemes { borderRadius: BorderRadius.circular(AppConfig.borderRadius), ), ), + cardTheme: CardTheme( + elevation: 7, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + ), + clipBehavior: Clip.hardEdge, + ), floatingActionButtonTheme: FloatingActionButtonThemeData( backgroundColor: AppConfig.primaryColor, foregroundColor: Colors.white, @@ -128,6 +142,17 @@ abstract class FluffyThemes { ), ), ), + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + primary: AppConfig.primaryColor, + onPrimary: Colors.white, + elevation: 7, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + ), + padding: EdgeInsets.all(12), + ), + ), appBarTheme: AppBarTheme( brightness: Brightness.dark, color: Color(0xff1D1D1D), diff --git a/lib/views/chat_list.dart b/lib/views/chat_list.dart index d26f693ed..f46e2931d 100644 --- a/lib/views/chat_list.dart +++ b/lib/views/chat_list.dart @@ -204,6 +204,9 @@ class _ChatListState extends State { return Scaffold( appBar: appBar ?? AppBar( + elevation: AdaptivePageLayout.of(context).columnMode(context) + ? 1 + : null, leading: selectMode == SelectMode.normal ? null : IconButton( diff --git a/lib/views/homeserver_picker.dart b/lib/views/homeserver_picker.dart index 9f6c0878f..62e2025c9 100644 --- a/lib/views/homeserver_picker.dart +++ b/lib/views/homeserver_picker.dart @@ -1,11 +1,12 @@ import 'dart:async'; -import 'dart:math'; import 'package:adaptive_page_layout/adaptive_page_layout.dart'; import 'package:famedlysdk/famedlysdk.dart'; import 'package:fluffychat/components/default_app_bar_search_field.dart'; +import 'package:fluffychat/components/fluffy_banner.dart'; import 'package:fluffychat/components/matrix.dart'; import 'package:fluffychat/app_config.dart'; +import 'package:fluffychat/components/one_page_card.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/utils/platform_infos.dart'; @@ -120,9 +121,6 @@ class _HomeserverPickerState extends State { @override Widget build(BuildContext context) { - final padding = EdgeInsets.symmetric( - horizontal: max((MediaQuery.of(context).size.width - 600) / 2, 0), - ); if (kIsWeb) { WidgetsBinding.instance.addPostFrameCallback((_) { final token = @@ -130,28 +128,28 @@ class _HomeserverPickerState extends State { _loginWithToken(token); }); } - return Scaffold( - appBar: AppBar( - title: DefaultAppBarSearchField( - prefixText: 'https://', - hintText: L10n.of(context).enterYourHomeserver, - searchController: _controller, - suffix: Icon(Icons.edit_outlined), - padding: padding, - onChanged: (s) => _domain = s, - readOnly: !AppConfig.allowOtherHomeservers, - onSubmit: (_) => _checkHomeserverAction(context), + return OnePageCard( + child: Scaffold( + appBar: AppBar( + titleSpacing: 8, + title: DefaultAppBarSearchField( + prefixText: 'https://', + hintText: L10n.of(context).enterYourHomeserver, + searchController: _controller, + suffix: Icon(Icons.edit_outlined), + padding: EdgeInsets.zero, + onChanged: (s) => _domain = s, + readOnly: !AppConfig.allowOtherHomeservers, + onSubmit: (_) => _checkHomeserverAction(context), + ), + elevation: 0, ), - elevation: 0, - ), - body: SafeArea( - child: Padding( - padding: padding, + body: SafeArea( child: ListView( children: [ Hero( tag: 'loginBanner', - child: Image.asset('assets/banner.png'), + child: FluffyBanner(), ), Padding( padding: const EdgeInsets.all(16.0), @@ -167,10 +165,7 @@ class _HomeserverPickerState extends State { ], ), ), - ), - bottomNavigationBar: Padding( - padding: padding, - child: Column( + bottomNavigationBar: Column( mainAxisSize: MainAxisSize.min, children: [ Hero( diff --git a/lib/views/login.dart b/lib/views/login.dart index dcbd38772..95dd4f738 100644 --- a/lib/views/login.dart +++ b/lib/views/login.dart @@ -1,9 +1,9 @@ import 'dart:async'; -import 'dart:math'; import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:adaptive_page_layout/adaptive_page_layout.dart'; import 'package:famedlysdk/famedlysdk.dart'; +import 'package:fluffychat/components/one_page_card.dart'; import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:fluffychat/components/matrix.dart'; @@ -184,96 +184,95 @@ class _LoginState extends State { @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - leading: loading ? Container() : BackButton(), - elevation: 0, - title: Text( - L10n.of(context).logInTo(Matrix.of(context) - .client - .homeserver - .toString() - .replaceFirst('https://', '')), + return OnePageCard( + child: Scaffold( + appBar: AppBar( + leading: loading ? Container() : BackButton(), + elevation: 0, + title: Text( + L10n.of(context).logInTo(Matrix.of(context) + .client + .homeserver + .toString() + .replaceFirst('https://', '')), + ), ), - ), - body: Builder(builder: (context) { - return ListView( - padding: EdgeInsets.symmetric( - horizontal: - max((MediaQuery.of(context).size.width - 600) / 2, 0)), - children: [ - Padding( - padding: const EdgeInsets.all(12.0), - child: TextField( - readOnly: loading, - autocorrect: false, - autofocus: true, - onChanged: (t) => _checkWellKnownWithCoolDown(t, context), - controller: usernameController, - autofillHints: loading ? null : [AutofillHints.username], - decoration: InputDecoration( - prefixIcon: Icon(Icons.account_box_outlined), - hintText: - '@${L10n.of(context).username.toLowerCase()}:domain', - errorText: usernameError, - labelText: L10n.of(context).username), + body: Builder(builder: (context) { + return ListView( + children: [ + Padding( + padding: const EdgeInsets.all(12.0), + child: TextField( + readOnly: loading, + autocorrect: false, + autofocus: true, + onChanged: (t) => _checkWellKnownWithCoolDown(t, context), + controller: usernameController, + autofillHints: loading ? null : [AutofillHints.username], + decoration: InputDecoration( + prefixIcon: Icon(Icons.account_box_outlined), + hintText: + '@${L10n.of(context).username.toLowerCase()}:domain', + errorText: usernameError, + labelText: L10n.of(context).username), + ), ), - ), - Padding( - padding: const EdgeInsets.all(12.0), - child: TextField( - readOnly: loading, - autocorrect: false, - autofillHints: loading ? null : [AutofillHints.password], - controller: passwordController, - obscureText: !showPassword, - onSubmitted: (t) => login(context), - decoration: InputDecoration( - prefixIcon: Icon(Icons.lock_outlined), - hintText: '****', - errorText: passwordError, - suffixIcon: IconButton( - tooltip: L10n.of(context).showPassword, - icon: Icon(showPassword - ? Icons.visibility_off_outlined - : Icons.visibility_outlined), - onPressed: () => - setState(() => showPassword = !showPassword), - ), - labelText: L10n.of(context).password), + Padding( + padding: const EdgeInsets.all(12.0), + child: TextField( + readOnly: loading, + autocorrect: false, + autofillHints: loading ? null : [AutofillHints.password], + controller: passwordController, + obscureText: !showPassword, + onSubmitted: (t) => login(context), + decoration: InputDecoration( + prefixIcon: Icon(Icons.lock_outlined), + hintText: '****', + errorText: passwordError, + suffixIcon: IconButton( + tooltip: L10n.of(context).showPassword, + icon: Icon(showPassword + ? Icons.visibility_off_outlined + : Icons.visibility_outlined), + onPressed: () => + setState(() => showPassword = !showPassword), + ), + labelText: L10n.of(context).password), + ), ), - ), - SizedBox(height: 12), - Hero( - tag: 'loginButton', - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 12), - child: ElevatedButton( - onPressed: loading ? null : () => login(context), - child: loading - ? LinearProgressIndicator() - : Text( - L10n.of(context).login.toUpperCase(), - style: TextStyle(color: Colors.white, fontSize: 16), - ), + SizedBox(height: 12), + Hero( + tag: 'loginButton', + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 12), + child: ElevatedButton( + onPressed: loading ? null : () => login(context), + child: loading + ? LinearProgressIndicator() + : Text( + L10n.of(context).login.toUpperCase(), + style: TextStyle(color: Colors.white, fontSize: 16), + ), + ), ), ), - ), - Center( - child: TextButton( - onPressed: () => _passwordForgotten(context), - child: Text( - L10n.of(context).passwordForgotten, - style: TextStyle( - color: Colors.blue, - decoration: TextDecoration.underline, + Center( + child: TextButton( + onPressed: () => _passwordForgotten(context), + child: Text( + L10n.of(context).passwordForgotten, + style: TextStyle( + color: Colors.blue, + decoration: TextDecoration.underline, + ), ), ), ), - ), - ], - ); - }), + ], + ); + }), + ), ); } } diff --git a/lib/views/sign_up.dart b/lib/views/sign_up.dart index dfadf5df0..a78092fe5 100644 --- a/lib/views/sign_up.dart +++ b/lib/views/sign_up.dart @@ -1,10 +1,10 @@ -import 'dart:math'; - import 'package:adaptive_page_layout/adaptive_page_layout.dart'; import 'package:famedlysdk/famedlysdk.dart'; import 'package:file_picker_cross/file_picker_cross.dart'; +import 'package:fluffychat/components/fluffy_banner.dart'; import 'package:fluffychat/components/matrix.dart'; +import 'package:fluffychat/components/one_page_card.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; @@ -67,103 +67,101 @@ class _SignUpState extends State { @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - elevation: 0, - leading: loading ? Container() : BackButton(), - title: Text( - Matrix.of(context) - .client - .homeserver - .toString() - .replaceFirst('https://', ''), + return OnePageCard( + child: Scaffold( + appBar: AppBar( + elevation: 0, + leading: loading ? Container() : BackButton(), + title: Text( + Matrix.of(context) + .client + .homeserver + .toString() + .replaceFirst('https://', ''), + ), ), - ), - body: ListView( - padding: EdgeInsets.symmetric( - horizontal: - max((MediaQuery.of(context).size.width - 600) / 2, 0)), - children: [ - Hero( - tag: 'loginBanner', - child: Image.asset('assets/banner.png'), - ), - SizedBox(height: 16), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 12.0), - child: TextField( - readOnly: loading, - autocorrect: false, - controller: usernameController, - onSubmitted: (s) => signUpAction(context), - autofillHints: loading ? null : [AutofillHints.newUsername], - decoration: InputDecoration( - prefixIcon: Icon(Icons.account_circle_outlined), - hintText: L10n.of(context).username, - errorText: usernameError, - labelText: L10n.of(context).chooseAUsername, - ), + body: ListView(children: [ + Hero( + tag: 'loginBanner', + child: FluffyBanner(), + ), + SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 12.0), + child: TextField( + readOnly: loading, + autocorrect: false, + controller: usernameController, + onSubmitted: (s) => signUpAction(context), + autofillHints: loading ? null : [AutofillHints.newUsername], + decoration: InputDecoration( + prefixIcon: Icon(Icons.account_circle_outlined), + hintText: L10n.of(context).username, + errorText: usernameError, + labelText: L10n.of(context).chooseAUsername, ), ), - SizedBox(height: 8), - ListTile( - leading: CircleAvatar( - backgroundImage: - avatar == null ? null : MemoryImage(avatar.bytes), - backgroundColor: avatar == null - ? Theme.of(context).brightness == Brightness.dark - ? Color(0xff121212) - : Colors.white - : Theme.of(context).secondaryHeaderColor, - child: avatar == null - ? Icon(Icons.camera_alt_outlined, - color: Theme.of(context).primaryColor) - : null, - ), - trailing: avatar == null - ? null - : Icon( - Icons.close, - color: Colors.red, - ), - title: Text(avatar == null - ? L10n.of(context).setAProfilePicture - : L10n.of(context).discardPicture), - onTap: avatar == null - ? setAvatarAction - : () => setState(() => avatar = null), + ), + SizedBox(height: 8), + ListTile( + leading: CircleAvatar( + backgroundImage: + avatar == null ? null : MemoryImage(avatar.bytes), + backgroundColor: avatar == null + ? Theme.of(context).brightness == Brightness.dark + ? Color(0xff121212) + : Colors.white + : Theme.of(context).secondaryHeaderColor, + child: avatar == null + ? Icon(Icons.camera_alt_outlined, + color: Theme.of(context).primaryColor) + : null, ), - SizedBox(height: 16), - Hero( - tag: 'loginButton', - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 12), - child: ElevatedButton( - onPressed: loading ? null : () => signUpAction(context), - child: loading - ? LinearProgressIndicator() - : Text( - L10n.of(context).signUp.toUpperCase(), - style: TextStyle(color: Colors.white, fontSize: 16), - ), - ), + trailing: avatar == null + ? null + : Icon( + Icons.close, + color: Colors.red, + ), + title: Text(avatar == null + ? L10n.of(context).setAProfilePicture + : L10n.of(context).discardPicture), + onTap: avatar == null + ? setAvatarAction + : () => setState(() => avatar = null), + ), + SizedBox(height: 16), + Hero( + tag: 'loginButton', + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 12), + child: ElevatedButton( + onPressed: loading ? null : () => signUpAction(context), + child: loading + ? LinearProgressIndicator() + : Text( + L10n.of(context).signUp.toUpperCase(), + style: TextStyle(color: Colors.white, fontSize: 16), + ), ), ), - Center( - child: TextButton( - onPressed: () => - AdaptivePageLayout.of(context).pushNamed('/login'), - child: Text( - L10n.of(context).alreadyHaveAnAccount, - style: TextStyle( - decoration: TextDecoration.underline, - color: Colors.blue, - fontSize: 16, - ), + ), + Center( + child: TextButton( + onPressed: () => + AdaptivePageLayout.of(context).pushNamed('/login'), + child: Text( + L10n.of(context).alreadyHaveAnAccount, + style: TextStyle( + decoration: TextDecoration.underline, + color: Colors.blue, + fontSize: 16, ), ), ), - ]), + ), + ]), + ), ); } } diff --git a/lib/views/sign_up_password.dart b/lib/views/sign_up_password.dart index 9eb140ffd..33feccefb 100644 --- a/lib/views/sign_up_password.dart +++ b/lib/views/sign_up_password.dart @@ -1,11 +1,10 @@ -import 'dart:math'; - import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:adaptive_page_layout/adaptive_page_layout.dart'; import 'package:famedlysdk/famedlysdk.dart'; import 'package:fluffychat/components/matrix.dart'; +import 'package:fluffychat/components/one_page_card.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -131,60 +130,60 @@ class _SignUpPasswordState extends State { @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - elevation: 0, - leading: loading ? Container() : BackButton(), - title: Text( - L10n.of(context).chooseAStrongPassword, + return OnePageCard( + child: Scaffold( + appBar: AppBar( + elevation: 0, + leading: loading ? Container() : BackButton(), + title: Text( + L10n.of(context).chooseAStrongPassword, + ), ), - ), - body: ListView( - padding: EdgeInsets.symmetric( - horizontal: max((MediaQuery.of(context).size.width - 600) / 2, 0)), - children: [ - Padding( - padding: const EdgeInsets.all(12.0), - child: TextField( - controller: passwordController, - obscureText: !showPassword, - autofocus: true, - readOnly: loading, - autocorrect: false, - onSubmitted: (t) => _signUpAction(context), - autofillHints: loading ? null : [AutofillHints.newPassword], - decoration: InputDecoration( - prefixIcon: Icon(Icons.lock_outlined), - hintText: '****', - errorText: passwordError, - suffixIcon: IconButton( - tooltip: L10n.of(context).showPassword, - icon: Icon(showPassword - ? Icons.visibility_off_outlined - : Icons.visibility_outlined), - onPressed: () => - setState(() => showPassword = !showPassword), - ), - labelText: L10n.of(context).password), + body: ListView( + children: [ + Padding( + padding: const EdgeInsets.all(12.0), + child: TextField( + controller: passwordController, + obscureText: !showPassword, + autofocus: true, + readOnly: loading, + autocorrect: false, + onSubmitted: (t) => _signUpAction(context), + autofillHints: loading ? null : [AutofillHints.newPassword], + decoration: InputDecoration( + prefixIcon: Icon(Icons.lock_outlined), + hintText: '****', + errorText: passwordError, + suffixIcon: IconButton( + tooltip: L10n.of(context).showPassword, + icon: Icon(showPassword + ? Icons.visibility_off_outlined + : Icons.visibility_outlined), + onPressed: () => + setState(() => showPassword = !showPassword), + ), + labelText: L10n.of(context).password), + ), ), - ), - SizedBox(height: 12), - Hero( - tag: 'loginButton', - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 12), - child: ElevatedButton( - onPressed: loading ? null : () => _signUpAction(context), - child: loading - ? LinearProgressIndicator() - : Text( - L10n.of(context).createAccountNow.toUpperCase(), - style: TextStyle(color: Colors.white, fontSize: 16), - ), + SizedBox(height: 12), + Hero( + tag: 'loginButton', + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 12), + child: ElevatedButton( + onPressed: loading ? null : () => _signUpAction(context), + child: loading + ? LinearProgressIndicator() + : Text( + L10n.of(context).createAccountNow.toUpperCase(), + style: TextStyle(color: Colors.white, fontSize: 16), + ), + ), ), ), - ), - ], + ], + ), ), ); }