From 29f00a359fd02ecf7f29e4c6471b62df106085e0 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] 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; +}