// Copyright 2014 The Flutter Authors. All rights reserved. // 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(super.blockName, super.fileName, super.tokens, { super.colorSchemePrefix = '_colors.', }); @override String generate() => ''' class _${blockName}DefaultsM3 extends ButtonStyle { _${blockName}DefaultsM3(this.context) : super( animationDuration: kThemeChangeDuration, enableFeedback: true, alignment: Alignment.center, ); final BuildContext context; late final ColorScheme _colors = Theme.of(context).colorScheme; // No default text style @override MaterialStateProperty? get backgroundColor => ButtonStyleButton.allOrNull(Colors.transparent); @override MaterialStateProperty? get foregroundColor => MaterialStateProperty.resolveWith((Set states) { if (states.contains(MaterialState.disabled)) { return ${componentColor('md.comp.icon-button.disabled.icon')}; } if (states.contains(MaterialState.selected)) { return ${componentColor('md.comp.icon-button.selected.icon')}; } return ${componentColor('md.comp.icon-button.unselected.icon')}; }); @override MaterialStateProperty? get overlayColor => MaterialStateProperty.resolveWith((Set states) { if (states.contains(MaterialState.selected)) { if (states.contains(MaterialState.hovered)) { return ${componentColor('md.comp.icon-button.selected.hover.state-layer')}; } if (states.contains(MaterialState.focused)) { return ${componentColor('md.comp.icon-button.selected.focus.state-layer')}; } if (states.contains(MaterialState.pressed)) { return ${componentColor('md.comp.icon-button.selected.pressed.state-layer')}; } } if (states.contains(MaterialState.hovered)) { return ${componentColor('md.comp.icon-button.unselected.hover.state-layer')}; } if (states.contains(MaterialState.focused)) { return ${componentColor('md.comp.icon-button.unselected.focus.state-layer')}; } if (states.contains(MaterialState.pressed)) { return ${componentColor('md.comp.icon-button.unselected.pressed.state-layer')}; } return null; }); // No default shadow color // No default surface tint color @override MaterialStateProperty? get elevation => ButtonStyleButton.allOrNull(0.0); @override MaterialStateProperty? get padding => ButtonStyleButton.allOrNull(const EdgeInsets.all(8.0)); @override MaterialStateProperty? get minimumSize => ButtonStyleButton.allOrNull(const Size(${tokens["md.comp.icon-button.state-layer.size"]}, ${tokens["md.comp.icon-button.state-layer.size"]})); // No default fixedSize @override MaterialStateProperty? get maximumSize => ButtonStyleButton.allOrNull(Size.infinite); @override MaterialStateProperty? get iconSize => ButtonStyleButton.allOrNull(${tokens["md.comp.icon-button.icon.size"]}); // No default side @override MaterialStateProperty? get shape => ButtonStyleButton.allOrNull(${shape("md.comp.icon-button.state-layer")}); @override MaterialStateProperty? get mouseCursor => MaterialStateProperty.resolveWith((Set states) { if (states.contains(MaterialState.disabled)) { return SystemMouseCursors.basic; } return SystemMouseCursors.click; }); @override VisualDensity? get visualDensity => Theme.of(context).visualDensity; @override MaterialTapTargetSize? get tapTargetSize => Theme.of(context).materialTapTargetSize; @override InteractiveInkFeatureFactory? get splashFactory => Theme.of(context).splashFactory; } '''; }