// 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, String fileName, Map<String, dynamic> tokens) : super(fileName, tokens, colorSchemePrefix: '_colors.', ); final String tokenGroup; String _backgroundColor() { if (tokens.containsKey('$tokenGroup.container.color')) { return ''' MaterialStateProperty.resolveWith((Set<MaterialState> states) { if (states.contains(MaterialState.disabled)) { return ${componentColor('$tokenGroup.disabled.container')}; } return ${componentColor('$tokenGroup.container')}; })'''; } return ''' ButtonStyleButton.allOrNull<Color>(Colors.transparent)'''; } String _elevation() { if (tokens.containsKey('$tokenGroup.container.elevation')) { return ''' MaterialStateProperty.resolveWith((Set<MaterialState> states) { if (states.contains(MaterialState.disabled)) { return ${elevation("$tokenGroup.disabled.container")}; } if (states.contains(MaterialState.hovered)) { return ${elevation("$tokenGroup.hover.container")}; } if (states.contains(MaterialState.focused)) { return ${elevation("$tokenGroup.focus.container")}; } if (states.contains(MaterialState.pressed)) { return ${elevation("$tokenGroup.pressed.container")}; } return ${elevation("$tokenGroup.container")}; })'''; } return ''' ButtonStyleButton.allOrNull<double>(0.0)'''; } @override String generate() => ''' // Generated version ${tokens["version"]} class _TokenDefaultsM3 extends ButtonStyle { _TokenDefaultsM3(this.context) : super( animationDuration: kThemeChangeDuration, enableFeedback: true, alignment: Alignment.center, ); final BuildContext context; late final ColorScheme _colors = Theme.of(context).colorScheme; @override MaterialStateProperty<TextStyle?> get textStyle => MaterialStatePropertyAll<TextStyle?>(${textStyle("$tokenGroup.label-text")}); @override MaterialStateProperty<Color?>? get backgroundColor =>${_backgroundColor()}; @override MaterialStateProperty<Color?>? get foregroundColor => MaterialStateProperty.resolveWith((Set<MaterialState> states) { if (states.contains(MaterialState.disabled)) { return ${componentColor('$tokenGroup.disabled.label-text')}; } return ${componentColor('$tokenGroup.label-text')}; }); @override MaterialStateProperty<Color?>? get overlayColor => MaterialStateProperty.resolveWith((Set<MaterialState> states) { if (states.contains(MaterialState.hovered)) { return ${componentColor('$tokenGroup.hover.state-layer')}; } if (states.contains(MaterialState.focused)) { return ${componentColor('$tokenGroup.focus.state-layer')}; } if (states.contains(MaterialState.pressed)) { return ${componentColor('$tokenGroup.pressed.state-layer')}; } return null; }); ${tokens.containsKey("$tokenGroup.container.shadow-color") ? ''' @override MaterialStateProperty<Color>? get shadowColor => ButtonStyleButton.allOrNull<Color>(${color("$tokenGroup.container.shadow-color")});''' : ''' // No default shadow color'''} ${tokens.containsKey("$tokenGroup.container.surface-tint-layer.color") ? ''' @override MaterialStateProperty<Color>? get surfaceTintColor => ButtonStyleButton.allOrNull<Color>(${color("$tokenGroup.container.surface-tint-layer.color")});''' : ''' // No default surface tint color'''} @override MaterialStateProperty<double>? get elevation =>${_elevation()}; @override MaterialStateProperty<EdgeInsetsGeometry>? get padding => ButtonStyleButton.allOrNull<EdgeInsetsGeometry>(_scaledPadding(context)); @override MaterialStateProperty<Size>? get minimumSize => ButtonStyleButton.allOrNull<Size>(const Size(64.0, ${tokens["$tokenGroup.container.height"]})); // No default fixedSize @override MaterialStateProperty<Size>? get maximumSize => ButtonStyleButton.allOrNull<Size>(Size.infinite); ${tokens.containsKey("$tokenGroup.outline.color") ? ''' @override MaterialStateProperty<BorderSide>? get side => MaterialStateProperty.resolveWith((Set<MaterialState> states) { if (states.contains(MaterialState.disabled)) { return ${border("$tokenGroup.disabled.outline")}; } return ${border("$tokenGroup.outline")}; });''' : ''' // No default side'''} @override MaterialStateProperty<OutlinedBorder>? get shape => ButtonStyleButton.allOrNull<OutlinedBorder>(${shape("$tokenGroup.container")}); @override MaterialStateProperty<MouseCursor?>? get mouseCursor => MaterialStateProperty.resolveWith((Set<MaterialState> 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; } '''; }