From 96d511f987f365deb600f0b4f10ce3cb56b3dd22 Mon Sep 17 00:00:00 2001 From: Qun Cheng Date: Thu, 17 Sep 2026 18:06:25 -0700 Subject: [PATCH] [material_ui] Migrate M3 IconButton template to use new gen_defaults --- .../filled_icon_button_defaults_m3.g.dart} | 5 + ...lled_tonal_icon_button_defaults_m3.g.dart} | 5 + .../generated/icon_button_defaults_m3.g.dart} | 5 + .../outlined_icon_button_defaults_m3.g.dart} | 5 + packages/material_ui/lib/src/icon_button.dart | 543 +----------------- .../tool/gen_defaults/bin/gen_defaults.dart | 7 +- .../templates/icon_button_template.dart | 358 ++++++++++++ .../templates/icon_button_template.dart | 316 ---------- .../gen_defaults/test/gen_defaults_test.dart | 37 +- 9 files changed, 422 insertions(+), 859 deletions(-) rename packages/material_ui/{tool/gen_defaults/temporarily_excluded/generated/filled_icon_button_defaults.g.dart => lib/src/generated/filled_icon_button_defaults_m3.g.dart} (95%) rename packages/material_ui/{tool/gen_defaults/temporarily_excluded/generated/filled_tonal_icon_button_defaults.g.dart => lib/src/generated/filled_tonal_icon_button_defaults_m3.g.dart} (95%) rename packages/material_ui/{tool/gen_defaults/temporarily_excluded/generated/icon_button_defaults.g.dart => lib/src/generated/icon_button_defaults_m3.g.dart} (94%) rename packages/material_ui/{tool/gen_defaults/temporarily_excluded/generated/outlined_icon_button_defaults.g.dart => lib/src/generated/outlined_icon_button_defaults_m3.g.dart} (95%) create mode 100644 packages/material_ui/tool/gen_defaults/templates/icon_button_template.dart delete mode 100644 packages/material_ui/tool/gen_defaults/temporarily_excluded/templates/icon_button_template.dart diff --git a/packages/material_ui/tool/gen_defaults/temporarily_excluded/generated/filled_icon_button_defaults.g.dart b/packages/material_ui/lib/src/generated/filled_icon_button_defaults_m3.g.dart similarity index 95% rename from packages/material_ui/tool/gen_defaults/temporarily_excluded/generated/filled_icon_button_defaults.g.dart rename to packages/material_ui/lib/src/generated/filled_icon_button_defaults_m3.g.dart index 1eb52d422e56..c3e4a8bde1a6 100644 --- a/packages/material_ui/tool/gen_defaults/temporarily_excluded/generated/filled_icon_button_defaults.g.dart +++ b/packages/material_ui/lib/src/generated/filled_icon_button_defaults_m3.g.dart @@ -2,6 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// Do not edit by hand. The code is generated from data in the Material +// Design token database by the script: +// packages/material_ui/tool/gen_defaults/bin/gen_defaults.dart. +part of '../icon_button.dart'; + class _FilledIconButtonDefaultsM3 extends ButtonStyle { _FilledIconButtonDefaultsM3(this.context, this.toggleable) : super( diff --git a/packages/material_ui/tool/gen_defaults/temporarily_excluded/generated/filled_tonal_icon_button_defaults.g.dart b/packages/material_ui/lib/src/generated/filled_tonal_icon_button_defaults_m3.g.dart similarity index 95% rename from packages/material_ui/tool/gen_defaults/temporarily_excluded/generated/filled_tonal_icon_button_defaults.g.dart rename to packages/material_ui/lib/src/generated/filled_tonal_icon_button_defaults_m3.g.dart index 0fb6422688d3..d6e77860106b 100644 --- a/packages/material_ui/tool/gen_defaults/temporarily_excluded/generated/filled_tonal_icon_button_defaults.g.dart +++ b/packages/material_ui/lib/src/generated/filled_tonal_icon_button_defaults_m3.g.dart @@ -2,6 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// Do not edit by hand. The code is generated from data in the Material +// Design token database by the script: +// packages/material_ui/tool/gen_defaults/bin/gen_defaults.dart. +part of '../icon_button.dart'; + class _FilledTonalIconButtonDefaultsM3 extends ButtonStyle { _FilledTonalIconButtonDefaultsM3(this.context, this.toggleable) : super( diff --git a/packages/material_ui/tool/gen_defaults/temporarily_excluded/generated/icon_button_defaults.g.dart b/packages/material_ui/lib/src/generated/icon_button_defaults_m3.g.dart similarity index 94% rename from packages/material_ui/tool/gen_defaults/temporarily_excluded/generated/icon_button_defaults.g.dart rename to packages/material_ui/lib/src/generated/icon_button_defaults_m3.g.dart index d4294c7e571c..4be88c856418 100644 --- a/packages/material_ui/tool/gen_defaults/temporarily_excluded/generated/icon_button_defaults.g.dart +++ b/packages/material_ui/lib/src/generated/icon_button_defaults_m3.g.dart @@ -2,6 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// Do not edit by hand. The code is generated from data in the Material +// Design token database by the script: +// packages/material_ui/tool/gen_defaults/bin/gen_defaults.dart. +part of '../icon_button.dart'; + class _IconButtonDefaultsM3 extends ButtonStyle { _IconButtonDefaultsM3(this.context, this.toggleable) : super( diff --git a/packages/material_ui/tool/gen_defaults/temporarily_excluded/generated/outlined_icon_button_defaults.g.dart b/packages/material_ui/lib/src/generated/outlined_icon_button_defaults_m3.g.dart similarity index 95% rename from packages/material_ui/tool/gen_defaults/temporarily_excluded/generated/outlined_icon_button_defaults.g.dart rename to packages/material_ui/lib/src/generated/outlined_icon_button_defaults_m3.g.dart index 3444f477cc5e..3bdeb99a929e 100644 --- a/packages/material_ui/tool/gen_defaults/temporarily_excluded/generated/outlined_icon_button_defaults.g.dart +++ b/packages/material_ui/lib/src/generated/outlined_icon_button_defaults_m3.g.dart @@ -2,6 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// Do not edit by hand. The code is generated from data in the Material +// Design token database by the script: +// packages/material_ui/tool/gen_defaults/bin/gen_defaults.dart. +part of '../icon_button.dart'; + class _OutlinedIconButtonDefaultsM3 extends ButtonStyle { _OutlinedIconButtonDefaultsM3(this.context, this.toggleable) : super( diff --git a/packages/material_ui/lib/src/icon_button.dart b/packages/material_ui/lib/src/icon_button.dart index f29860277773..e9333fe2c09e 100644 --- a/packages/material_ui/lib/src/icon_button.dart +++ b/packages/material_ui/lib/src/icon_button.dart @@ -31,6 +31,11 @@ import 'theme.dart'; import 'theme_data.dart'; import 'tooltip.dart'; +part 'generated/icon_button_defaults_m3.g.dart'; +part 'generated/filled_icon_button_defaults_m3.g.dart'; +part 'generated/filled_tonal_icon_button_defaults_m3.g.dart'; +part 'generated/outlined_icon_button_defaults_m3.g.dart'; + // Examples can assume: // late BuildContext context; @@ -1067,541 +1072,3 @@ class _IconButtonM3 extends ButtonStyleButton { return IconButtonTheme.of(context).style?.merge(iconThemeStyle) ?? iconThemeStyle; } } - -// BEGIN GENERATED TOKEN PROPERTIES - IconButton - -// Do not edit by hand. The code between the "BEGIN GENERATED" and -// "END GENERATED" comments are generated from data in the Material -// Design token database by the script: -// dev/tools/gen_defaults/bin/gen_defaults.dart. - -// dart format off -class _IconButtonDefaultsM3 extends ButtonStyle { - _IconButtonDefaultsM3(this.context, this.toggleable) - : super( - animationDuration: kThemeChangeDuration, - enableFeedback: true, - alignment: Alignment.center, - ); - - final BuildContext context; - final bool toggleable; - late final ColorScheme _colors = Theme.of(context).colorScheme; - - // No default text style - - @override - WidgetStateProperty? get backgroundColor => - const MaterialStatePropertyAll(Colors.transparent); - - @override - WidgetStateProperty? get foregroundColor => - WidgetStateProperty.resolveWith((Set states) { - if (states.contains(WidgetState.disabled)) { - return _colors.onSurface.withOpacity(0.38); - } - if (states.contains(WidgetState.selected)) { - return _colors.primary; - } - return _colors.onSurfaceVariant; - }); - - @override - WidgetStateProperty? get overlayColor => - WidgetStateProperty.resolveWith((Set states) { - if (states.contains(WidgetState.selected)) { - if (states.contains(WidgetState.pressed)) { - return _colors.primary.withOpacity(0.1); - } - if (states.contains(WidgetState.hovered)) { - return _colors.primary.withOpacity(0.08); - } - if (states.contains(WidgetState.focused)) { - return _colors.primary.withOpacity(0.1); - } - } - if (states.contains(WidgetState.pressed)) { - return _colors.onSurfaceVariant.withOpacity(0.1); - } - if (states.contains(WidgetState.hovered)) { - return _colors.onSurfaceVariant.withOpacity(0.08); - } - if (states.contains(WidgetState.focused)) { - return _colors.onSurfaceVariant.withOpacity(0.1); - } - return Colors.transparent; - }); - - @override - WidgetStateProperty? get elevation => - const MaterialStatePropertyAll(0.0); - - @override - WidgetStateProperty? get shadowColor => - const MaterialStatePropertyAll(Colors.transparent); - - @override - WidgetStateProperty? get surfaceTintColor => - const MaterialStatePropertyAll(Colors.transparent); - - @override - WidgetStateProperty? get padding => - const MaterialStatePropertyAll(EdgeInsets.all(8.0)); - - @override - WidgetStateProperty? get minimumSize => - const MaterialStatePropertyAll(Size(40.0, 40.0)); - - // No default fixedSize - - @override - WidgetStateProperty? get maximumSize => - const MaterialStatePropertyAll(Size.infinite); - - @override - WidgetStateProperty? get iconSize => - const MaterialStatePropertyAll(24.0); - - @override - WidgetStateProperty? get side => null; - - @override - WidgetStateProperty? get shape => - const MaterialStatePropertyAll(StadiumBorder()); - - @override - WidgetStateProperty? get mouseCursor => WidgetStateMouseCursor.adaptiveClickable; - - @override - VisualDensity? get visualDensity => VisualDensity.standard; - - @override - MaterialTapTargetSize? get tapTargetSize => Theme.of(context).materialTapTargetSize; - - @override - InteractiveInkFeatureFactory? get splashFactory => Theme.of(context).splashFactory; -} -// dart format on - -// END GENERATED TOKEN PROPERTIES - IconButton - -// BEGIN GENERATED TOKEN PROPERTIES - FilledIconButton - -// Do not edit by hand. The code between the "BEGIN GENERATED" and -// "END GENERATED" comments are generated from data in the Material -// Design token database by the script: -// dev/tools/gen_defaults/bin/gen_defaults.dart. - -// dart format off -class _FilledIconButtonDefaultsM3 extends ButtonStyle { - _FilledIconButtonDefaultsM3(this.context, this.toggleable) - : super( - animationDuration: kThemeChangeDuration, - enableFeedback: true, - alignment: Alignment.center, - ); - - final BuildContext context; - final bool toggleable; - late final ColorScheme _colors = Theme.of(context).colorScheme; - - // No default text style - - @override - WidgetStateProperty? get backgroundColor => - WidgetStateProperty.resolveWith((Set states) { - if (states.contains(WidgetState.disabled)) { - return _colors.onSurface.withOpacity(0.12); - } - if (states.contains(WidgetState.selected)) { - return _colors.primary; - } - if (toggleable) { // toggleable but unselected case - return _colors.surfaceContainerHighest; - } - return _colors.primary; - }); - - @override - WidgetStateProperty? get foregroundColor => - WidgetStateProperty.resolveWith((Set states) { - if (states.contains(WidgetState.disabled)) { - return _colors.onSurface.withOpacity(0.38); - } - if (states.contains(WidgetState.selected)) { - return _colors.onPrimary; - } - if (toggleable) { // toggleable but unselected case - return _colors.primary; - } - return _colors.onPrimary; - }); - - @override - WidgetStateProperty? get overlayColor => - WidgetStateProperty.resolveWith((Set states) { - if (states.contains(WidgetState.selected)) { - if (states.contains(WidgetState.pressed)) { - return _colors.onPrimary.withOpacity(0.1); - } - if (states.contains(WidgetState.hovered)) { - return _colors.onPrimary.withOpacity(0.08); - } - if (states.contains(WidgetState.focused)) { - return _colors.onPrimary.withOpacity(0.1); - } - } - if (toggleable) { // toggleable but unselected case - if (states.contains(WidgetState.pressed)) { - return _colors.primary.withOpacity(0.1); - } - if (states.contains(WidgetState.hovered)) { - return _colors.primary.withOpacity(0.08); - } - if (states.contains(WidgetState.focused)) { - return _colors.primary.withOpacity(0.1); - } - } - if (states.contains(WidgetState.pressed)) { - return _colors.onPrimary.withOpacity(0.1); - } - if (states.contains(WidgetState.hovered)) { - return _colors.onPrimary.withOpacity(0.08); - } - if (states.contains(WidgetState.focused)) { - return _colors.onPrimary.withOpacity(0.1); - } - return Colors.transparent; - }); - - @override - WidgetStateProperty? get elevation => - const MaterialStatePropertyAll(0.0); - - @override - WidgetStateProperty? get shadowColor => - const MaterialStatePropertyAll(Colors.transparent); - - @override - WidgetStateProperty? get surfaceTintColor => - const MaterialStatePropertyAll(Colors.transparent); - - @override - WidgetStateProperty? get padding => - const MaterialStatePropertyAll(EdgeInsets.all(8.0)); - - @override - WidgetStateProperty? get minimumSize => - const MaterialStatePropertyAll(Size(40.0, 40.0)); - - // No default fixedSize - - @override - WidgetStateProperty? get maximumSize => - const MaterialStatePropertyAll(Size.infinite); - - @override - WidgetStateProperty? get iconSize => - const MaterialStatePropertyAll(24.0); - - @override - WidgetStateProperty? get side => null; - - @override - WidgetStateProperty? get shape => - const MaterialStatePropertyAll(StadiumBorder()); - - @override - WidgetStateProperty? get mouseCursor => WidgetStateMouseCursor.adaptiveClickable; - - @override - VisualDensity? get visualDensity => VisualDensity.standard; - - @override - MaterialTapTargetSize? get tapTargetSize => Theme.of(context).materialTapTargetSize; - - @override - InteractiveInkFeatureFactory? get splashFactory => Theme.of(context).splashFactory; -} -// dart format on - -// END GENERATED TOKEN PROPERTIES - FilledIconButton - -// BEGIN GENERATED TOKEN PROPERTIES - FilledTonalIconButton - -// Do not edit by hand. The code between the "BEGIN GENERATED" and -// "END GENERATED" comments are generated from data in the Material -// Design token database by the script: -// dev/tools/gen_defaults/bin/gen_defaults.dart. - -// dart format off -class _FilledTonalIconButtonDefaultsM3 extends ButtonStyle { - _FilledTonalIconButtonDefaultsM3(this.context, this.toggleable) - : super( - animationDuration: kThemeChangeDuration, - enableFeedback: true, - alignment: Alignment.center, - ); - - final BuildContext context; - final bool toggleable; - late final ColorScheme _colors = Theme.of(context).colorScheme; - - // No default text style - - @override - WidgetStateProperty? get backgroundColor => - WidgetStateProperty.resolveWith((Set states) { - if (states.contains(WidgetState.disabled)) { - return _colors.onSurface.withOpacity(0.12); - } - if (states.contains(WidgetState.selected)) { - return _colors.secondaryContainer; - } - if (toggleable) { // toggleable but unselected case - return _colors.surfaceContainerHighest; - } - return _colors.secondaryContainer; - }); - - @override - WidgetStateProperty? get foregroundColor => - WidgetStateProperty.resolveWith((Set states) { - if (states.contains(WidgetState.disabled)) { - return _colors.onSurface.withOpacity(0.38); - } - if (states.contains(WidgetState.selected)) { - return _colors.onSecondaryContainer; - } - if (toggleable) { // toggleable but unselected case - return _colors.onSurfaceVariant; - } - return _colors.onSecondaryContainer; - }); - - @override - WidgetStateProperty? get overlayColor => - WidgetStateProperty.resolveWith((Set states) { - if (states.contains(WidgetState.selected)) { - if (states.contains(WidgetState.pressed)) { - return _colors.onSecondaryContainer.withOpacity(0.1); - } - if (states.contains(WidgetState.hovered)) { - return _colors.onSecondaryContainer.withOpacity(0.08); - } - if (states.contains(WidgetState.focused)) { - return _colors.onSecondaryContainer.withOpacity(0.1); - } - } - if (toggleable) { // toggleable but unselected case - if (states.contains(WidgetState.pressed)) { - return _colors.onSurfaceVariant.withOpacity(0.1); - } - if (states.contains(WidgetState.hovered)) { - return _colors.onSurfaceVariant.withOpacity(0.08); - } - if (states.contains(WidgetState.focused)) { - return _colors.onSurfaceVariant.withOpacity(0.1); - } - } - if (states.contains(WidgetState.pressed)) { - return _colors.onSecondaryContainer.withOpacity(0.1); - } - if (states.contains(WidgetState.hovered)) { - return _colors.onSecondaryContainer.withOpacity(0.08); - } - if (states.contains(WidgetState.focused)) { - return _colors.onSecondaryContainer.withOpacity(0.1); - } - return Colors.transparent; - }); - - @override - WidgetStateProperty? get elevation => - const MaterialStatePropertyAll(0.0); - - @override - WidgetStateProperty? get shadowColor => - const MaterialStatePropertyAll(Colors.transparent); - - @override - WidgetStateProperty? get surfaceTintColor => - const MaterialStatePropertyAll(Colors.transparent); - - @override - WidgetStateProperty? get padding => - const MaterialStatePropertyAll(EdgeInsets.all(8.0)); - - @override - WidgetStateProperty? get minimumSize => - const MaterialStatePropertyAll(Size(40.0, 40.0)); - - // No default fixedSize - - @override - WidgetStateProperty? get maximumSize => - const MaterialStatePropertyAll(Size.infinite); - - @override - WidgetStateProperty? get iconSize => - const MaterialStatePropertyAll(24.0); - - @override - WidgetStateProperty? get side => null; - - @override - WidgetStateProperty? get shape => - const MaterialStatePropertyAll(StadiumBorder()); - - @override - WidgetStateProperty? get mouseCursor => WidgetStateMouseCursor.adaptiveClickable; - - @override - VisualDensity? get visualDensity => VisualDensity.standard; - - @override - MaterialTapTargetSize? get tapTargetSize => Theme.of(context).materialTapTargetSize; - - @override - InteractiveInkFeatureFactory? get splashFactory => Theme.of(context).splashFactory; -} -// dart format on - -// END GENERATED TOKEN PROPERTIES - FilledTonalIconButton - -// BEGIN GENERATED TOKEN PROPERTIES - OutlinedIconButton - -// Do not edit by hand. The code between the "BEGIN GENERATED" and -// "END GENERATED" comments are generated from data in the Material -// Design token database by the script: -// dev/tools/gen_defaults/bin/gen_defaults.dart. - -// dart format off -class _OutlinedIconButtonDefaultsM3 extends ButtonStyle { - _OutlinedIconButtonDefaultsM3(this.context, this.toggleable) - : super( - animationDuration: kThemeChangeDuration, - enableFeedback: true, - alignment: Alignment.center, - ); - - final BuildContext context; - final bool toggleable; - late final ColorScheme _colors = Theme.of(context).colorScheme; - - // No default text style - - @override - WidgetStateProperty? get backgroundColor => - WidgetStateProperty.resolveWith((Set states) { - if (states.contains(WidgetState.disabled)) { - if (states.contains(WidgetState.selected)) { - return _colors.onSurface.withOpacity(0.12); - } - return Colors.transparent; - } - if (states.contains(WidgetState.selected)) { - return _colors.inverseSurface; - } - return Colors.transparent; - }); - - @override - WidgetStateProperty? get foregroundColor => - WidgetStateProperty.resolveWith((Set states) { - if (states.contains(WidgetState.disabled)) { - return _colors.onSurface.withOpacity(0.38); - } - if (states.contains(WidgetState.selected)) { - return _colors.onInverseSurface; - } - return _colors.onSurfaceVariant; - }); - - @override - WidgetStateProperty? get overlayColor => WidgetStateProperty.resolveWith((Set states) { - if (states.contains(WidgetState.selected)) { - if (states.contains(WidgetState.pressed)) { - return _colors.onInverseSurface.withOpacity(0.1); - } - if (states.contains(WidgetState.hovered)) { - return _colors.onInverseSurface.withOpacity(0.08); - } - if (states.contains(WidgetState.focused)) { - return _colors.onInverseSurface.withOpacity(0.08); - } - } - if (states.contains(WidgetState.pressed)) { - return _colors.onSurface.withOpacity(0.1); - } - if (states.contains(WidgetState.hovered)) { - return _colors.onSurfaceVariant.withOpacity(0.08); - } - if (states.contains(WidgetState.focused)) { - return _colors.onSurfaceVariant.withOpacity(0.08); - } - return Colors.transparent; - }); - - @override - WidgetStateProperty? get elevation => - const MaterialStatePropertyAll(0.0); - - @override - WidgetStateProperty? get shadowColor => - const MaterialStatePropertyAll(Colors.transparent); - - @override - WidgetStateProperty? get surfaceTintColor => - const MaterialStatePropertyAll(Colors.transparent); - - @override - WidgetStateProperty? get padding => - const MaterialStatePropertyAll(EdgeInsets.all(8.0)); - - @override - WidgetStateProperty? get minimumSize => - const MaterialStatePropertyAll(Size(40.0, 40.0)); - - // No default fixedSize - - @override - WidgetStateProperty? get maximumSize => - const MaterialStatePropertyAll(Size.infinite); - - @override - WidgetStateProperty? get iconSize => - const MaterialStatePropertyAll(24.0); - - @override - WidgetStateProperty? get side => - WidgetStateProperty.resolveWith((Set states) { - if (states.contains(WidgetState.selected)) { - return null; - } else { - if (states.contains(WidgetState.disabled)) { - return BorderSide(color: _colors.onSurface.withOpacity(0.12)); - } - return BorderSide(color: _colors.outline); - } - }); - - @override - WidgetStateProperty? get shape => - const MaterialStatePropertyAll(StadiumBorder()); - - @override - WidgetStateProperty? get mouseCursor => WidgetStateMouseCursor.adaptiveClickable; - - @override - VisualDensity? get visualDensity => VisualDensity.standard; - - @override - MaterialTapTargetSize? get tapTargetSize => Theme.of(context).materialTapTargetSize; - - @override - InteractiveInkFeatureFactory? get splashFactory => Theme.of(context).splashFactory; -} -// dart format on - -// END GENERATED TOKEN PROPERTIES - OutlinedIconButton diff --git a/packages/material_ui/tool/gen_defaults/bin/gen_defaults.dart b/packages/material_ui/tool/gen_defaults/bin/gen_defaults.dart index 849621e5b575..c6fea63cac78 100644 --- a/packages/material_ui/tool/gen_defaults/bin/gen_defaults.dart +++ b/packages/material_ui/tool/gen_defaults/bin/gen_defaults.dart @@ -31,7 +31,7 @@ import '../templates/card_template.dart'; // import '../templates/expansion_tile_template.dart'; // import '../templates/fab_template.dart'; // import '../templates/filter_chip_template.dart'; -// import '../templates/icon_button_template.dart'; +import '../templates/icon_button_template.dart'; // import '../templates/input_chip_template.dart'; // import '../templates/input_decorator_template.dart'; // import '../templates/list_tile_template.dart'; @@ -88,7 +88,10 @@ Future main(List args) async { // const ExpansionTileTemplateM3().generateFile(verbose: verbose); // const FabTemplateM3().generateFile(verbose: verbose); // const FilterChipTemplateM3().generateFile(verbose: verbose); - // const IconButtonTemplateM3().generateFile(verbose: verbose); + const IconButtonTemplateM3('Icon Button').generateFile(verbose: verbose); + const IconButtonTemplateM3('Filled Icon Button').generateFile(verbose: verbose); + const IconButtonTemplateM3('Filled Tonal Icon Button').generateFile(verbose: verbose); + const IconButtonTemplateM3('Outlined Icon Button').generateFile(verbose: verbose); // const InputChipTemplateM3().generateFile(verbose: verbose); // const InputDecoratorTemplateM3().generateFile(verbose: verbose); // const ListTileTemplateM3().generateFile(verbose: verbose); diff --git a/packages/material_ui/tool/gen_defaults/templates/icon_button_template.dart b/packages/material_ui/tool/gen_defaults/templates/icon_button_template.dart new file mode 100644 index 000000000000..c53940dd77b6 --- /dev/null +++ b/packages/material_ui/tool/gen_defaults/templates/icon_button_template.dart @@ -0,0 +1,358 @@ +// Copyright 2013 The Flutter Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../data/color_role.dart'; +import '../data/icon_button.dart'; +import '../data/icon_button_filled.dart'; +import '../data/icon_button_outlined.dart'; +import '../data/icon_button_standard.dart'; +import '../data/icon_button_tonal.dart'; +import 'template.dart'; + +enum _IconButtonVariant { standard, filled, filledTonal, outlined } + +class IconButtonTemplateM3 extends TokenTemplateM3 { + const IconButtonTemplateM3(this.name); + + @override + final String name; + + @override + String get parentFilePath => 'icon_button.dart'; + + _IconButtonVariant get _variant => switch (name) { + 'Icon Button' => _IconButtonVariant.standard, + 'Filled Icon Button' => _IconButtonVariant.filled, + 'Filled Tonal Icon Button' => _IconButtonVariant.filledTonal, + 'Outlined Icon Button' => _IconButtonVariant.outlined, + _ => throw UnsupportedError('Unsupported icon button template name: $name'), + }; + + // The exported md.comp.icon-button.* tokens differ from Flutter's existing + // M3 icon button defaults. Preserve the old disabled opacity and use direct + // color roles where needed so this migration does not change the defaults. + // TODO(QuncCccccc): Replace these values with tokens. + static const double _legacyDisabledContainerOpacity = 0.12; + + String get _backgroundColor => switch (_variant) { + _IconButtonVariant.standard => 'const MaterialStatePropertyAll(Colors.transparent)', + _IconButtonVariant.filled => + ''' +WidgetStateProperty.resolveWith((Set states) { + if (states.contains(WidgetState.disabled)) { + return ${colorWithOpacity(TokenIconButtonFilled.disabledContainerColor, _legacyDisabledContainerOpacity)}; + } + if (states.contains(WidgetState.selected)) { + return ${color(TokenIconButtonFilled.selectedContainerColor)}; + } + if (toggleable) { + // toggleable but unselected case + return ${color(TokenColorRole.surfaceContainerHighest)}; + } + return ${color(TokenIconButtonFilled.containerColor)}; +})''', + _IconButtonVariant.filledTonal => + ''' +WidgetStateProperty.resolveWith((Set states) { + if (states.contains(WidgetState.disabled)) { + return ${colorWithOpacity(TokenIconButtonTonal.disabledContainerColor, _legacyDisabledContainerOpacity)}; + } + if (states.contains(WidgetState.selected)) { + return ${color(TokenColorRole.secondaryContainer)}; + } + if (toggleable) { + // toggleable but unselected case + return ${color(TokenColorRole.surfaceContainerHighest)}; + } + return ${color(TokenIconButtonTonal.containerColor)}; +})''', + _IconButtonVariant.outlined => + ''' +WidgetStateProperty.resolveWith((Set states) { + if (states.contains(WidgetState.disabled)) { + if (states.contains(WidgetState.selected)) { + return ${colorWithOpacity(TokenIconButtonOutlined.selectedDisabledContainerColor, _legacyDisabledContainerOpacity)}; + } + return Colors.transparent; + } + if (states.contains(WidgetState.selected)) { + return ${color(TokenIconButtonOutlined.selectedContainerColor)}; + } + return Colors.transparent; +})''', + }; + + String get _foregroundColor => switch (_variant) { + _IconButtonVariant.standard => + ''' +WidgetStateProperty.resolveWith((Set states) { + if (states.contains(WidgetState.disabled)) { + return ${colorWithOpacity(TokenIconButtonStandard.disabledIconColor, TokenIconButtonStandard.disabledIconOpacity)}; + } + if (states.contains(WidgetState.selected)) { + return ${color(TokenIconButtonStandard.selectedIconColor)}; + } + return ${color(TokenIconButtonStandard.unselectedIconColor)}; +})''', + _IconButtonVariant.filled => + ''' +WidgetStateProperty.resolveWith((Set states) { + if (states.contains(WidgetState.disabled)) { + return ${colorWithOpacity(TokenIconButtonFilled.disabledIconColor, TokenIconButtonFilled.disabledIconOpacity)}; + } + if (states.contains(WidgetState.selected)) { + return ${color(TokenIconButtonFilled.selectedIconColor)}; + } + if (toggleable) { + // toggleable but unselected case + return ${color(TokenColorRole.primary)}; + } + return ${color(TokenIconButtonFilled.iconColor)}; +})''', + _IconButtonVariant.filledTonal => + ''' +WidgetStateProperty.resolveWith((Set states) { + if (states.contains(WidgetState.disabled)) { + return ${colorWithOpacity(TokenIconButtonTonal.disabledIconColor, TokenIconButtonTonal.disabledIconOpacity)}; + } + if (states.contains(WidgetState.selected)) { + return ${color(TokenColorRole.onSecondaryContainer)}; + } + if (toggleable) { + // toggleable but unselected case + return ${color(TokenColorRole.onSurfaceVariant)}; + } + return ${color(TokenIconButtonTonal.iconColor)}; +})''', + _IconButtonVariant.outlined => + ''' +WidgetStateProperty.resolveWith((Set states) { + if (states.contains(WidgetState.disabled)) { + return ${colorWithOpacity(TokenIconButtonOutlined.disabledIconColor, TokenIconButtonOutlined.disabledIconOpacity)}; + } + if (states.contains(WidgetState.selected)) { + return ${color(TokenIconButtonOutlined.selectedIconColor)}; + } + return ${color(TokenIconButtonOutlined.unselectedIconColor)}; +})''', + }; + + String get _overlayColor => switch (_variant) { + _IconButtonVariant.standard => + ''' +WidgetStateProperty.resolveWith((Set states) { + if (states.contains(WidgetState.selected)) { + if (states.contains(WidgetState.pressed)) { + return ${colorWithOpacity(TokenIconButtonStandard.selectedPressedStateLayerColor, TokenIconButtonStandard.pressedStateLayerOpacity)}; + } + if (states.contains(WidgetState.hovered)) { + return ${colorWithOpacity(TokenIconButtonStandard.selectedHoveredStateLayerColor, TokenIconButtonStandard.hoveredStateLayerOpacity)}; + } + if (states.contains(WidgetState.focused)) { + return ${colorWithOpacity(TokenIconButtonStandard.selectedFocusedStateLayerColor, TokenIconButtonStandard.focusedStateLayerOpacity)}; + } + } + if (states.contains(WidgetState.pressed)) { + return ${colorWithOpacity(TokenIconButtonStandard.unselectedPressedStateLayerColor, TokenIconButtonStandard.pressedStateLayerOpacity)}; + } + if (states.contains(WidgetState.hovered)) { + return ${colorWithOpacity(TokenIconButtonStandard.unselectedHoveredStateLayerColor, TokenIconButtonStandard.hoveredStateLayerOpacity)}; + } + if (states.contains(WidgetState.focused)) { + return ${colorWithOpacity(TokenIconButtonStandard.unselectedFocusedStateLayerColor, TokenIconButtonStandard.focusedStateLayerOpacity)}; + } + return Colors.transparent; +})''', + _IconButtonVariant.filled => + ''' +WidgetStateProperty.resolveWith((Set states) { + if (states.contains(WidgetState.selected)) { + if (states.contains(WidgetState.pressed)) { + return ${colorWithOpacity(TokenIconButtonFilled.selectedPressedStateLayerColor, TokenIconButtonFilled.pressedStateLayerOpacity)}; + } + if (states.contains(WidgetState.hovered)) { + return ${colorWithOpacity(TokenIconButtonFilled.selectedHoveredStateLayerColor, TokenIconButtonFilled.hoveredStateLayerOpacity)}; + } + if (states.contains(WidgetState.focused)) { + return ${colorWithOpacity(TokenIconButtonFilled.selectedFocusedStateLayerColor, TokenIconButtonFilled.focusedStateLayerOpacity)}; + } + } + if (toggleable) { + // toggleable but unselected case + if (states.contains(WidgetState.pressed)) { + return ${colorWithOpacity(TokenColorRole.primary, TokenIconButtonFilled.pressedStateLayerOpacity)}; + } + if (states.contains(WidgetState.hovered)) { + return ${colorWithOpacity(TokenColorRole.primary, TokenIconButtonFilled.hoveredStateLayerOpacity)}; + } + if (states.contains(WidgetState.focused)) { + return ${colorWithOpacity(TokenColorRole.primary, TokenIconButtonFilled.focusedStateLayerOpacity)}; + } + } + if (states.contains(WidgetState.pressed)) { + return ${colorWithOpacity(TokenIconButtonFilled.pressedStateLayerColor, TokenIconButtonFilled.pressedStateLayerOpacity)}; + } + if (states.contains(WidgetState.hovered)) { + return ${colorWithOpacity(TokenIconButtonFilled.hoveredStateLayerColor, TokenIconButtonFilled.hoveredStateLayerOpacity)}; + } + if (states.contains(WidgetState.focused)) { + return ${colorWithOpacity(TokenIconButtonFilled.focusedStateLayerColor, TokenIconButtonFilled.focusedStateLayerOpacity)}; + } + return Colors.transparent; +})''', + _IconButtonVariant.filledTonal => + ''' +WidgetStateProperty.resolveWith((Set states) { + if (states.contains(WidgetState.selected)) { + if (states.contains(WidgetState.pressed)) { + return ${colorWithOpacity(TokenColorRole.onSecondaryContainer, TokenIconButtonTonal.pressedStateLayerOpacity)}; + } + if (states.contains(WidgetState.hovered)) { + return ${colorWithOpacity(TokenColorRole.onSecondaryContainer, TokenIconButtonTonal.hoveredStateLayerOpacity)}; + } + if (states.contains(WidgetState.focused)) { + return ${colorWithOpacity(TokenColorRole.onSecondaryContainer, TokenIconButtonTonal.focusedStateLayerOpacity)}; + } + } + if (toggleable) { + // toggleable but unselected case + if (states.contains(WidgetState.pressed)) { + return ${colorWithOpacity(TokenColorRole.onSurfaceVariant, TokenIconButtonTonal.pressedStateLayerOpacity)}; + } + if (states.contains(WidgetState.hovered)) { + return ${colorWithOpacity(TokenColorRole.onSurfaceVariant, TokenIconButtonTonal.hoveredStateLayerOpacity)}; + } + if (states.contains(WidgetState.focused)) { + return ${colorWithOpacity(TokenColorRole.onSurfaceVariant, TokenIconButtonTonal.focusedStateLayerOpacity)}; + } + } + if (states.contains(WidgetState.pressed)) { + return ${colorWithOpacity(TokenIconButtonTonal.pressedStateLayerColor, TokenIconButtonTonal.pressedStateLayerOpacity)}; + } + if (states.contains(WidgetState.hovered)) { + return ${colorWithOpacity(TokenIconButtonTonal.hoveredStateLayerColor, TokenIconButtonTonal.hoveredStateLayerOpacity)}; + } + if (states.contains(WidgetState.focused)) { + return ${colorWithOpacity(TokenIconButtonTonal.focusedStateLayerColor, TokenIconButtonTonal.focusedStateLayerOpacity)}; + } + return Colors.transparent; +})''', + _IconButtonVariant.outlined => + ''' +WidgetStateProperty.resolveWith((Set states) { + if (states.contains(WidgetState.selected)) { + if (states.contains(WidgetState.pressed)) { + return ${colorWithOpacity(TokenIconButtonOutlined.selectedPressedStateLayerColor, TokenIconButtonOutlined.pressedStateLayerOpacity)}; + } + if (states.contains(WidgetState.hovered)) { + return ${colorWithOpacity(TokenIconButtonOutlined.selectedHoveredStateLayerColor, TokenIconButtonOutlined.hoveredStateLayerOpacity)}; + } + if (states.contains(WidgetState.focused)) { + return ${colorWithOpacity(TokenIconButtonOutlined.selectedFocusedStateLayerColor, TokenIconButtonOutlined.hoveredStateLayerOpacity)}; + } + } + if (states.contains(WidgetState.pressed)) { + return ${colorWithOpacity(TokenColorRole.onSurface, TokenIconButtonOutlined.pressedStateLayerOpacity)}; + } + if (states.contains(WidgetState.hovered)) { + return ${colorWithOpacity(TokenIconButtonOutlined.unselectedHoveredStateLayerColor, TokenIconButtonOutlined.hoveredStateLayerOpacity)}; + } + if (states.contains(WidgetState.focused)) { + return ${colorWithOpacity(TokenIconButtonOutlined.unselectedFocusedStateLayerColor, TokenIconButtonOutlined.hoveredStateLayerOpacity)}; + } + return Colors.transparent; +})''', + }; + + String get _side { + if (_variant != _IconButtonVariant.outlined) { + return 'null'; + } + return ''' +WidgetStateProperty.resolveWith((Set states) { + if (states.contains(WidgetState.selected)) { + return null; + } else { + if (states.contains(WidgetState.disabled)) { + return ${border(colorWithOpacity(TokenColorRole.onSurface, _legacyDisabledContainerOpacity))}; + } + return ${border(color(TokenColorRole.outline))}; + } +})'''; + } + + @override + String generateContents(String className) => + ''' +class $className extends ButtonStyle { + $className(this.context, this.toggleable) + : super( + animationDuration: kThemeChangeDuration, + enableFeedback: true, + alignment: Alignment.center, + ); + + final BuildContext context; + final bool toggleable; + late final ColorScheme _colors = Theme.of(context).colorScheme; + + // No default text style + + @override + WidgetStateProperty? get backgroundColor => $_backgroundColor; + + @override + WidgetStateProperty? get foregroundColor => $_foregroundColor; + + @override + WidgetStateProperty? get overlayColor => $_overlayColor; + + @override + WidgetStateProperty? get elevation => const MaterialStatePropertyAll(0.0); + + @override + WidgetStateProperty? get shadowColor => + const MaterialStatePropertyAll(Colors.transparent); + + @override + WidgetStateProperty? get surfaceTintColor => + const MaterialStatePropertyAll(Colors.transparent); + + @override + WidgetStateProperty? get padding => + const MaterialStatePropertyAll(EdgeInsets.all(${number(TokenIconButton.defaultLeadingSpace)})); + + @override + WidgetStateProperty? get minimumSize => + const MaterialStatePropertyAll(Size(${number(TokenIconButton.containerHeight)}, ${number(TokenIconButton.containerHeight)})); + + // No default fixedSize + + @override + WidgetStateProperty? get maximumSize => const MaterialStatePropertyAll(Size.infinite); + + @override + WidgetStateProperty? get iconSize => const MaterialStatePropertyAll(${number(TokenIconButton.iconSize)}); + + @override + WidgetStateProperty? get side => $_side; + + @override + WidgetStateProperty? get shape => + const MaterialStatePropertyAll(${shape(TokenIconButton.containerShapeRound, '')}); + + @override + WidgetStateProperty? get mouseCursor => WidgetStateMouseCursor.adaptiveClickable; + + @override + VisualDensity? get visualDensity => VisualDensity.standard; + + @override + MaterialTapTargetSize? get tapTargetSize => Theme.of(context).materialTapTargetSize; + + @override + InteractiveInkFeatureFactory? get splashFactory => Theme.of(context).splashFactory; +} +'''; +} diff --git a/packages/material_ui/tool/gen_defaults/temporarily_excluded/templates/icon_button_template.dart b/packages/material_ui/tool/gen_defaults/temporarily_excluded/templates/icon_button_template.dart deleted file mode 100644 index d99944676baa..000000000000 --- a/packages/material_ui/tool/gen_defaults/temporarily_excluded/templates/icon_button_template.dart +++ /dev/null @@ -1,316 +0,0 @@ -// Copyright 2013 The Flutter Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'template.dart'; - -class IconButtonTemplate extends TokenTemplate { - const IconButtonTemplate( - this.tokenGroup, - super.blockName, - super.fileName, - super.tokens, { - super.colorSchemePrefix = '_colors.', - }); - - final String tokenGroup; - - String _backgroundColor() { - switch (tokenGroup) { - case 'md.comp.filled-icon-button': - case 'md.comp.filled-tonal-icon-button': - return ''' - - WidgetStateProperty.resolveWith((Set states) { - if (states.contains(WidgetState.disabled)) { - return ${componentColor('$tokenGroup.disabled.container')}; - } - if (states.contains(WidgetState.selected)) { - return ${componentColor('$tokenGroup.selected.container')}; - } - if (toggleable) { // toggleable but unselected case - return ${componentColor('$tokenGroup.unselected.container')}; - } - return ${componentColor('$tokenGroup.container')}; - })'''; - case 'md.comp.outlined-icon-button': - return ''' - - WidgetStateProperty.resolveWith((Set states) { - if (states.contains(WidgetState.disabled)) { - if (states.contains(WidgetState.selected)) { - return ${componentColor('$tokenGroup.disabled.selected.container')}; - } - return Colors.transparent; - } - if (states.contains(WidgetState.selected)) { - return ${componentColor('$tokenGroup.selected.container')}; - } - return Colors.transparent; - })'''; - } - return ''' - - const MaterialStatePropertyAll(Colors.transparent)'''; - } - - String _foregroundColor() { - switch (tokenGroup) { - case 'md.comp.filled-icon-button': - case 'md.comp.filled-tonal-icon-button': - return ''' - - WidgetStateProperty.resolveWith((Set states) { - if (states.contains(WidgetState.disabled)) { - return ${componentColor('$tokenGroup.disabled.icon')}; - } - if (states.contains(WidgetState.selected)) { - return ${componentColor('$tokenGroup.toggle.selected.icon')}; - } - if (toggleable) { // toggleable but unselected case - return ${componentColor('$tokenGroup.toggle.unselected.icon')}; - } - return ${componentColor('$tokenGroup.icon')}; - })'''; - case 'md.comp.outlined-icon-button': - case 'md.comp.icon-button': - return ''' - - WidgetStateProperty.resolveWith((Set states) { - if (states.contains(WidgetState.disabled)) { - return ${componentColor('$tokenGroup.disabled.icon')}; - } - if (states.contains(WidgetState.selected)) { - return ${componentColor('$tokenGroup.selected.icon')}; - } - return ${componentColor('$tokenGroup.unselected.icon')}; - })'''; - } - return ''' - - const MaterialStatePropertyAll(Colors.transparent)'''; - } - - String _overlayColor() { - switch (tokenGroup) { - case 'md.comp.filled-icon-button': - case 'md.comp.filled-tonal-icon-button': - return ''' - - WidgetStateProperty.resolveWith((Set states) { - if (states.contains(WidgetState.selected)) { - if (states.contains(WidgetState.pressed)) { - return ${componentColor('$tokenGroup.toggle.selected.pressed.state-layer')}.withOpacity(${opacity('$tokenGroup.pressed.state-layer.opacity')}); - } - if (states.contains(WidgetState.hovered)) { - return ${componentColor('$tokenGroup.toggle.selected.hover.state-layer')}.withOpacity(${opacity('$tokenGroup.hover.state-layer.opacity')}); - } - if (states.contains(WidgetState.focused)) { - return ${componentColor('$tokenGroup.toggle.selected.focus.state-layer')}.withOpacity(${opacity('$tokenGroup.focus.state-layer.opacity')}); - } - } - if (toggleable) { // toggleable but unselected case - if (states.contains(WidgetState.pressed)) { - return ${componentColor('$tokenGroup.toggle.unselected.pressed.state-layer')}.withOpacity(${opacity('$tokenGroup.pressed.state-layer.opacity')}); - } - if (states.contains(WidgetState.hovered)) { - return ${componentColor('$tokenGroup.toggle.unselected.hover.state-layer')}.withOpacity(${opacity('$tokenGroup.hover.state-layer.opacity')}); - } - if (states.contains(WidgetState.focused)) { - return ${componentColor('$tokenGroup.toggle.unselected.focus.state-layer')}.withOpacity(${opacity('$tokenGroup.focus.state-layer.opacity')}); - } - } - if (states.contains(WidgetState.pressed)) { - return ${componentColor('$tokenGroup.pressed.state-layer')}; - } - if (states.contains(WidgetState.hovered)) { - return ${componentColor('$tokenGroup.hover.state-layer')}; - } - if (states.contains(WidgetState.focused)) { - return ${componentColor('$tokenGroup.focus.state-layer')}; - } - return Colors.transparent; - })'''; - case 'md.comp.outlined-icon-button': - return ''' - WidgetStateProperty.resolveWith((Set states) { - if (states.contains(WidgetState.selected)) { - if (states.contains(WidgetState.pressed)) { - return ${componentColor('$tokenGroup.selected.pressed.state-layer')}.withOpacity(${opacity('$tokenGroup.pressed.state-layer.opacity')}); - } - if (states.contains(WidgetState.hovered)) { - return ${componentColor('$tokenGroup.selected.hover.state-layer')}.withOpacity(${opacity('$tokenGroup.hover.state-layer.opacity')}); - } - if (states.contains(WidgetState.focused)) { - return ${componentColor('$tokenGroup.selected.focus.state-layer')}.withOpacity(${opacity('$tokenGroup.focus.state-layer.opacity')}); - } - } - if (states.contains(WidgetState.pressed)) { - return ${componentColor('$tokenGroup.unselected.pressed.state-layer')}.withOpacity(${opacity('$tokenGroup.pressed.state-layer.opacity')}); - } - if (states.contains(WidgetState.hovered)) { - return ${componentColor('$tokenGroup.unselected.hover.state-layer')}.withOpacity(${opacity('$tokenGroup.hover.state-layer.opacity')}); - } - if (states.contains(WidgetState.focused)) { - return ${componentColor('$tokenGroup.unselected.focus.state-layer')}.withOpacity(${opacity('$tokenGroup.focus.state-layer.opacity')}); - } - return Colors.transparent; - })'''; - case 'md.comp.icon-button': - return ''' - - WidgetStateProperty.resolveWith((Set states) { - if (states.contains(WidgetState.selected)) { - if (states.contains(WidgetState.pressed)) { - return ${componentColor('$tokenGroup.selected.pressed.state-layer')}; - } - if (states.contains(WidgetState.hovered)) { - return ${componentColor('$tokenGroup.selected.hover.state-layer')}; - } - if (states.contains(WidgetState.focused)) { - return ${componentColor('$tokenGroup.selected.focus.state-layer')}; - } - } - if (states.contains(WidgetState.pressed)) { - return ${componentColor('$tokenGroup.unselected.pressed.state-layer')}; - } - if (states.contains(WidgetState.hovered)) { - return ${componentColor('$tokenGroup.unselected.hover.state-layer')}; - } - if (states.contains(WidgetState.focused)) { - return ${componentColor('$tokenGroup.unselected.focus.state-layer')}; - } - return Colors.transparent; - })'''; - } - return ''' - - const MaterialStatePropertyAll(Colors.transparent)'''; - } - - String _minimumSize() { - if (tokenAvailable('$tokenGroup.container.height') && - tokenAvailable('$tokenGroup.container.width')) { - return ''' - - const MaterialStatePropertyAll(Size(${getToken('$tokenGroup.container.width')}, ${getToken('$tokenGroup.container.height')}))'''; - } else { - return ''' - - const MaterialStatePropertyAll(Size(40.0, 40.0))'''; - } - } - - String _shape() { - if (tokenAvailable('$tokenGroup.container.shape')) { - return ''' - - const MaterialStatePropertyAll(${shape("$tokenGroup.container", "")})'''; - } else { - return ''' - - const MaterialStatePropertyAll(${shape("$tokenGroup.state-layer", "")})'''; - } - } - - String _side() { - if (tokenAvailable('$tokenGroup.unselected.outline.color')) { - return ''' - - WidgetStateProperty.resolveWith((Set states) { - if (states.contains(WidgetState.selected)) { - return null; - } else { - if (states.contains(WidgetState.disabled)) { - return BorderSide(color: ${componentColor('$tokenGroup.disabled.unselected.outline')}); - } - return BorderSide(color: ${componentColor('$tokenGroup.unselected.outline')}); - } - })'''; - } - return ''' null'''; - } - - String _elevationColor(String token) { - if (tokenAvailable(token)) { - return 'MaterialStatePropertyAll(${color(token)})'; - } else { - return 'const MaterialStatePropertyAll(Colors.transparent)'; - } - } - - @override - String generate() => - ''' -class _${blockName}DefaultsM3 extends ButtonStyle { - _${blockName}DefaultsM3(this.context, this.toggleable) - : super( - animationDuration: kThemeChangeDuration, - enableFeedback: true, - alignment: Alignment.center, - ); - - final BuildContext context; - final bool toggleable; - late final ColorScheme _colors = Theme.of(context).colorScheme; - - // No default text style - - @override - WidgetStateProperty? get backgroundColor =>${_backgroundColor()}; - - @override - WidgetStateProperty? get foregroundColor =>${_foregroundColor()}; - - @override - WidgetStateProperty? get overlayColor =>${_overlayColor()}; - - @override - WidgetStateProperty? get elevation => - const MaterialStatePropertyAll(0.0); - - @override - WidgetStateProperty? get shadowColor => - ${_elevationColor("$tokenGroup.container.shadow-color")}; - - @override - WidgetStateProperty? get surfaceTintColor => - ${_elevationColor("$tokenGroup.container.surface-tint-layer.color")}; - - @override - WidgetStateProperty? get padding => - const MaterialStatePropertyAll(EdgeInsets.all(8.0)); - - @override - WidgetStateProperty? get minimumSize =>${_minimumSize()}; - - // No default fixedSize - - @override - WidgetStateProperty? get maximumSize => - const MaterialStatePropertyAll(Size.infinite); - - @override - WidgetStateProperty? get iconSize => - const MaterialStatePropertyAll(${getToken("$tokenGroup.icon.size")}); - - @override - WidgetStateProperty? get side =>${_side()}; - - @override - WidgetStateProperty? get shape =>${_shape()}; - - @override - WidgetStateProperty? get mouseCursor => WidgetStateMouseCursor.adaptiveClickable; - - @override - VisualDensity? get visualDensity => VisualDensity.standard; - - @override - MaterialTapTargetSize? get tapTargetSize => Theme.of(context).materialTapTargetSize; - - @override - InteractiveInkFeatureFactory? get splashFactory => Theme.of(context).splashFactory; -} -'''; -} diff --git a/packages/material_ui/tool/gen_defaults/test/gen_defaults_test.dart b/packages/material_ui/tool/gen_defaults/test/gen_defaults_test.dart index f9185c0b5ef8..0187c2b94030 100644 --- a/packages/material_ui/tool/gen_defaults/test/gen_defaults_test.dart +++ b/packages/material_ui/tool/gen_defaults/test/gen_defaults_test.dart @@ -27,7 +27,7 @@ import '../templates/card_template.dart'; // import '../templates/expansion_tile_template.dart'; // import '../templates/fab_template.dart'; // import '../templates/filter_chip_template.dart'; -// import '../templates/icon_button_template.dart'; +import '../templates/icon_button_template.dart' as icon_button; // import '../templates/input_chip_template.dart'; // import '../templates/input_decorator_template.dart'; // import '../templates/list_tile_template.dart'; @@ -519,8 +519,39 @@ void main() { }); test('IconButtonTemplateM3 emits M3 IconButton defaults from tokens', () { - // Intentionally empty, will be implemented during migration. See: - // https://github.com/flutter/flutter/issues/187899 + const template = icon_button.IconButtonTemplateM3('Icon Button'); + final String contents = _generateContents(template); + expect(contents, contains('class _IconButtonDefaultsM3 extends ButtonStyle')); + expect(contents, contains('return _colors.onSurface.withOpacity(0.38);')); + expect(contents, contains('return _colors.primary;')); + expect(contents, contains('return _colors.primary.withOpacity(0.1);')); + }); + + test('IconButtonTemplateM3 emits M3 FilledIconButton defaults from tokens', () { + const template = icon_button.IconButtonTemplateM3('Filled Icon Button'); + final String contents = _generateContents(template); + expect(contents, contains('class _FilledIconButtonDefaultsM3 extends ButtonStyle')); + expect(contents, contains('return _colors.onSurface.withOpacity(0.12);')); + expect(contents, contains('return _colors.surfaceContainerHighest;')); + expect(contents, contains('return _colors.primary.withOpacity(0.1);')); + }); + + test('IconButtonTemplateM3 emits M3 FilledTonalIconButton defaults from tokens', () { + const template = icon_button.IconButtonTemplateM3('Filled Tonal Icon Button'); + final String contents = _generateContents(template); + expect(contents, contains('class _FilledTonalIconButtonDefaultsM3 extends ButtonStyle')); + expect(contents, contains('return _colors.secondaryContainer;')); + expect(contents, contains('return _colors.onSurfaceVariant;')); + expect(contents, contains('return _colors.onSecondaryContainer.withOpacity(0.1);')); + }); + + test('IconButtonTemplateM3 emits M3 OutlinedIconButton defaults from tokens', () { + const template = icon_button.IconButtonTemplateM3('Outlined Icon Button'); + final String contents = _generateContents(template); + expect(contents, contains('class _OutlinedIconButtonDefaultsM3 extends ButtonStyle')); + expect(contents, contains('return _colors.inverseSurface;')); + expect(contents, contains('return _colors.onInverseSurface.withOpacity(0.1);')); + expect(contents, contains('return BorderSide(color: _colors.onSurface.withOpacity(0.12));')); }); test('InputChipTemplateM3 emits M3 InputChip defaults from tokens', () {