From 960a1edb9d77023ba0fc4adac78f0b35e519f708 Mon Sep 17 00:00:00 2001 From: Hugo Pointcheval Date: Wed, 15 Feb 2023 15:57:36 +0100 Subject: [PATCH] feat(ui_kit): add theme extension support in buttons + theme negociation --- .../file_selection_button.g.dart | 28 +- .../file_selection_button_screen.dart | 279 ++++++++++++------ .../buttons/flat_button/flat_button.g.dart | 20 +- .../flat_button/flat_button_screen.dart | 170 +++++------ .../simple_icon_button.dart | 5 - .../simple_icon_button.g.dart | 25 +- .../simple_icon_screen.dart | 108 ++++--- .../symbol_button/symbol_button.g.dart | 24 +- .../symbol_button/symbol_button_screen.dart | 213 ++++++------- .../components/gradients/gradient_icon.dart | 2 +- .../button_theme_extension.dart | 20 ++ ...file_selection_button_theme_extension.dart | 52 ++++ .../flat_button_theme_extension.dart | 44 +++ .../simple_icon_button_theme_extension.dart | 44 +++ .../symbol_button_theme_extension.dart | 48 +++ .../wyatt_ui_kit/lib/src/domain/domain.dart | 18 ++ packages/wyatt_ui_kit/lib/src/src.dart | 18 +- packages/wyatt_ui_kit/lib/wyatt_ui_kit.dart | 2 + 18 files changed, 724 insertions(+), 396 deletions(-) create mode 100644 packages/wyatt_ui_kit/lib/src/domain/button_theme_extension/button_theme_extension.dart create mode 100644 packages/wyatt_ui_kit/lib/src/domain/button_theme_extension/file_selection_button_theme_extension.dart create mode 100644 packages/wyatt_ui_kit/lib/src/domain/button_theme_extension/flat_button_theme_extension.dart create mode 100644 packages/wyatt_ui_kit/lib/src/domain/button_theme_extension/simple_icon_button_theme_extension.dart create mode 100644 packages/wyatt_ui_kit/lib/src/domain/button_theme_extension/symbol_button_theme_extension.dart create mode 100644 packages/wyatt_ui_kit/lib/src/domain/domain.dart diff --git a/packages/wyatt_ui_kit/lib/src/components/buttons/file_selection_button/file_selection_button.g.dart b/packages/wyatt_ui_kit/lib/src/components/buttons/file_selection_button/file_selection_button.g.dart index d70db729..79759e3b 100644 --- a/packages/wyatt_ui_kit/lib/src/components/buttons/file_selection_button/file_selection_button.g.dart +++ b/packages/wyatt_ui_kit/lib/src/components/buttons/file_selection_button/file_selection_button.g.dart @@ -21,25 +21,25 @@ class $FileSelectionButtonCWProxyImpl FileSelectionButton subTitle(TextWrapper? subTitle) => this(subTitle: subTitle); @override - FileSelectionButton disabledStyle(ButtonStyle? disabledStyle) => + FileSelectionButton disabledStyle(ButtonStyle? disabledStyle) => this(disabledStyle: disabledStyle); @override - FileSelectionButton normalStyle(ButtonStyle? normalStyle) => + FileSelectionButton normalStyle(ButtonStyle? normalStyle) => this(normalStyle: normalStyle); @override - FileSelectionButton hoveredStyle(ButtonStyle? hoveredStyle) => + FileSelectionButton hoveredStyle(ButtonStyle? hoveredStyle) => this(hoveredStyle: hoveredStyle); @override - FileSelectionButton focusedStyle(ButtonStyle? focusedStyle) => + FileSelectionButton focusedStyle(ButtonStyle? focusedStyle) => this(focusedStyle: focusedStyle); @override - FileSelectionButton tappedStyle(ButtonStyle? tappedStyle) => + FileSelectionButton tappedStyle(ButtonStyle? tappedStyle) => this(tappedStyle: tappedStyle); @override - FileSelectionButton selectedStyle(ButtonStyle? selectedStyle) => + FileSelectionButton selectedStyle(ButtonStyle? selectedStyle) => this(selectedStyle: selectedStyle); @override - FileSelectionButton invalidStyle(ButtonStyle? invalidStyle) => + FileSelectionButton invalidStyle(ButtonStyle? invalidStyle) => this(invalidStyle: invalidStyle); @override FileSelectionButton onPressed(void Function(ControlState)? onPressed) => @@ -52,13 +52,13 @@ class $FileSelectionButtonCWProxyImpl Widget? leading, TextWrapper? title, TextWrapper? subTitle, - ButtonStyle? disabledStyle, - ButtonStyle? normalStyle, - ButtonStyle? hoveredStyle, - ButtonStyle? focusedStyle, - ButtonStyle? tappedStyle, - ButtonStyle? selectedStyle, - ButtonStyle? invalidStyle, + ButtonStyle? disabledStyle, + ButtonStyle? normalStyle, + ButtonStyle? hoveredStyle, + ButtonStyle? focusedStyle, + ButtonStyle? tappedStyle, + ButtonStyle? selectedStyle, + ButtonStyle? invalidStyle, void Function(ControlState)? onPressed, Key? key, }) => diff --git a/packages/wyatt_ui_kit/lib/src/components/buttons/file_selection_button/file_selection_button_screen.dart b/packages/wyatt_ui_kit/lib/src/components/buttons/file_selection_button/file_selection_button_screen.dart index fd92b971..72196edf 100644 --- a/packages/wyatt_ui_kit/lib/src/components/buttons/file_selection_button/file_selection_button_screen.dart +++ b/packages/wyatt_ui_kit/lib/src/components/buttons/file_selection_button/file_selection_button_screen.dart @@ -25,6 +25,7 @@ import 'package:wyatt_ui_kit/src/components/buttons/cubit/invalid_button_cubit.d import 'package:wyatt_ui_kit/src/components/gradients/gradient_text.dart'; import 'package:wyatt_ui_kit/src/core/extensions/theme_extensions.dart'; import 'package:wyatt_ui_kit/src/core/helpers/linear_gradient_helper.dart'; +import 'package:wyatt_ui_kit/src/domain/button_theme_extension/file_selection_button_theme_extension.dart'; class FileSelectionButtonScreen extends CubitScreen { @@ -47,6 +48,7 @@ class FileSelectionButtonScreen final Widget? leading; final TextWrapper? title; final TextWrapper? subTitle; + final MainAxisSize? mainAxisSize; final FileSelectionButtonStyle? disabledStyle; final FileSelectionButtonStyle? normalStyle; @@ -58,44 +60,164 @@ class FileSelectionButtonScreen final void Function(ControlState state)? onPressed; - final MainAxisSize? mainAxisSize; - @override InvalidButtonCubit create(BuildContext context) => InvalidButtonCubit(); - @override - Widget onBuild(BuildContext context, ButtonState state) { - // Set a default style - FileSelectionButtonStyle? style = - normalStyle ?? const FileSelectionButtonStyle(); + /// Negotiate the theme to get a complete style. + FileSelectionButtonStyle negotiate(BuildContext context, ButtonState state) { + // Define default style from Flutter values. + FileSelectionButtonStyle style = + FileSelectionButtonStyle.fromFlutter(context); + + // Try to retrieve custom theme extension + final fileSelectionButtonThemeExtension = + context.themeExtension(); switch (state.state) { case ControlState.disabled: - style = disabledStyle ?? style; + style = disabledStyle ?? + fileSelectionButtonThemeExtension?.disabledStyle ?? + style.copyWith( + foregroundColors: + MultiColor.single(context.colorScheme.onSurface), + backgroundColors: MultiColor.single(context.colorScheme.surface), + ); break; case ControlState.hovered: - style = hoveredStyle ?? style; + style = hoveredStyle ?? + fileSelectionButtonThemeExtension?.hoveredStyle ?? + style; break; case ControlState.tapped: - style = tappedStyle ?? style; + style = tappedStyle ?? + fileSelectionButtonThemeExtension?.tappedStyle ?? + style; break; case ControlState.focused: - style = focusedStyle ?? style; + style = focusedStyle ?? + fileSelectionButtonThemeExtension?.focusedStyle ?? + style; break; case ControlState.normal: - // already done + style = normalStyle ?? + fileSelectionButtonThemeExtension?.normalStyle ?? + style; break; } + // Apply extra theme if (state.isSelected) { - style = selectedStyle ?? style; + // TODO(hpcl): enhance copyWith to copy only non-null attributes of an object + style = style.copyWith( + title: (selectedStyle ?? + fileSelectionButtonThemeExtension?.selectedStyle ?? + style) + .title, + subTitle: (selectedStyle ?? + fileSelectionButtonThemeExtension?.selectedStyle ?? + style) + .subTitle, + radius: (selectedStyle ?? + fileSelectionButtonThemeExtension?.selectedStyle ?? + style) + .radius, + padding: (selectedStyle ?? + fileSelectionButtonThemeExtension?.selectedStyle ?? + style) + .padding, + foregroundColors: (selectedStyle ?? + fileSelectionButtonThemeExtension?.selectedStyle ?? + style) + .foregroundColors, + backgroundColors: (selectedStyle ?? + fileSelectionButtonThemeExtension?.selectedStyle ?? + style) + .backgroundColors, + borderColors: (selectedStyle ?? + fileSelectionButtonThemeExtension?.selectedStyle ?? + style) + .borderColors, + stroke: (selectedStyle ?? + fileSelectionButtonThemeExtension?.selectedStyle ?? + style) + .stroke, + shadow: (selectedStyle ?? + fileSelectionButtonThemeExtension?.selectedStyle ?? + style) + .shadow, + ); } if (state.isInvalid) { - style = invalidStyle ?? style; + // TODO(hpcl): enhance copyWith to copy only non-null attributes of an object + style = style.copyWith( + title: (invalidStyle ?? + fileSelectionButtonThemeExtension?.invalidStyle ?? + style) + .title, + subTitle: (invalidStyle ?? + fileSelectionButtonThemeExtension?.invalidStyle ?? + style) + .subTitle, + radius: (invalidStyle ?? + fileSelectionButtonThemeExtension?.invalidStyle ?? + style) + .radius, + padding: (invalidStyle ?? + fileSelectionButtonThemeExtension?.invalidStyle ?? + style) + .padding, + foregroundColors: (invalidStyle ?? + fileSelectionButtonThemeExtension?.invalidStyle ?? + style) + .foregroundColors, + backgroundColors: (invalidStyle ?? + fileSelectionButtonThemeExtension?.invalidStyle ?? + style) + .backgroundColors, + borderColors: (invalidStyle ?? + fileSelectionButtonThemeExtension?.invalidStyle ?? + style) + .borderColors, + stroke: (invalidStyle ?? + fileSelectionButtonThemeExtension?.invalidStyle ?? + style) + .stroke, + shadow: (invalidStyle ?? + fileSelectionButtonThemeExtension?.invalidStyle ?? + style) + .shadow, + ); } - print(state); + return style; + } + + Widget _border( + BuildContext context, + FileSelectionButtonStyle style, + Widget child, + ) { + if (style.borderColors != null && style.stroke != null) { + return DottedBorder( + padding: EdgeInsets.zero, + dashPattern: const [5, 5], + strokeWidth: style.stroke!, + color: style.borderColors!.color, + borderType: BorderType.RRect, + radius: + style.radius?.resolve(TextDirection.ltr).bottomLeft ?? Radius.zero, + strokeCap: StrokeCap.square, + child: child, + ); + } else { + return child; + } + } + + @override + Widget onBuild(BuildContext context, ButtonState state) { + final style = negotiate(context, state); return Focus( onFocusChange: (hasFocus) => @@ -128,18 +250,12 @@ class FileSelectionButtonScreen onPressed?.call(state.state); bloc(context).onClickUpOut(); }, - child: DottedBorder( - padding: EdgeInsets.zero, - dashPattern: const [5, 5], - strokeWidth: style.stroke ?? 3, - color: style.borderColors?.color ?? context.colorScheme.primary, - borderType: BorderType.RRect, - radius: Radius.circular(style.radius ?? 0), - strokeCap: StrokeCap.square, - child: DecoratedBox( + child: _border( + context, + style, + DecoratedBox( decoration: BoxDecoration( - color: style.backgroundColors?.color ?? - context.colorScheme.primary, + color: style.backgroundColors?.color, // if no gradient colors => no default value gradient: (style.backgroundColors?.isGradient ?? false) ? LinearGradient( @@ -149,9 +265,7 @@ class FileSelectionButtonScreen boxShadow: [ if (style.shadow != null) ...[style.shadow!] ], - borderRadius: BorderRadius.all( - Radius.circular(style.radius ?? 0), - ), + borderRadius: style.radius, ), child: ConstrainedBox( constraints: const BoxConstraints( @@ -159,81 +273,70 @@ class FileSelectionButtonScreen minHeight: 50, ), // min sizes for Material buttons child: Padding( - padding: EdgeInsets.all(style.padding ?? 0), + padding: style.padding ?? EdgeInsets.zero, child: Row( mainAxisSize: mainAxisSize ?? MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ if (leading != null) ...[ leading ?? const SizedBox.shrink(), - Gap(style.padding ?? 10), + Gap(style.padding?.horizontal ?? 10), ], - - // Choose color - // label.style.color ?? - // buttonStyle.foregroundColor.color ?? - // context.textTheme.titleLarge.color - // - // Choose gradient - // label.gradient ?? - // buttonStyle.foregroundColor.colors ?? - // null Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, children: [ + /// Choose color + /// title.style.color ?? + /// buttonStyle.title.style.color ?? + /// context.textTheme.titleLarge.color + /// + /// Choose gradient + /// title.gradient ?? + /// buttonStyle.foregroundColor.colors ?? + /// null + /// + /// More infos in `negociate()` method if (title != null) ...[ - Builder( - builder: (context) { - final color = title?.style?.color ?? - style?.foregroundColors?.color ?? - context.textTheme.titleLarge?.color; - final buttonStyleGradient = - (style?.foregroundColors?.isGradient ?? + Gap(style.padding?.horizontal ?? 10), + Text( + title!.text, + style: title!.style ?? style.title, + ).toGradient( + LinearGradientHelper.fromNullableColors( + title?.gradient ?? + ((style.foregroundColors?.isGradient ?? false) - ? style?.foregroundColors?.colors - : null; - final gradient = - title?.gradient ?? buttonStyleGradient; - - return Text( - title!.text, - style: (title!.style ?? - context.textTheme.titleLarge) - ?.copyWith(color: color), - ).toGradient( - LinearGradientHelper.fromNullableColors( - gradient, - ), - ); - }, + ? style.foregroundColors?.colors + : null), + ), ), ], - if (subTitle != null) ...[ - Builder( - builder: (context) { - final color = subTitle?.style?.color ?? - style?.foregroundColors?.color ?? - context.textTheme.bodyMedium?.color; - final buttonStyleGradient = - (style?.foregroundColors?.isGradient ?? - false) - ? style?.foregroundColors?.colors - : null; - final gradient = - subTitle?.gradient ?? buttonStyleGradient; - return Text( - subTitle!.text, - style: (subTitle!.style ?? - context.textTheme.bodyMedium) - ?.copyWith(color: color), - ).toGradient( - LinearGradientHelper.fromNullableColors( - gradient, - ), - ); - }, + /// Choose color + /// subTitle.style.color ?? + /// buttonStyle.subTitle.style.color ?? + /// context.textTheme.subTitleLarge.color + /// + /// Choose gradient + /// subTitle.gradient ?? + /// buttonStyle.foregroundColor.colors ?? + /// null + /// + /// More infos in `negociate()` method + if (subTitle != null) ...[ + Gap(style.padding?.horizontal ?? 10), + Text( + subTitle!.text, + style: subTitle!.style ?? style.subTitle, + ).toGradient( + LinearGradientHelper.fromNullableColors( + subTitle?.gradient ?? + ((style.foregroundColors?.isGradient ?? + false) + ? style.foregroundColors?.colors + : null), + ), ), ], ], diff --git a/packages/wyatt_ui_kit/lib/src/components/buttons/flat_button/flat_button.g.dart b/packages/wyatt_ui_kit/lib/src/components/buttons/flat_button/flat_button.g.dart index 379f13ba..87ed36e1 100644 --- a/packages/wyatt_ui_kit/lib/src/components/buttons/flat_button/flat_button.g.dart +++ b/packages/wyatt_ui_kit/lib/src/components/buttons/flat_button/flat_button.g.dart @@ -19,19 +19,19 @@ class $FlatButtonCWProxyImpl implements $FlatButtonComponentCWProxy { @override FlatButton label(TextWrapper? label) => this(label: label); @override - FlatButton disabledStyle(ButtonStyle? disabledStyle) => + FlatButton disabledStyle(ButtonStyle? disabledStyle) => this(disabledStyle: disabledStyle); @override - FlatButton normalStyle(ButtonStyle? normalStyle) => + FlatButton normalStyle(ButtonStyle? normalStyle) => this(normalStyle: normalStyle); @override - FlatButton hoveredStyle(ButtonStyle? hoveredStyle) => + FlatButton hoveredStyle(ButtonStyle? hoveredStyle) => this(hoveredStyle: hoveredStyle); @override - FlatButton focusedStyle(ButtonStyle? focusedStyle) => + FlatButton focusedStyle(ButtonStyle? focusedStyle) => this(focusedStyle: focusedStyle); @override - FlatButton tappedStyle(ButtonStyle? tappedStyle) => + FlatButton tappedStyle(ButtonStyle? tappedStyle) => this(tappedStyle: tappedStyle); @override FlatButton onPressed(void Function(ControlState)? onPressed) => @@ -44,11 +44,11 @@ class $FlatButtonCWProxyImpl implements $FlatButtonComponentCWProxy { Widget? prefix, Widget? suffix, TextWrapper? label, - ButtonStyle? disabledStyle, - ButtonStyle? normalStyle, - ButtonStyle? hoveredStyle, - ButtonStyle? focusedStyle, - ButtonStyle? tappedStyle, + ButtonStyle? disabledStyle, + ButtonStyle? normalStyle, + ButtonStyle? hoveredStyle, + ButtonStyle? focusedStyle, + ButtonStyle? tappedStyle, void Function(ControlState)? onPressed, Key? key, }) => diff --git a/packages/wyatt_ui_kit/lib/src/components/buttons/flat_button/flat_button_screen.dart b/packages/wyatt_ui_kit/lib/src/components/buttons/flat_button/flat_button_screen.dart index 050ab61e..2ef0d172 100644 --- a/packages/wyatt_ui_kit/lib/src/components/buttons/flat_button/flat_button_screen.dart +++ b/packages/wyatt_ui_kit/lib/src/components/buttons/flat_button/flat_button_screen.dart @@ -24,6 +24,7 @@ import 'package:wyatt_ui_kit/src/components/gradients/gradient_box_border.dart'; import 'package:wyatt_ui_kit/src/components/gradients/gradient_text.dart'; import 'package:wyatt_ui_kit/src/core/extensions/theme_extensions.dart'; import 'package:wyatt_ui_kit/src/core/helpers/linear_gradient_helper.dart'; +import 'package:wyatt_ui_kit/src/domain/button_theme_extension/flat_button_theme_extension.dart'; class FlatButtonScreen extends CubitScreen { const FlatButtonScreen({ @@ -43,6 +44,7 @@ class FlatButtonScreen extends CubitScreen { final Widget? prefix; final Widget? suffix; final TextWrapper? label; + final MainAxisSize? mainAxisSize; final FlatButtonStyle? disabledStyle; final FlatButtonStyle? normalStyle; @@ -52,34 +54,49 @@ class FlatButtonScreen extends CubitScreen { final void Function(ControlState state)? onPressed; - final MainAxisSize? mainAxisSize; - @override ButtonCubit create(BuildContext context) => ButtonCubit(); - @override - Widget onBuild(BuildContext context, ButtonState state) { - // Set a default style - FlatButtonStyle? style = normalStyle ?? const FlatButtonStyle(); + /// Negotiate the theme to get a complete style. + FlatButtonStyle negotiate(BuildContext context, ControlState state) { + // Define default style from Flutter values. + FlatButtonStyle style = FlatButtonStyle.fromFlutter(context); - switch (state.state) { + // Try to retrieve custom theme extension + final flatButtonThemeExtension = + context.themeExtension(); + + switch (state) { case ControlState.disabled: - style = disabledStyle ?? style; + style = disabledStyle ?? + flatButtonThemeExtension?.disabledStyle ?? + style.copyWith( + foregroundColors: + MultiColor.single(context.colorScheme.onSurface), + backgroundColors: MultiColor.single(context.colorScheme.surface), + ); break; case ControlState.hovered: - style = hoveredStyle ?? style; + style = hoveredStyle ?? flatButtonThemeExtension?.hoveredStyle ?? style; break; case ControlState.tapped: - style = tappedStyle ?? style; + style = tappedStyle ?? flatButtonThemeExtension?.tappedStyle ?? style; break; case ControlState.focused: - style = focusedStyle ?? style; + style = focusedStyle ?? flatButtonThemeExtension?.focusedStyle ?? style; break; case ControlState.normal: - // already done + style = normalStyle ?? flatButtonThemeExtension?.normalStyle ?? style; break; } + return style; + } + + @override + Widget onBuild(BuildContext context, ButtonState state) { + final style = negotiate(context, state.state); + return Focus( onFocusChange: (hasFocus) => hasFocus ? bloc(context).onFocus() : bloc(context).onUnfocus(), @@ -113,20 +130,19 @@ class FlatButtonScreen extends CubitScreen { }, child: DecoratedBox( decoration: BoxDecoration( - color: style.backgroundColors?.color ?? - context.colorScheme.primary, + color: style.backgroundColors?.color, // If no border color => no default value - border: (style.borderColors != null) + border: (style.borderColors != null && style.stroke != null) ? (style.borderColors?.isGradient ?? false) ? GradientBoxBorder( gradient: LinearGradient( colors: style.borderColors!.colors, ), - width: style.stroke ?? 2, + width: style.stroke!, ) : Border.all( color: style.borderColors!.color, - width: style.stroke ?? 2, + width: style.stroke!, ) : null, // if no gradient colors => no default value @@ -138,9 +154,7 @@ class FlatButtonScreen extends CubitScreen { boxShadow: [ if (style.shadow != null) ...[style.shadow!] ], - borderRadius: BorderRadius.all( - Radius.circular(style.radius ?? 0), - ), + borderRadius: style.radius, ), child: ConstrainedBox( constraints: const BoxConstraints( @@ -148,76 +162,62 @@ class FlatButtonScreen extends CubitScreen { minHeight: 36, ), // min sizes for Material buttons child: Padding( - padding: EdgeInsets.all(style.padding ?? 0), + padding: style.padding ?? EdgeInsets.zero, child: Row( mainAxisSize: mainAxisSize ?? MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Builder( - builder: (context) { - final color = style?.foregroundColors?.color; - if (color != null) { - return ColorFiltered( - colorFilter: - ColorFilter.mode(color, BlendMode.srcIn), - child: prefix ?? const SizedBox.shrink(), - ); - } else { - return prefix ?? const SizedBox.shrink(); - } - }, - ), - Gap(style.padding ?? 10), - // Choose color - // label.style.color ?? - // buttonStyle.foregroundColor.color ?? - // context.textTheme.titleLarge.color - // - // Choose gradient - // label.gradient ?? - // buttonStyle.foregroundColor.colors ?? - // null - if (label != null) ...[ - Builder( - builder: (context) { - final color = label?.style?.color ?? - style?.foregroundColors?.color ?? - context.textTheme.titleLarge?.color; - final buttonStyleGradient = - (style?.foregroundColors?.isGradient ?? false) - ? style?.foregroundColors?.colors - : null; - final gradient = - label?.gradient ?? buttonStyleGradient; - - return Text( - label!.text, - style: - (label!.style ?? context.textTheme.titleLarge) - ?.copyWith(color: color), - ).toGradient( - LinearGradientHelper.fromNullableColors( - gradient, - ), - ); - }, - ), + if (style.foregroundColors?.color != null && + prefix != null) ...[ + ColorFiltered( + colorFilter: ColorFilter.mode( + style.foregroundColors!.color, + BlendMode.srcIn, + ), + child: prefix, + ) + ] else ...[ + prefix ?? const SizedBox.shrink() + ], + Gap(style.padding?.vertical ?? 10), + + /// Choose color + /// label.style.color ?? + /// buttonStyle.label.style.color ?? + /// context.textTheme.labelLarge.color + /// + /// Choose gradient + /// label.gradient ?? + /// buttonStyle.foregroundColor.colors ?? + /// null + /// + /// More infos in `negociate()` method + if (label != null) ...[ + Text( + label!.text, + style: label!.style ?? style.label, + ).toGradient( + LinearGradientHelper.fromNullableColors( + label?.gradient ?? + ((style.foregroundColors?.isGradient ?? false) + ? style.foregroundColors?.colors + : null), + ), + ) + ], + Gap(style.padding?.vertical ?? 10), + if (style.foregroundColors?.color != null && + suffix != null) ...[ + ColorFiltered( + colorFilter: ColorFilter.mode( + style.foregroundColors!.color, + BlendMode.srcIn, + ), + child: suffix, + ) + ] else ...[ + suffix ?? const SizedBox.shrink() ], - Gap(style.padding ?? 10), - Builder( - builder: (context) { - final color = style?.foregroundColors?.color; - if (color != null) { - return ColorFiltered( - colorFilter: - ColorFilter.mode(color, BlendMode.srcIn), - child: suffix ?? const SizedBox.shrink(), - ); - } else { - return suffix ?? const SizedBox.shrink(); - } - }, - ), ], ), ), diff --git a/packages/wyatt_ui_kit/lib/src/components/buttons/simple_icon_button/simple_icon_button.dart b/packages/wyatt_ui_kit/lib/src/components/buttons/simple_icon_button/simple_icon_button.dart index db4a188e..76a6b4bb 100644 --- a/packages/wyatt_ui_kit/lib/src/components/buttons/simple_icon_button/simple_icon_button.dart +++ b/packages/wyatt_ui_kit/lib/src/components/buttons/simple_icon_button/simple_icon_button.dart @@ -33,7 +33,6 @@ class SimpleIconButton extends SimpleIconButtonComponent super.hoveredStyle, super.focusedStyle, super.tappedStyle, - super.selectedStyle, super.onPressed, super.key, }); @@ -63,9 +62,6 @@ class SimpleIconButton extends SimpleIconButtonComponent SimpleIconButtonStyle? get tappedStyle => super.tappedStyle as SimpleIconButtonStyle?; - @override - SimpleIconButtonStyle? get selectedStyle => - super.selectedStyle as SimpleIconButtonStyle?; @override Widget build(BuildContext context) => exportBloc( @@ -76,7 +72,6 @@ class SimpleIconButton extends SimpleIconButtonComponent hoveredStyle: hoveredStyle, focusedStyle: focusedStyle, tappedStyle: tappedStyle, - selectedStyle: selectedStyle, onPressed: onPressed, key: key, ), diff --git a/packages/wyatt_ui_kit/lib/src/components/buttons/simple_icon_button/simple_icon_button.g.dart b/packages/wyatt_ui_kit/lib/src/components/buttons/simple_icon_button/simple_icon_button.g.dart index 87f97ab8..b846f4f6 100644 --- a/packages/wyatt_ui_kit/lib/src/components/buttons/simple_icon_button/simple_icon_button.g.dart +++ b/packages/wyatt_ui_kit/lib/src/components/buttons/simple_icon_button/simple_icon_button.g.dart @@ -13,24 +13,21 @@ class $SimpleIconButtonCWProxyImpl @override SimpleIconButton icon(Icon? icon) => this(icon: icon); @override - SimpleIconButton disabledStyle(ButtonStyle? disabledStyle) => + SimpleIconButton disabledStyle(ButtonStyle? disabledStyle) => this(disabledStyle: disabledStyle); @override - SimpleIconButton normalStyle(ButtonStyle? normalStyle) => + SimpleIconButton normalStyle(ButtonStyle? normalStyle) => this(normalStyle: normalStyle); @override - SimpleIconButton hoveredStyle(ButtonStyle? hoveredStyle) => + SimpleIconButton hoveredStyle(ButtonStyle? hoveredStyle) => this(hoveredStyle: hoveredStyle); @override - SimpleIconButton focusedStyle(ButtonStyle? focusedStyle) => + SimpleIconButton focusedStyle(ButtonStyle? focusedStyle) => this(focusedStyle: focusedStyle); @override - SimpleIconButton tappedStyle(ButtonStyle? tappedStyle) => + SimpleIconButton tappedStyle(ButtonStyle? tappedStyle) => this(tappedStyle: tappedStyle); @override - SimpleIconButton selectedStyle(ButtonStyle? selectedStyle) => - this(selectedStyle: selectedStyle); - @override SimpleIconButton onPressed(void Function(ControlState)? onPressed) => this(onPressed: onPressed); @override @@ -38,12 +35,11 @@ class $SimpleIconButtonCWProxyImpl @override SimpleIconButton call({ Icon? icon, - ButtonStyle? disabledStyle, - ButtonStyle? normalStyle, - ButtonStyle? hoveredStyle, - ButtonStyle? focusedStyle, - ButtonStyle? tappedStyle, - ButtonStyle? selectedStyle, + ButtonStyle? disabledStyle, + ButtonStyle? normalStyle, + ButtonStyle? hoveredStyle, + ButtonStyle? focusedStyle, + ButtonStyle? tappedStyle, void Function(ControlState)? onPressed, Key? key, }) => @@ -54,7 +50,6 @@ class $SimpleIconButtonCWProxyImpl hoveredStyle: hoveredStyle ?? _value.hoveredStyle, focusedStyle: focusedStyle ?? _value.focusedStyle, tappedStyle: tappedStyle ?? _value.tappedStyle, - selectedStyle: selectedStyle ?? _value.selectedStyle, onPressed: onPressed ?? _value.onPressed, key: key ?? _value.key, ); diff --git a/packages/wyatt_ui_kit/lib/src/components/buttons/simple_icon_button/simple_icon_screen.dart b/packages/wyatt_ui_kit/lib/src/components/buttons/simple_icon_button/simple_icon_screen.dart index 64e5bc49..bceab017 100644 --- a/packages/wyatt_ui_kit/lib/src/components/buttons/simple_icon_button/simple_icon_screen.dart +++ b/packages/wyatt_ui_kit/lib/src/components/buttons/simple_icon_button/simple_icon_screen.dart @@ -20,7 +20,10 @@ import 'package:wyatt_bloc_helper/wyatt_bloc_helper.dart'; import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart'; import 'package:wyatt_ui_kit/src/components/buttons/cubit/button_cubit.dart'; import 'package:wyatt_ui_kit/src/components/gradients/gradient_box_border.dart'; +import 'package:wyatt_ui_kit/src/components/gradients/gradient_icon.dart'; import 'package:wyatt_ui_kit/src/core/extensions/theme_extensions.dart'; +import 'package:wyatt_ui_kit/src/core/helpers/linear_gradient_helper.dart'; +import 'package:wyatt_ui_kit/src/domain/button_theme_extension/simple_icon_button_theme_extension.dart'; class SimpleIconButtonScreen extends CubitScreen { const SimpleIconButtonScreen({ @@ -30,7 +33,6 @@ class SimpleIconButtonScreen extends CubitScreen { this.hoveredStyle, this.focusedStyle, this.tappedStyle, - this.selectedStyle, this.onPressed, super.key, }); @@ -42,35 +44,58 @@ class SimpleIconButtonScreen extends CubitScreen { final SimpleIconButtonStyle? hoveredStyle; final SimpleIconButtonStyle? focusedStyle; final SimpleIconButtonStyle? tappedStyle; - final SimpleIconButtonStyle? selectedStyle; final void Function(ControlState state)? onPressed; @override ButtonCubit create(BuildContext context) => ButtonCubit(); - @override - Widget onBuild(BuildContext context, ButtonState state) { - // Set a default style - SimpleIconButtonStyle? style = normalStyle ?? const SimpleIconButtonStyle(); + /// Negotiate the theme to get a complete style. + SimpleIconButtonStyle negotiate(BuildContext context, ControlState state) { + // Define default style from Flutter values. + SimpleIconButtonStyle style = SimpleIconButtonStyle.fromFlutter(context); - switch (state.state) { + // Try to retrieve custom theme extension + final simpleIconButtonThemeExtension = + context.themeExtension(); + + switch (state) { case ControlState.disabled: - style = disabledStyle ?? style; + style = disabledStyle ?? + simpleIconButtonThemeExtension?.disabledStyle ?? + style.copyWith( + foregroundColors: + MultiColor.single(context.colorScheme.onSurface), + backgroundColors: MultiColor.single(context.colorScheme.surface), + ); break; case ControlState.hovered: - style = hoveredStyle ?? style; + style = hoveredStyle ?? + simpleIconButtonThemeExtension?.hoveredStyle ?? + style; break; case ControlState.tapped: - style = tappedStyle ?? style; + style = + tappedStyle ?? simpleIconButtonThemeExtension?.tappedStyle ?? style; break; case ControlState.focused: - style = focusedStyle ?? style; + style = focusedStyle ?? + simpleIconButtonThemeExtension?.focusedStyle ?? + style; break; case ControlState.normal: + style = + normalStyle ?? simpleIconButtonThemeExtension?.normalStyle ?? style; break; } + return style; + } + + @override + Widget onBuild(BuildContext context, ButtonState state) { + final style = negotiate(context, state.state); + return Focus( onFocusChange: (hasFocus) => hasFocus ? bloc(context).onFocus() : bloc(context).onUnfocus(), @@ -104,25 +129,24 @@ class SimpleIconButtonScreen extends CubitScreen { bloc(context).onClickUpOut(); }, child: SizedBox.square( - dimension: style.dimension ?? 30, + dimension: style.dimension, child: AspectRatio( aspectRatio: 1, child: DecoratedBox( decoration: BoxDecoration( - color: style.backgroundColors?.color ?? - context.colorScheme.tertiary, + color: style.backgroundColors?.color, // If no border color => no default value - border: (style.borderColors != null) + border: (style.borderColors != null && style.stroke != null) ? (style.borderColors?.isGradient ?? false) ? GradientBoxBorder( gradient: LinearGradient( colors: style.borderColors!.colors, ), - width: style.stroke ?? 2, + width: style.stroke!, ) : Border.all( color: style.borderColors!.color, - width: style.stroke ?? 2, + width: style.stroke!, ) : null, // if no gradient colors => no default value @@ -134,52 +158,40 @@ class SimpleIconButtonScreen extends CubitScreen { boxShadow: [ if (style.shadow != null) ...[style.shadow!] ], - borderRadius: BorderRadius.all( - Radius.circular(style.radius ?? 0), - ), + borderRadius: style.radius, ), child: ConstrainedBox( constraints: BoxConstraints( minWidth: style.dimension ?? 30, - ), // min sizes for Material buttons + ), child: Padding( - padding: EdgeInsets.all(style.padding ?? 0), + padding: style.padding ?? EdgeInsets.zero, child: Center( - // Choose color - // button.foreground.colors (gradient) ?? - // buttonStyle.foregroundColor.color ?? - // context.colorScheme.onTertiary + /// Choose color + /// icon.color ?? + /// button.foregroundColors.colors ?? + /// buttonStyle.foregroundColors.colors ?? + /// context.buttonTheme.onPrimary child: Builder( builder: (context) { if (icon?.color != null) { return icon!; } - final gradient = - (style?.foregroundColors?.isGradient ?? false) - ? LinearGradient( - colors: style!.foregroundColors!.colors, - ) - : null; - final color = style?.foregroundColors?.color ?? - context.colorScheme.onTertiary; - if (gradient != null) { - return ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (bounds) => gradient.createShader( - Rect.fromLTWH( - 0, - 0, - bounds.width, - bounds.height, - ), + + if (!(style.foregroundColors?.isGradient ?? false)) { + return ColorFiltered( + colorFilter: ColorFilter.mode( + style.foregroundColors!.color, + BlendMode.srcIn, ), child: icon, ); } - return ColorFiltered( - colorFilter: - ColorFilter.mode(color, BlendMode.srcIn), - child: icon, + + return icon!.toGradient( + LinearGradientHelper.fromMultiColor( + style.foregroundColors!, + ), ); }, ), diff --git a/packages/wyatt_ui_kit/lib/src/components/buttons/symbol_button/symbol_button.g.dart b/packages/wyatt_ui_kit/lib/src/components/buttons/symbol_button/symbol_button.g.dart index 7aa6b439..f6f8d9ca 100644 --- a/packages/wyatt_ui_kit/lib/src/components/buttons/symbol_button/symbol_button.g.dart +++ b/packages/wyatt_ui_kit/lib/src/components/buttons/symbol_button/symbol_button.g.dart @@ -17,22 +17,22 @@ class $SymbolButtonCWProxyImpl implements $SymbolButtonComponentCWProxy { @override SymbolButton icon(Widget? icon) => this(icon: icon); @override - SymbolButton disabledStyle(ButtonStyle? disabledStyle) => + SymbolButton disabledStyle(ButtonStyle? disabledStyle) => this(disabledStyle: disabledStyle); @override - SymbolButton normalStyle(ButtonStyle? normalStyle) => + SymbolButton normalStyle(ButtonStyle? normalStyle) => this(normalStyle: normalStyle); @override - SymbolButton hoveredStyle(ButtonStyle? hoveredStyle) => + SymbolButton hoveredStyle(ButtonStyle? hoveredStyle) => this(hoveredStyle: hoveredStyle); @override - SymbolButton focusedStyle(ButtonStyle? focusedStyle) => + SymbolButton focusedStyle(ButtonStyle? focusedStyle) => this(focusedStyle: focusedStyle); @override - SymbolButton tappedStyle(ButtonStyle? tappedStyle) => + SymbolButton tappedStyle(ButtonStyle? tappedStyle) => this(tappedStyle: tappedStyle); @override - SymbolButton selectedStyle(ButtonStyle? selectedStyle) => + SymbolButton selectedStyle(ButtonStyle? selectedStyle) => this(selectedStyle: selectedStyle); @override SymbolButton onPressed(void Function(ControlState)? onPressed) => @@ -44,12 +44,12 @@ class $SymbolButtonCWProxyImpl implements $SymbolButtonComponentCWProxy { MainAxisSize? mainAxisSize, TextWrapper? label, Widget? icon, - ButtonStyle? disabledStyle, - ButtonStyle? normalStyle, - ButtonStyle? hoveredStyle, - ButtonStyle? focusedStyle, - ButtonStyle? tappedStyle, - ButtonStyle? selectedStyle, + ButtonStyle? disabledStyle, + ButtonStyle? normalStyle, + ButtonStyle? hoveredStyle, + ButtonStyle? focusedStyle, + ButtonStyle? tappedStyle, + ButtonStyle? selectedStyle, void Function(ControlState)? onPressed, Key? key, }) => diff --git a/packages/wyatt_ui_kit/lib/src/components/buttons/symbol_button/symbol_button_screen.dart b/packages/wyatt_ui_kit/lib/src/components/buttons/symbol_button/symbol_button_screen.dart index 0b993bc2..e199ebe0 100644 --- a/packages/wyatt_ui_kit/lib/src/components/buttons/symbol_button/symbol_button_screen.dart +++ b/packages/wyatt_ui_kit/lib/src/components/buttons/symbol_button/symbol_button_screen.dart @@ -25,6 +25,7 @@ import 'package:wyatt_ui_kit/src/components/gradients/gradient_box_border.dart'; import 'package:wyatt_ui_kit/src/components/gradients/gradient_text.dart'; import 'package:wyatt_ui_kit/src/core/extensions/theme_extensions.dart'; import 'package:wyatt_ui_kit/src/core/helpers/linear_gradient_helper.dart'; +import 'package:wyatt_ui_kit/src/domain/button_theme_extension/symbol_button_theme_extension.dart'; class SymbolButtonScreen extends CubitScreen { @@ -44,6 +45,7 @@ class SymbolButtonScreen final Widget? icon; final TextWrapper? label; + final MainAxisSize? mainAxisSize; final SymbolButtonStyle? disabledStyle; final SymbolButtonStyle? normalStyle; @@ -54,37 +56,94 @@ class SymbolButtonScreen final void Function(ControlState state)? onPressed; - final MainAxisSize? mainAxisSize; - @override SelectableButtonCubit create(BuildContext context) => SelectableButtonCubit(); - @override - Widget onBuild(BuildContext context, ButtonState state) { - // Set a default style - SymbolButtonStyle? style = normalStyle ?? const SymbolButtonStyle(); + /// Negotiate the theme to get a complete style. + SymbolButtonStyle negotiate(BuildContext context, ButtonState state) { + // Define default style from Flutter values. + SymbolButtonStyle style = SymbolButtonStyle.fromFlutter(context); + + // Try to retrieve custom theme extension + final symbolButtonThemeExtension = + context.themeExtension(); switch (state.state) { case ControlState.disabled: - style = disabledStyle ?? style; + style = disabledStyle ?? + symbolButtonThemeExtension?.disabledStyle ?? + style.copyWith( + foregroundColors: + MultiColor.single(context.colorScheme.onSurface), + backgroundColors: MultiColor.single(context.colorScheme.surface), + ); break; case ControlState.hovered: - style = hoveredStyle ?? style; + style = + hoveredStyle ?? symbolButtonThemeExtension?.hoveredStyle ?? style; break; case ControlState.tapped: - style = tappedStyle ?? style; + style = tappedStyle ?? symbolButtonThemeExtension?.tappedStyle ?? style; break; case ControlState.focused: - style = focusedStyle ?? style; + style = + focusedStyle ?? symbolButtonThemeExtension?.focusedStyle ?? style; break; case ControlState.normal: + style = normalStyle ?? symbolButtonThemeExtension?.normalStyle ?? style; break; } + // Apply extra theme if (state.isSelected) { - style = selectedStyle ?? style; + // TODO(hpcl): enhance copyWith to copy only non-null attributes of an object + style = style.copyWith( + label: (selectedStyle ?? + symbolButtonThemeExtension?.selectedStyle ?? + style) + .label, + dimension: (selectedStyle ?? + symbolButtonThemeExtension?.selectedStyle ?? + style) + .dimension, + radius: (selectedStyle ?? + symbolButtonThemeExtension?.selectedStyle ?? + style) + .radius, + padding: (selectedStyle ?? + symbolButtonThemeExtension?.selectedStyle ?? + style) + .padding, + foregroundColors: (selectedStyle ?? + symbolButtonThemeExtension?.selectedStyle ?? + style) + .foregroundColors, + backgroundColors: (selectedStyle ?? + symbolButtonThemeExtension?.selectedStyle ?? + style) + .backgroundColors, + borderColors: (selectedStyle ?? + symbolButtonThemeExtension?.selectedStyle ?? + style) + .borderColors, + stroke: (selectedStyle ?? + symbolButtonThemeExtension?.selectedStyle ?? + style) + .stroke, + shadow: (selectedStyle ?? + symbolButtonThemeExtension?.selectedStyle ?? + style) + .shadow, + ); } + return style; + } + + @override + Widget onBuild(BuildContext context, ButtonState state) { + final style = negotiate(context, state); + return Focus( onFocusChange: (hasFocus) => hasFocus ? bloc(context).onFocus() : bloc(context).onUnfocus(), @@ -122,27 +181,27 @@ class SymbolButtonScreen mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ SizedBox.square( - dimension: style.dimension ?? 60, + dimension: style.dimension, child: AspectRatio( aspectRatio: 1, child: DecoratedBox( decoration: BoxDecoration( - color: style.backgroundColors?.color ?? - context.colorScheme.primary, + color: style.backgroundColors?.color, // If no border color => no default value - border: (style.borderColors != null) - ? (style.borderColors?.isGradient ?? false) - ? GradientBoxBorder( - gradient: LinearGradient( - colors: style.borderColors!.colors, - ), - width: style.stroke ?? 2, - ) - : Border.all( - color: style.borderColors!.color, - width: style.stroke ?? 2, - ) - : null, + border: + (style.borderColors != null && style.stroke != null) + ? (style.borderColors?.isGradient ?? false) + ? GradientBoxBorder( + gradient: LinearGradient( + colors: style.borderColors!.colors, + ), + width: style.stroke!, + ) + : Border.all( + color: style.borderColors!.color, + width: style.stroke!, + ) + : null, // if no gradient colors => no default value gradient: (style.backgroundColors?.isGradient ?? false) ? LinearGradient( @@ -152,92 +211,44 @@ class SymbolButtonScreen boxShadow: [ if (style.shadow != null) ...[style.shadow!] ], - borderRadius: BorderRadius.all( - Radius.circular(style.radius ?? 0), - ), + borderRadius: style.radius, ), child: ConstrainedBox( constraints: BoxConstraints( minWidth: style.dimension ?? 60, ), // min sizes for Material buttons child: Padding( - padding: EdgeInsets.all(style.padding ?? 0), - child: Center( - // Choose color - // button.foreground.colors (gradient) ?? - // buttonStyle.foregroundColor.color ?? - // context.colorScheme.secondary - child: Builder( - builder: (context) { - final gradient = - (style?.foregroundColors?.isGradient ?? false) - ? LinearGradient( - colors: - style!.foregroundColors!.colors, - ) - : null; - final color = style?.foregroundColors?.color ?? - context.colorScheme.secondary; - if (gradient != null) { - return ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (bounds) => - gradient.createShader( - Rect.fromLTWH( - 0, - 0, - bounds.width, - bounds.height, - ), - ), - child: icon, - ); - } - return ColorFiltered( - colorFilter: - ColorFilter.mode(color, BlendMode.srcIn), - child: icon, - ); - }, - ), - ), + padding: style.padding ?? EdgeInsets.zero, + child: Center(child: icon), ), ), ), ), ), - // Choose color - // label.style.color ?? - // buttonStyle.foregroundColor.color ?? - // context.textTheme.titleLarge.color - // - // Choose gradient - // label.gradient ?? - // buttonStyle.foregroundColor.colors ?? - // null - if (label != null) ...[ - const Gap(10), - Builder( - builder: (context) { - final color = label?.style?.color ?? - style?.foregroundColors?.color ?? - context.textTheme.titleLarge?.color; - final buttonStyleGradient = - (style?.foregroundColors?.isGradient ?? false) - ? style?.foregroundColors?.colors - : null; - final gradient = label?.gradient ?? buttonStyleGradient; - return Text( - label!.text, - style: (label!.style ?? context.textTheme.titleMedium) - ?.copyWith(color: color), - ).toGradient( - LinearGradientHelper.fromNullableColors( - gradient, - ), - ); - }, + /// Choose color + /// label.style.color ?? + /// buttonStyle.label.style.color ?? + /// context.textTheme.labelLarge.color + /// + /// Choose gradient + /// label.gradient ?? + /// buttonStyle.foregroundColor.colors ?? + /// null + /// + /// More infos in `negociate()` method + if (label != null) ...[ + Gap(style.padding?.horizontal ?? 10), + Text( + label!.text, + style: label!.style ?? style.label, + ).toGradient( + LinearGradientHelper.fromNullableColors( + label?.gradient ?? + ((style.foregroundColors?.isGradient ?? false) + ? style.foregroundColors?.colors + : null), + ), ), ], ], diff --git a/packages/wyatt_ui_kit/lib/src/components/gradients/gradient_icon.dart b/packages/wyatt_ui_kit/lib/src/components/gradients/gradient_icon.dart index 6f7864e3..a6e2a38f 100644 --- a/packages/wyatt_ui_kit/lib/src/components/gradients/gradient_icon.dart +++ b/packages/wyatt_ui_kit/lib/src/components/gradients/gradient_icon.dart @@ -16,7 +16,7 @@ import 'package:flutter/widgets.dart'; -extension GradientTextExtension on Icon { +extension GradientIconExtension on Icon { GradientIcon toGradient(Gradient? gradient) => GradientIcon.from(this, gradient); } diff --git a/packages/wyatt_ui_kit/lib/src/domain/button_theme_extension/button_theme_extension.dart b/packages/wyatt_ui_kit/lib/src/domain/button_theme_extension/button_theme_extension.dart new file mode 100644 index 00000000..d2467ee2 --- /dev/null +++ b/packages/wyatt_ui_kit/lib/src/domain/button_theme_extension/button_theme_extension.dart @@ -0,0 +1,20 @@ +// 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 'file_selection_button_theme_extension.dart'; +export 'flat_button_theme_extension.dart'; +export 'simple_icon_button_theme_extension.dart'; +export 'symbol_button_theme_extension.dart'; diff --git a/packages/wyatt_ui_kit/lib/src/domain/button_theme_extension/file_selection_button_theme_extension.dart b/packages/wyatt_ui_kit/lib/src/domain/button_theme_extension/file_selection_button_theme_extension.dart new file mode 100644 index 00000000..b5e882fa --- /dev/null +++ b/packages/wyatt_ui_kit/lib/src/domain/button_theme_extension/file_selection_button_theme_extension.dart @@ -0,0 +1,52 @@ +// 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 FileSelectionButtonThemeExtension + extends ThemeExtension { + const FileSelectionButtonThemeExtension({ + this.disabledStyle, + this.focusedStyle, + this.hoveredStyle, + this.normalStyle, + this.tappedStyle, + this.selectedStyle, + this.invalidStyle, + }); + + /// Style of this button in disabled state + final FileSelectionButtonStyle? disabledStyle; + + /// Style of this button in focused state + final FileSelectionButtonStyle? focusedStyle; + + /// Style of this button in hovered state + final FileSelectionButtonStyle? hoveredStyle; + + /// Style of this button in normal state + final FileSelectionButtonStyle? normalStyle; + + /// Style of this button in tapped state + final FileSelectionButtonStyle? tappedStyle; + + /// Style of this button in selected state + final FileSelectionButtonStyle? selectedStyle; + + /// Style of this button in invalid state + final FileSelectionButtonStyle? invalidStyle; +} diff --git a/packages/wyatt_ui_kit/lib/src/domain/button_theme_extension/flat_button_theme_extension.dart b/packages/wyatt_ui_kit/lib/src/domain/button_theme_extension/flat_button_theme_extension.dart new file mode 100644 index 00000000..c851e8a7 --- /dev/null +++ b/packages/wyatt_ui_kit/lib/src/domain/button_theme_extension/flat_button_theme_extension.dart @@ -0,0 +1,44 @@ +// 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 FlatButtonThemeExtension + extends ThemeExtension { + const FlatButtonThemeExtension({ + this.disabledStyle, + this.focusedStyle, + this.hoveredStyle, + this.normalStyle, + this.tappedStyle, + }); + + /// Style of this button in disabled state + final FlatButtonStyle? disabledStyle; + + /// Style of this button in focused state + final FlatButtonStyle? focusedStyle; + + /// Style of this button in hovered state + final FlatButtonStyle? hoveredStyle; + + /// Style of this button in normal state + final FlatButtonStyle? normalStyle; + + /// Style of this button in tapped state + final FlatButtonStyle? tappedStyle; +} diff --git a/packages/wyatt_ui_kit/lib/src/domain/button_theme_extension/simple_icon_button_theme_extension.dart b/packages/wyatt_ui_kit/lib/src/domain/button_theme_extension/simple_icon_button_theme_extension.dart new file mode 100644 index 00000000..8912fc38 --- /dev/null +++ b/packages/wyatt_ui_kit/lib/src/domain/button_theme_extension/simple_icon_button_theme_extension.dart @@ -0,0 +1,44 @@ +// 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 SimpleIconButtonThemeExtension + extends ThemeExtension { + const SimpleIconButtonThemeExtension({ + this.disabledStyle, + this.focusedStyle, + this.hoveredStyle, + this.normalStyle, + this.tappedStyle, + }); + + /// Style of this button in disabled state + final SimpleIconButtonStyle? disabledStyle; + + /// Style of this button in focused state + final SimpleIconButtonStyle? focusedStyle; + + /// Style of this button in hovered state + final SimpleIconButtonStyle? hoveredStyle; + + /// Style of this button in normal state + final SimpleIconButtonStyle? normalStyle; + + /// Style of this button in tapped state + final SimpleIconButtonStyle? tappedStyle; +} diff --git a/packages/wyatt_ui_kit/lib/src/domain/button_theme_extension/symbol_button_theme_extension.dart b/packages/wyatt_ui_kit/lib/src/domain/button_theme_extension/symbol_button_theme_extension.dart new file mode 100644 index 00000000..e6be4650 --- /dev/null +++ b/packages/wyatt_ui_kit/lib/src/domain/button_theme_extension/symbol_button_theme_extension.dart @@ -0,0 +1,48 @@ +// 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 SymbolButtonThemeExtension + extends ThemeExtension { + const SymbolButtonThemeExtension({ + this.disabledStyle, + this.focusedStyle, + this.hoveredStyle, + this.normalStyle, + this.tappedStyle, + this.selectedStyle, + }); + + /// Style of this button in disabled state + final SymbolButtonStyle? disabledStyle; + + /// Style of this button in focused state + final SymbolButtonStyle? focusedStyle; + + /// Style of this button in hovered state + final SymbolButtonStyle? hoveredStyle; + + /// Style of this button in normal state + final SymbolButtonStyle? normalStyle; + + /// Style of this button in tapped state + final SymbolButtonStyle? tappedStyle; + + /// Style of this button in selected state + final SymbolButtonStyle? selectedStyle; +} diff --git a/packages/wyatt_ui_kit/lib/src/domain/domain.dart b/packages/wyatt_ui_kit/lib/src/domain/domain.dart new file mode 100644 index 00000000..901c7de9 --- /dev/null +++ b/packages/wyatt_ui_kit/lib/src/domain/domain.dart @@ -0,0 +1,18 @@ +// 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 'button_theme_extension/button_theme_extension.dart'; +export 'card_theme_extension.dart'; diff --git a/packages/wyatt_ui_kit/lib/src/src.dart b/packages/wyatt_ui_kit/lib/src/src.dart index 554793d9..406639aa 100644 --- a/packages/wyatt_ui_kit/lib/src/src.dart +++ b/packages/wyatt_ui_kit/lib/src/src.dart @@ -14,22 +14,6 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -// 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 './components/components.dart'; export './core/core.dart'; -export './domain/card_theme_extension.dart'; +export './domain/domain.dart'; diff --git a/packages/wyatt_ui_kit/lib/wyatt_ui_kit.dart b/packages/wyatt_ui_kit/lib/wyatt_ui_kit.dart index 815ae892..61041f92 100644 --- a/packages/wyatt_ui_kit/lib/wyatt_ui_kit.dart +++ b/packages/wyatt_ui_kit/lib/wyatt_ui_kit.dart @@ -17,4 +17,6 @@ /// UIKit and Design System used in Wyatt Studio. library wyatt_ui_kit; +export 'package:wyatt_ui_components/src/core/extensions/build_context_extensions.dart'; + export './src/src.dart';