diff --git a/packages/material_ui/lib/src/generated/color_scheme_defaults.g.dart b/packages/material_ui/lib/src/generated/color_scheme_defaults.g.dart new file mode 100644 index 000000000000..d6581af34aa7 --- /dev/null +++ b/packages/material_ui/lib/src/generated/color_scheme_defaults.g.dart @@ -0,0 +1,324 @@ +// Copyright 2013 The Flutter Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Do not edit by hand. The code is generated from data in the Material +// Design token database by the script: +// packages/material_ui/tool/gen_defaults/bin/gen_defaults.dart. +part of '../theme_data.dart'; + +const ColorScheme _colorSchemeLightM3 = ColorScheme( + brightness: Brightness.light, + primary: Color(0xFF6750A4), + onPrimary: Color(0xFFFFFFFF), + primaryContainer: Color(0xFFEADDFF), + onPrimaryContainer: Color(0xFF4F378B), + primaryFixed: Color(0xFFEADDFF), + primaryFixedDim: Color(0xFFD0BCFF), + onPrimaryFixed: Color(0xFF21005D), + onPrimaryFixedVariant: Color(0xFF4F378B), + secondary: Color(0xFF625B71), + onSecondary: Color(0xFFFFFFFF), + secondaryContainer: Color(0xFFE8DEF8), + onSecondaryContainer: Color(0xFF4A4458), + secondaryFixed: Color(0xFFE8DEF8), + secondaryFixedDim: Color(0xFFCCC2DC), + onSecondaryFixed: Color(0xFF1D192B), + onSecondaryFixedVariant: Color(0xFF4A4458), + tertiary: Color(0xFF7D5260), + onTertiary: Color(0xFFFFFFFF), + tertiaryContainer: Color(0xFFFFD8E4), + onTertiaryContainer: Color(0xFF633B48), + tertiaryFixed: Color(0xFFFFD8E4), + tertiaryFixedDim: Color(0xFFEFB8C8), + onTertiaryFixed: Color(0xFF31111D), + onTertiaryFixedVariant: Color(0xFF633B48), + error: Color(0xFFB3261E), + onError: Color(0xFFFFFFFF), + errorContainer: Color(0xFFF9DEDC), + onErrorContainer: Color(0xFF8C1D18), + background: Color(0xFFFEF7FF), + onBackground: Color(0xFF1D1B20), + surface: Color(0xFFFEF7FF), + surfaceBright: Color(0xFFFEF7FF), + surfaceContainerLowest: Color(0xFFFFFFFF), + surfaceContainerLow: Color(0xFFF7F2FA), + surfaceContainer: Color(0xFFF3EDF7), + surfaceContainerHigh: Color(0xFFECE6F0), + surfaceContainerHighest: Color(0xFFE6E0E9), + surfaceDim: Color(0xFFDED8E1), + onSurface: Color(0xFF1D1B20), + surfaceVariant: Color(0xFFE7E0EC), + onSurfaceVariant: Color(0xFF49454F), + outline: Color(0xFF79747E), + outlineVariant: Color(0xFFCAC4D0), + shadow: Color(0xFF000000), + scrim: Color(0xFF000000), + inverseSurface: Color(0xFF322F35), + onInverseSurface: Color(0xFFF5EFF7), + inversePrimary: Color(0xFFD0BCFF), +); + +const ColorScheme _colorSchemeDarkM3 = ColorScheme( + brightness: Brightness.dark, + primary: Color(0xFFD0BCFF), + onPrimary: Color(0xFF381E72), + primaryContainer: Color(0xFF4F378B), + onPrimaryContainer: Color(0xFFEADDFF), + primaryFixed: Color(0xFFEADDFF), + primaryFixedDim: Color(0xFFD0BCFF), + onPrimaryFixed: Color(0xFF21005D), + onPrimaryFixedVariant: Color(0xFF4F378B), + secondary: Color(0xFFCCC2DC), + onSecondary: Color(0xFF332D41), + secondaryContainer: Color(0xFF4A4458), + onSecondaryContainer: Color(0xFFE8DEF8), + secondaryFixed: Color(0xFFE8DEF8), + secondaryFixedDim: Color(0xFFCCC2DC), + onSecondaryFixed: Color(0xFF1D192B), + onSecondaryFixedVariant: Color(0xFF4A4458), + tertiary: Color(0xFFEFB8C8), + onTertiary: Color(0xFF492532), + tertiaryContainer: Color(0xFF633B48), + onTertiaryContainer: Color(0xFFFFD8E4), + tertiaryFixed: Color(0xFFFFD8E4), + tertiaryFixedDim: Color(0xFFEFB8C8), + onTertiaryFixed: Color(0xFF31111D), + onTertiaryFixedVariant: Color(0xFF633B48), + error: Color(0xFFF2B8B5), + onError: Color(0xFF601410), + errorContainer: Color(0xFF8C1D18), + onErrorContainer: Color(0xFFF9DEDC), + background: Color(0xFF141218), + onBackground: Color(0xFFE6E0E9), + surface: Color(0xFF141218), + surfaceBright: Color(0xFF3B383E), + surfaceContainerLowest: Color(0xFF0F0D13), + surfaceContainerLow: Color(0xFF1D1B20), + surfaceContainer: Color(0xFF211F26), + surfaceContainerHigh: Color(0xFF2B2930), + surfaceContainerHighest: Color(0xFF36343B), + surfaceDim: Color(0xFF141218), + onSurface: Color(0xFFE6E0E9), + surfaceVariant: Color(0xFF49454F), + onSurfaceVariant: Color(0xFFCAC4D0), + outline: Color(0xFF938F99), + outlineVariant: Color(0xFF49454F), + shadow: Color(0xFF000000), + scrim: Color(0xFF000000), + inverseSurface: Color(0xFFE6E0E9), + onInverseSurface: Color(0xFF322F35), + inversePrimary: Color(0xFF6750A4), +); + +const ColorScheme _colorSchemeLightMediumContrastM3 = ColorScheme( + brightness: Brightness.light, + primary: Color(0xFF4F378B), + onPrimary: Color(0xFFFFFFFF), + primaryContainer: Color(0xFF6750A4), + onPrimaryContainer: Color(0xFFFFFFFF), + primaryFixed: Color(0xFF6750A4), + primaryFixedDim: Color(0xFF4F378B), + onPrimaryFixed: Color(0xFFFFFFFF), + onPrimaryFixedVariant: Color(0xFFFFFFFF), + secondary: Color(0xFF4A4458), + onSecondary: Color(0xFFFFFFFF), + secondaryContainer: Color(0xFF625B71), + onSecondaryContainer: Color(0xFFFFFFFF), + secondaryFixed: Color(0xFF625B71), + secondaryFixedDim: Color(0xFF4A4458), + onSecondaryFixed: Color(0xFFFFFFFF), + onSecondaryFixedVariant: Color(0xFFFFFFFF), + tertiary: Color(0xFF633B48), + onTertiary: Color(0xFFFFFFFF), + tertiaryContainer: Color(0xFF7D5260), + onTertiaryContainer: Color(0xFFFFFFFF), + tertiaryFixed: Color(0xFF7D5260), + tertiaryFixedDim: Color(0xFF633B48), + onTertiaryFixed: Color(0xFFFFFFFF), + onTertiaryFixedVariant: Color(0xFFFFFFFF), + error: Color(0xFF8C1D18), + onError: Color(0xFFFFFFFF), + errorContainer: Color(0xFFB3261E), + onErrorContainer: Color(0xFFFFFFFF), + onBackground: Color(0xFF000000), + onSurface: Color(0xFF000000), + onSurfaceVariant: Color(0xFF322F37), + outline: Color(0xFF49454F), + outlineVariant: Color(0xFF79747E), + onInverseSurface: Color(0xFFFFFFFF), + // These roles fall back to the default light tokens. + background: Color(0xFFFEF7FF), + surface: Color(0xFFFEF7FF), + surfaceBright: Color(0xFFFEF7FF), + surfaceContainerLowest: Color(0xFFFFFFFF), + surfaceContainerLow: Color(0xFFF7F2FA), + surfaceContainer: Color(0xFFF3EDF7), + surfaceContainerHigh: Color(0xFFECE6F0), + surfaceContainerHighest: Color(0xFFE6E0E9), + surfaceDim: Color(0xFFDED8E1), + surfaceVariant: Color(0xFFE7E0EC), + shadow: Color(0xFF000000), + scrim: Color(0xFF000000), + inverseSurface: Color(0xFF322F35), + inversePrimary: Color(0xFFD0BCFF), +); + +const ColorScheme _colorSchemeLightHighContrastM3 = ColorScheme( + brightness: Brightness.light, + primary: Color(0xFF381E72), + onPrimary: Color(0xFFFFFFFF), + primaryContainer: Color(0xFF4F378B), + onPrimaryContainer: Color(0xFFFFFFFF), + primaryFixed: Color(0xFF4F378B), + primaryFixedDim: Color(0xFF381E72), + onPrimaryFixed: Color(0xFFFFFFFF), + onPrimaryFixedVariant: Color(0xFFFFFFFF), + secondary: Color(0xFF332D41), + onSecondary: Color(0xFFFFFFFF), + secondaryContainer: Color(0xFF4A4458), + onSecondaryContainer: Color(0xFFFFFFFF), + secondaryFixed: Color(0xFF4A4458), + secondaryFixedDim: Color(0xFF332D41), + onSecondaryFixed: Color(0xFFFFFFFF), + onSecondaryFixedVariant: Color(0xFFFFFFFF), + tertiary: Color(0xFF492532), + onTertiary: Color(0xFFFFFFFF), + tertiaryContainer: Color(0xFF633B48), + onTertiaryContainer: Color(0xFFFFFFFF), + tertiaryFixed: Color(0xFF633B48), + tertiaryFixedDim: Color(0xFF492532), + onTertiaryFixed: Color(0xFFFFFFFF), + onTertiaryFixedVariant: Color(0xFFFFFFFF), + error: Color(0xFF601410), + onError: Color(0xFFFFFFFF), + errorContainer: Color(0xFF8C1D18), + onErrorContainer: Color(0xFFFFFFFF), + onBackground: Color(0xFF000000), + onSurface: Color(0xFF000000), + onSurfaceVariant: Color(0xFF000000), + outline: Color(0xFF322F37), + outlineVariant: Color(0xFF49454F), + onInverseSurface: Color(0xFFFFFFFF), + // These roles fall back to the default light tokens. + background: Color(0xFFFEF7FF), + surface: Color(0xFFFEF7FF), + surfaceBright: Color(0xFFFEF7FF), + surfaceContainerLowest: Color(0xFFFFFFFF), + surfaceContainerLow: Color(0xFFF7F2FA), + surfaceContainer: Color(0xFFF3EDF7), + surfaceContainerHigh: Color(0xFFECE6F0), + surfaceContainerHighest: Color(0xFFE6E0E9), + surfaceDim: Color(0xFFDED8E1), + surfaceVariant: Color(0xFFE7E0EC), + shadow: Color(0xFF000000), + scrim: Color(0xFF000000), + inverseSurface: Color(0xFF322F35), + inversePrimary: Color(0xFFD0BCFF), +); + +const ColorScheme _colorSchemeDarkMediumContrastM3 = ColorScheme( + brightness: Brightness.dark, + primary: Color(0xFFEADDFF), + onPrimary: Color(0xFF21005D), + primaryContainer: Color(0xFF9A82DB), + onPrimaryContainer: Color(0xFF000000), + primaryFixed: Color(0xFFEADDFF), + primaryFixedDim: Color(0xFFD0BCFF), + onPrimaryFixed: Color(0xFF000000), + onPrimaryFixedVariant: Color(0xFF381E72), + secondary: Color(0xFFE8DEF8), + onSecondary: Color(0xFF1D192B), + secondaryContainer: Color(0xFF958DA5), + onSecondaryContainer: Color(0xFF000000), + secondaryFixed: Color(0xFFE8DEF8), + secondaryFixedDim: Color(0xFFCCC2DC), + onSecondaryFixed: Color(0xFF000000), + onSecondaryFixedVariant: Color(0xFF332D41), + tertiary: Color(0xFFFFD8E4), + onTertiary: Color(0xFF31111D), + tertiaryContainer: Color(0xFFB58392), + onTertiaryContainer: Color(0xFF000000), + tertiaryFixed: Color(0xFFFFD8E4), + tertiaryFixedDim: Color(0xFFEFB8C8), + onTertiaryFixed: Color(0xFF000000), + onTertiaryFixedVariant: Color(0xFF492532), + error: Color(0xFFF9DEDC), + onError: Color(0xFF410E0B), + errorContainer: Color(0xFFE46962), + onErrorContainer: Color(0xFF000000), + onBackground: Color(0xFFFFFFFF), + onSurface: Color(0xFFFFFFFF), + onSurfaceVariant: Color(0xFFE7E0EC), + outline: Color(0xFFAEA9B4), + outlineVariant: Color(0xFF938F99), + onInverseSurface: Color(0xFF1D1B20), + inversePrimary: Color(0xFF4F378B), + // These roles fall back to the default dark tokens. + background: Color(0xFF141218), + surface: Color(0xFF141218), + surfaceBright: Color(0xFF3B383E), + surfaceContainerLowest: Color(0xFF0F0D13), + surfaceContainerLow: Color(0xFF1D1B20), + surfaceContainer: Color(0xFF211F26), + surfaceContainerHigh: Color(0xFF2B2930), + surfaceContainerHighest: Color(0xFF36343B), + surfaceDim: Color(0xFF141218), + surfaceVariant: Color(0xFF49454F), + shadow: Color(0xFF000000), + scrim: Color(0xFF000000), + inverseSurface: Color(0xFFE6E0E9), +); + +const ColorScheme _colorSchemeDarkHighContrastM3 = ColorScheme( + brightness: Brightness.dark, + primary: Color(0xFFF6EDFF), + onPrimary: Color(0xFF000000), + primaryContainer: Color(0xFFD0BCFF), + onPrimaryContainer: Color(0xFF000000), + primaryFixed: Color(0xFFEADDFF), + primaryFixedDim: Color(0xFFD0BCFF), + onPrimaryFixed: Color(0xFF000000), + onPrimaryFixedVariant: Color(0xFF000000), + secondary: Color(0xFFF6EDFF), + onSecondary: Color(0xFF000000), + secondaryContainer: Color(0xFFCCC2DC), + onSecondaryContainer: Color(0xFF000000), + secondaryFixed: Color(0xFFE8DEF8), + secondaryFixedDim: Color(0xFFCCC2DC), + onSecondaryFixed: Color(0xFF000000), + onSecondaryFixedVariant: Color(0xFF000000), + tertiary: Color(0xFFFFECF1), + onTertiary: Color(0xFF000000), + tertiaryContainer: Color(0xFFEFB8C8), + onTertiaryContainer: Color(0xFF000000), + tertiaryFixed: Color(0xFFFFD8E4), + tertiaryFixedDim: Color(0xFFEFB8C8), + onTertiaryFixed: Color(0xFF000000), + onTertiaryFixedVariant: Color(0xFF000000), + error: Color(0xFFFCEEEE), + onError: Color(0xFF000000), + errorContainer: Color(0xFFF2B8B5), + onErrorContainer: Color(0xFF000000), + onBackground: Color(0xFFFFFFFF), + onSurface: Color(0xFFFFFFFF), + onSurfaceVariant: Color(0xFFFFFFFF), + outline: Color(0xFFF5EEFA), + outlineVariant: Color(0xFFCAC4D0), + onInverseSurface: Color(0xFF000000), + inversePrimary: Color(0xFF381E72), + // These roles fall back to the default dark tokens. + background: Color(0xFF141218), + surface: Color(0xFF141218), + surfaceBright: Color(0xFF3B383E), + surfaceContainerLowest: Color(0xFF0F0D13), + surfaceContainerLow: Color(0xFF1D1B20), + surfaceContainer: Color(0xFF211F26), + surfaceContainerHigh: Color(0xFF2B2930), + surfaceContainerHighest: Color(0xFF36343B), + surfaceDim: Color(0xFF141218), + surfaceVariant: Color(0xFF49454F), + shadow: Color(0xFF000000), + scrim: Color(0xFF000000), + inverseSurface: Color(0xFFE6E0E9), +); diff --git a/packages/material_ui/lib/src/theme_data.dart b/packages/material_ui/lib/src/theme_data.dart index a785bcf83692..1c2e62add8c4 100644 --- a/packages/material_ui/lib/src/theme_data.dart +++ b/packages/material_ui/lib/src/theme_data.dart @@ -78,6 +78,8 @@ import 'typography.dart'; export 'package:flutter/services.dart' show Brightness; +part 'generated/color_scheme_defaults.g.dart'; + // Examples can assume: // late BuildContext context; @@ -199,6 +201,35 @@ enum StyleVariant { material3Expressive, } +/// Named contrast levels for Material 3 color schemes. +/// +/// Material 3 baseline color schemes provide standard, medium, and high +/// contrast levels. When the `colorSchemeSeed` parameter of the [ThemeData] +/// constructor is null, use [standard], [medium], or [high] to select a +/// token-backed baseline color scheme with that contrast level. +/// +/// A custom `double` between -1.0 and 1.0 can also be passed as the +/// `contrastLevel` parameter of the [ThemeData] constructor when +/// `colorSchemeSeed` is provided, in which case the value is passed to +/// [ColorScheme.fromSeed]. +/// +/// See also: +/// +/// * [ColorScheme.fromSeed], which generates a color scheme from a seed color, +/// brightness, and contrast level. +/// * , the Material 3 +/// color system overview. +abstract final class ContrastLevel { + /// Standard contrast, corresponding to a contrast level of 0.0. + static const double standard = 0.0; + + /// Medium contrast, corresponding to a contrast level of 0.5. + static const double medium = 0.5; + + /// High contrast, corresponding to a contrast level of 1.0. + static const double high = 1.0; +} + /// Defines the configuration of the overall visual [Theme] for a [MaterialApp] /// or a widget subtree within the app. /// @@ -241,12 +272,24 @@ class ThemeData with Diagnosticable { /// compute default values for visual properties. The API documentation for /// each component widget explains exactly how the defaults are computed. /// - /// When providing a [ColorScheme], apps can either provide one directly - /// with the [colorScheme] parameter, or have one generated for them by - /// using the [colorSchemeSeed] and [brightness] parameters. A generated - /// color scheme will be based on the tones of [colorSchemeSeed] and all of - /// its contrasting color will meet accessibility guidelines for readability. - /// (See [ColorScheme.fromSeed] for more details.) + /// When providing a [ColorScheme], apps can either provide one directly with + /// the [colorScheme] parameter, or have one generated for them. A provided + /// [colorScheme] is used directly and is not affected by [brightness], + /// [colorSchemeSeed], or [contrastLevel]. + /// + /// If a [colorSchemeSeed] is provided, [ColorScheme.fromSeed] generates the + /// color scheme from [colorSchemeSeed], [brightness], and [contrastLevel]. + /// In this case, [contrastLevel] can be any value between -1.0 and 1.0 + /// inclusive. All of the color scheme's contrasting colors will meet + /// accessibility guidelines for readability. (See [ColorScheme.fromSeed] for + /// more details.) + /// + /// If [colorSchemeSeed] is null, use [brightness] and [contrastLevel] to + /// select a token-backed Material 3 baseline color scheme. + /// Use [ContrastLevel.standard], [ContrastLevel.medium], or + /// [ContrastLevel.high] to choose between the standard, medium, and high + /// contrast baselines. Other custom [contrastLevel] values, such as 0.6, are + /// ignored and the standard contrast baseline is used. /// /// If the app wants to customize a generated color scheme, it can use /// [ColorScheme.fromSeed] directly and then [ColorScheme.copyWith] on the @@ -304,6 +347,7 @@ class ThemeData with Diagnosticable { ColorScheme? colorScheme, Brightness? brightness, Color? colorSchemeSeed, + double? contrastLevel, // [colorScheme] is the preferred way to configure colors. The [Color] properties // listed below (as well as primarySwatch) will gradually be phased out, see // https://github.com/flutter/flutter/issues/91772. @@ -429,6 +473,11 @@ class ThemeData with Diagnosticable { visualDensity ??= VisualDensity.defaultDensityForPlatform(platform); useMaterial3 ??= true; useSystemColors ??= false; + assert( + contrastLevel == null || (contrastLevel >= -1.0 && contrastLevel <= 1.0), + 'contrastLevel must be between -1.0 and 1.0 inclusive.', + ); + contrastLevel ??= ContrastLevel.standard; final bool useInkSparkle = platform == TargetPlatform.android && !kIsWeb; splashFactory ??= useMaterial3 ? useInkSparkle @@ -456,9 +505,10 @@ class ThemeData with Diagnosticable { colorScheme = ColorScheme.fromSeed( seedColor: colorSchemeSeed, brightness: effectiveBrightness, + contrastLevel: contrastLevel, ); } - colorScheme ??= isDark ? _colorSchemeDarkM3 : _colorSchemeLightM3; + colorScheme ??= _defaultM3ColorScheme(effectiveBrightness, contrastLevel); // For surfaces that use primary color in light themes and surface color in dark final Color primarySurfaceColor = isDark ? colorScheme.surface : colorScheme.primary; @@ -2952,6 +3002,17 @@ class ThemeData with Diagnosticable { } } +ColorScheme _defaultM3ColorScheme(Brightness brightness, double contrastLevel) { + final isDark = brightness == Brightness.dark; + if (contrastLevel == ContrastLevel.medium) { + return isDark ? _colorSchemeDarkMediumContrastM3 : _colorSchemeLightMediumContrastM3; + } + if (contrastLevel == ContrastLevel.high) { + return isDark ? _colorSchemeDarkHighContrastM3 : _colorSchemeLightHighContrastM3; + } + return isDark ? _colorSchemeDarkM3 : _colorSchemeLightM3; +} + /// A [CupertinoThemeData] that defers unspecified theme attributes to an /// upstream Material [ThemeData]. /// @@ -3385,122 +3446,3 @@ class VisualDensity with Diagnosticable { return '${super.toStringShort()}(h: ${debugFormatDouble(horizontal)}, v: ${debugFormatDouble(vertical)})'; } } - -// BEGIN GENERATED TOKEN PROPERTIES - ColorScheme - -// Do not edit by hand. The code between the "BEGIN GENERATED" and -// "END GENERATED" comments are generated from data in the Material -// Design token database by the script: -// dev/tools/gen_defaults/bin/gen_defaults.dart. - -// dart format off -const ColorScheme _colorSchemeLightM3 = ColorScheme( - brightness: Brightness.light, - primary: Color(0xFF6750A4), - onPrimary: Color(0xFFFFFFFF), - primaryContainer: Color(0xFFEADDFF), - onPrimaryContainer: Color(0xFF4F378B), - primaryFixed: Color(0xFFEADDFF), - primaryFixedDim: Color(0xFFD0BCFF), - onPrimaryFixed: Color(0xFF21005D), - onPrimaryFixedVariant: Color(0xFF4F378B), - secondary: Color(0xFF625B71), - onSecondary: Color(0xFFFFFFFF), - secondaryContainer: Color(0xFFE8DEF8), - onSecondaryContainer: Color(0xFF4A4458), - secondaryFixed: Color(0xFFE8DEF8), - secondaryFixedDim: Color(0xFFCCC2DC), - onSecondaryFixed: Color(0xFF1D192B), - onSecondaryFixedVariant: Color(0xFF4A4458), - tertiary: Color(0xFF7D5260), - onTertiary: Color(0xFFFFFFFF), - tertiaryContainer: Color(0xFFFFD8E4), - onTertiaryContainer: Color(0xFF633B48), - tertiaryFixed: Color(0xFFFFD8E4), - tertiaryFixedDim: Color(0xFFEFB8C8), - onTertiaryFixed: Color(0xFF31111D), - onTertiaryFixedVariant: Color(0xFF633B48), - error: Color(0xFFB3261E), - onError: Color(0xFFFFFFFF), - errorContainer: Color(0xFFF9DEDC), - onErrorContainer: Color(0xFF8C1D18), - background: Color(0xFFFEF7FF), - onBackground: Color(0xFF1D1B20), - surface: Color(0xFFFEF7FF), - surfaceBright: Color(0xFFFEF7FF), - surfaceContainerLowest: Color(0xFFFFFFFF), - surfaceContainerLow: Color(0xFFF7F2FA), - surfaceContainer: Color(0xFFF3EDF7), - surfaceContainerHigh: Color(0xFFECE6F0), - surfaceContainerHighest: Color(0xFFE6E0E9), - surfaceDim: Color(0xFFDED8E1), - onSurface: Color(0xFF1D1B20), - surfaceVariant: Color(0xFFE7E0EC), - onSurfaceVariant: Color(0xFF49454F), - outline: Color(0xFF79747E), - outlineVariant: Color(0xFFCAC4D0), - shadow: Color(0xFF000000), - scrim: Color(0xFF000000), - inverseSurface: Color(0xFF322F35), - onInverseSurface: Color(0xFFF5EFF7), - inversePrimary: Color(0xFFD0BCFF), - // The surfaceTint color is set to the same color as the primary. - surfaceTint: Color(0xFF6750A4), -); - -const ColorScheme _colorSchemeDarkM3 = ColorScheme( - brightness: Brightness.dark, - primary: Color(0xFFD0BCFF), - onPrimary: Color(0xFF381E72), - primaryContainer: Color(0xFF4F378B), - onPrimaryContainer: Color(0xFFEADDFF), - primaryFixed: Color(0xFFEADDFF), - primaryFixedDim: Color(0xFFD0BCFF), - onPrimaryFixed: Color(0xFF21005D), - onPrimaryFixedVariant: Color(0xFF4F378B), - secondary: Color(0xFFCCC2DC), - onSecondary: Color(0xFF332D41), - secondaryContainer: Color(0xFF4A4458), - onSecondaryContainer: Color(0xFFE8DEF8), - secondaryFixed: Color(0xFFE8DEF8), - secondaryFixedDim: Color(0xFFCCC2DC), - onSecondaryFixed: Color(0xFF1D192B), - onSecondaryFixedVariant: Color(0xFF4A4458), - tertiary: Color(0xFFEFB8C8), - onTertiary: Color(0xFF492532), - tertiaryContainer: Color(0xFF633B48), - onTertiaryContainer: Color(0xFFFFD8E4), - tertiaryFixed: Color(0xFFFFD8E4), - tertiaryFixedDim: Color(0xFFEFB8C8), - onTertiaryFixed: Color(0xFF31111D), - onTertiaryFixedVariant: Color(0xFF633B48), - error: Color(0xFFF2B8B5), - onError: Color(0xFF601410), - errorContainer: Color(0xFF8C1D18), - onErrorContainer: Color(0xFFF9DEDC), - background: Color(0xFF141218), - onBackground: Color(0xFFE6E0E9), - surface: Color(0xFF141218), - surfaceBright: Color(0xFF3B383E), - surfaceContainerLowest: Color(0xFF0F0D13), - surfaceContainerLow: Color(0xFF1D1B20), - surfaceContainer: Color(0xFF211F26), - surfaceContainerHigh: Color(0xFF2B2930), - surfaceContainerHighest: Color(0xFF36343B), - surfaceDim: Color(0xFF141218), - onSurface: Color(0xFFE6E0E9), - surfaceVariant: Color(0xFF49454F), - onSurfaceVariant: Color(0xFFCAC4D0), - outline: Color(0xFF938F99), - outlineVariant: Color(0xFF49454F), - shadow: Color(0xFF000000), - scrim: Color(0xFF000000), - inverseSurface: Color(0xFFE6E0E9), - onInverseSurface: Color(0xFF322F35), - inversePrimary: Color(0xFF6750A4), - // The surfaceTint color is set to the same color as the primary. - surfaceTint: Color(0xFFD0BCFF), -); -// dart format on - -// END GENERATED TOKEN PROPERTIES - ColorScheme diff --git a/packages/material_ui/test/theme_data_test.dart b/packages/material_ui/test/theme_data_test.dart index ca97ec327c0f..27477a8eb3f8 100644 --- a/packages/material_ui/test/theme_data_test.dart +++ b/packages/material_ui/test/theme_data_test.dart @@ -127,6 +127,53 @@ void main() { ); }); + test('ThemeData supports Material 3 contrast levels', () { + final standardTheme = ThemeData(); + final mediumContrastTheme = ThemeData(contrastLevel: ContrastLevel.medium); + final highContrastTheme = ThemeData(contrastLevel: ContrastLevel.high); + final darkMediumContrastTheme = ThemeData( + brightness: Brightness.dark, + contrastLevel: ContrastLevel.medium, + ); + final darkHighContrastTheme = ThemeData( + brightness: Brightness.dark, + contrastLevel: ContrastLevel.high, + ); + + expect(standardTheme.colorScheme.primary, isNot(mediumContrastTheme.colorScheme.primary)); + expect(mediumContrastTheme.colorScheme.primary, const Color(0xFF4F378B)); + expect(mediumContrastTheme.colorScheme.onSurface, const Color(0xFF000000)); + expect(highContrastTheme.colorScheme.primary, const Color(0xFF381E72)); + expect(highContrastTheme.colorScheme.onSurfaceVariant, const Color(0xFF000000)); + expect(darkMediumContrastTheme.colorScheme.primary, const Color(0xFFEADDFF)); + expect(darkMediumContrastTheme.colorScheme.onSurface, const Color(0xFFFFFFFF)); + expect(darkHighContrastTheme.colorScheme.primary, const Color(0xFFF6EDFF)); + expect(darkHighContrastTheme.colorScheme.onSurfaceVariant, const Color(0xFFFFFFFF)); + }); + + test('ThemeData supports custom Material 3 contrast levels from seed colors', () { + const contrastLevel = 0.25; + final theme = ThemeData(colorSchemeSeed: Colors.blue, contrastLevel: contrastLevel); + + expect( + theme.colorScheme, + ColorScheme.fromSeed(seedColor: Colors.blue, contrastLevel: contrastLevel), + ); + }); + + test('ThemeData defaults to standard Material 3 color scheme for custom contrast levels', () { + final standardTheme = ThemeData(); + const contrastLevel = 0.25; + final customContrastTheme = ThemeData(contrastLevel: contrastLevel); + + expect(customContrastTheme.colorScheme, standardTheme.colorScheme); + }); + + test('ThemeData throws for contrast levels outside the valid range', () { + expect(() => ThemeData(contrastLevel: -1.5), throwsAssertionError); + expect(() => ThemeData(contrastLevel: 1.5), throwsAssertionError); + }); + testWidgets( 'Defaults to MaterialTapTargetBehavior.padded on mobile platforms and MaterialTapTargetBehavior.shrinkWrap on desktop', (WidgetTester tester) async { @@ -367,7 +414,6 @@ void main() { expect(theme.colorScheme.onInverseSurface, const Color(0xfff5eff7)); expect(theme.colorScheme.inversePrimary, const Color(0xffd0bcff)); expect(theme.colorScheme.shadow, const Color(0xff000000)); - expect(theme.colorScheme.surfaceTint, const Color(0xff6750a4)); expect(theme.colorScheme.brightness, Brightness.light); expect(theme.primaryColor, theme.colorScheme.primary); @@ -843,7 +889,6 @@ void main() { expect(theme.colorScheme.onInverseSurface, const Color(0xfff5eff7)); expect(theme.colorScheme.inversePrimary, const Color(0xffd0bcff)); expect(theme.colorScheme.shadow, const Color(0xff000000)); - expect(theme.colorScheme.surfaceTint, const Color(0xff6750a4)); expect(theme.colorScheme.brightness, Brightness.light); expect(theme.primaryColor, theme.colorScheme.primary); @@ -905,7 +950,6 @@ void main() { expect(theme.colorScheme.onInverseSurface, const Color(0xff322f35)); expect(theme.colorScheme.inversePrimary, const Color(0xff6750a4)); expect(theme.colorScheme.shadow, const Color(0xff000000)); - expect(theme.colorScheme.surfaceTint, const Color(0xffd0bcff)); expect(theme.colorScheme.brightness, Brightness.dark); expect(theme.primaryColor, theme.colorScheme.surface); diff --git a/packages/material_ui/tool/gen_defaults/bin/gen_defaults.dart b/packages/material_ui/tool/gen_defaults/bin/gen_defaults.dart index 342fc586149e..62b3869029cd 100644 --- a/packages/material_ui/tool/gen_defaults/bin/gen_defaults.dart +++ b/packages/material_ui/tool/gen_defaults/bin/gen_defaults.dart @@ -22,7 +22,8 @@ import '../templates/bottom_sheet_template.dart'; // import '../templates/card_template.dart'; // import '../templates/checkbox_template.dart'; // import '../templates/chip_template.dart'; -// import '../templates/color_scheme_template.dart'; +import '../templates/color_scheme_template.dart'; + // import '../templates/date_picker_template.dart'; // import '../templates/dialog_template.dart'; // import '../templates/divider_template.dart'; @@ -73,7 +74,7 @@ Future main(List args) async { // const CardTemplateM3().generateFile(verbose: verbose); // const CheckboxTemplateM3().generateFile(verbose: verbose); // const ChipTemplateM3().generateFile(verbose: verbose); - // const ColorSchemeTemplateM3().generateFile(verbose: verbose); + const ColorSchemeTemplateM3().generateFile(verbose: verbose); // const DatePickerTemplateM3().generateFile(verbose: verbose); // const DialogTemplateM3().generateFile(verbose: verbose); // const DividerTemplateM3().generateFile(verbose: verbose); diff --git a/packages/material_ui/tool/gen_defaults/templates/color_scheme_template.dart b/packages/material_ui/tool/gen_defaults/templates/color_scheme_template.dart new file mode 100644 index 000000000000..9cfb3e03766f --- /dev/null +++ b/packages/material_ui/tool/gen_defaults/templates/color_scheme_template.dart @@ -0,0 +1,406 @@ +// Copyright 2013 The Flutter Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '../data/color_dark.dart'; +import '../data/color_dark_high_contrast.dart'; +import '../data/color_dark_medium_contrast.dart'; +import '../data/color_light.dart'; +import '../data/color_light_high_contrast.dart'; +import '../data/color_light_medium_contrast.dart'; +import 'template.dart'; + +class ColorSchemeTemplateM3 extends TokenTemplateM3 { + const ColorSchemeTemplateM3(); + + @override + String get name => 'Theme Data'; + + @override + String get parentFilePath => 'theme_data.dart'; + + @override + String get outputFileName => 'color_scheme_defaults.g.dart'; + + @override + bool get requiresGeneratedClass => false; + + static const Map _lightTokens = { + 'background': TokenColorLight.background, + 'error': TokenColorLight.error, + 'errorContainer': TokenColorLight.errorContainer, + 'inverseOnSurface': TokenColorLight.inverseOnSurface, + 'inversePrimary': TokenColorLight.inversePrimary, + 'inverseSurface': TokenColorLight.inverseSurface, + 'onBackground': TokenColorLight.onBackground, + 'onError': TokenColorLight.onError, + 'onErrorContainer': TokenColorLight.onErrorContainer, + 'onPrimary': TokenColorLight.onPrimary, + 'onPrimaryContainer': TokenColorLight.onPrimaryContainer, + 'onPrimaryFixed': TokenColorLight.onPrimaryFixed, + 'onPrimaryFixedVariant': TokenColorLight.onPrimaryFixedVariant, + 'onSecondary': TokenColorLight.onSecondary, + 'onSecondaryContainer': TokenColorLight.onSecondaryContainer, + 'onSecondaryFixed': TokenColorLight.onSecondaryFixed, + 'onSecondaryFixedVariant': TokenColorLight.onSecondaryFixedVariant, + 'onSurface': TokenColorLight.onSurface, + 'onSurfaceVariant': TokenColorLight.onSurfaceVariant, + 'onTertiary': TokenColorLight.onTertiary, + 'onTertiaryContainer': TokenColorLight.onTertiaryContainer, + 'onTertiaryFixed': TokenColorLight.onTertiaryFixed, + 'onTertiaryFixedVariant': TokenColorLight.onTertiaryFixedVariant, + 'outline': TokenColorLight.outline, + 'outlineVariant': TokenColorLight.outlineVariant, + 'primary': TokenColorLight.primary, + 'primaryContainer': TokenColorLight.primaryContainer, + 'primaryFixed': TokenColorLight.primaryFixed, + 'primaryFixedDim': TokenColorLight.primaryFixedDim, + 'scrim': TokenColorLight.scrim, + 'secondary': TokenColorLight.secondary, + 'secondaryContainer': TokenColorLight.secondaryContainer, + 'secondaryFixed': TokenColorLight.secondaryFixed, + 'secondaryFixedDim': TokenColorLight.secondaryFixedDim, + 'shadow': TokenColorLight.shadow, + 'surface': TokenColorLight.surface, + 'surfaceBright': TokenColorLight.surfaceBright, + 'surfaceContainer': TokenColorLight.surfaceContainer, + 'surfaceContainerHigh': TokenColorLight.surfaceContainerHigh, + 'surfaceContainerHighest': TokenColorLight.surfaceContainerHighest, + 'surfaceContainerLow': TokenColorLight.surfaceContainerLow, + 'surfaceContainerLowest': TokenColorLight.surfaceContainerLowest, + 'surfaceDim': TokenColorLight.surfaceDim, + 'surfaceVariant': TokenColorLight.surfaceVariant, + 'tertiary': TokenColorLight.tertiary, + 'tertiaryContainer': TokenColorLight.tertiaryContainer, + 'tertiaryFixed': TokenColorLight.tertiaryFixed, + 'tertiaryFixedDim': TokenColorLight.tertiaryFixedDim, + }; + + static const Map _darkTokens = { + 'background': TokenColorDark.background, + 'error': TokenColorDark.error, + 'errorContainer': TokenColorDark.errorContainer, + 'inverseOnSurface': TokenColorDark.inverseOnSurface, + 'inversePrimary': TokenColorDark.inversePrimary, + 'inverseSurface': TokenColorDark.inverseSurface, + 'onBackground': TokenColorDark.onBackground, + 'onError': TokenColorDark.onError, + 'onErrorContainer': TokenColorDark.onErrorContainer, + 'onPrimary': TokenColorDark.onPrimary, + 'onPrimaryContainer': TokenColorDark.onPrimaryContainer, + 'onPrimaryFixed': TokenColorDark.onPrimaryFixed, + 'onPrimaryFixedVariant': TokenColorDark.onPrimaryFixedVariant, + 'onSecondary': TokenColorDark.onSecondary, + 'onSecondaryContainer': TokenColorDark.onSecondaryContainer, + 'onSecondaryFixed': TokenColorDark.onSecondaryFixed, + 'onSecondaryFixedVariant': TokenColorDark.onSecondaryFixedVariant, + 'onSurface': TokenColorDark.onSurface, + 'onSurfaceVariant': TokenColorDark.onSurfaceVariant, + 'onTertiary': TokenColorDark.onTertiary, + 'onTertiaryContainer': TokenColorDark.onTertiaryContainer, + 'onTertiaryFixed': TokenColorDark.onTertiaryFixed, + 'onTertiaryFixedVariant': TokenColorDark.onTertiaryFixedVariant, + 'outline': TokenColorDark.outline, + 'outlineVariant': TokenColorDark.outlineVariant, + 'primary': TokenColorDark.primary, + 'primaryContainer': TokenColorDark.primaryContainer, + 'primaryFixed': TokenColorDark.primaryFixed, + 'primaryFixedDim': TokenColorDark.primaryFixedDim, + 'scrim': TokenColorDark.scrim, + 'secondary': TokenColorDark.secondary, + 'secondaryContainer': TokenColorDark.secondaryContainer, + 'secondaryFixed': TokenColorDark.secondaryFixed, + 'secondaryFixedDim': TokenColorDark.secondaryFixedDim, + 'shadow': TokenColorDark.shadow, + 'surface': TokenColorDark.surface, + 'surfaceBright': TokenColorDark.surfaceBright, + 'surfaceContainer': TokenColorDark.surfaceContainer, + 'surfaceContainerHigh': TokenColorDark.surfaceContainerHigh, + 'surfaceContainerHighest': TokenColorDark.surfaceContainerHighest, + 'surfaceContainerLow': TokenColorDark.surfaceContainerLow, + 'surfaceContainerLowest': TokenColorDark.surfaceContainerLowest, + 'surfaceDim': TokenColorDark.surfaceDim, + 'surfaceVariant': TokenColorDark.surfaceVariant, + 'tertiary': TokenColorDark.tertiary, + 'tertiaryContainer': TokenColorDark.tertiaryContainer, + 'tertiaryFixed': TokenColorDark.tertiaryFixed, + 'tertiaryFixedDim': TokenColorDark.tertiaryFixedDim, + }; + + static const Map _lightMediumContrastTokens = { + 'error': TokenColorLightMediumContrast.error, + 'errorContainer': TokenColorLightMediumContrast.errorContainer, + 'inverseOnSurface': TokenColorLightMediumContrast.inverseOnSurface, + 'onBackground': TokenColorLightMediumContrast.onBackground, + 'onError': TokenColorLightMediumContrast.onError, + 'onErrorContainer': TokenColorLightMediumContrast.onErrorContainer, + 'onPrimary': TokenColorLightMediumContrast.onPrimary, + 'onPrimaryContainer': TokenColorLightMediumContrast.onPrimaryContainer, + 'onPrimaryFixed': TokenColorLightMediumContrast.onPrimaryFixed, + 'onPrimaryFixedVariant': TokenColorLightMediumContrast.onPrimaryFixedVariant, + 'onSecondary': TokenColorLightMediumContrast.onSecondary, + 'onSecondaryContainer': TokenColorLightMediumContrast.onSecondaryContainer, + 'onSecondaryFixed': TokenColorLightMediumContrast.onSecondaryFixed, + 'onSecondaryFixedVariant': TokenColorLightMediumContrast.onSecondaryFixedVariant, + 'onSurface': TokenColorLightMediumContrast.onSurface, + 'onSurfaceVariant': TokenColorLightMediumContrast.onSurfaceVariant, + 'onTertiary': TokenColorLightMediumContrast.onTertiary, + 'onTertiaryContainer': TokenColorLightMediumContrast.onTertiaryContainer, + 'onTertiaryFixed': TokenColorLightMediumContrast.onTertiaryFixed, + 'onTertiaryFixedVariant': TokenColorLightMediumContrast.onTertiaryFixedVariant, + 'outline': TokenColorLightMediumContrast.outline, + 'outlineVariant': TokenColorLightMediumContrast.outlineVariant, + 'primary': TokenColorLightMediumContrast.primary, + 'primaryContainer': TokenColorLightMediumContrast.primaryContainer, + 'primaryFixed': TokenColorLightMediumContrast.primaryFixed, + 'primaryFixedDim': TokenColorLightMediumContrast.primaryFixedDim, + 'secondary': TokenColorLightMediumContrast.secondary, + 'secondaryContainer': TokenColorLightMediumContrast.secondaryContainer, + 'secondaryFixed': TokenColorLightMediumContrast.secondaryFixed, + 'secondaryFixedDim': TokenColorLightMediumContrast.secondaryFixedDim, + 'tertiary': TokenColorLightMediumContrast.tertiary, + 'tertiaryContainer': TokenColorLightMediumContrast.tertiaryContainer, + 'tertiaryFixed': TokenColorLightMediumContrast.tertiaryFixed, + 'tertiaryFixedDim': TokenColorLightMediumContrast.tertiaryFixedDim, + }; + + static const Map _lightHighContrastTokens = { + 'error': TokenColorLightHighContrast.error, + 'errorContainer': TokenColorLightHighContrast.errorContainer, + 'inverseOnSurface': TokenColorLightHighContrast.inverseOnSurface, + 'onBackground': TokenColorLightHighContrast.onBackground, + 'onError': TokenColorLightHighContrast.onError, + 'onErrorContainer': TokenColorLightHighContrast.onErrorContainer, + 'onPrimary': TokenColorLightHighContrast.onPrimary, + 'onPrimaryContainer': TokenColorLightHighContrast.onPrimaryContainer, + 'onPrimaryFixed': TokenColorLightHighContrast.onPrimaryFixed, + 'onPrimaryFixedVariant': TokenColorLightHighContrast.onPrimaryFixedVariant, + 'onSecondary': TokenColorLightHighContrast.onSecondary, + 'onSecondaryContainer': TokenColorLightHighContrast.onSecondaryContainer, + 'onSecondaryFixed': TokenColorLightHighContrast.onSecondaryFixed, + 'onSecondaryFixedVariant': TokenColorLightHighContrast.onSecondaryFixedVariant, + 'onSurface': TokenColorLightHighContrast.onSurface, + 'onSurfaceVariant': TokenColorLightHighContrast.onSurfaceVariant, + 'onTertiary': TokenColorLightHighContrast.onTertiary, + 'onTertiaryContainer': TokenColorLightHighContrast.onTertiaryContainer, + 'onTertiaryFixed': TokenColorLightHighContrast.onTertiaryFixed, + 'onTertiaryFixedVariant': TokenColorLightHighContrast.onTertiaryFixedVariant, + 'outline': TokenColorLightHighContrast.outline, + 'outlineVariant': TokenColorLightHighContrast.outlineVariant, + 'primary': TokenColorLightHighContrast.primary, + 'primaryContainer': TokenColorLightHighContrast.primaryContainer, + 'primaryFixed': TokenColorLightHighContrast.primaryFixed, + 'primaryFixedDim': TokenColorLightHighContrast.primaryFixedDim, + 'secondary': TokenColorLightHighContrast.secondary, + 'secondaryContainer': TokenColorLightHighContrast.secondaryContainer, + 'secondaryFixed': TokenColorLightHighContrast.secondaryFixed, + 'secondaryFixedDim': TokenColorLightHighContrast.secondaryFixedDim, + 'tertiary': TokenColorLightHighContrast.tertiary, + 'tertiaryContainer': TokenColorLightHighContrast.tertiaryContainer, + 'tertiaryFixed': TokenColorLightHighContrast.tertiaryFixed, + 'tertiaryFixedDim': TokenColorLightHighContrast.tertiaryFixedDim, + }; + + static const Map _darkMediumContrastTokens = { + 'error': TokenColorDarkMediumContrast.error, + 'errorContainer': TokenColorDarkMediumContrast.errorContainer, + 'inverseOnSurface': TokenColorDarkMediumContrast.inverseOnSurface, + 'inversePrimary': TokenColorDarkMediumContrast.inversePrimary, + 'onBackground': TokenColorDarkMediumContrast.onBackground, + 'onError': TokenColorDarkMediumContrast.onError, + 'onErrorContainer': TokenColorDarkMediumContrast.onErrorContainer, + 'onPrimary': TokenColorDarkMediumContrast.onPrimary, + 'onPrimaryContainer': TokenColorDarkMediumContrast.onPrimaryContainer, + 'onPrimaryFixed': TokenColorDarkMediumContrast.onPrimaryFixed, + 'onPrimaryFixedVariant': TokenColorDarkMediumContrast.onPrimaryFixedVariant, + 'onSecondary': TokenColorDarkMediumContrast.onSecondary, + 'onSecondaryContainer': TokenColorDarkMediumContrast.onSecondaryContainer, + 'onSecondaryFixed': TokenColorDarkMediumContrast.onSecondaryFixed, + 'onSecondaryFixedVariant': TokenColorDarkMediumContrast.onSecondaryFixedVariant, + 'onSurface': TokenColorDarkMediumContrast.onSurface, + 'onSurfaceVariant': TokenColorDarkMediumContrast.onSurfaceVariant, + 'onTertiary': TokenColorDarkMediumContrast.onTertiary, + 'onTertiaryContainer': TokenColorDarkMediumContrast.onTertiaryContainer, + 'onTertiaryFixed': TokenColorDarkMediumContrast.onTertiaryFixed, + 'onTertiaryFixedVariant': TokenColorDarkMediumContrast.onTertiaryFixedVariant, + 'outline': TokenColorDarkMediumContrast.outline, + 'outlineVariant': TokenColorDarkMediumContrast.outlineVariant, + 'primary': TokenColorDarkMediumContrast.primary, + 'primaryContainer': TokenColorDarkMediumContrast.primaryContainer, + 'primaryFixed': TokenColorDarkMediumContrast.primaryFixed, + 'primaryFixedDim': TokenColorDarkMediumContrast.primaryFixedDim, + 'secondary': TokenColorDarkMediumContrast.secondary, + 'secondaryContainer': TokenColorDarkMediumContrast.secondaryContainer, + 'secondaryFixed': TokenColorDarkMediumContrast.secondaryFixed, + 'secondaryFixedDim': TokenColorDarkMediumContrast.secondaryFixedDim, + 'tertiary': TokenColorDarkMediumContrast.tertiary, + 'tertiaryContainer': TokenColorDarkMediumContrast.tertiaryContainer, + 'tertiaryFixed': TokenColorDarkMediumContrast.tertiaryFixed, + 'tertiaryFixedDim': TokenColorDarkMediumContrast.tertiaryFixedDim, + }; + + static const Map _darkHighContrastTokens = { + 'error': TokenColorDarkHighContrast.error, + 'errorContainer': TokenColorDarkHighContrast.errorContainer, + 'inverseOnSurface': TokenColorDarkHighContrast.inverseOnSurface, + 'inversePrimary': TokenColorDarkHighContrast.inversePrimary, + 'onBackground': TokenColorDarkHighContrast.onBackground, + 'onError': TokenColorDarkHighContrast.onError, + 'onErrorContainer': TokenColorDarkHighContrast.onErrorContainer, + 'onPrimary': TokenColorDarkHighContrast.onPrimary, + 'onPrimaryContainer': TokenColorDarkHighContrast.onPrimaryContainer, + 'onPrimaryFixed': TokenColorDarkHighContrast.onPrimaryFixed, + 'onPrimaryFixedVariant': TokenColorDarkHighContrast.onPrimaryFixedVariant, + 'onSecondary': TokenColorDarkHighContrast.onSecondary, + 'onSecondaryContainer': TokenColorDarkHighContrast.onSecondaryContainer, + 'onSecondaryFixed': TokenColorDarkHighContrast.onSecondaryFixed, + 'onSecondaryFixedVariant': TokenColorDarkHighContrast.onSecondaryFixedVariant, + 'onSurface': TokenColorDarkHighContrast.onSurface, + 'onSurfaceVariant': TokenColorDarkHighContrast.onSurfaceVariant, + 'onTertiary': TokenColorDarkHighContrast.onTertiary, + 'onTertiaryContainer': TokenColorDarkHighContrast.onTertiaryContainer, + 'onTertiaryFixed': TokenColorDarkHighContrast.onTertiaryFixed, + 'onTertiaryFixedVariant': TokenColorDarkHighContrast.onTertiaryFixedVariant, + 'outline': TokenColorDarkHighContrast.outline, + 'outlineVariant': TokenColorDarkHighContrast.outlineVariant, + 'primary': TokenColorDarkHighContrast.primary, + 'primaryContainer': TokenColorDarkHighContrast.primaryContainer, + 'primaryFixed': TokenColorDarkHighContrast.primaryFixed, + 'primaryFixedDim': TokenColorDarkHighContrast.primaryFixedDim, + 'secondary': TokenColorDarkHighContrast.secondary, + 'secondaryContainer': TokenColorDarkHighContrast.secondaryContainer, + 'secondaryFixed': TokenColorDarkHighContrast.secondaryFixed, + 'secondaryFixedDim': TokenColorDarkHighContrast.secondaryFixedDim, + 'tertiary': TokenColorDarkHighContrast.tertiary, + 'tertiaryContainer': TokenColorDarkHighContrast.tertiaryContainer, + 'tertiaryFixed': TokenColorDarkHighContrast.tertiaryFixed, + 'tertiaryFixedDim': TokenColorDarkHighContrast.tertiaryFixedDim, + }; + + @override + String generateContents(String className) { + return [ + _colorScheme('_colorSchemeLightM3', 'Brightness.light', _lightTokens), + _colorScheme('_colorSchemeDarkM3', 'Brightness.dark', _darkTokens), + _colorScheme( + '_colorSchemeLightMediumContrastM3', + 'Brightness.light', + _lightMediumContrastTokens, + fallbackTokens: _lightTokens, + ), + _colorScheme( + '_colorSchemeLightHighContrastM3', + 'Brightness.light', + _lightHighContrastTokens, + fallbackTokens: _lightTokens, + ), + _colorScheme( + '_colorSchemeDarkMediumContrastM3', + 'Brightness.dark', + _darkMediumContrastTokens, + fallbackTokens: _darkTokens, + ), + _colorScheme( + '_colorSchemeDarkHighContrastM3', + 'Brightness.dark', + _darkHighContrastTokens, + fallbackTokens: _darkTokens, + ), + ].join('\n'); + } + + String _colorScheme( + String name, + String brightness, + Map tokens, { + Map? fallbackTokens, + }) { + const colorRoles = <(String, String)>[ + ('primary', 'primary'), + ('onPrimary', 'onPrimary'), + ('primaryContainer', 'primaryContainer'), + ('onPrimaryContainer', 'onPrimaryContainer'), + ('primaryFixed', 'primaryFixed'), + ('primaryFixedDim', 'primaryFixedDim'), + ('onPrimaryFixed', 'onPrimaryFixed'), + ('onPrimaryFixedVariant', 'onPrimaryFixedVariant'), + ('secondary', 'secondary'), + ('onSecondary', 'onSecondary'), + ('secondaryContainer', 'secondaryContainer'), + ('onSecondaryContainer', 'onSecondaryContainer'), + ('secondaryFixed', 'secondaryFixed'), + ('secondaryFixedDim', 'secondaryFixedDim'), + ('onSecondaryFixed', 'onSecondaryFixed'), + ('onSecondaryFixedVariant', 'onSecondaryFixedVariant'), + ('tertiary', 'tertiary'), + ('onTertiary', 'onTertiary'), + ('tertiaryContainer', 'tertiaryContainer'), + ('onTertiaryContainer', 'onTertiaryContainer'), + ('tertiaryFixed', 'tertiaryFixed'), + ('tertiaryFixedDim', 'tertiaryFixedDim'), + ('onTertiaryFixed', 'onTertiaryFixed'), + ('onTertiaryFixedVariant', 'onTertiaryFixedVariant'), + ('error', 'error'), + ('onError', 'onError'), + ('errorContainer', 'errorContainer'), + ('onErrorContainer', 'onErrorContainer'), + ('background', 'background'), + ('onBackground', 'onBackground'), + ('surface', 'surface'), + ('surfaceBright', 'surfaceBright'), + ('surfaceContainerLowest', 'surfaceContainerLowest'), + ('surfaceContainerLow', 'surfaceContainerLow'), + ('surfaceContainer', 'surfaceContainer'), + ('surfaceContainerHigh', 'surfaceContainerHigh'), + ('surfaceContainerHighest', 'surfaceContainerHighest'), + ('surfaceDim', 'surfaceDim'), + ('onSurface', 'onSurface'), + ('surfaceVariant', 'surfaceVariant'), + ('onSurfaceVariant', 'onSurfaceVariant'), + ('outline', 'outline'), + ('outlineVariant', 'outlineVariant'), + ('shadow', 'shadow'), + ('scrim', 'scrim'), + ('inverseSurface', 'inverseSurface'), + ('onInverseSurface', 'inverseOnSurface'), + ('inversePrimary', 'inversePrimary'), + ]; + + final buffer = StringBuffer(''' +const ColorScheme $name = ColorScheme( + brightness: $brightness, +'''); + final Iterable<(String, String)> rolesWithTokens = colorRoles.where( + ((String, String) role) => tokens.containsKey(role.$2), + ); + final Iterable<(String, String)> rolesWithFallbackTokens = colorRoles.where( + ((String, String) role) => !tokens.containsKey(role.$2), + ); + + for (final (parameterName, tokenName) in rolesWithTokens) { + buffer.writeln(' $parameterName: Color(${tokens[tokenName]}),'); + } + if (fallbackTokens != null && rolesWithFallbackTokens.isNotEmpty) { + buffer.writeln( + ' // These roles fall back to the default ${_brightnessName(brightness)} tokens.', + ); + for (final (parameterName, tokenName) in rolesWithFallbackTokens) { + buffer.writeln(' $parameterName: Color(${_fallbackToken(tokenName, fallbackTokens)}),'); + } + } + buffer.writeln(');\n'); + return buffer.toString(); + } + + String _brightnessName(String brightness) { + return switch (brightness) { + 'Brightness.light' => 'light', + 'Brightness.dark' => 'dark', + _ => throw StateError('Unsupported brightness: $brightness.'), + }; + } + + String _fallbackToken(String name, Map fallbackTokens) { + return fallbackTokens[name] ?? (throw StateError('No fallback token is defined for $name.')); + } +} diff --git a/packages/material_ui/tool/gen_defaults/templates/template.dart b/packages/material_ui/tool/gen_defaults/templates/template.dart index cc2e09b54f2a..f7f31718ff84 100644 --- a/packages/material_ui/tool/gen_defaults/templates/template.dart +++ b/packages/material_ui/tool/gen_defaults/templates/template.dart @@ -93,6 +93,18 @@ abstract class TokenTemplate { /// the class. RegExp get _classRegExp => RegExp('class\\s+$className\\b'); + /// The output file name generated under [materialLib]. + String get outputFileName { + final String snakeName = name.toLowerCase().replaceAll(' ', '_'); + return switch (_version) { + _MaterialVersion.material3 => '${snakeName}_defaults_m3.g.dart', + _MaterialVersion.material3Expressive => '${snakeName}_defaults_m3e.g.dart', + }; + } + + /// Whether the generated contents must declare the generated defaults class. + bool get requiresGeneratedClass => true; + /// Returns the body of the generated file as a string. /// /// The [className] parameter must be used to declare the class. @@ -186,11 +198,6 @@ abstract class TokenTemplate { /// Generates the file under the target path [materialLib] and formats it. void generateFile({bool verbose = false}) { - final String snakeName = name.toLowerCase().replaceAll(' ', '_'); - final String outputFileName = switch (_version) { - _MaterialVersion.material3 => '${snakeName}_defaults_m3.g.dart', - _MaterialVersion.material3Expressive => '${snakeName}_defaults_m3e.g.dart', - }; final fileName = '$materialLib/$outputFileName'; if (verbose) { stdout.writeln('Generating file: $fileName'); @@ -211,9 +218,9 @@ abstract class TokenTemplate { if (verbose) { stdout.writeln('Generating contents...'); } - final String contents = generateContents(className); + final String contents = generateContents(requiresGeneratedClass ? className : ''); assert( - contents.contains(_classRegExp), + !requiresGeneratedClass || contents.contains(_classRegExp), 'The generated contents for "$name" must define the class "$className". ' 'Make sure you are utilizing the passed `className` parameter.', ); diff --git a/packages/material_ui/tool/gen_defaults/temporarily_excluded/generated/color_scheme_defaults.g.dart b/packages/material_ui/tool/gen_defaults/temporarily_excluded/generated/color_scheme_defaults.g.dart deleted file mode 100644 index cb1475b6a7b5..000000000000 --- a/packages/material_ui/tool/gen_defaults/temporarily_excluded/generated/color_scheme_defaults.g.dart +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2013 The Flutter Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -const ColorScheme _colorSchemeLightM3 = ColorScheme( - brightness: Brightness.light, - primary: Color(0xFF6750A4), - onPrimary: Color(0xFFFFFFFF), - primaryContainer: Color(0xFFEADDFF), - onPrimaryContainer: Color(0xFF4F378B), - primaryFixed: Color(0xFFEADDFF), - primaryFixedDim: Color(0xFFD0BCFF), - onPrimaryFixed: Color(0xFF21005D), - onPrimaryFixedVariant: Color(0xFF4F378B), - secondary: Color(0xFF625B71), - onSecondary: Color(0xFFFFFFFF), - secondaryContainer: Color(0xFFE8DEF8), - onSecondaryContainer: Color(0xFF4A4458), - secondaryFixed: Color(0xFFE8DEF8), - secondaryFixedDim: Color(0xFFCCC2DC), - onSecondaryFixed: Color(0xFF1D192B), - onSecondaryFixedVariant: Color(0xFF4A4458), - tertiary: Color(0xFF7D5260), - onTertiary: Color(0xFFFFFFFF), - tertiaryContainer: Color(0xFFFFD8E4), - onTertiaryContainer: Color(0xFF633B48), - tertiaryFixed: Color(0xFFFFD8E4), - tertiaryFixedDim: Color(0xFFEFB8C8), - onTertiaryFixed: Color(0xFF31111D), - onTertiaryFixedVariant: Color(0xFF633B48), - error: Color(0xFFB3261E), - onError: Color(0xFFFFFFFF), - errorContainer: Color(0xFFF9DEDC), - onErrorContainer: Color(0xFF8C1D18), - background: Color(0xFFFEF7FF), - onBackground: Color(0xFF1D1B20), - surface: Color(0xFFFEF7FF), - surfaceBright: Color(0xFFFEF7FF), - surfaceContainerLowest: Color(0xFFFFFFFF), - surfaceContainerLow: Color(0xFFF7F2FA), - surfaceContainer: Color(0xFFF3EDF7), - surfaceContainerHigh: Color(0xFFECE6F0), - surfaceContainerHighest: Color(0xFFE6E0E9), - surfaceDim: Color(0xFFDED8E1), - onSurface: Color(0xFF1D1B20), - surfaceVariant: Color(0xFFE7E0EC), - onSurfaceVariant: Color(0xFF49454F), - outline: Color(0xFF79747E), - outlineVariant: Color(0xFFCAC4D0), - shadow: Color(0xFF000000), - scrim: Color(0xFF000000), - inverseSurface: Color(0xFF322F35), - onInverseSurface: Color(0xFFF5EFF7), - inversePrimary: Color(0xFFD0BCFF), - // The surfaceTint color is set to the same color as the primary. - surfaceTint: Color(0xFF6750A4), -); - -const ColorScheme _colorSchemeDarkM3 = ColorScheme( - brightness: Brightness.dark, - primary: Color(0xFFD0BCFF), - onPrimary: Color(0xFF381E72), - primaryContainer: Color(0xFF4F378B), - onPrimaryContainer: Color(0xFFEADDFF), - primaryFixed: Color(0xFFEADDFF), - primaryFixedDim: Color(0xFFD0BCFF), - onPrimaryFixed: Color(0xFF21005D), - onPrimaryFixedVariant: Color(0xFF4F378B), - secondary: Color(0xFFCCC2DC), - onSecondary: Color(0xFF332D41), - secondaryContainer: Color(0xFF4A4458), - onSecondaryContainer: Color(0xFFE8DEF8), - secondaryFixed: Color(0xFFE8DEF8), - secondaryFixedDim: Color(0xFFCCC2DC), - onSecondaryFixed: Color(0xFF1D192B), - onSecondaryFixedVariant: Color(0xFF4A4458), - tertiary: Color(0xFFEFB8C8), - onTertiary: Color(0xFF492532), - tertiaryContainer: Color(0xFF633B48), - onTertiaryContainer: Color(0xFFFFD8E4), - tertiaryFixed: Color(0xFFFFD8E4), - tertiaryFixedDim: Color(0xFFEFB8C8), - onTertiaryFixed: Color(0xFF31111D), - onTertiaryFixedVariant: Color(0xFF633B48), - error: Color(0xFFF2B8B5), - onError: Color(0xFF601410), - errorContainer: Color(0xFF8C1D18), - onErrorContainer: Color(0xFFF9DEDC), - background: Color(0xFF141218), - onBackground: Color(0xFFE6E0E9), - surface: Color(0xFF141218), - surfaceBright: Color(0xFF3B383E), - surfaceContainerLowest: Color(0xFF0F0D13), - surfaceContainerLow: Color(0xFF1D1B20), - surfaceContainer: Color(0xFF211F26), - surfaceContainerHigh: Color(0xFF2B2930), - surfaceContainerHighest: Color(0xFF36343B), - surfaceDim: Color(0xFF141218), - onSurface: Color(0xFFE6E0E9), - surfaceVariant: Color(0xFF49454F), - onSurfaceVariant: Color(0xFFCAC4D0), - outline: Color(0xFF938F99), - outlineVariant: Color(0xFF49454F), - shadow: Color(0xFF000000), - scrim: Color(0xFF000000), - inverseSurface: Color(0xFFE6E0E9), - onInverseSurface: Color(0xFF322F35), - inversePrimary: Color(0xFF6750A4), - // The surfaceTint color is set to the same color as the primary. - surfaceTint: Color(0xFFD0BCFF), -); diff --git a/packages/material_ui/tool/gen_defaults/temporarily_excluded/templates/color_scheme_template.dart b/packages/material_ui/tool/gen_defaults/temporarily_excluded/templates/color_scheme_template.dart deleted file mode 100644 index a775c00c4ef4..000000000000 --- a/packages/material_ui/tool/gen_defaults/temporarily_excluded/templates/color_scheme_template.dart +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2013 The Flutter Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'template.dart'; -import 'token_logger.dart'; - -class ColorSchemeTemplate extends TokenTemplate { - ColorSchemeTemplate( - this._colorTokensLight, - this._colorTokensDark, - super.blockName, - super.fileName, - super.tokens, - ); - - // Map of light color scheme token data from tokens. - final Map _colorTokensLight; - - // Map of dark color scheme token data from tokens. - final Map _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(${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')}), - primaryFixed: Color(${light('md.sys.color.primary-fixed')}), - primaryFixedDim: Color(${light('md.sys.color.primary-fixed-dim')}), - onPrimaryFixed: Color(${light('md.sys.color.on-primary-fixed')}), - onPrimaryFixedVariant: Color(${light('md.sys.color.on-primary-fixed-variant')}), - 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')}), - secondaryFixed: Color(${light('md.sys.color.secondary-fixed')}), - secondaryFixedDim: Color(${light('md.sys.color.secondary-fixed-dim')}), - onSecondaryFixed: Color(${light('md.sys.color.on-secondary-fixed')}), - onSecondaryFixedVariant: Color(${light('md.sys.color.on-secondary-fixed-variant')}), - 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')}), - tertiaryFixed: Color(${light('md.sys.color.tertiary-fixed')}), - tertiaryFixedDim: Color(${light('md.sys.color.tertiary-fixed-dim')}), - onTertiaryFixed: Color(${light('md.sys.color.on-tertiary-fixed')}), - onTertiaryFixedVariant: Color(${light('md.sys.color.on-tertiary-fixed-variant')}), - 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')}), - surfaceBright: Color(${light('md.sys.color.surface-bright')}), - surfaceContainerLowest: Color(${light('md.sys.color.surface-container-lowest')}), - surfaceContainerLow: Color(${light('md.sys.color.surface-container-low')}), - surfaceContainer: Color(${light('md.sys.color.surface-container')}), - surfaceContainerHigh: Color(${light('md.sys.color.surface-container-high')}), - surfaceContainerHighest: Color(${light('md.sys.color.surface-container-highest')}), - surfaceDim: Color(${light('md.sys.color.surface-dim')}), - 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(${light('md.sys.color.primary')}), -); - -const ColorScheme _colorSchemeDarkM3 = ColorScheme( - brightness: Brightness.dark, - 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')}), - primaryFixed: Color(${dark('md.sys.color.primary-fixed')}), - primaryFixedDim: Color(${dark('md.sys.color.primary-fixed-dim')}), - onPrimaryFixed: Color(${dark('md.sys.color.on-primary-fixed')}), - onPrimaryFixedVariant: Color(${dark('md.sys.color.on-primary-fixed-variant')}), - 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')}), - secondaryFixed: Color(${dark('md.sys.color.secondary-fixed')}), - secondaryFixedDim: Color(${dark('md.sys.color.secondary-fixed-dim')}), - onSecondaryFixed: Color(${dark('md.sys.color.on-secondary-fixed')}), - onSecondaryFixedVariant: Color(${dark('md.sys.color.on-secondary-fixed-variant')}), - 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')}), - tertiaryFixed: Color(${dark('md.sys.color.tertiary-fixed')}), - tertiaryFixedDim: Color(${dark('md.sys.color.tertiary-fixed-dim')}), - onTertiaryFixed: Color(${dark('md.sys.color.on-tertiary-fixed')}), - onTertiaryFixedVariant: Color(${dark('md.sys.color.on-tertiary-fixed-variant')}), - 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')}), - surfaceBright: Color(${dark('md.sys.color.surface-bright')}), - surfaceContainerLowest: Color(${dark('md.sys.color.surface-container-lowest')}), - surfaceContainerLow: Color(${dark('md.sys.color.surface-container-low')}), - surfaceContainer: Color(${dark('md.sys.color.surface-container')}), - surfaceContainerHigh: Color(${dark('md.sys.color.surface-container-high')}), - surfaceContainerHighest: Color(${dark('md.sys.color.surface-container-highest')}), - surfaceDim: Color(${dark('md.sys.color.surface-dim')}), - 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(${dark('md.sys.color.primary')}), -); -'''; -} diff --git a/packages/material_ui/tool/gen_defaults/test/gen_defaults_test.dart b/packages/material_ui/tool/gen_defaults/test/gen_defaults_test.dart index 3161c2bf2fc1..b8964d5051a0 100644 --- a/packages/material_ui/tool/gen_defaults/test/gen_defaults_test.dart +++ b/packages/material_ui/tool/gen_defaults/test/gen_defaults_test.dart @@ -12,6 +12,7 @@ import '../data/typescale_emphasized.dart'; import '../templates/action_chip_template.dart'; import '../templates/app_bar_template.dart'; import '../templates/bottom_sheet_template.dart'; +import '../templates/color_scheme_template.dart'; import '../templates/template.dart'; import 'test_fixtures/test_templates.dart'; @@ -101,7 +102,7 @@ void main() { '_colors.onSurface', ); }); - + test('border generates border expression', () { final template = IconButtonTemplateM3(testPath()); expect(template.border('_colors.outline'), 'BorderSide(color: _colors.outline)'); @@ -256,8 +257,24 @@ void main() { }); test('ColorSchemeTemplateM3 emits M3 ColorScheme defaults from tokens', () { - // Intentionally empty, will be implemented during migration. See: - // https://github.com/flutter/flutter/issues/187899 + final String contents = const ColorSchemeTemplateM3().generateContents(''); + + expect(contents, contains('const ColorScheme _colorSchemeLightM3 = ColorScheme(')); + expect(contents, contains('const ColorScheme _colorSchemeDarkM3 = ColorScheme(')); + expect( + contents, + contains('const ColorScheme _colorSchemeLightMediumContrastM3 = ColorScheme('), + ); + expect( + contents, + contains('const ColorScheme _colorSchemeLightHighContrastM3 = ColorScheme('), + ); + expect( + contents, + contains('const ColorScheme _colorSchemeDarkMediumContrastM3 = ColorScheme('), + ); + expect(contents, contains('const ColorScheme _colorSchemeDarkHighContrastM3 = ColorScheme(')); + expect(contents, isNot(contains('_colorSchemeLightM3E'))); }); test('DatePickerTemplateM3 emits M3 DatePicker defaults from tokens', () {