From bbd3f0a02dfb66fc95753d74731dfbcf3befdaed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malo=20L=C3=A9on?= Date: Wed, 22 Feb 2023 11:23:08 +0100 Subject: [PATCH 01/11] feat(ui_components): add Top Navigation Bar Component --- .../top_navigation_bar_component.dart | 38 +++++++++++++++++++ .../top_navigation_bar_component.g.dart | 22 +++++++++++ 2 files changed, 60 insertions(+) create mode 100644 packages/wyatt_ui_components/lib/src/domain/entities/top_navigation_bar_component.dart create mode 100644 packages/wyatt_ui_components/lib/src/domain/entities/top_navigation_bar_component.g.dart diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/top_navigation_bar_component.dart b/packages/wyatt_ui_components/lib/src/domain/entities/top_navigation_bar_component.dart new file mode 100644 index 00000000..cb23bf07 --- /dev/null +++ b/packages/wyatt_ui_components/lib/src/domain/entities/top_navigation_bar_component.dart @@ -0,0 +1,38 @@ +// Copyright (C) 2023 WYATT GROUP +// Please see the AUTHORS file for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +import 'package:flutter/material.dart'; +import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart'; +import 'package:wyatt_ui_components/src/core/mixins/copy_with_mixin.dart'; +import 'package:wyatt_ui_components/src/domain/entities/component.dart'; + +part 'top_navigation_bar_component.g.dart'; + +@ComponentProxyExtension() +abstract class TopNavigationBarComponent extends Component + with CopyWithMixin<$TopNavigationBarComponentCWProxy> { + const TopNavigationBarComponent({ + this.leading, + this.actions, + this.onTap, + this.currentIndex = 0, + super.key, + }); + final int currentIndex; + final void Function(BuildContext, int)? onTap; + final Widget? leading; + final List? actions; +} diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/top_navigation_bar_component.g.dart b/packages/wyatt_ui_components/lib/src/domain/entities/top_navigation_bar_component.g.dart new file mode 100644 index 00000000..591c9a6e --- /dev/null +++ b/packages/wyatt_ui_components/lib/src/domain/entities/top_navigation_bar_component.g.dart @@ -0,0 +1,22 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'top_navigation_bar_component.dart'; + +// ************************************************************************** +// ComponentProxyGenerator +// ************************************************************************** + +abstract class $TopNavigationBarComponentCWProxy { + TopNavigationBarComponent leading(Widget? leading); + TopNavigationBarComponent actions(List? actions); + TopNavigationBarComponent onTap(void Function(BuildContext, int)? onTap); + TopNavigationBarComponent currentIndex(int? currentIndex); + TopNavigationBarComponent key(Key? key); + TopNavigationBarComponent call({ + Widget? leading, + List? actions, + void Function(BuildContext, int)? onTap, + int? currentIndex, + Key? key, + }); +} -- 2.47.2 From b2fe14a123af5044a49d5c5b619ffa711eeeac36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malo=20L=C3=A9on?= Date: Wed, 22 Feb 2023 11:24:30 +0100 Subject: [PATCH 02/11] feat(ui_components): add top navigation bar component to theme data --- .../lib/src/features/component_theme_data.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/wyatt_ui_components/lib/src/features/component_theme_data.dart b/packages/wyatt_ui_components/lib/src/features/component_theme_data.dart index c083545a..1f58e87c 100644 --- a/packages/wyatt_ui_components/lib/src/features/component_theme_data.dart +++ b/packages/wyatt_ui_components/lib/src/features/component_theme_data.dart @@ -19,6 +19,7 @@ import 'package:wyatt_ui_components/src/domain/entities/entities.dart'; class ComponentThemeData { const ComponentThemeData.raw({ this.appBar, + this.topNavigationBarComponent, this.bottomNavigationBar, this.errorWidget, this.loadingWidget, @@ -35,7 +36,10 @@ class ComponentThemeData { this.skillCardComponent, }); final AppBarComponent? appBar; + + final TopNavigationBarComponent? topNavigationBarComponent; final BottomNavigationBarComponent? bottomNavigationBar; + final ErrorWidgetComponent? errorWidget; final LoadingWidgetComponent? loadingWidget; final LoaderComponent? loaderComponent; -- 2.47.2 From dba14088b0afb2adeb818a6d5fa5b030cf1bde7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malo=20L=C3=A9on?= Date: Wed, 22 Feb 2023 11:25:22 +0100 Subject: [PATCH 03/11] style(ui_components): format imports --- .../src/domain/entities/bottom_navigation_bar_component.dart | 4 ++-- .../wyatt_ui_components/lib/src/domain/entities/entities.dart | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/bottom_navigation_bar_component.dart b/packages/wyatt_ui_components/lib/src/domain/entities/bottom_navigation_bar_component.dart index 0daf25fd..af313e63 100644 --- a/packages/wyatt_ui_components/lib/src/domain/entities/bottom_navigation_bar_component.dart +++ b/packages/wyatt_ui_components/lib/src/domain/entities/bottom_navigation_bar_component.dart @@ -1,5 +1,3 @@ -import 'package:flutter/material.dart'; -import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart'; // Copyright (C) 2023 WYATT GROUP // Please see the AUTHORS file for details. // @@ -16,6 +14,8 @@ import 'package:wyatt_component_copy_with_extension/component_copy_with_extensio // You should have received a copy of the GNU General Public License // along with this program. If not, see . +import 'package:flutter/material.dart'; +import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart'; import 'package:wyatt_ui_components/src/core/mixins/copy_with_mixin.dart'; import 'package:wyatt_ui_components/src/domain/entities/component.dart'; diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/entities.dart b/packages/wyatt_ui_components/lib/src/domain/entities/entities.dart index 93e81e4a..c5ea3c94 100644 --- a/packages/wyatt_ui_components/lib/src/domain/entities/entities.dart +++ b/packages/wyatt_ui_components/lib/src/domain/entities/entities.dart @@ -26,3 +26,4 @@ export './loading_widget_component.dart'; export './rich_text_builder/rich_text_builder.dart'; export './text_inputs/text_inputs.dart'; export './theme_style.dart'; +export './top_navigation_bar_component.dart'; -- 2.47.2 From 4811ed899867e126006797dbf794246de89a8b73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malo=20L=C3=A9on?= Date: Wed, 22 Feb 2023 11:37:29 +0100 Subject: [PATCH 04/11] feat(ui_components): add centerTitle property to app bar component --- .../example/lib/components/custom_app_bar.g.dart | 3 +++ .../lib/src/domain/entities/app_bar_component.dart | 2 ++ .../lib/src/domain/entities/app_bar_component.g.dart | 2 ++ 3 files changed, 7 insertions(+) diff --git a/packages/wyatt_ui_components/example/lib/components/custom_app_bar.g.dart b/packages/wyatt_ui_components/example/lib/components/custom_app_bar.g.dart index 2fd0319a..af384641 100644 --- a/packages/wyatt_ui_components/example/lib/components/custom_app_bar.g.dart +++ b/packages/wyatt_ui_components/example/lib/components/custom_app_bar.g.dart @@ -16,12 +16,15 @@ class $CustomAppBarCWProxyImpl implements $AppBarComponentCWProxy { @override CustomAppBar actions(List? actions) => this(actions: actions); @override + CustomAppBar centerTitle(bool? centerTitle) => this(centerTitle: centerTitle); + @override CustomAppBar key(Key? key) => this(key: key); @override CustomAppBar call({ TextWrapper? title, Widget? leading, List? actions, + bool? centerTitle, Key? key, }) => CustomAppBar( diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/app_bar_component.dart b/packages/wyatt_ui_components/lib/src/domain/entities/app_bar_component.dart index 4345b741..fd28328d 100644 --- a/packages/wyatt_ui_components/lib/src/domain/entities/app_bar_component.dart +++ b/packages/wyatt_ui_components/lib/src/domain/entities/app_bar_component.dart @@ -27,9 +27,11 @@ abstract class AppBarComponent extends Component this.title, this.leading, this.actions, + this.centerTitle, super.key, }); final TextWrapper? title; + final bool? centerTitle; final Widget? leading; final List? actions; } diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/app_bar_component.g.dart b/packages/wyatt_ui_components/lib/src/domain/entities/app_bar_component.g.dart index e16ec248..945a035c 100644 --- a/packages/wyatt_ui_components/lib/src/domain/entities/app_bar_component.g.dart +++ b/packages/wyatt_ui_components/lib/src/domain/entities/app_bar_component.g.dart @@ -10,11 +10,13 @@ abstract class $AppBarComponentCWProxy { AppBarComponent title(TextWrapper? title); AppBarComponent leading(Widget? leading); AppBarComponent actions(List? actions); + AppBarComponent centerTitle(bool? centerTitle); AppBarComponent key(Key? key); AppBarComponent call({ TextWrapper? title, Widget? leading, List? actions, + bool? centerTitle, Key? key, }); } -- 2.47.2 From 41a484c0137af0d01a2e22ab47f8a238b4fe1427 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malo=20L=C3=A9on?= Date: Wed, 22 Feb 2023 15:50:21 +0100 Subject: [PATCH 05/11] feat(ui_components): update attributs and proxy most of appbar attributs --- .../lib/components/custom_app_bar.g.dart | 60 +++++++++++++++++++ .../domain/entities/app_bar_component.dart | 33 ++++++++++ .../domain/entities/app_bar_component.g.dart | 32 ++++++++++ 3 files changed, 125 insertions(+) diff --git a/packages/wyatt_ui_components/example/lib/components/custom_app_bar.g.dart b/packages/wyatt_ui_components/example/lib/components/custom_app_bar.g.dart index af384641..911b0f37 100644 --- a/packages/wyatt_ui_components/example/lib/components/custom_app_bar.g.dart +++ b/packages/wyatt_ui_components/example/lib/components/custom_app_bar.g.dart @@ -10,6 +10,47 @@ class $CustomAppBarCWProxyImpl implements $AppBarComponentCWProxy { const $CustomAppBarCWProxyImpl(this._value); final CustomAppBar _value; @override + CustomAppBar shape(ShapeBorder? shape) => this(shape: shape); + @override + CustomAppBar systemOverlayStyle(SystemUiOverlayStyle? systemOverlayStyle) => + this(systemOverlayStyle: systemOverlayStyle); + @override + CustomAppBar automaticallyImplyLeading(bool? automaticallyImplyLeading) => + this(automaticallyImplyLeading: automaticallyImplyLeading); + @override + CustomAppBar flexibleSpace(Widget? flexibleSpace) => + this(flexibleSpace: flexibleSpace); + @override + CustomAppBar bottom(PreferredSizeWidget? bottom) => this(bottom: bottom); + @override + CustomAppBar elevation(double? elevation) => this(elevation: elevation); + @override + CustomAppBar scrolledUnderElevation(double? scrolledUnderElevation) => + this(scrolledUnderElevation: scrolledUnderElevation); + @override + CustomAppBar shadowColor(Color? shadowColor) => + this(shadowColor: shadowColor); + @override + CustomAppBar surfaceTintColor(Color? surfaceTintColor) => + this(surfaceTintColor: surfaceTintColor); + @override + CustomAppBar backgroundColor(MultiColor? backgroundColor) => + this(backgroundColor: backgroundColor); + @override + CustomAppBar iconTheme(IconThemeData? iconTheme) => + this(iconTheme: iconTheme); + @override + CustomAppBar primary(bool? primary) => this(primary: primary); + @override + CustomAppBar excludeHeaderSemantics(bool? excludeHeaderSemantics) => + this(excludeHeaderSemantics: excludeHeaderSemantics); + @override + CustomAppBar toolbarHeight(double? toolbarHeight) => + this(toolbarHeight: toolbarHeight); + @override + CustomAppBar leadingWidth(double? leadingWidth) => + this(leadingWidth: leadingWidth); + @override CustomAppBar title(TextWrapper? title) => this(title: title); @override CustomAppBar leading(Widget? leading) => this(leading: leading); @@ -18,13 +59,32 @@ class $CustomAppBarCWProxyImpl implements $AppBarComponentCWProxy { @override CustomAppBar centerTitle(bool? centerTitle) => this(centerTitle: centerTitle); @override + CustomAppBar expandedWidget(List? expandedWidget) => + this(expandedWidget: expandedWidget); + @override CustomAppBar key(Key? key) => this(key: key); @override CustomAppBar call({ + ShapeBorder? shape, + SystemUiOverlayStyle? systemOverlayStyle, + bool? automaticallyImplyLeading, + Widget? flexibleSpace, + PreferredSizeWidget? bottom, + double? elevation, + double? scrolledUnderElevation, + Color? shadowColor, + Color? surfaceTintColor, + MultiColor? backgroundColor, + IconThemeData? iconTheme, + bool? primary, + bool? excludeHeaderSemantics, + double? toolbarHeight, + double? leadingWidth, TextWrapper? title, Widget? leading, List? actions, bool? centerTitle, + List? expandedWidget, Key? key, }) => CustomAppBar( diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/app_bar_component.dart b/packages/wyatt_ui_components/lib/src/domain/entities/app_bar_component.dart index fd28328d..27326808 100644 --- a/packages/wyatt_ui_components/lib/src/domain/entities/app_bar_component.dart +++ b/packages/wyatt_ui_components/lib/src/domain/entities/app_bar_component.dart @@ -15,6 +15,7 @@ // along with this program. If not, see . import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart'; import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart'; @@ -24,14 +25,46 @@ part 'app_bar_component.g.dart'; abstract class AppBarComponent extends Component with CopyWithMixin<$AppBarComponentCWProxy> { const AppBarComponent({ + this.shape, + this.systemOverlayStyle, + this.automaticallyImplyLeading, + this.flexibleSpace, + this.bottom, + this.elevation, + this.scrolledUnderElevation, + this.shadowColor, + this.surfaceTintColor, + this.backgroundColor, + this.iconTheme, + this.primary, + this.excludeHeaderSemantics, + this.toolbarHeight, + this.leadingWidth, this.title, this.leading, this.actions, this.centerTitle, + this.expandedWidget, super.key, }); final TextWrapper? title; final bool? centerTitle; final Widget? leading; final List? actions; + final bool? automaticallyImplyLeading; + final Widget? flexibleSpace; + final PreferredSizeWidget? bottom; + final double? elevation; + final double? scrolledUnderElevation; + final Color? shadowColor; + final Color? surfaceTintColor; + final MultiColor? backgroundColor; + final IconThemeData? iconTheme; + final bool? primary; + final bool? excludeHeaderSemantics; + final double? toolbarHeight; + final double? leadingWidth; + final SystemUiOverlayStyle? systemOverlayStyle; + final ShapeBorder? shape; + final List? expandedWidget; } diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/app_bar_component.g.dart b/packages/wyatt_ui_components/lib/src/domain/entities/app_bar_component.g.dart index 945a035c..bb6bcf5e 100644 --- a/packages/wyatt_ui_components/lib/src/domain/entities/app_bar_component.g.dart +++ b/packages/wyatt_ui_components/lib/src/domain/entities/app_bar_component.g.dart @@ -7,16 +7,48 @@ part of 'app_bar_component.dart'; // ************************************************************************** abstract class $AppBarComponentCWProxy { + AppBarComponent shape(ShapeBorder? shape); + AppBarComponent systemOverlayStyle(SystemUiOverlayStyle? systemOverlayStyle); + AppBarComponent automaticallyImplyLeading(bool? automaticallyImplyLeading); + AppBarComponent flexibleSpace(Widget? flexibleSpace); + AppBarComponent bottom(PreferredSizeWidget? bottom); + AppBarComponent elevation(double? elevation); + AppBarComponent scrolledUnderElevation(double? scrolledUnderElevation); + AppBarComponent shadowColor(Color? shadowColor); + AppBarComponent surfaceTintColor(Color? surfaceTintColor); + AppBarComponent backgroundColor(MultiColor? backgroundColor); + AppBarComponent iconTheme(IconThemeData? iconTheme); + AppBarComponent primary(bool? primary); + AppBarComponent excludeHeaderSemantics(bool? excludeHeaderSemantics); + AppBarComponent toolbarHeight(double? toolbarHeight); + AppBarComponent leadingWidth(double? leadingWidth); AppBarComponent title(TextWrapper? title); AppBarComponent leading(Widget? leading); AppBarComponent actions(List? actions); AppBarComponent centerTitle(bool? centerTitle); + AppBarComponent expandedWidget(List? expandedWidget); AppBarComponent key(Key? key); AppBarComponent call({ + ShapeBorder? shape, + SystemUiOverlayStyle? systemOverlayStyle, + bool? automaticallyImplyLeading, + Widget? flexibleSpace, + PreferredSizeWidget? bottom, + double? elevation, + double? scrolledUnderElevation, + Color? shadowColor, + Color? surfaceTintColor, + MultiColor? backgroundColor, + IconThemeData? iconTheme, + bool? primary, + bool? excludeHeaderSemantics, + double? toolbarHeight, + double? leadingWidth, TextWrapper? title, Widget? leading, List? actions, bool? centerTitle, + List? expandedWidget, Key? key, }); } -- 2.47.2 From ad0f1ec1c58b860f2df6962c7fe83ecf33bd3d89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malo=20L=C3=A9on?= Date: Wed, 22 Feb 2023 15:50:46 +0100 Subject: [PATCH 06/11] feat(ui_kit): implement top app bar and update example --- .../example/assets/images/studio_logo.png | Bin 0 -> 27366 bytes .../wyatt_ui_kit/example/lib/bars/bars.dart | 69 +++++++++ packages/wyatt_ui_kit/example/lib/home.dart | 2 + .../example/lib/theme/themes.dart | 3 + .../example/lib/theme/top_app_bar_theme.dart | 71 +++++++++ .../lib/src/components/app_bars/app_bars.dart | 17 +++ .../src/components/app_bars/top_app_bar.dart | 139 ++++++++++++++++++ .../components/app_bars/top_app_bar.g.dart | 119 +++++++++++++++ .../lib/src/components/components.dart | 1 + .../top_navigation_bar.dart | 35 +++++ .../top_navigation_bar.g.dart | 45 ++++++ .../wyatt_ui_kit/lib/src/domain/domain.dart | 1 + .../lib/src/domain/top_app_bar_extension.dart | 34 +++++ 13 files changed, 536 insertions(+) create mode 100644 packages/wyatt_ui_kit/example/assets/images/studio_logo.png create mode 100644 packages/wyatt_ui_kit/example/lib/bars/bars.dart create mode 100644 packages/wyatt_ui_kit/example/lib/theme/top_app_bar_theme.dart create mode 100644 packages/wyatt_ui_kit/lib/src/components/app_bars/app_bars.dart create mode 100644 packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.dart create mode 100644 packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.g.dart create mode 100644 packages/wyatt_ui_kit/lib/src/components/top_navigation_bars/top_navigation_bar.dart create mode 100644 packages/wyatt_ui_kit/lib/src/components/top_navigation_bars/top_navigation_bar.g.dart create mode 100644 packages/wyatt_ui_kit/lib/src/domain/top_app_bar_extension.dart diff --git a/packages/wyatt_ui_kit/example/assets/images/studio_logo.png b/packages/wyatt_ui_kit/example/assets/images/studio_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e3fe86fd5705b60ccb95636ce82d36894e30ca7a GIT binary patch literal 27366 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 z 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 literal 0 HcmV?d00001 diff --git a/packages/wyatt_ui_kit/example/lib/bars/bars.dart b/packages/wyatt_ui_kit/example/lib/bars/bars.dart new file mode 100644 index 00000000..2290e006 --- /dev/null +++ b/packages/wyatt_ui_kit/example/lib/bars/bars.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:gap/gap.dart'; +import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart'; +import 'package:wyatt_ui_kit/wyatt_ui_kit.dart'; +import 'package:wyatt_ui_kit_example/demo_page.dart'; + +class Bars extends DemoPage { + const Bars({super.key}); + + @override + Widget build(BuildContext context) => ListView( + cacheExtent: 1000, + children: [ + const Gap(20), + TopAppBar( + leading: Padding( + padding: const EdgeInsets.all(8), + child: Image.asset('assets/images/studio_logo.png'), + ), + title: 'Wyatt Studio'.wrap( + gradientColors: const MultiColor( + [ + Color.fromRGBO(57, 167, 254, 1), + Color.fromRGBO(71, 94, 241, 1), + ], + ), + ), + actions: [ + IconButton(onPressed: () {}, icon: const Icon(Icons.menu)) + ], + ), + const Gap(20), + TopAppBar( + leading: Padding( + padding: const EdgeInsets.all(8), + child: Image.asset('assets/images/studio_logo.png'), + ), + title: 'Wyatt Studio'.wrap( + gradientColors: const MultiColor( + [ + Color.fromRGBO(57, 167, 254, 1), + Color.fromRGBO(71, 94, 241, 1), + ], + ), + ), + expandedWidget: const [ + ListTile( + title: Text('Votre programme'), + ), + ListTile( + title: Text('Votre programme'), + ), + ListTile( + title: Text('Votre programme'), + ) + ], + actions: [ + IconButton( + onPressed: () {}, + icon: const Icon(Icons.clear), + ) + ], + ), + ], + ); + + @override + String get title => 'Bars'; +} diff --git a/packages/wyatt_ui_kit/example/lib/home.dart b/packages/wyatt_ui_kit/example/lib/home.dart index 9d772a61..70a20107 100644 --- a/packages/wyatt_ui_kit/example/lib/home.dart +++ b/packages/wyatt_ui_kit/example/lib/home.dart @@ -1,6 +1,7 @@ import 'package:adaptive_theme/adaptive_theme.dart'; import 'package:flutter/material.dart'; import 'package:gap/gap.dart'; +import 'package:wyatt_ui_kit_example/bars/bars.dart'; import 'package:wyatt_ui_kit_example/buttons/buttons.dart'; import 'package:wyatt_ui_kit_example/cards/cards.dart'; import 'package:wyatt_ui_kit_example/demo_page.dart'; @@ -28,6 +29,7 @@ class _HomeState extends State { Loaders(), RichTextBuilders(), TextInputs(), + Bars(), ]; int currentIndex = 0; diff --git a/packages/wyatt_ui_kit/example/lib/theme/themes.dart b/packages/wyatt_ui_kit/example/lib/theme/themes.dart index 6bb52867..e36014d6 100644 --- a/packages/wyatt_ui_kit/example/lib/theme/themes.dart +++ b/packages/wyatt_ui_kit/example/lib/theme/themes.dart @@ -25,6 +25,7 @@ import 'package:wyatt_ui_kit_example/theme/rich_text_builder_theme.dart'; import 'package:wyatt_ui_kit_example/theme/simple_icon_button_theme.dart'; import 'package:wyatt_ui_kit_example/theme/symbol_button_theme.dart'; import 'package:wyatt_ui_kit_example/theme/text_input_theme.dart'; +import 'package:wyatt_ui_kit_example/theme/top_app_bar_theme.dart'; /// Easely switch between Material and Studio themes. abstract class Themes { @@ -92,6 +93,7 @@ abstract class Themes { // Rich Text RichTextBuilderTheme.light(), TextInputTheme.light(), + TopAppBarTheme.light(), ], ); @@ -124,6 +126,7 @@ abstract class Themes { // Rich Text RichTextBuilderTheme.dark(), TextInputTheme.dark(), + TopAppBarTheme.dark(), ], ); } diff --git a/packages/wyatt_ui_kit/example/lib/theme/top_app_bar_theme.dart b/packages/wyatt_ui_kit/example/lib/theme/top_app_bar_theme.dart new file mode 100644 index 00000000..8be94e42 --- /dev/null +++ b/packages/wyatt_ui_kit/example/lib/theme/top_app_bar_theme.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart'; +import 'package:wyatt_ui_kit/wyatt_ui_kit.dart'; + +class TopAppBarTheme extends TopAppBarThemeExtension { + const TopAppBarTheme({ + super.iconTheme, + super.backgroundColors, + super.expandedDividerStyle, + super.titleStyle, + }); + + factory TopAppBarTheme.light() => TopAppBarTheme( + backgroundColors: const MultiColor.single( + Color.fromRGBO(246, 246, 246, 1), + ), + expandedDividerStyle: Colors.black.withOpacity(0.1), + titleStyle: GoogleFonts.montserrat( + fontWeight: FontWeight.bold, + fontSize: 18, + ), + iconTheme: const IconThemeData(color: Colors.black), + ); + + factory TopAppBarTheme.dark() => TopAppBarTheme( + backgroundColors: const MultiColor([ + Color.fromRGBO(44, 50, 56, 1), + Color.fromRGBO(39, 47, 61, 1), + Color.fromRGBO(44, 50, 56, 1), + ]), + expandedDividerStyle: Colors.white.withOpacity(0.1), + titleStyle: GoogleFonts.montserrat( + fontWeight: FontWeight.bold, + fontSize: 18, + ), + iconTheme: const IconThemeData(color: Colors.white), + ); + + @override + ThemeExtension copyWith({ + IconThemeData? iconTheme, + MultiColor? backgroundColors, + Color? expandedDividerStyle, + TextStyle? titleStyle, + }) => + TopAppBarTheme( + iconTheme: iconTheme ?? this.iconTheme, + backgroundColors: backgroundColors ?? this.backgroundColors, + expandedDividerStyle: expandedDividerStyle ?? this.expandedDividerStyle, + titleStyle: titleStyle ?? this.titleStyle, + ); + + @override + ThemeExtension lerp( + covariant ThemeExtension? other, + double t, + ) { + if (other is! TopAppBarTheme) { + return this; + } + return TopAppBarTheme( + iconTheme: IconThemeData.lerp(iconTheme, other.iconTheme, t), + backgroundColors: + MultiColor.lerp(backgroundColors, other.backgroundColors, t), + expandedDividerStyle: + Color.lerp(expandedDividerStyle, other.expandedDividerStyle, t), + titleStyle: TextStyle.lerp(titleStyle, other.titleStyle, t), + ); + } +} diff --git a/packages/wyatt_ui_kit/lib/src/components/app_bars/app_bars.dart b/packages/wyatt_ui_kit/lib/src/components/app_bars/app_bars.dart new file mode 100644 index 00000000..a7a986ee --- /dev/null +++ b/packages/wyatt_ui_kit/lib/src/components/app_bars/app_bars.dart @@ -0,0 +1,17 @@ +// Copyright (C) 2023 WYATT GROUP +// Please see the AUTHORS file for details. +// +// super program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// any later version. +// +// super program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with super program. If not, see . + +export 'top_app_bar.dart'; diff --git a/packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.dart b/packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.dart new file mode 100644 index 00000000..d8f433d9 --- /dev/null +++ b/packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.dart @@ -0,0 +1,139 @@ +// Copyright (C) 2023 WYATT GROUP +// Please see the AUTHORS file for details. +// +// super program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// any later version. +// +// super program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with super program. If not, see . + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart'; +import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart'; +import 'package:wyatt_ui_kit/wyatt_ui_kit.dart'; +part 'top_app_bar.g.dart'; + +@ComponentCopyWithExtension() +class TopAppBar extends AppBarComponent with $TopAppBarCWMixin { + const TopAppBar({ + super.systemOverlayStyle, + super.automaticallyImplyLeading, + super.flexibleSpace, + super.bottom, + super.elevation, + super.scrolledUnderElevation, + super.shadowColor, + super.surfaceTintColor, + super.backgroundColor, + super.iconTheme, + super.primary, + super.excludeHeaderSemantics, + super.toolbarHeight, + super.leadingWidth, + super.title, + super.leading, + super.actions, + super.centerTitle, + super.shape, + super.expandedWidget, + super.key, + }); + + @override + Widget build(BuildContext context) => DecoratedBox( + decoration: BoxDecoration( + gradient: ThemeHelper.getThemeElement( + [ + backgroundColor, + context + .themeExtension() + ?.backgroundColors, + ], + valueValidator: (value) => value?.isGradient, + transform: (value) => + LinearGradientHelper.fromNullableColors(value?.colors), + defaultValue: null, + ), + color: ThemeHelper.getThemeElement( + [ + backgroundColor, + context + .themeExtension() + ?.backgroundColors, + ], + valueValidator: (value) => value?.isColor, + transform: (value) => value?.color, + defaultValue: Theme.of(context).appBarTheme.backgroundColor, + ), + ), + child: Column( + children: [ + AppBar( + titleSpacing: 0, + backgroundColor: Colors.transparent, + systemOverlayStyle: systemOverlayStyle, + automaticallyImplyLeading: automaticallyImplyLeading ?? true, + flexibleSpace: flexibleSpace, + bottom: bottom, + elevation: elevation ?? 0, + scrolledUnderElevation: scrolledUnderElevation, + shadowColor: shadowColor, + surfaceTintColor: surfaceTintColor, + iconTheme: + ThemeHelper.getThemeElement( + [ + iconTheme, + context.themeExtension()?.iconTheme, + ], + valueValidator: (value) => value != null, + transform: (value) => value, + defaultValue: Theme.of(context).iconTheme, + ), + primary: primary ?? true, + excludeHeaderSemantics: excludeHeaderSemantics ?? false, + leadingWidth: leadingWidth, + title: Text( + title?.data ?? '', + style: ThemeHelper.getThemeElement( + [ + title?.style, + context + .themeExtension() + ?.titleStyle + ], + valueValidator: (value) => value != null, + transform: (value) => value, + defaultValue: context.textTheme.titleLarge, + ), + ).toGradient(gradientColors: title?.gradientColors), + leading: leading, + actions: actions, + centerTitle: centerTitle ?? false, + ), + if (expandedWidget != null) + ...ListTile.divideTiles( + color: ThemeHelper.getThemeElement( + [ + context + .themeExtension() + ?.expandedDividerStyle, + ], + valueValidator: (value) => value != null, + transform: (value) => value, + defaultValue: Theme.of(context).dividerColor, + ), + context: context, + tiles: expandedWidget!, + ), + ], + ), + ); +} diff --git a/packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.g.dart b/packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.g.dart new file mode 100644 index 00000000..88c9e759 --- /dev/null +++ b/packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.g.dart @@ -0,0 +1,119 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'top_app_bar.dart'; + +// ************************************************************************** +// ComponentCopyWithGenerator +// ************************************************************************** + +class $TopAppBarCWProxyImpl implements $AppBarComponentCWProxy { + const $TopAppBarCWProxyImpl(this._value); + final TopAppBar _value; + @override + TopAppBar shape(ShapeBorder? shape) => this(shape: shape); + @override + TopAppBar systemOverlayStyle(SystemUiOverlayStyle? systemOverlayStyle) => + this(systemOverlayStyle: systemOverlayStyle); + @override + TopAppBar automaticallyImplyLeading(bool? automaticallyImplyLeading) => + this(automaticallyImplyLeading: automaticallyImplyLeading); + @override + TopAppBar flexibleSpace(Widget? flexibleSpace) => + this(flexibleSpace: flexibleSpace); + @override + TopAppBar bottom(PreferredSizeWidget? bottom) => this(bottom: bottom); + @override + TopAppBar elevation(double? elevation) => this(elevation: elevation); + @override + TopAppBar scrolledUnderElevation(double? scrolledUnderElevation) => + this(scrolledUnderElevation: scrolledUnderElevation); + @override + TopAppBar shadowColor(Color? shadowColor) => this(shadowColor: shadowColor); + @override + TopAppBar surfaceTintColor(Color? surfaceTintColor) => + this(surfaceTintColor: surfaceTintColor); + @override + TopAppBar backgroundColor(MultiColor? backgroundColor) => + this(backgroundColor: backgroundColor); + @override + TopAppBar iconTheme(IconThemeData? iconTheme) => this(iconTheme: iconTheme); + @override + TopAppBar primary(bool? primary) => this(primary: primary); + @override + TopAppBar excludeHeaderSemantics(bool? excludeHeaderSemantics) => + this(excludeHeaderSemantics: excludeHeaderSemantics); + @override + TopAppBar toolbarHeight(double? toolbarHeight) => + this(toolbarHeight: toolbarHeight); + @override + TopAppBar leadingWidth(double? leadingWidth) => + this(leadingWidth: leadingWidth); + @override + TopAppBar title(TextWrapper? title) => this(title: title); + @override + TopAppBar leading(Widget? leading) => this(leading: leading); + @override + TopAppBar actions(List? actions) => this(actions: actions); + @override + TopAppBar centerTitle(bool? centerTitle) => this(centerTitle: centerTitle); + @override + TopAppBar expandedWidget(List? expandedWidget) => + this(expandedWidget: expandedWidget); + @override + TopAppBar key(Key? key) => this(key: key); + @override + TopAppBar call({ + ShapeBorder? shape, + SystemUiOverlayStyle? systemOverlayStyle, + bool? automaticallyImplyLeading, + Widget? flexibleSpace, + PreferredSizeWidget? bottom, + double? elevation, + double? scrolledUnderElevation, + Color? shadowColor, + Color? surfaceTintColor, + MultiColor? backgroundColor, + IconThemeData? iconTheme, + bool? primary, + bool? excludeHeaderSemantics, + double? toolbarHeight, + double? leadingWidth, + TextWrapper? title, + Widget? leading, + List? actions, + bool? centerTitle, + List? expandedWidget, + Key? key, + }) => + TopAppBar( + systemOverlayStyle: systemOverlayStyle ?? _value.systemOverlayStyle, + automaticallyImplyLeading: + automaticallyImplyLeading ?? _value.automaticallyImplyLeading, + flexibleSpace: flexibleSpace ?? _value.flexibleSpace, + bottom: bottom ?? _value.bottom, + elevation: elevation ?? _value.elevation, + scrolledUnderElevation: + scrolledUnderElevation ?? _value.scrolledUnderElevation, + shadowColor: shadowColor ?? _value.shadowColor, + surfaceTintColor: surfaceTintColor ?? _value.surfaceTintColor, + backgroundColor: backgroundColor ?? _value.backgroundColor, + iconTheme: iconTheme ?? _value.iconTheme, + primary: primary ?? _value.primary, + excludeHeaderSemantics: + excludeHeaderSemantics ?? _value.excludeHeaderSemantics, + toolbarHeight: toolbarHeight ?? _value.toolbarHeight, + leadingWidth: leadingWidth ?? _value.leadingWidth, + title: title ?? _value.title, + leading: leading ?? _value.leading, + actions: actions ?? _value.actions, + centerTitle: centerTitle ?? _value.centerTitle, + shape: shape ?? _value.shape, + expandedWidget: expandedWidget ?? _value.expandedWidget, + key: key ?? _value.key, + ); +} + +mixin $TopAppBarCWMixin on Component { + $AppBarComponentCWProxy get copyWith => + $TopAppBarCWProxyImpl(this as TopAppBar); +} diff --git a/packages/wyatt_ui_kit/lib/src/components/components.dart b/packages/wyatt_ui_kit/lib/src/components/components.dart index 34d4753d..9b4c399c 100644 --- a/packages/wyatt_ui_kit/lib/src/components/components.dart +++ b/packages/wyatt_ui_kit/lib/src/components/components.dart @@ -14,6 +14,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +export './app_bars/app_bars.dart'; export './buttons/buttons.dart'; export './cards/cards.dart'; export './gradients/gradients.dart'; diff --git a/packages/wyatt_ui_kit/lib/src/components/top_navigation_bars/top_navigation_bar.dart b/packages/wyatt_ui_kit/lib/src/components/top_navigation_bars/top_navigation_bar.dart new file mode 100644 index 00000000..d236b884 --- /dev/null +++ b/packages/wyatt_ui_kit/lib/src/components/top_navigation_bars/top_navigation_bar.dart @@ -0,0 +1,35 @@ +// Copyright (C) 2023 WYATT GROUP +// Please see the AUTHORS file for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +import 'package:flutter/material.dart'; +import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart'; +import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart'; +part 'top_navigation_bar.g.dart'; + +@ComponentCopyWithExtension() +class TopNavigationBar extends TopNavigationBarComponent + with $TopNavigationBarCWMixin { + const TopNavigationBar({ + super.leading, + super.actions, + super.onTap, + super.currentIndex = 0, + super.key, + }); + + @override + Widget build(BuildContext context) => const Placeholder(); +} diff --git a/packages/wyatt_ui_kit/lib/src/components/top_navigation_bars/top_navigation_bar.g.dart b/packages/wyatt_ui_kit/lib/src/components/top_navigation_bars/top_navigation_bar.g.dart new file mode 100644 index 00000000..ba8e5a42 --- /dev/null +++ b/packages/wyatt_ui_kit/lib/src/components/top_navigation_bars/top_navigation_bar.g.dart @@ -0,0 +1,45 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'top_navigation_bar.dart'; + +// ************************************************************************** +// ComponentCopyWithGenerator +// ************************************************************************** + +class $TopNavigationBarCWProxyImpl + implements $TopNavigationBarComponentCWProxy { + const $TopNavigationBarCWProxyImpl(this._value); + final TopNavigationBar _value; + @override + TopNavigationBar leading(Widget? leading) => this(leading: leading); + @override + TopNavigationBar actions(List? actions) => this(actions: actions); + @override + TopNavigationBar onTap(void Function(BuildContext, int)? onTap) => + this(onTap: onTap); + @override + TopNavigationBar currentIndex(int? currentIndex) => + this(currentIndex: currentIndex); + @override + TopNavigationBar key(Key? key) => this(key: key); + @override + TopNavigationBar call({ + Widget? leading, + List? actions, + void Function(BuildContext, int)? onTap, + int? currentIndex, + Key? key, + }) => + TopNavigationBar( + leading: leading ?? _value.leading, + actions: actions ?? _value.actions, + onTap: onTap ?? _value.onTap, + currentIndex: currentIndex ?? _value.currentIndex, + key: key ?? _value.key, + ); +} + +mixin $TopNavigationBarCWMixin on Component { + $TopNavigationBarComponentCWProxy get copyWith => + $TopNavigationBarCWProxyImpl(this as TopNavigationBar); +} diff --git a/packages/wyatt_ui_kit/lib/src/domain/domain.dart b/packages/wyatt_ui_kit/lib/src/domain/domain.dart index 6cf19139..8433530b 100644 --- a/packages/wyatt_ui_kit/lib/src/domain/domain.dart +++ b/packages/wyatt_ui_kit/lib/src/domain/domain.dart @@ -19,3 +19,4 @@ export './card_theme_extension.dart'; export './loader_theme_extension.dart'; export './rich_text_builder_theme_extension.dart'; export './text_input_theme_extension.dart'; +export './top_app_bar_extension.dart'; diff --git a/packages/wyatt_ui_kit/lib/src/domain/top_app_bar_extension.dart b/packages/wyatt_ui_kit/lib/src/domain/top_app_bar_extension.dart new file mode 100644 index 00000000..ea6718bb --- /dev/null +++ b/packages/wyatt_ui_kit/lib/src/domain/top_app_bar_extension.dart @@ -0,0 +1,34 @@ +// Copyright (C) 2023 WYATT GROUP +// Please see the AUTHORS file for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +import 'package:flutter/material.dart'; +import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart'; + +abstract class TopAppBarThemeExtension + extends ThemeExtension { + const TopAppBarThemeExtension({ + this.iconTheme, + this.backgroundColors, + this.expandedDividerStyle, + this.titleStyle, + }); + + final MultiColor? backgroundColors; + final IconThemeData? iconTheme; + final Color? expandedDividerStyle; + + final TextStyle? titleStyle; +} -- 2.47.2 From ca6af3ccc398aaa303176118e58574de3d5f8213 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malo=20L=C3=A9on?= Date: Wed, 22 Feb 2023 16:01:51 +0100 Subject: [PATCH 07/11] style(ui_components): clean folders and gather bars --- .../{ => bars}/app_bar_component.dart | 0 .../{ => bars}/app_bar_component.g.dart | 0 .../lib/src/domain/entities/bars/bars.dart | 19 +++++++++++++++++++ .../bottom_navigation_bar_component.dart | 0 .../bottom_navigation_bar_component.g.dart | 0 .../top_navigation_bar_component.dart | 0 .../top_navigation_bar_component.g.dart | 0 .../lib/src/domain/entities/entities.dart | 4 +--- 8 files changed, 20 insertions(+), 3 deletions(-) rename packages/wyatt_ui_components/lib/src/domain/entities/{ => bars}/app_bar_component.dart (100%) rename packages/wyatt_ui_components/lib/src/domain/entities/{ => bars}/app_bar_component.g.dart (100%) create mode 100644 packages/wyatt_ui_components/lib/src/domain/entities/bars/bars.dart rename packages/wyatt_ui_components/lib/src/domain/entities/{ => bars}/bottom_navigation_bar_component.dart (100%) rename packages/wyatt_ui_components/lib/src/domain/entities/{ => bars}/bottom_navigation_bar_component.g.dart (100%) rename packages/wyatt_ui_components/lib/src/domain/entities/{ => bars}/top_navigation_bar_component.dart (100%) rename packages/wyatt_ui_components/lib/src/domain/entities/{ => bars}/top_navigation_bar_component.g.dart (100%) diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/app_bar_component.dart b/packages/wyatt_ui_components/lib/src/domain/entities/bars/app_bar_component.dart similarity index 100% rename from packages/wyatt_ui_components/lib/src/domain/entities/app_bar_component.dart rename to packages/wyatt_ui_components/lib/src/domain/entities/bars/app_bar_component.dart diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/app_bar_component.g.dart b/packages/wyatt_ui_components/lib/src/domain/entities/bars/app_bar_component.g.dart similarity index 100% rename from packages/wyatt_ui_components/lib/src/domain/entities/app_bar_component.g.dart rename to packages/wyatt_ui_components/lib/src/domain/entities/bars/app_bar_component.g.dart diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/bars/bars.dart b/packages/wyatt_ui_components/lib/src/domain/entities/bars/bars.dart new file mode 100644 index 00000000..3334ba20 --- /dev/null +++ b/packages/wyatt_ui_components/lib/src/domain/entities/bars/bars.dart @@ -0,0 +1,19 @@ +// Copyright (C) 2023 WYATT GROUP +// Please see the AUTHORS file for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +export './app_bar_component.dart'; +export './bottom_navigation_bar_component.dart'; +export './top_navigation_bar_component.dart'; diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/bottom_navigation_bar_component.dart b/packages/wyatt_ui_components/lib/src/domain/entities/bars/bottom_navigation_bar_component.dart similarity index 100% rename from packages/wyatt_ui_components/lib/src/domain/entities/bottom_navigation_bar_component.dart rename to packages/wyatt_ui_components/lib/src/domain/entities/bars/bottom_navigation_bar_component.dart diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/bottom_navigation_bar_component.g.dart b/packages/wyatt_ui_components/lib/src/domain/entities/bars/bottom_navigation_bar_component.g.dart similarity index 100% rename from packages/wyatt_ui_components/lib/src/domain/entities/bottom_navigation_bar_component.g.dart rename to packages/wyatt_ui_components/lib/src/domain/entities/bars/bottom_navigation_bar_component.g.dart diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/top_navigation_bar_component.dart b/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_navigation_bar_component.dart similarity index 100% rename from packages/wyatt_ui_components/lib/src/domain/entities/top_navigation_bar_component.dart rename to packages/wyatt_ui_components/lib/src/domain/entities/bars/top_navigation_bar_component.dart diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/top_navigation_bar_component.g.dart b/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_navigation_bar_component.g.dart similarity index 100% rename from packages/wyatt_ui_components/lib/src/domain/entities/top_navigation_bar_component.g.dart rename to packages/wyatt_ui_components/lib/src/domain/entities/bars/top_navigation_bar_component.g.dart diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/entities.dart b/packages/wyatt_ui_components/lib/src/domain/entities/entities.dart index c5ea3c94..1c7756e8 100644 --- a/packages/wyatt_ui_components/lib/src/domain/entities/entities.dart +++ b/packages/wyatt_ui_components/lib/src/domain/entities/entities.dart @@ -14,8 +14,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -export './app_bar_component.dart'; -export './bottom_navigation_bar_component.dart'; +export './bars/bars.dart'; export './buttons/buttons.dart'; export './cards/cards.dart'; export './component.dart'; @@ -26,4 +25,3 @@ export './loading_widget_component.dart'; export './rich_text_builder/rich_text_builder.dart'; export './text_inputs/text_inputs.dart'; export './theme_style.dart'; -export './top_navigation_bar_component.dart'; -- 2.47.2 From 8955788fa56977af2b2dc5ed0c39e43a3d2166d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malo=20L=C3=A9on?= Date: Wed, 22 Feb 2023 16:05:40 +0100 Subject: [PATCH 08/11] feat(ui_components): generify bars --- .../entities/bars/app_bar_component.dart | 63 +++++++------------ .../entities/bars/top_bar_component.dart | 62 ++++++++++++++++++ 2 files changed, 85 insertions(+), 40 deletions(-) create mode 100644 packages/wyatt_ui_components/lib/src/domain/entities/bars/top_bar_component.dart diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/bars/app_bar_component.dart b/packages/wyatt_ui_components/lib/src/domain/entities/bars/app_bar_component.dart index 27326808..f13710a2 100644 --- a/packages/wyatt_ui_components/lib/src/domain/entities/bars/app_bar_component.dart +++ b/packages/wyatt_ui_components/lib/src/domain/entities/bars/app_bar_component.dart @@ -1,70 +1,53 @@ // Copyright (C) 2023 WYATT GROUP // Please see the AUTHORS file for details. // -// This program is free software: you can redistribute it and/or modify +// super program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // any later version. // -// This program is distributed in the hope that it will be useful, +// super program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// along with super program. If not, see . import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart'; +import 'package:wyatt_ui_components/src/domain/entities/bars/top_bar_component.dart'; import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart'; part 'app_bar_component.g.dart'; @ComponentProxyExtension() -abstract class AppBarComponent extends Component +abstract class AppBarComponent extends TopBarComponent with CopyWithMixin<$AppBarComponentCWProxy> { const AppBarComponent({ - this.shape, - this.systemOverlayStyle, - this.automaticallyImplyLeading, - this.flexibleSpace, - this.bottom, - this.elevation, - this.scrolledUnderElevation, - this.shadowColor, - this.surfaceTintColor, - this.backgroundColor, - this.iconTheme, - this.primary, - this.excludeHeaderSemantics, - this.toolbarHeight, - this.leadingWidth, this.title, - this.leading, - this.actions, this.centerTitle, - this.expandedWidget, + super.shape, + super.systemOverlayStyle, + super.automaticallyImplyLeading, + super.flexibleSpace, + super.bottom, + super.elevation, + super.scrolledUnderElevation, + super.shadowColor, + super.surfaceTintColor, + super.backgroundColor, + super.iconTheme, + super.primary, + super.excludeHeaderSemantics, + super.toolbarHeight, + super.leadingWidth, + super.leading, + super.actions, + super.expandedWidget, super.key, }); final TextWrapper? title; final bool? centerTitle; - final Widget? leading; - final List? actions; - final bool? automaticallyImplyLeading; - final Widget? flexibleSpace; - final PreferredSizeWidget? bottom; - final double? elevation; - final double? scrolledUnderElevation; - final Color? shadowColor; - final Color? surfaceTintColor; - final MultiColor? backgroundColor; - final IconThemeData? iconTheme; - final bool? primary; - final bool? excludeHeaderSemantics; - final double? toolbarHeight; - final double? leadingWidth; - final SystemUiOverlayStyle? systemOverlayStyle; - final ShapeBorder? shape; - final List? expandedWidget; } diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_bar_component.dart b/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_bar_component.dart new file mode 100644 index 00000000..f73f8423 --- /dev/null +++ b/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_bar_component.dart @@ -0,0 +1,62 @@ +// Copyright (C) 2023 WYATT GROUP +// Please see the AUTHORS file for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart'; + +abstract class TopBarComponent extends Component { + const TopBarComponent({ + this.leading, + this.actions, + this.automaticallyImplyLeading, + this.flexibleSpace, + this.bottom, + this.elevation, + this.scrolledUnderElevation, + this.shadowColor, + this.surfaceTintColor, + this.backgroundColor, + this.iconTheme, + this.primary, + this.excludeHeaderSemantics, + this.toolbarHeight, + this.leadingWidth, + this.systemOverlayStyle, + this.shape, + this.expandedWidget, + super.key, + }); + + final Widget? leading; + final List? actions; + final bool? automaticallyImplyLeading; + final Widget? flexibleSpace; + final PreferredSizeWidget? bottom; + final double? elevation; + final double? scrolledUnderElevation; + final Color? shadowColor; + final Color? surfaceTintColor; + final MultiColor? backgroundColor; + final IconThemeData? iconTheme; + final bool? primary; + final bool? excludeHeaderSemantics; + final double? toolbarHeight; + final double? leadingWidth; + final SystemUiOverlayStyle? systemOverlayStyle; + final ShapeBorder? shape; + final List? expandedWidget; +} -- 2.47.2 From b9dac321435dfa8f45ab9b15ec4c0ef6e9abdee7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malo=20L=C3=A9on?= Date: Wed, 22 Feb 2023 16:10:25 +0100 Subject: [PATCH 09/11] refactor(ui_components): migrate top nav bar using generify top bar --- .../lib/components/custom_app_bar.dart | 2 +- .../lib/components/custom_app_bar.g.dart | 16 +++--- .../entities/bars/app_bar_component.g.dart | 54 ------------------ .../lib/src/domain/entities/bars/bars.dart | 2 +- ...ponent.dart => top_app_bar_component.dart} | 8 +-- .../bars/top_app_bar_component.g.dart | 55 +++++++++++++++++++ .../bars/top_navigation_bar_component.dart | 27 +++++++-- .../src/features/component_theme_data.dart | 2 +- 8 files changed, 91 insertions(+), 75 deletions(-) delete mode 100644 packages/wyatt_ui_components/lib/src/domain/entities/bars/app_bar_component.g.dart rename packages/wyatt_ui_components/lib/src/domain/entities/bars/{app_bar_component.dart => top_app_bar_component.dart} (90%) create mode 100644 packages/wyatt_ui_components/lib/src/domain/entities/bars/top_app_bar_component.g.dart diff --git a/packages/wyatt_ui_components/example/lib/components/custom_app_bar.dart b/packages/wyatt_ui_components/example/lib/components/custom_app_bar.dart index 7a0088fe..fcd0cff8 100644 --- a/packages/wyatt_ui_components/example/lib/components/custom_app_bar.dart +++ b/packages/wyatt_ui_components/example/lib/components/custom_app_bar.dart @@ -5,7 +5,7 @@ import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart'; part 'custom_app_bar.g.dart'; @ComponentCopyWithExtension() -class CustomAppBar extends AppBarComponent with $CustomAppBarCWMixin { +class CustomAppBar extends TopAppBarComponent with $CustomAppBarCWMixin { const CustomAppBar({super.title, super.key}); @override diff --git a/packages/wyatt_ui_components/example/lib/components/custom_app_bar.g.dart b/packages/wyatt_ui_components/example/lib/components/custom_app_bar.g.dart index 911b0f37..125680d9 100644 --- a/packages/wyatt_ui_components/example/lib/components/custom_app_bar.g.dart +++ b/packages/wyatt_ui_components/example/lib/components/custom_app_bar.g.dart @@ -6,10 +6,14 @@ part of 'custom_app_bar.dart'; // ComponentCopyWithGenerator // ************************************************************************** -class $CustomAppBarCWProxyImpl implements $AppBarComponentCWProxy { +class $CustomAppBarCWProxyImpl implements $TopAppBarComponentCWProxy { const $CustomAppBarCWProxyImpl(this._value); final CustomAppBar _value; @override + CustomAppBar title(TextWrapper? title) => this(title: title); + @override + CustomAppBar centerTitle(bool? centerTitle) => this(centerTitle: centerTitle); + @override CustomAppBar shape(ShapeBorder? shape) => this(shape: shape); @override CustomAppBar systemOverlayStyle(SystemUiOverlayStyle? systemOverlayStyle) => @@ -51,20 +55,18 @@ class $CustomAppBarCWProxyImpl implements $AppBarComponentCWProxy { CustomAppBar leadingWidth(double? leadingWidth) => this(leadingWidth: leadingWidth); @override - CustomAppBar title(TextWrapper? title) => this(title: title); - @override CustomAppBar leading(Widget? leading) => this(leading: leading); @override CustomAppBar actions(List? actions) => this(actions: actions); @override - CustomAppBar centerTitle(bool? centerTitle) => this(centerTitle: centerTitle); - @override CustomAppBar expandedWidget(List? expandedWidget) => this(expandedWidget: expandedWidget); @override CustomAppBar key(Key? key) => this(key: key); @override CustomAppBar call({ + TextWrapper? title, + bool? centerTitle, ShapeBorder? shape, SystemUiOverlayStyle? systemOverlayStyle, bool? automaticallyImplyLeading, @@ -80,10 +82,8 @@ class $CustomAppBarCWProxyImpl implements $AppBarComponentCWProxy { bool? excludeHeaderSemantics, double? toolbarHeight, double? leadingWidth, - TextWrapper? title, Widget? leading, List? actions, - bool? centerTitle, List? expandedWidget, Key? key, }) => @@ -94,6 +94,6 @@ class $CustomAppBarCWProxyImpl implements $AppBarComponentCWProxy { } mixin $CustomAppBarCWMixin on Component { - $AppBarComponentCWProxy get copyWith => + $TopAppBarComponentCWProxy get copyWith => $CustomAppBarCWProxyImpl(this as CustomAppBar); } diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/bars/app_bar_component.g.dart b/packages/wyatt_ui_components/lib/src/domain/entities/bars/app_bar_component.g.dart deleted file mode 100644 index bb6bcf5e..00000000 --- a/packages/wyatt_ui_components/lib/src/domain/entities/bars/app_bar_component.g.dart +++ /dev/null @@ -1,54 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'app_bar_component.dart'; - -// ************************************************************************** -// ComponentProxyGenerator -// ************************************************************************** - -abstract class $AppBarComponentCWProxy { - AppBarComponent shape(ShapeBorder? shape); - AppBarComponent systemOverlayStyle(SystemUiOverlayStyle? systemOverlayStyle); - AppBarComponent automaticallyImplyLeading(bool? automaticallyImplyLeading); - AppBarComponent flexibleSpace(Widget? flexibleSpace); - AppBarComponent bottom(PreferredSizeWidget? bottom); - AppBarComponent elevation(double? elevation); - AppBarComponent scrolledUnderElevation(double? scrolledUnderElevation); - AppBarComponent shadowColor(Color? shadowColor); - AppBarComponent surfaceTintColor(Color? surfaceTintColor); - AppBarComponent backgroundColor(MultiColor? backgroundColor); - AppBarComponent iconTheme(IconThemeData? iconTheme); - AppBarComponent primary(bool? primary); - AppBarComponent excludeHeaderSemantics(bool? excludeHeaderSemantics); - AppBarComponent toolbarHeight(double? toolbarHeight); - AppBarComponent leadingWidth(double? leadingWidth); - AppBarComponent title(TextWrapper? title); - AppBarComponent leading(Widget? leading); - AppBarComponent actions(List? actions); - AppBarComponent centerTitle(bool? centerTitle); - AppBarComponent expandedWidget(List? expandedWidget); - AppBarComponent key(Key? key); - AppBarComponent call({ - ShapeBorder? shape, - SystemUiOverlayStyle? systemOverlayStyle, - bool? automaticallyImplyLeading, - Widget? flexibleSpace, - PreferredSizeWidget? bottom, - double? elevation, - double? scrolledUnderElevation, - Color? shadowColor, - Color? surfaceTintColor, - MultiColor? backgroundColor, - IconThemeData? iconTheme, - bool? primary, - bool? excludeHeaderSemantics, - double? toolbarHeight, - double? leadingWidth, - TextWrapper? title, - Widget? leading, - List? actions, - bool? centerTitle, - List? expandedWidget, - Key? key, - }); -} diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/bars/bars.dart b/packages/wyatt_ui_components/lib/src/domain/entities/bars/bars.dart index 3334ba20..16fbd451 100644 --- a/packages/wyatt_ui_components/lib/src/domain/entities/bars/bars.dart +++ b/packages/wyatt_ui_components/lib/src/domain/entities/bars/bars.dart @@ -14,6 +14,6 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -export './app_bar_component.dart'; +export 'top_app_bar_component.dart'; export './bottom_navigation_bar_component.dart'; export './top_navigation_bar_component.dart'; diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/bars/app_bar_component.dart b/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_app_bar_component.dart similarity index 90% rename from packages/wyatt_ui_components/lib/src/domain/entities/bars/app_bar_component.dart rename to packages/wyatt_ui_components/lib/src/domain/entities/bars/top_app_bar_component.dart index f13710a2..7be231f2 100644 --- a/packages/wyatt_ui_components/lib/src/domain/entities/bars/app_bar_component.dart +++ b/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_app_bar_component.dart @@ -20,12 +20,12 @@ import 'package:wyatt_component_copy_with_extension/component_copy_with_extensio import 'package:wyatt_ui_components/src/domain/entities/bars/top_bar_component.dart'; import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart'; -part 'app_bar_component.g.dart'; +part 'top_app_bar_component.g.dart'; @ComponentProxyExtension() -abstract class AppBarComponent extends TopBarComponent - with CopyWithMixin<$AppBarComponentCWProxy> { - const AppBarComponent({ +abstract class TopAppBarComponent extends TopBarComponent + with CopyWithMixin<$TopAppBarComponentCWProxy> { + const TopAppBarComponent({ this.title, this.centerTitle, super.shape, diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_app_bar_component.g.dart b/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_app_bar_component.g.dart new file mode 100644 index 00000000..e71c01be --- /dev/null +++ b/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_app_bar_component.g.dart @@ -0,0 +1,55 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'top_app_bar_component.dart'; + +// ************************************************************************** +// ComponentProxyGenerator +// ************************************************************************** + +abstract class $TopAppBarComponentCWProxy { + TopAppBarComponent title(TextWrapper? title); + TopAppBarComponent centerTitle(bool? centerTitle); + TopAppBarComponent shape(ShapeBorder? shape); + TopAppBarComponent systemOverlayStyle( + SystemUiOverlayStyle? systemOverlayStyle); + TopAppBarComponent automaticallyImplyLeading(bool? automaticallyImplyLeading); + TopAppBarComponent flexibleSpace(Widget? flexibleSpace); + TopAppBarComponent bottom(PreferredSizeWidget? bottom); + TopAppBarComponent elevation(double? elevation); + TopAppBarComponent scrolledUnderElevation(double? scrolledUnderElevation); + TopAppBarComponent shadowColor(Color? shadowColor); + TopAppBarComponent surfaceTintColor(Color? surfaceTintColor); + TopAppBarComponent backgroundColor(MultiColor? backgroundColor); + TopAppBarComponent iconTheme(IconThemeData? iconTheme); + TopAppBarComponent primary(bool? primary); + TopAppBarComponent excludeHeaderSemantics(bool? excludeHeaderSemantics); + TopAppBarComponent toolbarHeight(double? toolbarHeight); + TopAppBarComponent leadingWidth(double? leadingWidth); + TopAppBarComponent leading(Widget? leading); + TopAppBarComponent actions(List? actions); + TopAppBarComponent expandedWidget(List? expandedWidget); + TopAppBarComponent key(Key? key); + TopAppBarComponent call({ + TextWrapper? title, + bool? centerTitle, + ShapeBorder? shape, + SystemUiOverlayStyle? systemOverlayStyle, + bool? automaticallyImplyLeading, + Widget? flexibleSpace, + PreferredSizeWidget? bottom, + double? elevation, + double? scrolledUnderElevation, + Color? shadowColor, + Color? surfaceTintColor, + MultiColor? backgroundColor, + IconThemeData? iconTheme, + bool? primary, + bool? excludeHeaderSemantics, + double? toolbarHeight, + double? leadingWidth, + Widget? leading, + List? actions, + List? expandedWidget, + Key? key, + }); +} diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_navigation_bar_component.dart b/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_navigation_bar_component.dart index cb23bf07..a5cc6977 100644 --- a/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_navigation_bar_component.dart +++ b/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_navigation_bar_component.dart @@ -17,22 +17,37 @@ import 'package:flutter/material.dart'; import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart'; import 'package:wyatt_ui_components/src/core/mixins/copy_with_mixin.dart'; -import 'package:wyatt_ui_components/src/domain/entities/component.dart'; +import 'package:wyatt_ui_components/src/domain/entities/bars/top_bar_component.dart'; part 'top_navigation_bar_component.g.dart'; @ComponentProxyExtension() -abstract class TopNavigationBarComponent extends Component +abstract class TopNavigationBarComponent extends TopBarComponent with CopyWithMixin<$TopNavigationBarComponentCWProxy> { const TopNavigationBarComponent({ - this.leading, - this.actions, this.onTap, this.currentIndex = 0, + super.shape, + super.systemOverlayStyle, + super.automaticallyImplyLeading, + super.flexibleSpace, + super.bottom, + super.elevation, + super.scrolledUnderElevation, + super.shadowColor, + super.surfaceTintColor, + super.backgroundColor, + super.iconTheme, + super.primary, + super.excludeHeaderSemantics, + super.toolbarHeight, + super.leadingWidth, + super.leading, + super.actions, + super.expandedWidget, super.key, }); + final int currentIndex; final void Function(BuildContext, int)? onTap; - final Widget? leading; - final List? actions; } diff --git a/packages/wyatt_ui_components/lib/src/features/component_theme_data.dart b/packages/wyatt_ui_components/lib/src/features/component_theme_data.dart index 1f58e87c..71f1b221 100644 --- a/packages/wyatt_ui_components/lib/src/features/component_theme_data.dart +++ b/packages/wyatt_ui_components/lib/src/features/component_theme_data.dart @@ -35,7 +35,7 @@ class ComponentThemeData { this.quoteCardComponent, this.skillCardComponent, }); - final AppBarComponent? appBar; + final TopAppBarComponent? appBar; final TopNavigationBarComponent? topNavigationBarComponent; final BottomNavigationBarComponent? bottomNavigationBar; -- 2.47.2 From 317eb56d66ce6020e32c65e6cf520db3050b14d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malo=20L=C3=A9on?= Date: Wed, 22 Feb 2023 16:13:07 +0100 Subject: [PATCH 10/11] refactor(ui_kit): adapt ui_kit --- .../src/components/app_bars/top_app_bar.dart | 2 +- .../components/app_bars/top_app_bar.g.dart | 16 ++-- .../top_navigation_bar.g.dart | 73 +++++++++++++++++-- 3 files changed, 76 insertions(+), 15 deletions(-) diff --git a/packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.dart b/packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.dart index d8f433d9..4e15d145 100644 --- a/packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.dart +++ b/packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.dart @@ -22,7 +22,7 @@ import 'package:wyatt_ui_kit/wyatt_ui_kit.dart'; part 'top_app_bar.g.dart'; @ComponentCopyWithExtension() -class TopAppBar extends AppBarComponent with $TopAppBarCWMixin { +class TopAppBar extends TopAppBarComponent with $TopAppBarCWMixin { const TopAppBar({ super.systemOverlayStyle, super.automaticallyImplyLeading, diff --git a/packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.g.dart b/packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.g.dart index 88c9e759..fe0baa7a 100644 --- a/packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.g.dart +++ b/packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.g.dart @@ -6,10 +6,14 @@ part of 'top_app_bar.dart'; // ComponentCopyWithGenerator // ************************************************************************** -class $TopAppBarCWProxyImpl implements $AppBarComponentCWProxy { +class $TopAppBarCWProxyImpl implements $TopAppBarComponentCWProxy { const $TopAppBarCWProxyImpl(this._value); final TopAppBar _value; @override + TopAppBar title(TextWrapper? title) => this(title: title); + @override + TopAppBar centerTitle(bool? centerTitle) => this(centerTitle: centerTitle); + @override TopAppBar shape(ShapeBorder? shape) => this(shape: shape); @override TopAppBar systemOverlayStyle(SystemUiOverlayStyle? systemOverlayStyle) => @@ -49,20 +53,18 @@ class $TopAppBarCWProxyImpl implements $AppBarComponentCWProxy { TopAppBar leadingWidth(double? leadingWidth) => this(leadingWidth: leadingWidth); @override - TopAppBar title(TextWrapper? title) => this(title: title); - @override TopAppBar leading(Widget? leading) => this(leading: leading); @override TopAppBar actions(List? actions) => this(actions: actions); @override - TopAppBar centerTitle(bool? centerTitle) => this(centerTitle: centerTitle); - @override TopAppBar expandedWidget(List? expandedWidget) => this(expandedWidget: expandedWidget); @override TopAppBar key(Key? key) => this(key: key); @override TopAppBar call({ + TextWrapper? title, + bool? centerTitle, ShapeBorder? shape, SystemUiOverlayStyle? systemOverlayStyle, bool? automaticallyImplyLeading, @@ -78,10 +80,8 @@ class $TopAppBarCWProxyImpl implements $AppBarComponentCWProxy { bool? excludeHeaderSemantics, double? toolbarHeight, double? leadingWidth, - TextWrapper? title, Widget? leading, List? actions, - bool? centerTitle, List? expandedWidget, Key? key, }) => @@ -114,6 +114,6 @@ class $TopAppBarCWProxyImpl implements $AppBarComponentCWProxy { } mixin $TopAppBarCWMixin on Component { - $AppBarComponentCWProxy get copyWith => + $TopAppBarComponentCWProxy get copyWith => $TopAppBarCWProxyImpl(this as TopAppBar); } diff --git a/packages/wyatt_ui_kit/lib/src/components/top_navigation_bars/top_navigation_bar.g.dart b/packages/wyatt_ui_kit/lib/src/components/top_navigation_bars/top_navigation_bar.g.dart index ba8e5a42..f6e95da2 100644 --- a/packages/wyatt_ui_kit/lib/src/components/top_navigation_bars/top_navigation_bar.g.dart +++ b/packages/wyatt_ui_kit/lib/src/components/top_navigation_bars/top_navigation_bar.g.dart @@ -11,23 +11,84 @@ class $TopNavigationBarCWProxyImpl const $TopNavigationBarCWProxyImpl(this._value); final TopNavigationBar _value; @override - TopNavigationBar leading(Widget? leading) => this(leading: leading); - @override - TopNavigationBar actions(List? actions) => this(actions: actions); - @override TopNavigationBar onTap(void Function(BuildContext, int)? onTap) => this(onTap: onTap); @override TopNavigationBar currentIndex(int? currentIndex) => this(currentIndex: currentIndex); @override + TopNavigationBar shape(ShapeBorder? shape) => this(shape: shape); + @override + TopNavigationBar systemOverlayStyle( + SystemUiOverlayStyle? systemOverlayStyle) => + this(systemOverlayStyle: systemOverlayStyle); + @override + TopNavigationBar automaticallyImplyLeading(bool? automaticallyImplyLeading) => + this(automaticallyImplyLeading: automaticallyImplyLeading); + @override + TopNavigationBar flexibleSpace(Widget? flexibleSpace) => + this(flexibleSpace: flexibleSpace); + @override + TopNavigationBar bottom(PreferredSizeWidget? bottom) => this(bottom: bottom); + @override + TopNavigationBar elevation(double? elevation) => this(elevation: elevation); + @override + TopNavigationBar scrolledUnderElevation(double? scrolledUnderElevation) => + this(scrolledUnderElevation: scrolledUnderElevation); + @override + TopNavigationBar shadowColor(Color? shadowColor) => + this(shadowColor: shadowColor); + @override + TopNavigationBar surfaceTintColor(Color? surfaceTintColor) => + this(surfaceTintColor: surfaceTintColor); + @override + TopNavigationBar backgroundColor(MultiColor? backgroundColor) => + this(backgroundColor: backgroundColor); + @override + TopNavigationBar iconTheme(IconThemeData? iconTheme) => + this(iconTheme: iconTheme); + @override + TopNavigationBar primary(bool? primary) => this(primary: primary); + @override + TopNavigationBar excludeHeaderSemantics(bool? excludeHeaderSemantics) => + this(excludeHeaderSemantics: excludeHeaderSemantics); + @override + TopNavigationBar toolbarHeight(double? toolbarHeight) => + this(toolbarHeight: toolbarHeight); + @override + TopNavigationBar leadingWidth(double? leadingWidth) => + this(leadingWidth: leadingWidth); + @override + TopNavigationBar leading(Widget? leading) => this(leading: leading); + @override + TopNavigationBar actions(List? actions) => this(actions: actions); + @override + TopNavigationBar expandedWidget(List? expandedWidget) => + this(expandedWidget: expandedWidget); + @override TopNavigationBar key(Key? key) => this(key: key); @override TopNavigationBar call({ - Widget? leading, - List? actions, void Function(BuildContext, int)? onTap, int? currentIndex, + ShapeBorder? shape, + SystemUiOverlayStyle? systemOverlayStyle, + bool? automaticallyImplyLeading, + Widget? flexibleSpace, + PreferredSizeWidget? bottom, + double? elevation, + double? scrolledUnderElevation, + Color? shadowColor, + Color? surfaceTintColor, + MultiColor? backgroundColor, + IconThemeData? iconTheme, + bool? primary, + bool? excludeHeaderSemantics, + double? toolbarHeight, + double? leadingWidth, + Widget? leading, + List? actions, + List? expandedWidget, Key? key, }) => TopNavigationBar( -- 2.47.2 From 4a3fde3a1ec3e71ec4d12320ce92622dd2498451 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malo=20L=C3=A9on?= Date: Wed, 22 Feb 2023 17:43:42 +0100 Subject: [PATCH 11/11] feat(ui_kit): implement top nav bar --- .../lib/src/domain/entities/bars/bars.dart | 2 +- .../bars/top_navigation_bar_component.dart | 5 +- .../bars/top_navigation_bar_component.g.dart | 46 +++++- .../assets/images/studio_long_logo.png | Bin 0 -> 27095 bytes .../wyatt_ui_kit/example/lib/bars/bars.dart | 22 +++ .../example/lib/theme/themes.dart | 2 +- ..._app_bar_theme.dart => top_bar_theme.dart} | 34 +++-- .../app_bars.dart => bars/bars.dart} | 3 +- .../{app_bars => bars}/top_app_bar.dart | 23 ++- .../{app_bars => bars}/top_app_bar.g.dart | 4 +- .../components/bars/top_navigation_bar.dart | 135 ++++++++++++++++++ .../top_navigation_bar.g.dart | 28 +++- .../bars/widgets/navigation_item.dart | 73 ++++++++++ .../lib/src/components/components.dart | 2 +- .../top_navigation_bar.dart | 35 ----- .../wyatt_ui_kit/lib/src/domain/domain.dart | 2 +- ...sion.dart => top_bar_theme_extension.dart} | 12 +- 17 files changed, 348 insertions(+), 80 deletions(-) create mode 100644 packages/wyatt_ui_kit/example/assets/images/studio_long_logo.png rename packages/wyatt_ui_kit/example/lib/theme/{top_app_bar_theme.dart => top_bar_theme.dart} (64%) rename packages/wyatt_ui_kit/lib/src/components/{app_bars/app_bars.dart => bars/bars.dart} (91%) rename packages/wyatt_ui_kit/lib/src/components/{app_bars => bars}/top_app_bar.dart (88%) rename packages/wyatt_ui_kit/lib/src/components/{app_bars => bars}/top_app_bar.g.dart (100%) create mode 100644 packages/wyatt_ui_kit/lib/src/components/bars/top_navigation_bar.dart rename packages/wyatt_ui_kit/lib/src/components/{top_navigation_bars => bars}/top_navigation_bar.g.dart (74%) create mode 100644 packages/wyatt_ui_kit/lib/src/components/bars/widgets/navigation_item.dart delete mode 100644 packages/wyatt_ui_kit/lib/src/components/top_navigation_bars/top_navigation_bar.dart rename packages/wyatt_ui_kit/lib/src/domain/{top_app_bar_extension.dart => top_bar_theme_extension.dart} (81%) diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/bars/bars.dart b/packages/wyatt_ui_components/lib/src/domain/entities/bars/bars.dart index 16fbd451..5bd04fd5 100644 --- a/packages/wyatt_ui_components/lib/src/domain/entities/bars/bars.dart +++ b/packages/wyatt_ui_components/lib/src/domain/entities/bars/bars.dart @@ -14,6 +14,6 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -export 'top_app_bar_component.dart'; export './bottom_navigation_bar_component.dart'; export './top_navigation_bar_component.dart'; +export 'top_app_bar_component.dart'; diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_navigation_bar_component.dart b/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_navigation_bar_component.dart index a5cc6977..3f9304ec 100644 --- a/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_navigation_bar_component.dart +++ b/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_navigation_bar_component.dart @@ -15,9 +15,10 @@ // along with this program. If not, see . import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart'; -import 'package:wyatt_ui_components/src/core/mixins/copy_with_mixin.dart'; import 'package:wyatt_ui_components/src/domain/entities/bars/top_bar_component.dart'; +import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart'; part 'top_navigation_bar_component.g.dart'; @@ -25,6 +26,7 @@ part 'top_navigation_bar_component.g.dart'; abstract class TopNavigationBarComponent extends TopBarComponent with CopyWithMixin<$TopNavigationBarComponentCWProxy> { const TopNavigationBarComponent({ + this.navigationItems, this.onTap, this.currentIndex = 0, super.shape, @@ -48,6 +50,7 @@ abstract class TopNavigationBarComponent extends TopBarComponent super.key, }); + final List? navigationItems; final int currentIndex; final void Function(BuildContext, int)? onTap; } diff --git a/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_navigation_bar_component.g.dart b/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_navigation_bar_component.g.dart index 591c9a6e..7d51e749 100644 --- a/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_navigation_bar_component.g.dart +++ b/packages/wyatt_ui_components/lib/src/domain/entities/bars/top_navigation_bar_component.g.dart @@ -7,16 +7,54 @@ part of 'top_navigation_bar_component.dart'; // ************************************************************************** abstract class $TopNavigationBarComponentCWProxy { - TopNavigationBarComponent leading(Widget? leading); - TopNavigationBarComponent actions(List? actions); + TopNavigationBarComponent navigationItems(List? navigationItems); TopNavigationBarComponent onTap(void Function(BuildContext, int)? onTap); TopNavigationBarComponent currentIndex(int? currentIndex); + TopNavigationBarComponent shape(ShapeBorder? shape); + TopNavigationBarComponent systemOverlayStyle( + SystemUiOverlayStyle? systemOverlayStyle); + TopNavigationBarComponent automaticallyImplyLeading( + bool? automaticallyImplyLeading); + TopNavigationBarComponent flexibleSpace(Widget? flexibleSpace); + TopNavigationBarComponent bottom(PreferredSizeWidget? bottom); + TopNavigationBarComponent elevation(double? elevation); + TopNavigationBarComponent scrolledUnderElevation( + double? scrolledUnderElevation); + TopNavigationBarComponent shadowColor(Color? shadowColor); + TopNavigationBarComponent surfaceTintColor(Color? surfaceTintColor); + TopNavigationBarComponent backgroundColor(MultiColor? backgroundColor); + TopNavigationBarComponent iconTheme(IconThemeData? iconTheme); + TopNavigationBarComponent primary(bool? primary); + TopNavigationBarComponent excludeHeaderSemantics( + bool? excludeHeaderSemantics); + TopNavigationBarComponent toolbarHeight(double? toolbarHeight); + TopNavigationBarComponent leadingWidth(double? leadingWidth); + TopNavigationBarComponent leading(Widget? leading); + TopNavigationBarComponent actions(List? actions); + TopNavigationBarComponent expandedWidget(List? expandedWidget); TopNavigationBarComponent key(Key? key); TopNavigationBarComponent call({ - Widget? leading, - List? actions, + List? navigationItems, void Function(BuildContext, int)? onTap, int? currentIndex, + ShapeBorder? shape, + SystemUiOverlayStyle? systemOverlayStyle, + bool? automaticallyImplyLeading, + Widget? flexibleSpace, + PreferredSizeWidget? bottom, + double? elevation, + double? scrolledUnderElevation, + Color? shadowColor, + Color? surfaceTintColor, + MultiColor? backgroundColor, + IconThemeData? iconTheme, + bool? primary, + bool? excludeHeaderSemantics, + double? toolbarHeight, + double? leadingWidth, + Widget? leading, + List? actions, + List? expandedWidget, Key? key, }); } diff --git a/packages/wyatt_ui_kit/example/assets/images/studio_long_logo.png b/packages/wyatt_ui_kit/example/assets/images/studio_long_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8534fdf9379bfe866b37d652724937e803a7e67e GIT binary patch literal 27095 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

_pFM4 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 HNyz^IcN|2; literal 0 HcmV?d00001 diff --git a/packages/wyatt_ui_kit/example/lib/bars/bars.dart b/packages/wyatt_ui_kit/example/lib/bars/bars.dart index 2290e006..c2254916 100644 --- a/packages/wyatt_ui_kit/example/lib/bars/bars.dart +++ b/packages/wyatt_ui_kit/example/lib/bars/bars.dart @@ -61,6 +61,28 @@ class Bars extends DemoPage { ) ], ), + const Gap(20), + TopNavigationBar( + leading: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Image.asset('assets/images/studio_long_logo.png'), + ), + actions: [ + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 20, vertical: 25), + child: FlatButton( + label: 'Estimer mon projet'.wrap(), + ), + ), + ], + navigationItems: [ + 'ACCEUIL'.wrap(), + 'VOTRE PROGRAMME'.wrap(), + 'LE STUDIO'.wrap(), + 'SAVOIR FAIRE'.wrap() + ].whereType().toList(), + ), ], ); diff --git a/packages/wyatt_ui_kit/example/lib/theme/themes.dart b/packages/wyatt_ui_kit/example/lib/theme/themes.dart index e36014d6..08c00bd2 100644 --- a/packages/wyatt_ui_kit/example/lib/theme/themes.dart +++ b/packages/wyatt_ui_kit/example/lib/theme/themes.dart @@ -25,7 +25,7 @@ import 'package:wyatt_ui_kit_example/theme/rich_text_builder_theme.dart'; import 'package:wyatt_ui_kit_example/theme/simple_icon_button_theme.dart'; import 'package:wyatt_ui_kit_example/theme/symbol_button_theme.dart'; import 'package:wyatt_ui_kit_example/theme/text_input_theme.dart'; -import 'package:wyatt_ui_kit_example/theme/top_app_bar_theme.dart'; +import 'package:wyatt_ui_kit_example/theme/top_bar_theme.dart'; /// Easely switch between Material and Studio themes. abstract class Themes { diff --git a/packages/wyatt_ui_kit/example/lib/theme/top_app_bar_theme.dart b/packages/wyatt_ui_kit/example/lib/theme/top_bar_theme.dart similarity index 64% rename from packages/wyatt_ui_kit/example/lib/theme/top_app_bar_theme.dart rename to packages/wyatt_ui_kit/example/lib/theme/top_bar_theme.dart index 8be94e42..218f223e 100644 --- a/packages/wyatt_ui_kit/example/lib/theme/top_app_bar_theme.dart +++ b/packages/wyatt_ui_kit/example/lib/theme/top_bar_theme.dart @@ -3,24 +3,31 @@ import 'package:google_fonts/google_fonts.dart'; import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart'; import 'package:wyatt_ui_kit/wyatt_ui_kit.dart'; -class TopAppBarTheme extends TopAppBarThemeExtension { +class TopAppBarTheme extends TopBarThemeExtension { const TopAppBarTheme({ super.iconTheme, super.backgroundColors, - super.expandedDividerStyle, + super.secondaryColor, super.titleStyle, + super.subTitleStyle, }); factory TopAppBarTheme.light() => TopAppBarTheme( backgroundColors: const MultiColor.single( Color.fromRGBO(246, 246, 246, 1), ), - expandedDividerStyle: Colors.black.withOpacity(0.1), + secondaryColor: const Color.fromRGBO(36, 38, 42, 1), titleStyle: GoogleFonts.montserrat( fontWeight: FontWeight.bold, + color: const Color.fromRGBO(36, 38, 42, 1), fontSize: 18, ), - iconTheme: const IconThemeData(color: Colors.black), + subTitleStyle: GoogleFonts.montserrat( + fontWeight: FontWeight.w400, + color: const Color.fromRGBO(36, 38, 42, 1), + fontSize: 18, + ), + iconTheme: const IconThemeData(color: Color.fromRGBO(36, 38, 42, 1)), ); factory TopAppBarTheme.dark() => TopAppBarTheme( @@ -29,31 +36,35 @@ class TopAppBarTheme extends TopAppBarThemeExtension { Color.fromRGBO(39, 47, 61, 1), Color.fromRGBO(44, 50, 56, 1), ]), - expandedDividerStyle: Colors.white.withOpacity(0.1), + secondaryColor: Colors.white, titleStyle: GoogleFonts.montserrat( fontWeight: FontWeight.bold, fontSize: 18, ), + subTitleStyle: GoogleFonts.montserrat( + fontWeight: FontWeight.w400, + fontSize: 18, + ), iconTheme: const IconThemeData(color: Colors.white), ); @override - ThemeExtension copyWith({ + ThemeExtension copyWith({ IconThemeData? iconTheme, MultiColor? backgroundColors, - Color? expandedDividerStyle, + Color? secondaryColor, TextStyle? titleStyle, }) => TopAppBarTheme( iconTheme: iconTheme ?? this.iconTheme, backgroundColors: backgroundColors ?? this.backgroundColors, - expandedDividerStyle: expandedDividerStyle ?? this.expandedDividerStyle, + secondaryColor: secondaryColor ?? this.secondaryColor, titleStyle: titleStyle ?? this.titleStyle, ); @override - ThemeExtension lerp( - covariant ThemeExtension? other, + ThemeExtension lerp( + covariant ThemeExtension? other, double t, ) { if (other is! TopAppBarTheme) { @@ -63,8 +74,7 @@ class TopAppBarTheme extends TopAppBarThemeExtension { iconTheme: IconThemeData.lerp(iconTheme, other.iconTheme, t), backgroundColors: MultiColor.lerp(backgroundColors, other.backgroundColors, t), - expandedDividerStyle: - Color.lerp(expandedDividerStyle, other.expandedDividerStyle, t), + secondaryColor: Color.lerp(secondaryColor, other.secondaryColor, t), titleStyle: TextStyle.lerp(titleStyle, other.titleStyle, t), ); } diff --git a/packages/wyatt_ui_kit/lib/src/components/app_bars/app_bars.dart b/packages/wyatt_ui_kit/lib/src/components/bars/bars.dart similarity index 91% rename from packages/wyatt_ui_kit/lib/src/components/app_bars/app_bars.dart rename to packages/wyatt_ui_kit/lib/src/components/bars/bars.dart index a7a986ee..f3f8f557 100644 --- a/packages/wyatt_ui_kit/lib/src/components/app_bars/app_bars.dart +++ b/packages/wyatt_ui_kit/lib/src/components/bars/bars.dart @@ -14,4 +14,5 @@ // You should have received a copy of the GNU General Public License // along with super program. If not, see . -export 'top_app_bar.dart'; +export './top_app_bar.dart'; +export './top_navigation_bar.dart'; diff --git a/packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.dart b/packages/wyatt_ui_kit/lib/src/components/bars/top_app_bar.dart similarity index 88% rename from packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.dart rename to packages/wyatt_ui_kit/lib/src/components/bars/top_app_bar.dart index 4e15d145..f915cff7 100644 --- a/packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.dart +++ b/packages/wyatt_ui_kit/lib/src/components/bars/top_app_bar.dart @@ -24,6 +24,8 @@ part 'top_app_bar.g.dart'; @ComponentCopyWithExtension() class TopAppBar extends TopAppBarComponent with $TopAppBarCWMixin { const TopAppBar({ + super.title, + super.centerTitle, super.systemOverlayStyle, super.automaticallyImplyLeading, super.flexibleSpace, @@ -38,10 +40,8 @@ class TopAppBar extends TopAppBarComponent with $TopAppBarCWMixin { super.excludeHeaderSemantics, super.toolbarHeight, super.leadingWidth, - super.title, super.leading, super.actions, - super.centerTitle, super.shape, super.expandedWidget, super.key, @@ -53,9 +53,7 @@ class TopAppBar extends TopAppBarComponent with $TopAppBarCWMixin { gradient: ThemeHelper.getThemeElement( [ backgroundColor, - context - .themeExtension() - ?.backgroundColors, + context.themeExtension()?.backgroundColors, ], valueValidator: (value) => value?.isGradient, transform: (value) => @@ -65,9 +63,7 @@ class TopAppBar extends TopAppBarComponent with $TopAppBarCWMixin { color: ThemeHelper.getThemeElement( [ backgroundColor, - context - .themeExtension() - ?.backgroundColors, + context.themeExtension()?.backgroundColors, ], valueValidator: (value) => value?.isColor, transform: (value) => value?.color, @@ -91,7 +87,7 @@ class TopAppBar extends TopAppBarComponent with $TopAppBarCWMixin { ThemeHelper.getThemeElement( [ iconTheme, - context.themeExtension()?.iconTheme, + context.themeExtension()?.iconTheme, ], valueValidator: (value) => value != null, transform: (value) => value, @@ -105,9 +101,7 @@ class TopAppBar extends TopAppBarComponent with $TopAppBarCWMixin { style: ThemeHelper.getThemeElement( [ title?.style, - context - .themeExtension() - ?.titleStyle + context.themeExtension()?.titleStyle ], valueValidator: (value) => value != null, transform: (value) => value, @@ -123,8 +117,9 @@ class TopAppBar extends TopAppBarComponent with $TopAppBarCWMixin { color: ThemeHelper.getThemeElement( [ context - .themeExtension() - ?.expandedDividerStyle, + .themeExtension() + ?.secondaryColor + ?.withOpacity(0.1), ], valueValidator: (value) => value != null, transform: (value) => value, diff --git a/packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.g.dart b/packages/wyatt_ui_kit/lib/src/components/bars/top_app_bar.g.dart similarity index 100% rename from packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.g.dart rename to packages/wyatt_ui_kit/lib/src/components/bars/top_app_bar.g.dart index fe0baa7a..366e5bbf 100644 --- a/packages/wyatt_ui_kit/lib/src/components/app_bars/top_app_bar.g.dart +++ b/packages/wyatt_ui_kit/lib/src/components/bars/top_app_bar.g.dart @@ -86,6 +86,8 @@ class $TopAppBarCWProxyImpl implements $TopAppBarComponentCWProxy { Key? key, }) => TopAppBar( + title: title ?? _value.title, + centerTitle: centerTitle ?? _value.centerTitle, systemOverlayStyle: systemOverlayStyle ?? _value.systemOverlayStyle, automaticallyImplyLeading: automaticallyImplyLeading ?? _value.automaticallyImplyLeading, @@ -103,10 +105,8 @@ class $TopAppBarCWProxyImpl implements $TopAppBarComponentCWProxy { excludeHeaderSemantics ?? _value.excludeHeaderSemantics, toolbarHeight: toolbarHeight ?? _value.toolbarHeight, leadingWidth: leadingWidth ?? _value.leadingWidth, - title: title ?? _value.title, leading: leading ?? _value.leading, actions: actions ?? _value.actions, - centerTitle: centerTitle ?? _value.centerTitle, shape: shape ?? _value.shape, expandedWidget: expandedWidget ?? _value.expandedWidget, key: key ?? _value.key, diff --git a/packages/wyatt_ui_kit/lib/src/components/bars/top_navigation_bar.dart b/packages/wyatt_ui_kit/lib/src/components/bars/top_navigation_bar.dart new file mode 100644 index 00000000..87d26a6d --- /dev/null +++ b/packages/wyatt_ui_kit/lib/src/components/bars/top_navigation_bar.dart @@ -0,0 +1,135 @@ +// Copyright (C) 2023 WYATT GROUP +// Please see the AUTHORS file for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart'; +import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart'; +import 'package:wyatt_ui_kit/src/components/bars/widgets/navigation_item.dart'; +import 'package:wyatt_ui_kit/wyatt_ui_kit.dart'; + +part 'top_navigation_bar.g.dart'; + +@ComponentCopyWithExtension() +class TopNavigationBar extends TopNavigationBarComponent + with $TopNavigationBarCWMixin { + const TopNavigationBar({ + super.navigationItems, + super.onTap, + super.currentIndex = 0, + super.systemOverlayStyle, + super.automaticallyImplyLeading, + super.flexibleSpace, + super.bottom, + super.elevation, + super.scrolledUnderElevation, + super.shadowColor, + super.surfaceTintColor, + super.backgroundColor, + super.iconTheme, + super.primary, + super.excludeHeaderSemantics, + super.toolbarHeight, + super.leadingWidth, + super.leading, + super.actions, + super.shape, + super.expandedWidget, + super.key, + }); + + @override + Widget build(BuildContext context) => DecoratedBox( + decoration: BoxDecoration( + gradient: ThemeHelper.getThemeElement( + [ + backgroundColor, + context.themeExtension()?.backgroundColors, + ], + valueValidator: (value) => value?.isGradient, + transform: (value) => + LinearGradientHelper.fromNullableColors(value?.colors), + defaultValue: null, + ), + color: ThemeHelper.getThemeElement( + [ + backgroundColor, + context.themeExtension()?.backgroundColors, + ], + valueValidator: (value) => value?.isColor, + transform: (value) => value?.color, + defaultValue: Theme.of(context).appBarTheme.backgroundColor, + ), + ), + child: AppBar( + toolbarHeight: 100, + titleSpacing: 0, + backgroundColor: Colors.transparent, + systemOverlayStyle: systemOverlayStyle, + automaticallyImplyLeading: automaticallyImplyLeading ?? true, + flexibleSpace: flexibleSpace, + bottom: bottom, + elevation: elevation ?? 0, + scrolledUnderElevation: scrolledUnderElevation, + shadowColor: shadowColor, + surfaceTintColor: surfaceTintColor, + iconTheme: ThemeHelper.getThemeElement( + [ + iconTheme, + context.themeExtension()?.iconTheme, + ], + valueValidator: (value) => value != null, + transform: (value) => value, + defaultValue: Theme.of(context).iconTheme, + ), + primary: primary ?? true, + excludeHeaderSemantics: excludeHeaderSemantics ?? false, + leadingWidth: 200, + title: Row( + mainAxisSize: MainAxisSize.min, + children: navigationItems != null + ? navigationItems! + .asMap() + .map( + (key, value) => MapEntry( + key, + Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: () { + onTap?.call(context, key); + }, + child: NavigationItem( + item: value, + selected: key == currentIndex, + ), + ), + ), + ), + ), + ) + .values + .toList() + : [], + ), + leading: leading, + actions: actions, + centerTitle: true, + ), + ); +} diff --git a/packages/wyatt_ui_kit/lib/src/components/top_navigation_bars/top_navigation_bar.g.dart b/packages/wyatt_ui_kit/lib/src/components/bars/top_navigation_bar.g.dart similarity index 74% rename from packages/wyatt_ui_kit/lib/src/components/top_navigation_bars/top_navigation_bar.g.dart rename to packages/wyatt_ui_kit/lib/src/components/bars/top_navigation_bar.g.dart index f6e95da2..591b8704 100644 --- a/packages/wyatt_ui_kit/lib/src/components/top_navigation_bars/top_navigation_bar.g.dart +++ b/packages/wyatt_ui_kit/lib/src/components/bars/top_navigation_bar.g.dart @@ -11,6 +11,9 @@ class $TopNavigationBarCWProxyImpl const $TopNavigationBarCWProxyImpl(this._value); final TopNavigationBar _value; @override + TopNavigationBar navigationItems(List? navigationItems) => + this(navigationItems: navigationItems); + @override TopNavigationBar onTap(void Function(BuildContext, int)? onTap) => this(onTap: onTap); @override @@ -69,6 +72,7 @@ class $TopNavigationBarCWProxyImpl TopNavigationBar key(Key? key) => this(key: key); @override TopNavigationBar call({ + List? navigationItems, void Function(BuildContext, int)? onTap, int? currentIndex, ShapeBorder? shape, @@ -92,10 +96,30 @@ class $TopNavigationBarCWProxyImpl Key? key, }) => TopNavigationBar( - leading: leading ?? _value.leading, - actions: actions ?? _value.actions, + navigationItems: navigationItems ?? _value.navigationItems, onTap: onTap ?? _value.onTap, currentIndex: currentIndex ?? _value.currentIndex, + systemOverlayStyle: systemOverlayStyle ?? _value.systemOverlayStyle, + automaticallyImplyLeading: + automaticallyImplyLeading ?? _value.automaticallyImplyLeading, + flexibleSpace: flexibleSpace ?? _value.flexibleSpace, + bottom: bottom ?? _value.bottom, + elevation: elevation ?? _value.elevation, + scrolledUnderElevation: + scrolledUnderElevation ?? _value.scrolledUnderElevation, + shadowColor: shadowColor ?? _value.shadowColor, + surfaceTintColor: surfaceTintColor ?? _value.surfaceTintColor, + backgroundColor: backgroundColor ?? _value.backgroundColor, + iconTheme: iconTheme ?? _value.iconTheme, + primary: primary ?? _value.primary, + excludeHeaderSemantics: + excludeHeaderSemantics ?? _value.excludeHeaderSemantics, + toolbarHeight: toolbarHeight ?? _value.toolbarHeight, + leadingWidth: leadingWidth ?? _value.leadingWidth, + leading: leading ?? _value.leading, + actions: actions ?? _value.actions, + shape: shape ?? _value.shape, + expandedWidget: expandedWidget ?? _value.expandedWidget, key: key ?? _value.key, ); } diff --git a/packages/wyatt_ui_kit/lib/src/components/bars/widgets/navigation_item.dart b/packages/wyatt_ui_kit/lib/src/components/bars/widgets/navigation_item.dart new file mode 100644 index 00000000..8269445f --- /dev/null +++ b/packages/wyatt_ui_kit/lib/src/components/bars/widgets/navigation_item.dart @@ -0,0 +1,73 @@ +// Copyright (C) 2023 WYATT GROUP +// Please see the AUTHORS file for details. +// +// super program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// any later version. +// +// super program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with super program. If not, see . + +import 'package:flutter/material.dart'; +import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart'; +import 'package:wyatt_ui_kit/wyatt_ui_kit.dart'; + +class NavigationItem extends StatelessWidget { + const NavigationItem({ + required this.item, + required this.selected, + super.key, + }); + final TextWrapper item; + final bool selected; + + @override + Widget build(BuildContext context) => Stack( + alignment: Alignment.bottomCenter, + children: [ + if (selected) + Container( + height: 5, + width: 70, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(100), + color: ThemeHelper.getThemeElement( + [ + context + .themeExtension() + ?.secondaryColor + ], + valueValidator: (value) => value != null, + transform: (value) => value, + defaultValue: Theme.of(context).primaryColor, + ), + ), + ), + SizedBox( + height: 50, + child: Center( + child: Text( + item.data, + style: ThemeHelper.getThemeElement( + [ + item.style, + context + .themeExtension() + ?.subTitleStyle + ], + valueValidator: (value) => value != null, + transform: (value) => value, + defaultValue: context.textTheme.titleMedium, + ), + ), + ), + ), + ], + ); +} diff --git a/packages/wyatt_ui_kit/lib/src/components/components.dart b/packages/wyatt_ui_kit/lib/src/components/components.dart index 9b4c399c..486e2f93 100644 --- a/packages/wyatt_ui_kit/lib/src/components/components.dart +++ b/packages/wyatt_ui_kit/lib/src/components/components.dart @@ -14,10 +14,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -export './app_bars/app_bars.dart'; export './buttons/buttons.dart'; export './cards/cards.dart'; export './gradients/gradients.dart'; export './loader/loader.dart'; export './rich_text_builder/rich_text_builder.dart'; export './text_inputs/text_input.dart'; +export 'bars/bars.dart'; diff --git a/packages/wyatt_ui_kit/lib/src/components/top_navigation_bars/top_navigation_bar.dart b/packages/wyatt_ui_kit/lib/src/components/top_navigation_bars/top_navigation_bar.dart deleted file mode 100644 index d236b884..00000000 --- a/packages/wyatt_ui_kit/lib/src/components/top_navigation_bars/top_navigation_bar.dart +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (C) 2023 WYATT GROUP -// Please see the AUTHORS file for details. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'package:flutter/material.dart'; -import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart'; -import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart'; -part 'top_navigation_bar.g.dart'; - -@ComponentCopyWithExtension() -class TopNavigationBar extends TopNavigationBarComponent - with $TopNavigationBarCWMixin { - const TopNavigationBar({ - super.leading, - super.actions, - super.onTap, - super.currentIndex = 0, - super.key, - }); - - @override - Widget build(BuildContext context) => const Placeholder(); -} diff --git a/packages/wyatt_ui_kit/lib/src/domain/domain.dart b/packages/wyatt_ui_kit/lib/src/domain/domain.dart index 8433530b..6c7c9ab3 100644 --- a/packages/wyatt_ui_kit/lib/src/domain/domain.dart +++ b/packages/wyatt_ui_kit/lib/src/domain/domain.dart @@ -19,4 +19,4 @@ export './card_theme_extension.dart'; export './loader_theme_extension.dart'; export './rich_text_builder_theme_extension.dart'; export './text_input_theme_extension.dart'; -export './top_app_bar_extension.dart'; +export 'top_bar_theme_extension.dart'; diff --git a/packages/wyatt_ui_kit/lib/src/domain/top_app_bar_extension.dart b/packages/wyatt_ui_kit/lib/src/domain/top_bar_theme_extension.dart similarity index 81% rename from packages/wyatt_ui_kit/lib/src/domain/top_app_bar_extension.dart rename to packages/wyatt_ui_kit/lib/src/domain/top_bar_theme_extension.dart index ea6718bb..9bfd3389 100644 --- a/packages/wyatt_ui_kit/lib/src/domain/top_app_bar_extension.dart +++ b/packages/wyatt_ui_kit/lib/src/domain/top_bar_theme_extension.dart @@ -17,18 +17,20 @@ import 'package:flutter/material.dart'; import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart'; -abstract class TopAppBarThemeExtension - extends ThemeExtension { - const TopAppBarThemeExtension({ +abstract class TopBarThemeExtension + extends ThemeExtension { + const TopBarThemeExtension({ this.iconTheme, this.backgroundColors, - this.expandedDividerStyle, + this.secondaryColor, this.titleStyle, + this.subTitleStyle, }); final MultiColor? backgroundColors; final IconThemeData? iconTheme; - final Color? expandedDividerStyle; + final Color? secondaryColor; final TextStyle? titleStyle; + final TextStyle? subTitleStyle; } -- 2.47.2