// 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 ButtonTemplate extends TokenTemplate { const ButtonTemplate( this.tokenGroup, super.blockName, super.fileName, super.tokens, { super.colorSchemePrefix = '_colors.', }); final String tokenGroup; String _backgroundColor() { if (tokenAvailable('$tokenGroup.container.color')) { return ''' WidgetStateProperty.resolveWith((Set states) { if (states.contains(WidgetState.disabled)) { return ${componentColor('$tokenGroup.disabled.container')}; } return ${componentColor('$tokenGroup.container')}; })'''; } return ''' const MaterialStatePropertyAll(Colors.transparent)'''; } String _elevation() { if (tokenAvailable('$tokenGroup.container.elevation')) { return ''' WidgetStateProperty.resolveWith((Set states) { if (states.contains(WidgetState.disabled)) { return ${elevation("$tokenGroup.disabled.container")}; } if (states.contains(WidgetState.pressed)) { return ${elevation("$tokenGroup.pressed.container")}; } if (states.contains(WidgetState.hovered)) { return ${elevation("$tokenGroup.hover.container")}; } if (states.contains(WidgetState.focused)) { return ${elevation("$tokenGroup.focus.container")}; } return ${elevation("$tokenGroup.container")}; })'''; } return ''' const MaterialStatePropertyAll(0.0)'''; } 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) : super( animationDuration: kThemeChangeDuration, enableFeedback: true, alignment: Alignment.center, ); final BuildContext context; late final ColorScheme _colors = Theme.of(context).colorScheme; @override WidgetStateProperty get textStyle => MaterialStatePropertyAll(${textStyle("$tokenGroup.label-text")}); @override WidgetStateProperty? get backgroundColor =>${_backgroundColor()}; @override WidgetStateProperty? get foregroundColor => WidgetStateProperty.resolveWith((Set states) { if (states.contains(WidgetState.disabled)) { return ${componentColor('$tokenGroup.disabled.label-text')}; } return ${componentColor('$tokenGroup.label-text')}; }); @override WidgetStateProperty? get overlayColor => WidgetStateProperty.resolveWith((Set states) { 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 null; }); @override WidgetStateProperty? get shadowColor => ${_elevationColor("$tokenGroup.container.shadow-color")}; @override WidgetStateProperty? get surfaceTintColor => ${_elevationColor("$tokenGroup.container.surface-tint-layer.color")}; @override WidgetStateProperty? get elevation =>${_elevation()}; @override WidgetStateProperty? get padding => MaterialStatePropertyAll(_scaledPadding(context)); @override WidgetStateProperty? get minimumSize => const MaterialStatePropertyAll(Size(64.0, ${getToken("$tokenGroup.container.height")})); // No default fixedSize @override WidgetStateProperty? get iconSize => const MaterialStatePropertyAll(${getToken("$tokenGroup.with-icon.icon.size")}); @override WidgetStateProperty? get iconColor { return WidgetStateProperty.resolveWith((Set states) { if (states.contains(WidgetState.disabled)) { return ${color('$tokenGroup.with-icon.disabled.icon.color')}.withOpacity(${opacity("$tokenGroup.with-icon.disabled.icon.opacity")}); } if (states.contains(WidgetState.pressed)) { return ${color('$tokenGroup.with-icon.pressed.icon.color')}; } if (states.contains(WidgetState.hovered)) { return ${color('$tokenGroup.with-icon.hover.icon.color')}; } if (states.contains(WidgetState.focused)) { return ${color('$tokenGroup.with-icon.focus.icon.color')}; } return ${color('$tokenGroup.with-icon.icon.color')}; }); } @override WidgetStateProperty? get maximumSize => const MaterialStatePropertyAll(Size.infinite); ${tokenAvailable("$tokenGroup.outline.color") ? ''' @override WidgetStateProperty? get side => WidgetStateProperty.resolveWith((Set states) { if (states.contains(WidgetState.disabled)) { return ${border("$tokenGroup.disabled.outline")}; } if (states.contains(WidgetState.focused)) { return ${border('$tokenGroup.focus.outline')}; } return ${border("$tokenGroup.outline")}; });''' : ''' // No default side'''} @override WidgetStateProperty? get shape => const MaterialStatePropertyAll(${shape("$tokenGroup.container", '')}); @override WidgetStateProperty? get mouseCursor => WidgetStateMouseCursor.adaptiveClickable; @override VisualDensity? get visualDensity => Theme.of(context).visualDensity; @override MaterialTapTargetSize? get tapTargetSize => Theme.of(context).materialTapTargetSize; @override InteractiveInkFeatureFactory? get splashFactory => Theme.of(context).splashFactory; } '''; }