// 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.', }); String _elevationColor(String token) { if (tokens.containsKey(token)) { return 'MaterialStatePropertyAll(${color(token)})'; } else { return 'const MaterialStatePropertyAll(Colors.transparent)'; } } @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 => const MaterialStatePropertyAll(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; }); @override MaterialStateProperty? get elevation => const MaterialStatePropertyAll(0.0); @override MaterialStateProperty? get shadowColor => ${_elevationColor("md.comp.icon-button.container.shadow-color")}; @override MaterialStateProperty? get surfaceTintColor => ${_elevationColor("md.comp.icon-button.container.surface-tint-layer.color")}; @override MaterialStateProperty? get padding => const MaterialStatePropertyAll(EdgeInsets.all(8.0)); @override MaterialStateProperty? get minimumSize => const MaterialStatePropertyAll(Size(${tokens["md.comp.icon-button.state-layer.size"]}, ${tokens["md.comp.icon-button.state-layer.size"]})); // No default fixedSize @override MaterialStateProperty? get maximumSize => const MaterialStatePropertyAll(Size.infinite); @override MaterialStateProperty? get iconSize => const MaterialStatePropertyAll(${tokens["md.comp.icon-button.icon.size"]}); // No default side @override MaterialStateProperty? get shape => const MaterialStatePropertyAll(${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 => VisualDensity.standard; @override MaterialTapTargetSize? get tapTargetSize => Theme.of(context).materialTapTargetSize; @override InteractiveInkFeatureFactory? get splashFactory => Theme.of(context).splashFactory; } '''; }