Unverified Commit 66cda591 authored by Pierre-Louis's avatar Pierre-Louis Committed by GitHub

Improve defaults generation with logging, stats, and token validation (#128244)

## Description

This improves defaults generation with logging, stats, and token validation. 

This PR includes these changes:
* introduce `TokenLogger`, with a verbose mode
  * prints versions and tokens usage to the console
  * outputs `generated/used_tokens.csv`, a list of all used tokens, for use by Google
* find token files in `data` automatically
* hide tokens `Map`
  * tokens can be obtained using existing resolvers (e.g. `color`, `shape`), or directly through `getToken`.
  * tokens can be checked for existence with `tokenAvailable`
* remove version from template, since the tokens are aggregated and multiple versions are possible (as is the case currently), it does not make sense to attribute a single version
* improve documentation

## Related Issues
 - Fixes https://github.com/flutter/flutter/issues/122602

## Tests
 - Added tests for `TokenLogger`
 - Regenerated tokens, no-op except version removal

## Future work
A future PR should replace or remove the following invalid tokens usages

<img width="578" alt="image" src="https://github.com/flutter/flutter/assets/6655696/b6f9e5a7-523f-4f72-94f9-1b0bf4cc9f00">
parent 0d39f646
## Token Defaults Generator
Script that generates widget component theme data defaults
based on the Material Token database. These tokens were
extracted into a JSON file from an internal Google database.
Script that generates component theme data defaults based on token data.
## Usage
Run this program from the root of the git repository:
```
dart dev/tools/gen_defaults/bin/gen_defaults.dart
dart dev/tools/gen_defaults/bin/gen_defaults.dart [-v]
```
This updates `generated/used_tokens.csv` and the various component theme files.
## Templates
There is a template file for every component that needs defaults from
......@@ -18,10 +18,18 @@ the token database. These templates are implemented as subclasses of
for adding a new block of generated code to the bottom of a given file.
Templates need to override the `generate` method to provide the generated
code block as a string. The tokens are represented as a `Map<String, dynamic>`
that is loaded from `data/material-tokens.json`. Templates can look up
whatever properties are needed in this structure to provide the properties
needed for the component.
code block as a string.
See `lib/fab_template.dart` for an example that generates defaults for the
Floating Action Button.
## Tokens
Tokens are stored in JSON files in `data/`, and are sourced from
an internal Google database.
`template.dart` should provide nearly all useful token resolvers
(e.g. `color`, `shape`, etc.). For special cases in which one shouldn't
be defined, use `getToken` to get the raw token value. The script, through
the various revolvers and `getToken`, validates tokens, keeps track of
which tokens are used, and generates `generated/used_tokens.csv`.
......@@ -2,21 +2,18 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Generate component theme data defaults based on the Material
// Design Token database. These tokens were extracted into a
// JSON file from the internal Google database.
//
// ## Usage
//
// Run this program from the root of the git repository.
//
// ```
// dart dev/tools/gen_defaults/bin/gen_defaults.dart
// dart dev/tools/gen_defaults/bin/gen_defaults.dart [-v]
// ```
import 'dart:convert';
import 'dart:io';
import 'package:args/args.dart';
import 'package:gen_defaults/action_chip_template.dart';
import 'package:gen_defaults/app_bar_template.dart';
import 'package:gen_defaults/badge_template.dart';
......@@ -56,89 +53,51 @@ import 'package:gen_defaults/switch_template.dart';
import 'package:gen_defaults/tabs_template.dart';
import 'package:gen_defaults/text_field_template.dart';
import 'package:gen_defaults/time_picker_template.dart';
import 'package:gen_defaults/token_logger.dart';
import 'package:gen_defaults/typography_template.dart';
Map<String, dynamic> _readTokenFile(String fileName) {
return jsonDecode(File('dev/tools/gen_defaults/data/$fileName').readAsStringSync()) as Map<String, dynamic>;
Map<String, dynamic> _readTokenFile(File file) {
return jsonDecode(file.readAsStringSync()) as Map<String, dynamic>;
}
const String materialLib = 'packages/flutter/lib/src/material';
const String dataDir = 'dev/tools/gen_defaults/data';
Future<void> main(List<String> args) async {
const String materialLib = 'packages/flutter/lib/src/material';
const List<String> tokenFiles = <String>[
'badge.json',
'banner.json',
'badge.json',
'bottom_app_bar.json',
'button_elevated.json',
'button_filled.json',
'button_filled_tonal.json',
'button_outlined.json',
'button_text.json',
'card_elevated.json',
'card_filled.json',
'card_outlined.json',
'checkbox.json',
'chip_assist.json',
'chip_filter.json',
'chip_input.json',
'chip_suggestion.json',
'color_dark.json',
'color_light.json',
'date_picker_docked.json',
'date_picker_modal.json',
'dialog.json',
'dialog_fullscreen.json',
'divider.json',
'elevation.json',
'fab_extended_primary.json',
'fab_large_primary.json',
'fab_primary.json',
'fab_small_primary.json',
'icon_button.json',
'icon_button_filled.json',
'icon_button_filled_tonal.json',
'icon_button_outlined.json',
'list.json',
'menu.json',
'motion.json',
'navigation_bar.json',
'navigation_drawer.json',
'navigation_rail.json',
'navigation_tab_primary.json',
'navigation_tab_secondary.json',
'palette.json',
'progress_indicator_circular.json',
'progress_indicator_linear.json',
'radio_button.json',
'search_bar.json',
'search_view.json',
'segmented_button_outlined.json',
'shape.json',
'sheet_bottom.json',
'slider.json',
'snackbar.json',
'state.json',
'switch.json',
'text_field_filled.json',
'text_field_outlined.json',
'text_style.json',
'time_picker.json',
'top_app_bar_large.json',
'top_app_bar_medium.json',
'top_app_bar_small.json',
'typeface.json',
];
// Parse arguments
final ArgParser parser = ArgParser();
parser.addFlag(
'verbose',
abbr: 'v',
help: 'Enable verbose output',
negatable: false,
);
final ArgResults argResults = parser.parse(args);
final bool verbose = argResults['verbose'] as bool;
// Generate a map with all the tokens to simplify the template interface.
// Map of version number to list of data files that use that version.
final Map<String, List<String>> versionMap = <String, List<String>>{};
// Map of all tokens to their values.
final Map<String, dynamic> tokens = <String, dynamic>{};
for (final String tokenFile in tokenFiles) {
tokens.addAll(_readTokenFile(tokenFile));
// Initialize.
for (final FileSystemEntity tokenFile in Directory(dataDir).listSync()) {
final Map<String, dynamic> tokenFileTokens = _readTokenFile(tokenFile as File);
final String version = tokenFileTokens['version'] as String;
tokenFileTokens.remove('version');
if (versionMap[version] == null) {
versionMap[version] = List<String>.empty(growable: true);
}
versionMap[version]!.add(tokenFile.uri.pathSegments.last);
// Special case the light and dark color schemes.
tokens['colorsLight'] = _readTokenFile('color_light.json');
tokens['colorsDark'] = _readTokenFile('color_dark.json');
tokens.addAll(tokenFileTokens);
}
tokenLogger.init(allTokens: tokens, versionMap: versionMap);
// Handle light/dark color tokens separately because they share identical token names.
final Map<String, dynamic> colorLightTokens = _readTokenFile(File('$dataDir/color_light.json'));
final Map<String, dynamic> colorDarkTokens = _readTokenFile(File('$dataDir/color_dark.json'));
// Generate tokens files.
ChipTemplate('Chip', '$materialLib/chip.dart', tokens).updateFile();
ActionChipTemplate('ActionChip', '$materialLib/action_chip.dart', tokens).updateFile();
AppBarTemplate('AppBar', '$materialLib/app_bar.dart', tokens).updateFile();
......@@ -154,7 +113,7 @@ Future<void> main(List<String> args) async {
ButtonTemplate('md.comp.text-button', 'TextButton', '$materialLib/text_button.dart', tokens).updateFile();
CardTemplate('Card', '$materialLib/card.dart', tokens).updateFile();
CheckboxTemplate('Checkbox', '$materialLib/checkbox.dart', tokens).updateFile();
ColorSchemeTemplate('ColorScheme', '$materialLib/theme_data.dart', tokens).updateFile();
ColorSchemeTemplate(colorLightTokens, colorDarkTokens, 'ColorScheme', '$materialLib/theme_data.dart', tokens).updateFile();
DatePickerTemplate('DatePicker', '$materialLib/date_picker_theme.dart', tokens).updateFile();
DialogFullscreenTemplate('DialogFullscreen', '$materialLib/dialog.dart', tokens).updateFile();
DialogTemplate('Dialog', '$materialLib/dialog.dart', tokens).updateFile();
......@@ -189,4 +148,12 @@ Future<void> main(List<String> args) async {
TextFieldTemplate('TextField', '$materialLib/text_field.dart', tokens).updateFile();
TabsTemplate('Tabs', '$materialLib/tabs.dart', tokens).updateFile();
TypographyTemplate('Typography', '$materialLib/typography.dart', tokens).updateFile();
tokenLogger.printVersionUsage(verbose: verbose);
tokenLogger.printTokensUsage(verbose: verbose);
if (!verbose) {
print('\nTo see detailed version and token usage, run with --verbose (-v).');
}
tokenLogger.dumpToFile('dev/tools/gen_defaults/generated/used_tokens.csv');
}
This diff is collapsed.
......@@ -77,7 +77,7 @@ class _${blockName}DefaultsM3 extends ChipThemeData {
color: isEnabled
? ${color("$tokenGroup.with-icon.icon.color")}
: ${color("$tokenGroup.with-icon.disabled.icon.color")},
size: ${tokens["$tokenGroup.with-icon.icon.size"]},
size: ${getToken("$tokenGroup.with-icon.icon.size")},
);
@override
......
......@@ -19,7 +19,7 @@ class _${blockName}DefaultsM3 extends AppBarTheme {
elevation: ${elevation('md.comp.top-app-bar.small.container')},
scrolledUnderElevation: ${elevation('md.comp.top-app-bar.small.on-scroll.container')},
titleSpacing: NavigationToolbar.kMiddleSpacing,
toolbarHeight: ${tokens['md.comp.top-app-bar.small.container.height']},
toolbarHeight: ${getToken('md.comp.top-app-bar.small.container.height')},
);
final BuildContext context;
......@@ -42,13 +42,13 @@ class _${blockName}DefaultsM3 extends AppBarTheme {
@override
IconThemeData? get iconTheme => IconThemeData(
color: ${componentColor('md.comp.top-app-bar.small.leading-icon')},
size: ${tokens['md.comp.top-app-bar.small.leading-icon.size']},
size: ${getToken('md.comp.top-app-bar.small.leading-icon.size')},
);
@override
IconThemeData? get actionsIconTheme => IconThemeData(
color: ${componentColor('md.comp.top-app-bar.small.trailing-icon')},
size: ${tokens['md.comp.top-app-bar.small.trailing-icon.size']},
size: ${getToken('md.comp.top-app-bar.small.trailing-icon.size')},
);
@override
......@@ -67,8 +67,8 @@ class _MediumScrollUnderFlexibleConfig with _ScrollUnderFlexibleConfig {
late final ColorScheme _colors = _theme.colorScheme;
late final TextTheme _textTheme = _theme.textTheme;
static const double collapsedHeight = ${tokens['md.comp.top-app-bar.small.container.height']};
static const double expandedHeight = ${tokens['md.comp.top-app-bar.medium.container.height']};
static const double collapsedHeight = ${getToken('md.comp.top-app-bar.small.container.height')};
static const double expandedHeight = ${getToken('md.comp.top-app-bar.medium.container.height')};
@override
TextStyle? get collapsedTextStyle =>
......@@ -90,8 +90,8 @@ class _LargeScrollUnderFlexibleConfig with _ScrollUnderFlexibleConfig {
late final ColorScheme _colors = _theme.colorScheme;
late final TextTheme _textTheme = _theme.textTheme;
static const double collapsedHeight = ${tokens['md.comp.top-app-bar.small.container.height']};
static const double expandedHeight = ${tokens['md.comp.top-app-bar.large.container.height']};
static const double collapsedHeight = ${getToken('md.comp.top-app-bar.small.container.height')};
static const double expandedHeight = ${getToken('md.comp.top-app-bar.large.container.height')};
@override
TextStyle? get collapsedTextStyle =>
......
......@@ -13,8 +13,8 @@ class BadgeTemplate extends TokenTemplate {
String generate() => '''
class _${blockName}DefaultsM3 extends BadgeThemeData {
_${blockName}DefaultsM3(this.context) : super(
smallSize: ${tokens["md.comp.badge.size"]},
largeSize: ${tokens["md.comp.badge.large.size"]},
smallSize: ${getToken("md.comp.badge.size")},
largeSize: ${getToken("md.comp.badge.large.size")},
padding: const EdgeInsets.symmetric(horizontal: 4),
alignment: AlignmentDirectional.topEnd,
);
......
......@@ -15,7 +15,7 @@ class _${blockName}DefaultsM3 extends BottomAppBarTheme {
_${blockName}DefaultsM3(this.context)
: super(
elevation: ${elevation('md.comp.bottom-app-bar.container')},
height: ${tokens['md.comp.bottom-app-bar.container.height']},
height: ${getToken('md.comp.bottom-app-bar.container.height')},
shape: const AutomaticNotchedShape(${shape('md.comp.bottom-app-bar.container', '')}),
);
......
......@@ -12,7 +12,7 @@ class ButtonTemplate extends TokenTemplate {
final String tokenGroup;
String _backgroundColor() {
if (tokens.containsKey('$tokenGroup.container.color')) {
if (tokenAvailable('$tokenGroup.container.color')) {
return '''
MaterialStateProperty.resolveWith((Set<MaterialState> states) {
......@@ -28,7 +28,7 @@ class ButtonTemplate extends TokenTemplate {
}
String _elevation() {
if (tokens.containsKey('$tokenGroup.container.elevation')) {
if (tokenAvailable('$tokenGroup.container.elevation')) {
return '''
MaterialStateProperty.resolveWith((Set<MaterialState> states) {
......@@ -53,7 +53,7 @@ class ButtonTemplate extends TokenTemplate {
}
String _elevationColor(String token) {
if (tokens.containsKey(token)) {
if (tokenAvailable(token)) {
return 'MaterialStatePropertyAll<Color>(${color(token)})';
} else {
return 'const MaterialStatePropertyAll<Color>(Colors.transparent)';
......@@ -121,7 +121,7 @@ class _${blockName}DefaultsM3 extends ButtonStyle {
@override
MaterialStateProperty<Size>? get minimumSize =>
const MaterialStatePropertyAll<Size>(Size(64.0, ${tokens["$tokenGroup.container.height"]}));
const MaterialStatePropertyAll<Size>(Size(64.0, ${getToken("$tokenGroup.container.height")}));
// No default fixedSize
......@@ -129,7 +129,7 @@ class _${blockName}DefaultsM3 extends ButtonStyle {
MaterialStateProperty<Size>? get maximumSize =>
const MaterialStatePropertyAll<Size>(Size.infinite);
${tokens.containsKey("$tokenGroup.outline.color") ? '''
${tokenAvailable("$tokenGroup.outline.color") ? '''
@override
MaterialStateProperty<BorderSide>? get side =>
MaterialStateProperty.resolveWith((Set<MaterialState> states) {
......
......@@ -24,26 +24,26 @@ class _${blockName}DefaultsM3 extends CheckboxThemeData {
return MaterialStateBorderSide.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.disabled)) {
if (states.contains(MaterialState.selected)) {
return const BorderSide(width: ${tokens['md.comp.checkbox.unselected.disabled.outline.width']}, color: Colors.transparent);
return const BorderSide(width: ${getToken('md.comp.checkbox.unselected.disabled.outline.width')}, color: Colors.transparent);
}
return BorderSide(width: ${tokens['md.comp.checkbox.unselected.disabled.outline.width']}, color: ${componentColor('md.comp.checkbox.unselected.disabled.outline')}.withOpacity(${tokens['md.comp.checkbox.unselected.disabled.container.opacity']}));
return BorderSide(width: ${getToken('md.comp.checkbox.unselected.disabled.outline.width')}, color: ${componentColor('md.comp.checkbox.unselected.disabled.outline')}.withOpacity(${getToken('md.comp.checkbox.unselected.disabled.container.opacity')}));
}
if (states.contains(MaterialState.selected)) {
return const BorderSide(width: ${tokens['md.comp.checkbox.selected.outline.width']}, color: Colors.transparent);
return const BorderSide(width: ${getToken('md.comp.checkbox.selected.outline.width')}, color: Colors.transparent);
}
if (states.contains(MaterialState.error)) {
return BorderSide(width: ${tokens['md.comp.checkbox.unselected.disabled.outline.width']}, color: ${componentColor('md.comp.checkbox.unselected.error.outline')});
return BorderSide(width: ${getToken('md.comp.checkbox.unselected.disabled.outline.width')}, color: ${componentColor('md.comp.checkbox.unselected.error.outline')});
}
if (states.contains(MaterialState.pressed)) {
return BorderSide(width: ${tokens['md.comp.checkbox.unselected.pressed.outline.width']}, color: ${componentColor('md.comp.checkbox.unselected.pressed.outline')});
return BorderSide(width: ${getToken('md.comp.checkbox.unselected.pressed.outline.width')}, color: ${componentColor('md.comp.checkbox.unselected.pressed.outline')});
}
if (states.contains(MaterialState.hovered)) {
return BorderSide(width: ${tokens['md.comp.checkbox.unselected.hover.outline.width']}, color: ${componentColor('md.comp.checkbox.unselected.hover.outline')});
return BorderSide(width: ${getToken('md.comp.checkbox.unselected.hover.outline.width')}, color: ${componentColor('md.comp.checkbox.unselected.hover.outline')});
}
if (states.contains(MaterialState.focused)) {
return BorderSide(width: ${tokens['md.comp.checkbox.unselected.focus.outline.width']}, color: ${componentColor('md.comp.checkbox.unselected.focus.outline')});
return BorderSide(width: ${getToken('md.comp.checkbox.unselected.focus.outline.width')}, color: ${componentColor('md.comp.checkbox.unselected.focus.outline')});
}
return BorderSide(width: ${tokens['md.comp.checkbox.unselected.outline.width']}, color: ${componentColor('md.comp.checkbox.unselected.outline')});
return BorderSide(width: ${getToken('md.comp.checkbox.unselected.outline.width')}, color: ${componentColor('md.comp.checkbox.unselected.outline')});
});
}
......@@ -125,7 +125,7 @@ class _${blockName}DefaultsM3 extends CheckboxThemeData {
}
@override
double get splashRadius => ${tokens['md.comp.checkbox.state-layer.size']} / 2;
double get splashRadius => ${getToken('md.comp.checkbox.state-layer.size')} / 2;
@override
MaterialTapTargetSize get materialTapTargetSize => _theme.materialTapTargetSize;
......@@ -135,7 +135,7 @@ class _${blockName}DefaultsM3 extends CheckboxThemeData {
@override
OutlinedBorder get shape => const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(${tokens['md.comp.checkbox.unselected.outline.width']})),
borderRadius: BorderRadius.all(Radius.circular(${getToken('md.comp.checkbox.unselected.outline.width')})),
);
}
''';
......
......@@ -62,7 +62,7 @@ class _${blockName}DefaultsM3 extends ChipThemeData {
color: isEnabled
? ${color("$tokenGroup.with-icon.icon.color")}
: ${color("$tokenGroup.with-icon.disabled.icon.color")},
size: ${tokens["$tokenGroup.with-icon.icon.size"]},
size: ${getToken("$tokenGroup.with-icon.icon.size")},
);
@override
......
......@@ -3,86 +3,97 @@
// found in the LICENSE file.
import 'template.dart';
import 'token_logger.dart';
class ColorSchemeTemplate extends TokenTemplate {
ColorSchemeTemplate(super.blockName, super.fileName, super.tokens);
ColorSchemeTemplate(this._colorTokensLight, this._colorTokensDark, super.blockName, super.fileName, super.tokens);
// Map of light color scheme token data from tokens.
late Map<String, dynamic> colorTokensLight = tokens['colorsLight'] as Map<String, dynamic>;
final Map<String, dynamic> _colorTokensLight;
// Map of dark color scheme token data from tokens.
late Map<String, dynamic> colorTokensDark = tokens['colorsDark'] as Map<String, dynamic>;
final Map<String, dynamic> _colorTokensDark;
dynamic light(String tokenName) {
tokenLogger.log(tokenName);
return getToken(_colorTokensLight[tokenName] as String);
}
dynamic dark(String tokenName) {
tokenLogger.log(tokenName);
return getToken(_colorTokensDark[tokenName] as String);
}
@override
String generate() => '''
const ColorScheme _colorSchemeLightM3 = ColorScheme(
brightness: Brightness.light,
primary: Color(${tokens[colorTokensLight['md.sys.color.primary']]}),
onPrimary: Color(${tokens[colorTokensLight['md.sys.color.on-primary']]}),
primaryContainer: Color(${tokens[colorTokensLight['md.sys.color.primary-container']]}),
onPrimaryContainer: Color(${tokens[colorTokensLight['md.sys.color.on-primary-container']]}),
secondary: Color(${tokens[colorTokensLight['md.sys.color.secondary']]}),
onSecondary: Color(${tokens[colorTokensLight['md.sys.color.on-secondary']]}),
secondaryContainer: Color(${tokens[colorTokensLight['md.sys.color.secondary-container']]}),
onSecondaryContainer: Color(${tokens[colorTokensLight['md.sys.color.on-secondary-container']]}),
tertiary: Color(${tokens[colorTokensLight['md.sys.color.tertiary']]}),
onTertiary: Color(${tokens[colorTokensLight['md.sys.color.on-tertiary']]}),
tertiaryContainer: Color(${tokens[colorTokensLight['md.sys.color.tertiary-container']]}),
onTertiaryContainer: Color(${tokens[colorTokensLight['md.sys.color.on-tertiary-container']]}),
error: Color(${tokens[colorTokensLight['md.sys.color.error']]}),
onError: Color(${tokens[colorTokensLight['md.sys.color.on-error']]}),
errorContainer: Color(${tokens[colorTokensLight['md.sys.color.error-container']]}),
onErrorContainer: Color(${tokens[colorTokensLight['md.sys.color.on-error-container']]}),
background: Color(${tokens[colorTokensLight['md.sys.color.background']]}),
onBackground: Color(${tokens[colorTokensLight['md.sys.color.on-background']]}),
surface: Color(${tokens[colorTokensLight['md.sys.color.surface']]}),
onSurface: Color(${tokens[colorTokensLight['md.sys.color.on-surface']]}),
surfaceVariant: Color(${tokens[colorTokensLight['md.sys.color.surface-variant']]}),
onSurfaceVariant: Color(${tokens[colorTokensLight['md.sys.color.on-surface-variant']]}),
outline: Color(${tokens[colorTokensLight['md.sys.color.outline']]}),
outlineVariant: Color(${tokens[colorTokensLight['md.sys.color.outline-variant']]}),
shadow: Color(${tokens[colorTokensLight['md.sys.color.shadow']]}),
scrim: Color(${tokens[colorTokensLight['md.sys.color.scrim']]}),
inverseSurface: Color(${tokens[colorTokensLight['md.sys.color.inverse-surface']]}),
onInverseSurface: Color(${tokens[colorTokensLight['md.sys.color.inverse-on-surface']]}),
inversePrimary: Color(${tokens[colorTokensLight['md.sys.color.inverse-primary']]}),
primary: Color(${light('md.sys.color.primary')}),
onPrimary: Color(${light('md.sys.color.on-primary')}),
primaryContainer: Color(${light('md.sys.color.primary-container')}),
onPrimaryContainer: Color(${light('md.sys.color.on-primary-container')}),
secondary: Color(${light('md.sys.color.secondary')}),
onSecondary: Color(${light('md.sys.color.on-secondary')}),
secondaryContainer: Color(${light('md.sys.color.secondary-container')}),
onSecondaryContainer: Color(${light('md.sys.color.on-secondary-container')}),
tertiary: Color(${light('md.sys.color.tertiary')}),
onTertiary: Color(${light('md.sys.color.on-tertiary')}),
tertiaryContainer: Color(${light('md.sys.color.tertiary-container')}),
onTertiaryContainer: Color(${light('md.sys.color.on-tertiary-container')}),
error: Color(${light('md.sys.color.error')}),
onError: Color(${light('md.sys.color.on-error')}),
errorContainer: Color(${light('md.sys.color.error-container')}),
onErrorContainer: Color(${light('md.sys.color.on-error-container')}),
background: Color(${light('md.sys.color.background')}),
onBackground: Color(${light('md.sys.color.on-background')}),
surface: Color(${light('md.sys.color.surface')}),
onSurface: Color(${light('md.sys.color.on-surface')}),
surfaceVariant: Color(${light('md.sys.color.surface-variant')}),
onSurfaceVariant: Color(${light('md.sys.color.on-surface-variant')}),
outline: Color(${light('md.sys.color.outline')}),
outlineVariant: Color(${light('md.sys.color.outline-variant')}),
shadow: Color(${light('md.sys.color.shadow')}),
scrim: Color(${light('md.sys.color.scrim')}),
inverseSurface: Color(${light('md.sys.color.inverse-surface')}),
onInverseSurface: Color(${light('md.sys.color.inverse-on-surface')}),
inversePrimary: Color(${light('md.sys.color.inverse-primary')}),
// The surfaceTint color is set to the same color as the primary.
surfaceTint: Color(${tokens[colorTokensLight['md.sys.color.primary']]}),
surfaceTint: Color(${light('md.sys.color.primary')}),
);
const ColorScheme _colorSchemeDarkM3 = ColorScheme(
brightness: Brightness.dark,
primary: Color(${tokens[colorTokensDark['md.sys.color.primary']]}),
onPrimary: Color(${tokens[colorTokensDark['md.sys.color.on-primary']]}),
primaryContainer: Color(${tokens[colorTokensDark['md.sys.color.primary-container']]}),
onPrimaryContainer: Color(${tokens[colorTokensDark['md.sys.color.on-primary-container']]}),
secondary: Color(${tokens[colorTokensDark['md.sys.color.secondary']]}),
onSecondary: Color(${tokens[colorTokensDark['md.sys.color.on-secondary']]}),
secondaryContainer: Color(${tokens[colorTokensDark['md.sys.color.secondary-container']]}),
onSecondaryContainer: Color(${tokens[colorTokensDark['md.sys.color.on-secondary-container']]}),
tertiary: Color(${tokens[colorTokensDark['md.sys.color.tertiary']]}),
onTertiary: Color(${tokens[colorTokensDark['md.sys.color.on-tertiary']]}),
tertiaryContainer: Color(${tokens[colorTokensDark['md.sys.color.tertiary-container']]}),
onTertiaryContainer: Color(${tokens[colorTokensDark['md.sys.color.on-tertiary-container']]}),
error: Color(${tokens[colorTokensDark['md.sys.color.error']]}),
onError: Color(${tokens[colorTokensDark['md.sys.color.on-error']]}),
errorContainer: Color(${tokens[colorTokensDark['md.sys.color.error-container']]}),
onErrorContainer: Color(${tokens[colorTokensDark['md.sys.color.on-error-container']]}),
background: Color(${tokens[colorTokensDark['md.sys.color.background']]}),
onBackground: Color(${tokens[colorTokensDark['md.sys.color.on-background']]}),
surface: Color(${tokens[colorTokensDark['md.sys.color.surface']]}),
onSurface: Color(${tokens[colorTokensDark['md.sys.color.on-surface']]}),
surfaceVariant: Color(${tokens[colorTokensDark['md.sys.color.surface-variant']]}),
onSurfaceVariant: Color(${tokens[colorTokensDark['md.sys.color.on-surface-variant']]}),
outline: Color(${tokens[colorTokensDark['md.sys.color.outline']]}),
outlineVariant: Color(${tokens[colorTokensDark['md.sys.color.outline-variant']]}),
shadow: Color(${tokens[colorTokensDark['md.sys.color.shadow']]}),
scrim: Color(${tokens[colorTokensDark['md.sys.color.scrim']]}),
inverseSurface: Color(${tokens[colorTokensDark['md.sys.color.inverse-surface']]}),
onInverseSurface: Color(${tokens[colorTokensDark['md.sys.color.inverse-on-surface']]}),
inversePrimary: Color(${tokens[colorTokensDark['md.sys.color.inverse-primary']]}),
primary: Color(${dark('md.sys.color.primary')}),
onPrimary: Color(${dark('md.sys.color.on-primary')}),
primaryContainer: Color(${dark('md.sys.color.primary-container')}),
onPrimaryContainer: Color(${dark('md.sys.color.on-primary-container')}),
secondary: Color(${dark('md.sys.color.secondary')}),
onSecondary: Color(${dark('md.sys.color.on-secondary')}),
secondaryContainer: Color(${dark('md.sys.color.secondary-container')}),
onSecondaryContainer: Color(${dark('md.sys.color.on-secondary-container')}),
tertiary: Color(${dark('md.sys.color.tertiary')}),
onTertiary: Color(${dark('md.sys.color.on-tertiary')}),
tertiaryContainer: Color(${dark('md.sys.color.tertiary-container')}),
onTertiaryContainer: Color(${dark('md.sys.color.on-tertiary-container')}),
error: Color(${dark('md.sys.color.error')}),
onError: Color(${dark('md.sys.color.on-error')}),
errorContainer: Color(${dark('md.sys.color.error-container')}),
onErrorContainer: Color(${dark('md.sys.color.on-error-container')}),
background: Color(${dark('md.sys.color.background')}),
onBackground: Color(${dark('md.sys.color.on-background')}),
surface: Color(${dark('md.sys.color.surface')}),
onSurface: Color(${dark('md.sys.color.on-surface')}),
surfaceVariant: Color(${dark('md.sys.color.surface-variant')}),
onSurfaceVariant: Color(${dark('md.sys.color.on-surface-variant')}),
outline: Color(${dark('md.sys.color.outline')}),
outlineVariant: Color(${dark('md.sys.color.outline-variant')}),
shadow: Color(${dark('md.sys.color.shadow')}),
scrim: Color(${dark('md.sys.color.scrim')}),
inverseSurface: Color(${dark('md.sys.color.inverse-surface')}),
onInverseSurface: Color(${dark('md.sys.color.inverse-on-surface')}),
inversePrimary: Color(${dark('md.sys.color.inverse-primary')}),
// The surfaceTint color is set to the same color as the primary.
surfaceTint: Color(${tokens[colorTokensDark['md.sys.color.primary']]}),
surfaceTint: Color(${dark('md.sys.color.primary')}),
);
''';
}
......@@ -11,10 +11,10 @@ class DatePickerTemplate extends TokenTemplate {
});
String _layerOpacity(String layerToken) {
if (tokens.containsKey(layerToken)) {
final String? layerValue = tokens[layerToken] as String?;
if (tokens.containsKey(layerValue)) {
final String? opacityValue = opacity(layerValue!);
if (tokenAvailable(layerToken)) {
final String layerValue = getToken(layerToken) as String;
if (tokenAvailable(layerValue)) {
final String? opacityValue = opacity(layerValue);
if (opacityValue != null) {
return '.withOpacity($opacityValue)';
}
......
......@@ -12,7 +12,7 @@ class DividerTemplate extends TokenTemplate {
class _${blockName}DefaultsM3 extends DividerThemeData {
const _${blockName}DefaultsM3(this.context) : super(
space: 16,
thickness: ${tokens["md.comp.divider.thickness"]},
thickness: ${getToken("md.comp.divider.thickness")},
indent: 0,
endIndent: 0,
);
......
......@@ -21,19 +21,19 @@ class _${blockName}DefaultsM3 extends FloatingActionButtonThemeData {
highlightElevation: ${elevation("md.comp.fab.primary.pressed.container")},
enableFeedback: true,
sizeConstraints: const BoxConstraints.tightFor(
width: ${tokens["md.comp.fab.primary.container.width"]},
height: ${tokens["md.comp.fab.primary.container.height"]},
width: ${getToken("md.comp.fab.primary.container.width")},
height: ${getToken("md.comp.fab.primary.container.height")},
),
smallSizeConstraints: const BoxConstraints.tightFor(
width: ${tokens["md.comp.fab.primary.small.container.width"]},
height: ${tokens["md.comp.fab.primary.small.container.height"]},
width: ${getToken("md.comp.fab.primary.small.container.width")},
height: ${getToken("md.comp.fab.primary.small.container.height")},
),
largeSizeConstraints: const BoxConstraints.tightFor(
width: ${tokens["md.comp.fab.primary.large.container.width"]},
height: ${tokens["md.comp.fab.primary.large.container.height"]},
width: ${getToken("md.comp.fab.primary.large.container.width")},
height: ${getToken("md.comp.fab.primary.large.container.height")},
),
extendedSizeConstraints: const BoxConstraints.tightFor(
height: ${tokens["md.comp.extended-fab.primary.container.height"]},
height: ${getToken("md.comp.extended-fab.primary.container.height")},
),
extendedIconLabelSpacing: 8.0,
);
......@@ -69,10 +69,10 @@ class _${blockName}DefaultsM3 extends FloatingActionButtonThemeData {
@override
double? get iconSize {
switch (type) {
case _FloatingActionButtonType.regular: return ${tokens["md.comp.fab.primary.icon.size"]};
case _FloatingActionButtonType.small: return ${tokens["md.comp.fab.primary.small.icon.size"]};
case _FloatingActionButtonType.large: return ${tokens["md.comp.fab.primary.large.icon.size"]};
case _FloatingActionButtonType.extended: return ${tokens["md.comp.extended-fab.primary.icon.size"]};
case _FloatingActionButtonType.regular: return ${getToken("md.comp.fab.primary.icon.size")};
case _FloatingActionButtonType.small: return ${getToken("md.comp.fab.primary.small.icon.size")};
case _FloatingActionButtonType.large: return ${getToken("md.comp.fab.primary.large.icon.size")};
case _FloatingActionButtonType.extended: return ${getToken("md.comp.extended-fab.primary.icon.size")};
}
}
......
......@@ -90,7 +90,7 @@ class _${blockName}DefaultsM3 extends ChipThemeData {
color: isEnabled
? ${color("$tokenGroup.with-icon.icon.color")}
: ${color("$tokenGroup.with-leading-icon.disabled.leading-icon.color")},
size: ${tokens["$tokenGroup.with-icon.icon.size"]},
size: ${getToken("$tokenGroup.with-icon.icon.size")},
);
@override
......
......@@ -185,19 +185,19 @@ class IconButtonTemplate extends TokenTemplate {
}
String _minimumSize() {
if (tokens.containsKey('$tokenGroup.container.size')) {
if (tokenAvailable('$tokenGroup.container.size')) {
return '''
const MaterialStatePropertyAll<Size>(Size(${tokens['$tokenGroup.container.size']}, ${tokens['$tokenGroup.container.size']}))''';
const MaterialStatePropertyAll<Size>(Size(${getToken('$tokenGroup.container.size')}, ${getToken('$tokenGroup.container.size')}))''';
} else {
return '''
const MaterialStatePropertyAll<Size>(Size(${tokens['$tokenGroup.state-layer.size']}, ${tokens['$tokenGroup.state-layer.size']}))''';
const MaterialStatePropertyAll<Size>(Size(${getToken('$tokenGroup.state-layer.size')}, ${getToken('$tokenGroup.state-layer.size')}))''';
}
}
String _shape() {
if (tokens.containsKey('$tokenGroup.container.shape')) {
if (tokenAvailable('$tokenGroup.container.shape')) {
return '''
const MaterialStatePropertyAll<OutlinedBorder>(${shape("$tokenGroup.container", "")})''';
......@@ -209,7 +209,7 @@ class IconButtonTemplate extends TokenTemplate {
}
String _side() {
if (tokens.containsKey('$tokenGroup.unselected.outline.color')) {
if (tokenAvailable('$tokenGroup.unselected.outline.color')) {
return '''
MaterialStateProperty.resolveWith((Set<MaterialState> states) {
......@@ -227,7 +227,7 @@ class IconButtonTemplate extends TokenTemplate {
}
String _elevationColor(String token) {
if (tokens.containsKey(token)) {
if (tokenAvailable(token)) {
return 'MaterialStatePropertyAll<Color>(${color(token)})';
} else {
return 'const MaterialStatePropertyAll<Color>(Colors.transparent)';
......@@ -286,7 +286,7 @@ class _${blockName}DefaultsM3 extends ButtonStyle {
@override
MaterialStateProperty<double>? get iconSize =>
const MaterialStatePropertyAll<double>(${tokens["$tokenGroup.icon.size"]});
const MaterialStatePropertyAll<double>(${getToken("$tokenGroup.icon.size")});
@override
MaterialStateProperty<BorderSide?>? get side =>${_side()};
......
......@@ -67,7 +67,7 @@ class _${blockName}DefaultsM3 extends ChipThemeData {
color: isEnabled
? ${color("$tokenGroup.with-leading-icon.leading-icon.color")}
: ${color("$tokenGroup.with-leading-icon.disabled.leading-icon.color")},
size: ${tokens["$tokenGroup.with-leading-icon.leading-icon.size"]},
size: ${getToken("$tokenGroup.with-leading-icon.leading-icon.size")},
);
@override
......
......@@ -215,10 +215,10 @@ class _${blockName}DefaultsM3 extends InputDecorationTheme {
? componentColor(componentToken1)
: componentColor(componentToken2);
final double width = (
tokens['$componentToken1.width'] ??
tokens['$componentToken1.height'] ??
tokens['$componentToken2.width'] ??
tokens['$componentToken2.height'] ??
getToken('$componentToken1.width') ??
getToken('$componentToken1.height') ??
getToken('$componentToken2.width') ??
getToken('$componentToken2.height') ??
1.0) as double;
return 'BorderSide(color: $borderColor${width != 1.0 ? ", width: $width" : ""})';
}
......
......@@ -15,7 +15,7 @@ class NavigationBarTemplate extends TokenTemplate {
class _${blockName}DefaultsM3 extends NavigationBarThemeData {
_${blockName}DefaultsM3(this.context)
: super(
height: ${tokens["md.comp.navigation-bar.container.height"]},
height: ${getToken("md.comp.navigation-bar.container.height")},
elevation: ${elevation("md.comp.navigation-bar.container")},
labelBehavior: NavigationDestinationLabelBehavior.alwaysShow,
);
......@@ -33,7 +33,7 @@ class _${blockName}DefaultsM3 extends NavigationBarThemeData {
@override MaterialStateProperty<IconThemeData?>? get iconTheme {
return MaterialStateProperty.resolveWith((Set<MaterialState> states) {
return IconThemeData(
size: ${tokens["md.comp.navigation-bar.icon.size"]},
size: ${getToken("md.comp.navigation-bar.icon.size")},
color: states.contains(MaterialState.selected)
? ${componentColor("md.comp.navigation-bar.active.icon")}
: ${componentColor("md.comp.navigation-bar.inactive.icon")},
......
......@@ -16,9 +16,9 @@ class _${blockName}DefaultsM3 extends NavigationDrawerThemeData {
_${blockName}DefaultsM3(this.context)
: super(
elevation: ${elevation("md.comp.navigation-drawer.modal.container")},
tileHeight: ${tokens["md.comp.navigation-drawer.active-indicator.height"]},
tileHeight: ${getToken("md.comp.navigation-drawer.active-indicator.height")},
indicatorShape: ${shape("md.comp.navigation-drawer.active-indicator")},
indicatorSize: const Size(${tokens["md.comp.navigation-drawer.active-indicator.width"]}, ${tokens["md.comp.navigation-drawer.active-indicator.height"]}),
indicatorSize: const Size(${getToken("md.comp.navigation-drawer.active-indicator.width")}, ${getToken("md.comp.navigation-drawer.active-indicator.height")}),
);
final BuildContext context;
......@@ -41,7 +41,7 @@ class _${blockName}DefaultsM3 extends NavigationDrawerThemeData {
MaterialStateProperty<IconThemeData?>? get iconTheme {
return MaterialStateProperty.resolveWith((Set<MaterialState> states) {
return IconThemeData(
size: ${tokens["md.comp.navigation-drawer.icon.size"]},
size: ${getToken("md.comp.navigation-drawer.icon.size")},
color: states.contains(MaterialState.selected)
? ${componentColor("md.comp.navigation-drawer.active.icon.")}
: ${componentColor("md.comp.navigation-drawer.inactive.icon")},
......
......@@ -19,7 +19,7 @@ class _${blockName}DefaultsM3 extends NavigationRailThemeData {
groupAlignment: -1,
labelType: NavigationRailLabelType.none,
useIndicator: true,
minWidth: ${tokens["md.comp.navigation-rail.container.width"]},
minWidth: ${getToken('md.comp.navigation-rail.container.width')},
minExtendedWidth: 256,
);
......@@ -39,14 +39,14 @@ class _${blockName}DefaultsM3 extends NavigationRailThemeData {
@override IconThemeData? get unselectedIconTheme {
return IconThemeData(
size: ${tokens["md.comp.navigation-rail.icon.size"]},
size: ${getToken("md.comp.navigation-rail.icon.size")},
color: ${componentColor("md.comp.navigation-rail.inactive.icon")},
);
}
@override IconThemeData? get selectedIconTheme {
return IconThemeData(
size: ${tokens["md.comp.navigation-rail.icon.size"]},
size: ${getToken("md.comp.navigation-rail.icon.size")},
color: ${componentColor("md.comp.navigation-rail.active.icon")},
);
}
......
......@@ -34,7 +34,7 @@ class _Linear${blockName}DefaultsM3 extends ProgressIndicatorThemeData {
Color get linearTrackColor => ${componentColor('md.comp.linear-progress-indicator.track')};
@override
double get linearMinHeight => ${tokens['md.comp.linear-progress-indicator.track.height']};
double get linearMinHeight => ${getToken('md.comp.linear-progress-indicator.track.height')};
}
''';
}
......@@ -70,7 +70,7 @@ class _SearchBarDefaultsM3 extends SearchBarThemeData {
@override
BoxConstraints get constraints =>
const BoxConstraints(minWidth: 360.0, maxWidth: 800.0, minHeight: ${tokens['md.comp.search-bar.container.height']});
const BoxConstraints(minWidth: 360.0, maxWidth: 800.0, minHeight: ${getToken('md.comp.search-bar.container.height')});
}
''';
}
......@@ -20,7 +20,7 @@ class _${blockName}DefaultsM3 extends ${blockName}ThemeData {
late final ColorScheme _colors = Theme.of(context).colorScheme;
late final TextTheme _textTheme = Theme.of(context).textTheme;
static double fullScreenBarHeight = ${tokens['md.comp.search-view.full-screen.header.container.height']};
static double fullScreenBarHeight = ${getToken('md.comp.search-view.full-screen.header.container.height')};
@override
Color? get backgroundColor => ${componentColor('md.comp.search-view.container')};
......
......@@ -12,10 +12,10 @@ class SegmentedButtonTemplate extends TokenTemplate {
final String tokenGroup;
String _layerOpacity(String layerToken) {
if (tokens.containsKey(layerToken)) {
final String? layerValue = tokens[layerToken] as String?;
if (tokens.containsKey(layerValue)) {
final String? opacityValue = opacity(layerValue!);
if (tokenAvailable(layerToken)) {
final String layerValue = getToken(layerToken) as String;
if (tokenAvailable(layerValue)) {
final String? opacityValue = opacity(layerValue);
if (opacityValue != null) {
return '.withOpacity($opacityValue)';
}
......@@ -106,7 +106,7 @@ class _${blockName}DefaultsM3 extends SegmentedButtonThemeData {
}),
surfaceTintColor: const MaterialStatePropertyAll<Color>(Colors.transparent),
elevation: const MaterialStatePropertyAll<double>(0),
iconSize: const MaterialStatePropertyAll<double?>(${tokens['$tokenGroup.with-icon.icon.size']}),
iconSize: const MaterialStatePropertyAll<double?>(${getToken('$tokenGroup.with-icon.icon.size')}),
side: MaterialStateProperty.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.disabled)) {
return ${border("$tokenGroup.disabled.outline")};
......@@ -114,7 +114,7 @@ class _${blockName}DefaultsM3 extends SegmentedButtonThemeData {
return ${border("$tokenGroup.outline")};
}),
shape: const MaterialStatePropertyAll<OutlinedBorder>(${shape(tokenGroup, '')}),
minimumSize: const MaterialStatePropertyAll<Size?>(Size.fromHeight(${tokens['$tokenGroup.container.height']})),
minimumSize: const MaterialStatePropertyAll<Size?>(Size.fromHeight(${getToken('$tokenGroup.container.height')})),
);
}
@override
......
......@@ -15,7 +15,7 @@ class SliderTemplate extends TokenTemplate {
String generate() => '''
class _${blockName}DefaultsM3 extends SliderThemeData {
_${blockName}DefaultsM3(this.context)
: super(trackHeight: ${tokens['$tokenGroup.active.track.height']});
: super(trackHeight: ${getToken('$tokenGroup.active.track.height')});
final BuildContext context;
late final ColorScheme _colors = Theme.of(context).colorScheme;
......
......@@ -14,12 +14,12 @@ class SurfaceTintTemplate extends TokenTemplate {
// https://m3.material.io/styles/color/the-color-system/color-roles
// Ordered by increasing elevation.
const List<_ElevationOpacity> _surfaceTintElevationOpacities = <_ElevationOpacity>[
_ElevationOpacity(${tokens['md.sys.elevation.level0']}, 0.0), // Elevation level 0
_ElevationOpacity(${tokens['md.sys.elevation.level1']}, 0.05), // Elevation level 1
_ElevationOpacity(${tokens['md.sys.elevation.level2']}, 0.08), // Elevation level 2
_ElevationOpacity(${tokens['md.sys.elevation.level3']}, 0.11), // Elevation level 3
_ElevationOpacity(${tokens['md.sys.elevation.level4']}, 0.12), // Elevation level 4
_ElevationOpacity(${tokens['md.sys.elevation.level5']}, 0.14), // Elevation level 5
_ElevationOpacity(${getToken('md.sys.elevation.level0')}, 0.0), // Elevation level 0
_ElevationOpacity(${getToken('md.sys.elevation.level1')}, 0.05), // Elevation level 1
_ElevationOpacity(${getToken('md.sys.elevation.level2')}, 0.08), // Elevation level 2
_ElevationOpacity(${getToken('md.sys.elevation.level3')}, 0.11), // Elevation level 3
_ElevationOpacity(${getToken('md.sys.elevation.level4')}, 0.12), // Elevation level 4
_ElevationOpacity(${getToken('md.sys.elevation.level5')}, 0.14), // Elevation level 5
];
''';
}
......@@ -127,10 +127,10 @@ class _${blockName}DefaultsM3 extends SwitchThemeData {
}
@override
MaterialStatePropertyAll<double> get trackOutlineWidth => const MaterialStatePropertyAll<double>(${tokens['md.comp.switch.track.outline.width']});
MaterialStatePropertyAll<double> get trackOutlineWidth => const MaterialStatePropertyAll<double>(${getToken('md.comp.switch.track.outline.width')});
@override
double get splashRadius => ${tokens['md.comp.switch.state-layer.size']} / 2;
double get splashRadius => ${getToken('md.comp.switch.state-layer.size')} / 2;
}
class _SwitchConfigM3 with _SwitchConfig {
......@@ -140,10 +140,10 @@ class _SwitchConfigM3 with _SwitchConfig {
BuildContext context;
final ColorScheme _colors;
static const double iconSize = ${tokens['md.comp.switch.unselected.icon.size']};
static const double iconSize = ${getToken('md.comp.switch.unselected.icon.size')};
@override
double get activeThumbRadius => ${tokens['md.comp.switch.selected.handle.width']} / 2;
double get activeThumbRadius => ${getToken('md.comp.switch.selected.handle.width')} / 2;
@override
MaterialStateProperty<Color> get iconColor {
......@@ -180,10 +180,10 @@ class _SwitchConfigM3 with _SwitchConfig {
}
@override
double get inactiveThumbRadius => ${tokens['md.comp.switch.unselected.handle.width']} / 2;
double get inactiveThumbRadius => ${getToken('md.comp.switch.unselected.handle.width')} / 2;
@override
double get pressedThumbRadius => ${tokens['md.comp.switch.pressed.handle.width']} / 2;
double get pressedThumbRadius => ${getToken('md.comp.switch.pressed.handle.width')} / 2;
@override
double get switchHeight => _kSwitchMinSize + 8.0;
......@@ -195,16 +195,16 @@ class _SwitchConfigM3 with _SwitchConfig {
double get switchWidth => trackWidth - 2 * (trackHeight / 2.0) + _kSwitchMinSize;
@override
double get thumbRadiusWithIcon => ${tokens['md.comp.switch.with-icon.handle.width']} / 2;
double get thumbRadiusWithIcon => ${getToken('md.comp.switch.with-icon.handle.width')} / 2;
@override
List<BoxShadow>? get thumbShadow => kElevationToShadow[0];
@override
double get trackHeight => ${tokens['md.comp.switch.track.height']};
double get trackHeight => ${getToken('md.comp.switch.track.height')};
@override
double get trackWidth => ${tokens['md.comp.switch.track.width']};
double get trackWidth => ${getToken('md.comp.switch.track.width')};
// The thumb size at the middle of the track. Hand coded default based on the animation specs.
@override
......
......@@ -73,7 +73,7 @@ class _${blockName}PrimaryDefaultsM3 extends TabBarTheme {
@override
TabAlignment? get tabAlignment => isScrollable ? TabAlignment.start : TabAlignment.fill;
static double indicatorWeight = ${tokens['md.comp.primary-navigation-tab.active-indicator.height']};
static double indicatorWeight = ${getToken('md.comp.primary-navigation-tab.active-indicator.height')};
}
class _${blockName}SecondaryDefaultsM3 extends TabBarTheme {
......
......@@ -4,8 +4,11 @@
import 'dart:io';
import 'token_logger.dart';
/// Base class for code generation templates.
abstract class TokenTemplate {
const TokenTemplate(this.blockName, this.fileName, this.tokens, {
const TokenTemplate(this.blockName, this.fileName, this._tokens, {
this.colorSchemePrefix = 'Theme.of(context).colorScheme.',
this.textThemePrefix = 'Theme.of(context).textTheme.'
});
......@@ -19,7 +22,7 @@ abstract class TokenTemplate {
final String fileName;
/// Map of token data extracted from the Material Design token database.
final Map<String, dynamic> tokens;
final Map<String, dynamic> _tokens;
/// Optional prefix prepended to color definitions.
///
......@@ -31,6 +34,15 @@ abstract class TokenTemplate {
/// Defaults to 'Theme.of(context).textTheme.'
final String textThemePrefix;
/// Check if a token is available.
bool tokenAvailable(String tokenName) => _tokens.containsKey(tokenName);
/// Resolve a token while logging its usage.
dynamic getToken(String tokenName) {
tokenLogger.log(tokenName);
return _tokens[tokenName];
}
static const String beginGeneratedComment = '''
// BEGIN GENERATED TOKEN PROPERTIES''';
......@@ -78,7 +90,6 @@ abstract class TokenTemplate {
final StringBuffer buffer = StringBuffer(contentBeforeBlock);
buffer.write(beginComment);
buffer.write(headerComment);
buffer.write('// Token database version: ${tokens['version']}\n\n');
buffer.write(generate());
buffer.write(endComment);
buffer.write(contentAfterBlock);
......@@ -102,8 +113,8 @@ abstract class TokenTemplate {
/// See also:
/// * [componentColor], that provides support for an optional opacity.
String color(String colorToken, [String defaultValue = 'null']) {
return tokens.containsKey(colorToken)
? '$colorSchemePrefix${tokens[colorToken]}'
return tokenAvailable(colorToken)
? '$colorSchemePrefix${getToken(colorToken)}'
: defaultValue;
}
......@@ -133,19 +144,22 @@ abstract class TokenTemplate {
/// * [color], that provides support for looking up a raw color token.
String componentColor(String componentToken) {
final String colorToken = '$componentToken.color';
if (!tokens.containsKey(colorToken)) {
if (!tokenAvailable(colorToken)) {
return 'null';
}
String value = color(colorToken);
final String opacityToken = '$componentToken.opacity';
if (tokens.containsKey(opacityToken)) {
if (tokenAvailable(opacityToken)) {
value += '.withOpacity(${opacity(opacityToken)})';
}
return value;
}
/// Generate the opacity value for the given token.
String? opacity(String token) => _numToString(tokens[token]);
String? opacity(String token) {
tokenLogger.log(token);
return _numToString(getToken(token));
}
String? _numToString(Object? value, [int? digits]) {
if (value == null) {
......@@ -157,12 +171,12 @@ abstract class TokenTemplate {
}
return digits == null ? value.toString() : value.toStringAsFixed(digits);
}
return tokens[value].toString();
return getToken(value as String).toString();
}
/// Generate an elevation value for the given component token.
String elevation(String componentToken) {
return tokens[tokens['$componentToken.elevation']!]!.toString();
return getToken(getToken('$componentToken.elevation')! as String)!.toString();
}
/// Generate a size value for the given component token.
......@@ -170,17 +184,17 @@ abstract class TokenTemplate {
/// Non-square sizes are specified as width and height.
String size(String componentToken) {
final String sizeToken = '$componentToken.size';
if (!tokens.containsKey(sizeToken)) {
if (!tokenAvailable(sizeToken)) {
final String widthToken = '$componentToken.width';
final String heightToken = '$componentToken.height';
if (!tokens.containsKey(widthToken) && !tokens.containsKey(heightToken)) {
if (!tokenAvailable(widthToken) && !tokenAvailable(heightToken)) {
throw Exception('Unable to find width, height, or size tokens for $componentToken');
}
final String? width = _numToString(tokens.containsKey(widthToken) ? tokens[widthToken]! as num : double.infinity, 0);
final String? height = _numToString(tokens.containsKey(heightToken) ? tokens[heightToken]! as num : double.infinity, 0);
final String? width = _numToString(tokenAvailable(widthToken) ? getToken(widthToken)! as num : double.infinity, 0);
final String? height = _numToString(tokenAvailable(heightToken) ? getToken(heightToken)! as num : double.infinity, 0);
return 'const Size($width, $height)';
}
return 'const Size.square(${_numToString(tokens[sizeToken])})';
return 'const Size.square(${_numToString(getToken(sizeToken))})';
}
/// Generate a shape constant for the given component token.
......@@ -189,7 +203,8 @@ abstract class TokenTemplate {
/// - "SHAPE_FAMILY_ROUNDED_CORNERS" which maps to [RoundedRectangleBorder].
/// - "SHAPE_FAMILY_CIRCULAR" which maps to a [StadiumBorder].
String shape(String componentToken, [String prefix = 'const ']) {
final Map<String, dynamic> shape = tokens[tokens['$componentToken.shape']!]! as Map<String, dynamic>;
final Map<String, dynamic> shape = getToken(getToken('$componentToken.shape') as String) as Map<String, dynamic>;
switch (shape['family']) {
case 'SHAPE_FAMILY_ROUNDED_CORNERS':
final double topLeft = shape['topLeft'] as double;
......@@ -224,25 +239,28 @@ abstract class TokenTemplate {
/// Generate a [BorderSide] for the given component.
String border(String componentToken) {
if (!tokens.containsKey('$componentToken.color')) {
if (!tokenAvailable('$componentToken.color')) {
return 'null';
}
final String borderColor = componentColor(componentToken);
final double width = (tokens['$componentToken.width'] ?? tokens['$componentToken.height'] ?? 1.0) as double;
final double width = (getToken('$componentToken.width') ?? getToken('$componentToken.height') ?? 1.0) as double;
return 'BorderSide(color: $borderColor${width != 1.0 ? ", width: $width" : ""})';
}
/// Generate a [TextTheme] text style name for the given component token.
String textStyle(String componentToken) {
return '$textThemePrefix${tokens["$componentToken.text-style"]}';
return '$textThemePrefix${getToken("$componentToken.text-style")}';
}
String textStyleWithColor(String componentToken) {
if (!tokens.containsKey('$componentToken.text-style')) {
if (!tokenAvailable('$componentToken.text-style')) {
return 'null';
}
String style = textStyle(componentToken);
if (tokens.containsKey('$componentToken.color')) {
if (tokenAvailable('$componentToken.color')) {
style = '$style?.copyWith(color: ${componentColor(componentToken)})';
}
return style;
......
// 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 'dart:collection';
import 'dart:io';
final TokenLogger tokenLogger = TokenLogger();
/// Class to keep track of used tokens and versions.
class TokenLogger {
TokenLogger();
void init({
required Map<String, dynamic> allTokens,
required Map<String, List<String>> versionMap
}){
_allTokens = allTokens;
_versionMap = versionMap;
}
/// Map of all tokens to their values.
late Map<String, dynamic> _allTokens;
// Map of versions to their token files.
late Map<String, List<String>> _versionMap;
// Sorted set of used tokens.
final SplayTreeSet<String> _usedTokens = SplayTreeSet<String>();
void clear() {
_allTokens.clear();
_versionMap.clear();
_usedTokens.clear();
}
/// Logs a token.
void log(String token) {
if (!_allTokens.containsKey(token)) {
print('\x1B[31m' 'Token unavailable: $token' '\x1B[0m');
return;
}
_usedTokens.add(token);
}
/// Prints version usage to the console.
void printVersionUsage({required bool verbose}) {
final String versionsString = 'Versions used: ${_versionMap.keys.join(', ')}';
print(versionsString);
if (verbose) {
for (final String version in _versionMap.keys) {
print(' $version:');
final List<String> files = List<String>.from(_versionMap[version]!);
files.sort();
for (final String file in files) {
print(' $file');
}
}
print('');
}
}
/// Prints tokens usage to the console.
void printTokensUsage({required bool verbose}) {
final Set<String> allTokensSet = _allTokens.keys.toSet();
if (verbose) {
for (final String token in SplayTreeSet<String>.from(allTokensSet).toList()) {
if (_usedTokens.contains(token)) {
print('✅ $token');
} else {
print('❌ $token');
}
}
print('');
}
print('Tokens used: ${_usedTokens.length}/${_allTokens.length}');
}
/// Dumps version and tokens usage to a file.
void dumpToFile(String path) {
final File file = File(path);
file.createSync(recursive: true);
final String versionsString = 'Versions used, ${_versionMap.keys.join(', ')}';
file.writeAsStringSync('$versionsString\n${_usedTokens.join(',\n')}\n');
}
}
......@@ -41,13 +41,13 @@ class _M3Typography {
return theme.toString();
}
String _textStyleDef(String tokenName, String debugLabel, String baseline) {
String _textStyleDef(String tokenPrefix, String debugLabel, String baseline) {
final StringBuffer style = StringBuffer("TextStyle(debugLabel: '$debugLabel'");
style.write(', inherit: false');
style.write(', fontSize: ${_fontSize(tokenName)}');
style.write(', fontWeight: ${_fontWeight(tokenName)}');
style.write(', letterSpacing: ${_fontSpacing(tokenName)}');
style.write(', height: ${_fontHeight(tokenName)}');
style.write(', fontSize: ${_fontSize(tokenPrefix)}');
style.write(', fontWeight: ${_fontWeight(tokenPrefix)}');
style.write(', letterSpacing: ${_fontSpacing(tokenPrefix)}');
style.write(', height: ${_fontHeight(tokenPrefix)}');
style.write(', textBaseline: TextBaseline.$baseline');
style.write(', leadingDistribution: TextLeadingDistribution.even');
style.write(')');
......@@ -55,21 +55,21 @@ class _M3Typography {
}
String _fontSize(String textStyleTokenName) {
return tokens['$textStyleTokenName.size']!.toString();
return getToken('$textStyleTokenName.size').toString();
}
String _fontWeight(String textStyleTokenName) {
final String weightValue = tokens[tokens['$textStyleTokenName.weight']!]!.toString();
final String weightValue = getToken(getToken('$textStyleTokenName.weight') as String).toString();
return 'FontWeight.w$weightValue';
}
String _fontSpacing(String textStyleTokenName) {
return tokens['$textStyleTokenName.tracking']!.toString();
return getToken('$textStyleTokenName.tracking').toString();
}
String _fontHeight(String textStyleTokenName) {
final double size = tokens['$textStyleTokenName.size']! as double;
final double lineHeight = tokens['$textStyleTokenName.line-height']! as double;
final double size = getToken('$textStyleTokenName.size') as double;
final double lineHeight = getToken('$textStyleTokenName.line-height') as double;
return (lineHeight / size).toStringAsFixed(2);
}
}
......@@ -6,6 +6,7 @@ environment:
sdk: '>=3.0.0-0 <4.0.0'
dependencies:
args: 2.4.2
dev_dependencies:
path: 1.8.3
......@@ -13,7 +14,6 @@ dev_dependencies:
_fe_analyzer_shared: 61.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
analyzer: 5.13.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 2.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.11.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
collection: 1.17.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
......
Versions used, v1.0.0, v2.0.0
bar,
foo
......@@ -2,13 +2,18 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'dart:io';
import 'package:gen_defaults/template.dart';
import 'package:gen_defaults/token_logger.dart';
import 'package:path/path.dart' as path;
import 'package:test/test.dart';
void main() {
final TokenLogger logger = tokenLogger;
logger.init(allTokens: <String, dynamic>{}, versionMap: <String, List<String>>{});
test('Templates will append to the end of a file', () {
final Directory tempDir = Directory.systemTemp.createTempSync('gen_defaults');
try {
......@@ -38,8 +43,6 @@ void main() {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: 0.0
static final String tokenFoo = 'Foobar';
static final String tokenBar = 'Barfoo';
......@@ -69,8 +72,6 @@ static final String tokenBar = 'Barfoo';
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: 0.0
static final String tokenFoo = 'Foobar';
static final String tokenBar = 'Barfoo';
......@@ -94,8 +95,6 @@ static final String tokenBar = 'Barfoo';
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: 0.0
static final String tokenFoo = 'foo';
static final String tokenBar = 'bar';
......@@ -136,8 +135,6 @@ static final String tokenBar = 'bar';
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: 0.0
static final String tokenFoo = 'foo';
static final String tokenBar = 'bar';
......@@ -162,8 +159,6 @@ static final String tokenBar = 'bar';
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: 0.0
static final String tokenFoo = 'foo';
static final String tokenBar = 'bar';
......@@ -176,8 +171,6 @@ static final String tokenBar = 'bar';
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: 0.0
static final String tokenFoo = 'bar';
static final String tokenBar = 'foo';
......@@ -202,8 +195,6 @@ static final String tokenBar = 'foo';
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: 0.0
static final String tokenFoo = 'FOO';
static final String tokenBar = 'BAR';
......@@ -216,8 +207,6 @@ static final String tokenBar = 'BAR';
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: 0.0
static final String tokenFoo = 'bar';
static final String tokenBar = 'foo';
......@@ -248,6 +237,127 @@ static final String tokenBar = 'foo';
expect(template.shape('foo'), 'const RoundedRectangleBorder(borderRadius: BorderRadius.only(topLeft: Radius.circular(1.0), topRight: Radius.circular(2.0), bottomLeft: Radius.circular(3.0), bottomRight: Radius.circular(4.0)))');
expect(template.shape('bar'), 'const StadiumBorder()');
});
group('Tokens logger', () {
final List<String> printLog = List<String>.empty(growable: true);
final Map<String, List<String>> versionMap = <String, List<String>>{};
final Map<String, dynamic> allTokens = <String, dynamic>{};
// Add to printLog instead of printing to stdout
void Function() overridePrint(void Function() testFn) => () {
final ZoneSpecification spec = ZoneSpecification(
print: (_, __, ___, String msg) {
printLog.add(msg);
}
);
return Zone.current.fork(specification: spec).run<void>(testFn);
};
setUp(() {
logger.init(allTokens: allTokens, versionMap: versionMap);
});
tearDown(() {
logger.clear();
printLog.clear();
versionMap.clear();
allTokens.clear();
});
String errorColoredString(String str) => '\x1B[31m$str\x1B[0m';
const Map<String, List<String>> testVersions = <String, List<String>>{
'v1.0.0': <String>['file_1.json'],
'v2.0.0': <String>['file_2.json, file_3.json'],
};
test('can print empty usage', overridePrint(() {
logger.printVersionUsage(verbose: true);
expect(printLog, contains('Versions used: '));
logger.printTokensUsage(verbose: true);
expect(printLog, contains('Tokens used: 0/0'));
}));
test('can print version usage', overridePrint(() {
versionMap.addAll(testVersions);
logger.printVersionUsage(verbose: false);
expect(printLog, contains('Versions used: v1.0.0, v2.0.0'));
}));
test('can print version usage (verbose)', overridePrint(() {
versionMap.addAll(testVersions);
logger.printVersionUsage(verbose: true);
expect(printLog, contains('Versions used: v1.0.0, v2.0.0'));
expect(printLog, contains(' v1.0.0:'));
expect(printLog, contains(' file_1.json'));
expect(printLog, contains(' v2.0.0:'));
expect(printLog, contains(' file_2.json, file_3.json'));
}));
test('can log and print tokens usage', overridePrint(() {
allTokens['foo'] = 'value';
logger.log('foo');
logger.printTokensUsage(verbose: false);
expect(printLog, contains('Tokens used: 1/1'));
}));
test('can log and print tokens usage (verbose)', overridePrint(() {
allTokens['foo'] = 'value';
logger.log('foo');
logger.printTokensUsage(verbose: true);
expect(printLog, contains(' foo'));
expect(printLog, contains('Tokens used: 1/1'));
}));
test('detects invalid logs', overridePrint(() {
allTokens['foo'] = 'value';
logger.log('baz');
logger.log('foobar');
logger.printTokensUsage(verbose: true);
expect(printLog, contains(errorColoredString('Token unavailable: baz')));
expect(printLog, contains(errorColoredString('Token unavailable: foobar')));
expect(printLog, contains(' foo'));
expect(printLog, contains('Tokens used: 0/1'));
}));
test('can log and dump versions & tokens to a file', overridePrint(() {
versionMap.addAll(testVersions);
allTokens['foo'] = 'value';
allTokens['bar'] = 'value';
logger.log('foo');
logger.log('bar');
logger.dumpToFile('test.json');
final String fileContent = File('test.json').readAsStringSync();
expect(fileContent, contains('Versions used, v1.0.0, v2.0.0'));
expect(fileContent, contains('bar,'));
expect(fileContent, contains('foo'));
}));
test('integration test', overridePrint(() {
allTokens['foo'] = 'value';
allTokens['bar'] = 'value';
TestTemplate('block', 'filename', allTokens).generate();
logger.printTokensUsage(verbose: true);
expect(printLog, contains(' foo'));
expect(printLog, contains(' bar'));
expect(printLog, contains('Tokens used: 2/2'));
}));
});
}
class TestTemplate extends TokenTemplate {
......@@ -255,7 +365,7 @@ class TestTemplate extends TokenTemplate {
@override
String generate() => '''
static final String tokenFoo = '${tokens['foo']}';
static final String tokenBar = '${tokens['bar']}';
static final String tokenFoo = '${getToken('foo')}';
static final String tokenBar = '${getToken('bar')}';
''';
}
......@@ -214,8 +214,6 @@ class ActionChip extends StatelessWidget implements ChipAttributes, TappableChip
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _ActionChipDefaultsM3 extends ChipThemeData {
_ActionChipDefaultsM3(this.context, this.isEnabled, this._chipVariant)
: super(
......
......@@ -2329,8 +2329,6 @@ class _AppBarDefaultsM2 extends AppBarTheme {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _AppBarDefaultsM3 extends AppBarTheme {
_AppBarDefaultsM3(this.context)
: super(
......
......@@ -287,8 +287,6 @@ class _RenderBadge extends RenderAligningShiftedBox {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _BadgeDefaultsM3 extends BadgeThemeData {
_BadgeDefaultsM3(this.context) : super(
smallSize: 6.0,
......
......@@ -464,8 +464,6 @@ class _BannerDefaultsM2 extends MaterialBannerThemeData {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _BannerDefaultsM3 extends MaterialBannerThemeData {
_BannerDefaultsM3(this.context)
: super(elevation: 1.0);
......
......@@ -296,8 +296,6 @@ class _BottomAppBarDefaultsM2 extends BottomAppBarTheme {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _BottomAppBarDefaultsM3 extends BottomAppBarTheme {
_BottomAppBarDefaultsM3(this.context)
: super(
......
......@@ -1339,8 +1339,6 @@ class _BottomSheetGestureDetector extends StatelessWidget {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _BottomSheetDefaultsM3 extends BottomSheetThemeData {
_BottomSheetDefaultsM3(this.context)
: super(
......
......@@ -215,8 +215,6 @@ class _CardDefaultsM2 extends CardTheme {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _CardDefaultsM3 extends CardTheme {
_CardDefaultsM3(this.context)
: super(
......
......@@ -895,8 +895,6 @@ class _CheckboxDefaultsM2 extends CheckboxThemeData {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _CheckboxDefaultsM3 extends CheckboxThemeData {
_CheckboxDefaultsM3(BuildContext context)
: _theme = Theme.of(context),
......
......@@ -2185,8 +2185,6 @@ bool _hitIsOnDeleteIcon({
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _ChipDefaultsM3 extends ChipThemeData {
_ChipDefaultsM3(this.context, this.isEnabled)
: super(
......
......@@ -240,8 +240,6 @@ class ChoiceChip extends StatelessWidget
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _ChoiceChipDefaultsM3 extends ChipThemeData {
_ChoiceChipDefaultsM3(
this.context,
......
......@@ -789,8 +789,6 @@ class _DatePickerDefaultsM2 extends DatePickerThemeData {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _DatePickerDefaultsM3 extends DatePickerThemeData {
_DatePickerDefaultsM3(this.context)
: super(
......
......@@ -1628,8 +1628,6 @@ class _DialogDefaultsM2 extends DialogTheme {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _DialogDefaultsM3 extends DialogTheme {
_DialogDefaultsM3(this.context)
: super(
......@@ -1673,8 +1671,6 @@ class _DialogDefaultsM3 extends DialogTheme {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _DialogFullscreenDefaultsM3 extends DialogTheme {
const _DialogFullscreenDefaultsM3(this.context);
......
......@@ -328,8 +328,6 @@ class _DividerDefaultsM2 extends DividerThemeData {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _DividerDefaultsM3 extends DividerThemeData {
const _DividerDefaultsM3(this.context) : super(
space: 16,
......
......@@ -839,8 +839,6 @@ class _DrawerDefaultsM2 extends DrawerThemeData {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _DrawerDefaultsM3 extends DrawerThemeData {
_DrawerDefaultsM3(this.context)
: super(elevation: 1.0);
......
......@@ -543,8 +543,6 @@ class _ElevatedButtonWithIconChild extends StatelessWidget {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _ElevatedButtonDefaultsM3 extends ButtonStyle {
_ElevatedButtonDefaultsM3(this.context)
: super(
......
......@@ -156,8 +156,6 @@ class _ElevationOpacity {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
// Surface tint opacities based on elevations according to the
// Material Design 3 specification:
// https://m3.material.io/styles/color/the-color-system/color-roles
......
......@@ -759,8 +759,6 @@ class _ExpansionTileDefaultsM2 extends ExpansionTileThemeData {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _ExpansionTileDefaultsM3 extends ExpansionTileThemeData {
_ExpansionTileDefaultsM3(this.context);
......
......@@ -553,8 +553,6 @@ class _FilledButtonWithIconChild extends StatelessWidget {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _FilledButtonDefaultsM3 extends ButtonStyle {
_FilledButtonDefaultsM3(this.context)
: super(
......@@ -677,8 +675,6 @@ class _FilledButtonDefaultsM3 extends ButtonStyle {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _FilledTonalButtonDefaultsM3 extends ButtonStyle {
_FilledTonalButtonDefaultsM3(this.context)
: super(
......
......@@ -240,8 +240,6 @@ class FilterChip extends StatelessWidget
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _FilterChipDefaultsM3 extends ChipThemeData {
_FilterChipDefaultsM3(
this.context,
......
......@@ -771,8 +771,6 @@ class _FABDefaultsM2 extends FloatingActionButtonThemeData {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _FABDefaultsM3 extends FloatingActionButtonThemeData {
_FABDefaultsM3(this.context, this.type, this.hasChild)
: super(
......
......@@ -1081,8 +1081,6 @@ class _IconButtonDefaultMouseCursor extends MaterialStateProperty<MouseCursor?>
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _IconButtonDefaultsM3 extends ButtonStyle {
_IconButtonDefaultsM3(this.context, this.toggleable)
: super(
......@@ -1204,8 +1202,6 @@ class _IconButtonDefaultsM3 extends ButtonStyle {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _FilledIconButtonDefaultsM3 extends ButtonStyle {
_FilledIconButtonDefaultsM3(this.context, this.toggleable)
: super(
......@@ -1352,8 +1348,6 @@ class _FilledIconButtonDefaultsM3 extends ButtonStyle {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _FilledTonalIconButtonDefaultsM3 extends ButtonStyle {
_FilledTonalIconButtonDefaultsM3(this.context, this.toggleable)
: super(
......@@ -1500,8 +1494,6 @@ class _FilledTonalIconButtonDefaultsM3 extends ButtonStyle {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _OutlinedIconButtonDefaultsM3 extends ButtonStyle {
_OutlinedIconButtonDefaultsM3(this.context, this.toggleable)
: super(
......
......@@ -246,8 +246,6 @@ class InputChip extends StatelessWidget
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _InputChipDefaultsM3 extends ChipThemeData {
_InputChipDefaultsM3(this.context, this.isEnabled, this.isSelected)
: super(
......
......@@ -4531,8 +4531,6 @@ class _InputDecoratorDefaultsM2 extends InputDecorationTheme {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _InputDecoratorDefaultsM3 extends InputDecorationTheme {
_InputDecoratorDefaultsM3(this.context)
: super();
......
......@@ -1557,8 +1557,6 @@ class _LisTileDefaultsM2 extends ListTileThemeData {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _LisTileDefaultsM3 extends ListTileThemeData {
_LisTileDefaultsM3(this.context)
: super(
......
......@@ -3584,8 +3584,6 @@ bool _platformSupportsAccelerators() {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _MenuBarDefaultsM3 extends MenuStyle {
_MenuBarDefaultsM3(this.context)
: super(
......
......@@ -1349,8 +1349,6 @@ class _NavigationBarDefaultsM2 extends NavigationBarThemeData {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _NavigationBarDefaultsM3 extends NavigationBarThemeData {
_NavigationBarDefaultsM3(this.context)
: super(
......
......@@ -671,8 +671,6 @@ bool _isForwardOrCompleted(Animation<double> animation) {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _NavigationDrawerDefaultsM3 extends NavigationDrawerThemeData {
_NavigationDrawerDefaultsM3(this.context)
: super(
......
......@@ -1049,8 +1049,6 @@ class _NavigationRailDefaultsM2 extends NavigationRailThemeData {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _NavigationRailDefaultsM3 extends NavigationRailThemeData {
_NavigationRailDefaultsM3(this.context)
: super(
......
......@@ -474,8 +474,6 @@ class _OutlinedButtonWithIconChild extends StatelessWidget {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _OutlinedButtonDefaultsM3 extends ButtonStyle {
_OutlinedButtonDefaultsM3(this.context)
: super(
......
......@@ -1415,8 +1415,6 @@ class _PopupMenuDefaultsM2 extends PopupMenuThemeData {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _PopupMenuDefaultsM3 extends PopupMenuThemeData {
_PopupMenuDefaultsM3(this.context)
: super(elevation: 3.0);
......
......@@ -1041,8 +1041,6 @@ class _LinearProgressIndicatorDefaultsM2 extends ProgressIndicatorThemeData {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _CircularProgressIndicatorDefaultsM3 extends ProgressIndicatorThemeData {
_CircularProgressIndicatorDefaultsM3(this.context);
......
......@@ -629,8 +629,6 @@ class _RadioDefaultsM2 extends RadioThemeData {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _RadioDefaultsM3 extends RadioThemeData {
_RadioDefaultsM3(this.context);
......
......@@ -1274,8 +1274,6 @@ class _SearchBarState extends State<SearchBar> {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _SearchBarDefaultsM3 extends SearchBarThemeData {
_SearchBarDefaultsM3(this.context);
......@@ -1346,8 +1344,6 @@ class _SearchBarDefaultsM3 extends SearchBarThemeData {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _SearchViewDefaultsM3 extends SearchViewThemeData {
_SearchViewDefaultsM3(this.context, {required this.isFullScreen});
......
......@@ -714,8 +714,6 @@ class _RenderSegmentedButton<T> extends RenderBox with
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _SegmentedButtonDefaultsM3 extends SegmentedButtonThemeData {
_SegmentedButtonDefaultsM3(this.context);
final BuildContext context;
......
......@@ -1977,8 +1977,6 @@ class _SliderDefaultsM2 extends SliderThemeData {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _SliderDefaultsM3 extends SliderThemeData {
_SliderDefaultsM3(this.context)
: super(trackHeight: 4.0);
......
......@@ -885,8 +885,6 @@ class _SnackbarDefaultsM2 extends SnackBarThemeData {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _SnackbarDefaultsM3 extends SnackBarThemeData {
_SnackbarDefaultsM3(this.context);
......
......@@ -1757,8 +1757,6 @@ class _SwitchDefaultsM2 extends SwitchThemeData {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _SwitchDefaultsM3 extends SwitchThemeData {
_SwitchDefaultsM3(this.context);
......
......@@ -2165,8 +2165,6 @@ class _TabsDefaultsM2 extends TabBarTheme {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _TabsPrimaryDefaultsM3 extends TabBarTheme {
_TabsPrimaryDefaultsM3(this.context, this.isScrollable)
: super(indicatorSize: TabBarIndicatorSize.label);
......
......@@ -535,8 +535,6 @@ class _TextButtonWithIconChild extends StatelessWidget {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _TextButtonDefaultsM3 extends ButtonStyle {
_TextButtonDefaultsM3(this.context)
: super(
......
......@@ -1503,8 +1503,6 @@ TextStyle _m2CounterErrorStyle(BuildContext context) =>
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
TextStyle? _m3StateInputStyle(BuildContext context) => MaterialStateTextStyle.resolveWith((Set<MaterialState> states) {
if (states.contains(MaterialState.disabled)) {
return TextStyle(color: Theme.of(context).textTheme.bodyLarge!.color?.withOpacity(0.38));
......
......@@ -2721,8 +2721,6 @@ class VisualDensity with Diagnosticable {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
const ColorScheme _colorSchemeLightM3 = ColorScheme(
brightness: Brightness.light,
primary: Color(0xFF6750A4),
......
......@@ -3322,8 +3322,6 @@ class _TimePickerDefaultsM2 extends _TimePickerDefaults {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _TimePickerDefaultsM3 extends _TimePickerDefaults {
_TimePickerDefaultsM3(this.context);
......
......@@ -748,8 +748,6 @@ class Typography with Diagnosticable {
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_162
class _M3Typography {
_M3Typography._();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment