From 5571bda1c218e7797d6da001ceb8996b1e201e6b Mon Sep 17 00:00:00 2001 From: Qun Cheng Date: Thu, 28 May 2026 17:44:35 -0700 Subject: [PATCH 01/18] Add contrastLevel for M3 color scheme --- .../generated/color_scheme_defaults.g.dart | 324 ++++++++++++++++ packages/material_ui/lib/src/theme_data.dart | 195 ++++------ .../material_ui/test/theme_data_test.dart | 50 ++- .../tool/gen_defaults/bin/gen_defaults.dart | 5 +- .../templates/color_scheme_template.dart | 348 ++++++++++++++++++ .../tool/gen_defaults/templates/template.dart | 72 +++- .../gen_defaults/test/gen_defaults_test.dart | 21 +- 7 files changed, 868 insertions(+), 147 deletions(-) create mode 100644 packages/material_ui/lib/src/generated/color_scheme_defaults.g.dart create mode 100644 packages/material_ui/tool/gen_defaults/templates/color_scheme_template.dart 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..86893f9f60ad --- /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), + // The following color roles have the same values as the roles in the light color scheme _colorSchemeLightM3. + 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), + // The following color roles have the same values as the roles in the light color scheme _colorSchemeLightM3. + 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), + // The following color roles have the same values as the roles in the dark color scheme _colorSchemeDarkM3. + 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), + // The following color roles have the same values as the roles in the dark color scheme _colorSchemeDarkM3. + 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 3f21a84d69f0..68ac04845c2b 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; @@ -194,6 +196,35 @@ enum MaterialTapTargetSize { shrinkWrap, } +/// 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. /// @@ -242,12 +273,22 @@ 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, a generated color scheme will be based + /// on the tones of [colorSchemeSeed] using [brightness] and [contrastLevel]. + /// All of its contrasting colors will meet accessibility guidelines for + /// readability. (See [ColorScheme.fromSeed] for more details.) + /// + /// If [colorSchemeSeed] is null and [useMaterial3] is true, the default + /// Material 3 color scheme is selected from [brightness] and [contrastLevel]. + /// [ContrastLevel.standard], [ContrastLevel.medium], and [ContrastLevel.high] + /// select token-backed default color schemes. Custom [contrastLevel] values + /// can only be used when [colorSchemeSeed] is provided; otherwise they use + /// the standard contrast default color scheme. /// /// If the app wants to customize a generated color scheme, it can use /// [ColorScheme.fromSeed] directly and then [ColorScheme.copyWith] on the @@ -262,6 +303,9 @@ class ThemeData with Diagnosticable { /// If [colorSchemeSeed] is non-null then [colorScheme], [primaryColor] and /// [primarySwatch] must all be null. /// + /// [contrastLevel] sets the contrast level for generated Material 3 color + /// schemes. Values must be between -1.0 and 1.0 inclusive. + /// /// The [textTheme] [TextStyle] colors are black if the color scheme's /// brightness is [Brightness.light], and white for [Brightness.dark]. /// @@ -305,6 +349,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. @@ -430,6 +475,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 @@ -457,9 +507,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; @@ -2964,6 +3015,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]. /// @@ -3397,122 +3459,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 dedee4a502bc..e81448da8424 100644 --- a/packages/material_ui/tool/gen_defaults/bin/gen_defaults.dart +++ b/packages/material_ui/tool/gen_defaults/bin/gen_defaults.dart @@ -23,7 +23,8 @@ import '../templates/app_bar_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'; @@ -74,7 +75,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..087cc40696c8 --- /dev/null +++ b/packages/material_ui/tool/gen_defaults/templates/color_scheme_template.dart @@ -0,0 +1,348 @@ +// 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.dart'; +import '../data/color_dark.dart'; +import '../data/color_dark_high_contrast.dart'; +import '../data/color_dark_medium_contrast.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; + + @override + String generateContents(String className) { + return ''' +const ColorScheme _colorSchemeLightM3 = ColorScheme( + brightness: Brightness.light, + primary: Color(${TokenColor.primary}), + onPrimary: Color(${TokenColor.onPrimary}), + primaryContainer: Color(${TokenColor.primaryContainer}), + onPrimaryContainer: Color(${TokenColor.onPrimaryContainer}), + primaryFixed: Color(${TokenColor.primaryFixed}), + primaryFixedDim: Color(${TokenColor.primaryFixedDim}), + onPrimaryFixed: Color(${TokenColor.onPrimaryFixed}), + onPrimaryFixedVariant: Color(${TokenColor.onPrimaryFixedVariant}), + secondary: Color(${TokenColor.secondary}), + onSecondary: Color(${TokenColor.onSecondary}), + secondaryContainer: Color(${TokenColor.secondaryContainer}), + onSecondaryContainer: Color(${TokenColor.onSecondaryContainer}), + secondaryFixed: Color(${TokenColor.secondaryFixed}), + secondaryFixedDim: Color(${TokenColor.secondaryFixedDim}), + onSecondaryFixed: Color(${TokenColor.onSecondaryFixed}), + onSecondaryFixedVariant: Color(${TokenColor.onSecondaryFixedVariant}), + tertiary: Color(${TokenColor.tertiary}), + onTertiary: Color(${TokenColor.onTertiary}), + tertiaryContainer: Color(${TokenColor.tertiaryContainer}), + onTertiaryContainer: Color(${TokenColor.onTertiaryContainer}), + tertiaryFixed: Color(${TokenColor.tertiaryFixed}), + tertiaryFixedDim: Color(${TokenColor.tertiaryFixedDim}), + onTertiaryFixed: Color(${TokenColor.onTertiaryFixed}), + onTertiaryFixedVariant: Color(${TokenColor.onTertiaryFixedVariant}), + error: Color(${TokenColor.error}), + onError: Color(${TokenColor.onError}), + errorContainer: Color(${TokenColor.errorContainer}), + onErrorContainer: Color(${TokenColor.onErrorContainer}), + background: Color(${TokenColor.background}), + onBackground: Color(${TokenColor.onBackground}), + surface: Color(${TokenColor.surface}), + surfaceBright: Color(${TokenColor.surfaceBright}), + surfaceContainerLowest: Color(${TokenColor.surfaceContainerLowest}), + surfaceContainerLow: Color(${TokenColor.surfaceContainerLow}), + surfaceContainer: Color(${TokenColor.surfaceContainer}), + surfaceContainerHigh: Color(${TokenColor.surfaceContainerHigh}), + surfaceContainerHighest: Color(${TokenColor.surfaceContainerHighest}), + surfaceDim: Color(${TokenColor.surfaceDim}), + onSurface: Color(${TokenColor.onSurface}), + surfaceVariant: Color(${TokenColor.surfaceVariant}), + onSurfaceVariant: Color(${TokenColor.onSurfaceVariant}), + outline: Color(${TokenColor.outline}), + outlineVariant: Color(${TokenColor.outlineVariant}), + shadow: Color(${TokenColor.shadow}), + scrim: Color(${TokenColor.scrim}), + inverseSurface: Color(${TokenColor.inverseSurface}), + onInverseSurface: Color(${TokenColor.inverseOnSurface}), + inversePrimary: Color(${TokenColor.inversePrimary}), +); + +const ColorScheme _colorSchemeDarkM3 = ColorScheme( + brightness: Brightness.dark, + primary: Color(${TokenColorDark.primary}), + onPrimary: Color(${TokenColorDark.onPrimary}), + primaryContainer: Color(${TokenColorDark.primaryContainer}), + onPrimaryContainer: Color(${TokenColorDark.onPrimaryContainer}), + primaryFixed: Color(${TokenColor.primaryFixed}), + primaryFixedDim: Color(${TokenColor.primaryFixedDim}), + onPrimaryFixed: Color(${TokenColor.onPrimaryFixed}), + onPrimaryFixedVariant: Color(${TokenColor.onPrimaryFixedVariant}), + secondary: Color(${TokenColorDark.secondary}), + onSecondary: Color(${TokenColorDark.onSecondary}), + secondaryContainer: Color(${TokenColorDark.secondaryContainer}), + onSecondaryContainer: Color(${TokenColorDark.onSecondaryContainer}), + secondaryFixed: Color(${TokenColor.secondaryFixed}), + secondaryFixedDim: Color(${TokenColor.secondaryFixedDim}), + onSecondaryFixed: Color(${TokenColor.onSecondaryFixed}), + onSecondaryFixedVariant: Color(${TokenColor.onSecondaryFixedVariant}), + tertiary: Color(${TokenColorDark.tertiary}), + onTertiary: Color(${TokenColorDark.onTertiary}), + tertiaryContainer: Color(${TokenColorDark.tertiaryContainer}), + onTertiaryContainer: Color(${TokenColorDark.onTertiaryContainer}), + tertiaryFixed: Color(${TokenColor.tertiaryFixed}), + tertiaryFixedDim: Color(${TokenColor.tertiaryFixedDim}), + onTertiaryFixed: Color(${TokenColor.onTertiaryFixed}), + onTertiaryFixedVariant: Color(${TokenColor.onTertiaryFixedVariant}), + error: Color(${TokenColorDark.error}), + onError: Color(${TokenColorDark.onError}), + errorContainer: Color(${TokenColorDark.errorContainer}), + onErrorContainer: Color(${TokenColorDark.onErrorContainer}), + background: Color(${TokenColorDark.background}), + onBackground: Color(${TokenColorDark.onBackground}), + surface: Color(${TokenColorDark.surface}), + surfaceBright: Color(${TokenColorDark.surfaceBright}), + surfaceContainerLowest: Color(${TokenColorDark.surfaceContainerLowest}), + surfaceContainerLow: Color(${TokenColorDark.surfaceContainerLow}), + surfaceContainer: Color(${TokenColorDark.surfaceContainer}), + surfaceContainerHigh: Color(${TokenColorDark.surfaceContainerHigh}), + surfaceContainerHighest: Color(${TokenColorDark.surfaceContainerHighest}), + surfaceDim: Color(${TokenColorDark.surfaceDim}), + onSurface: Color(${TokenColorDark.onSurface}), + surfaceVariant: Color(${TokenColorDark.surfaceVariant}), + onSurfaceVariant: Color(${TokenColorDark.onSurfaceVariant}), + outline: Color(${TokenColorDark.outline}), + outlineVariant: Color(${TokenColorDark.outlineVariant}), + shadow: Color(${TokenColorDark.shadow}), + scrim: Color(${TokenColorDark.scrim}), + inverseSurface: Color(${TokenColorDark.inverseSurface}), + onInverseSurface: Color(${TokenColorDark.inverseOnSurface}), + inversePrimary: Color(${TokenColorDark.inversePrimary}), +); + +const ColorScheme _colorSchemeLightMediumContrastM3 = ColorScheme( + brightness: Brightness.light, + primary: Color(${TokenColorLightMediumContrast.primary}), + onPrimary: Color(${TokenColorLightMediumContrast.onPrimary}), + primaryContainer: Color(${TokenColorLightMediumContrast.primaryContainer}), + onPrimaryContainer: Color(${TokenColorLightMediumContrast.onPrimaryContainer}), + primaryFixed: Color(${TokenColorLightMediumContrast.primaryFixed}), + primaryFixedDim: Color(${TokenColorLightMediumContrast.primaryFixedDim}), + onPrimaryFixed: Color(${TokenColorLightMediumContrast.onPrimaryFixed}), + onPrimaryFixedVariant: Color(${TokenColorLightMediumContrast.onPrimaryFixedVariant}), + secondary: Color(${TokenColorLightMediumContrast.secondary}), + onSecondary: Color(${TokenColorLightMediumContrast.onSecondary}), + secondaryContainer: Color(${TokenColorLightMediumContrast.secondaryContainer}), + onSecondaryContainer: Color(${TokenColorLightMediumContrast.onSecondaryContainer}), + secondaryFixed: Color(${TokenColorLightMediumContrast.secondaryFixed}), + secondaryFixedDim: Color(${TokenColorLightMediumContrast.secondaryFixedDim}), + onSecondaryFixed: Color(${TokenColorLightMediumContrast.onSecondaryFixed}), + onSecondaryFixedVariant: Color(${TokenColorLightMediumContrast.onSecondaryFixedVariant}), + tertiary: Color(${TokenColorLightMediumContrast.tertiary}), + onTertiary: Color(${TokenColorLightMediumContrast.onTertiary}), + tertiaryContainer: Color(${TokenColorLightMediumContrast.tertiaryContainer}), + onTertiaryContainer: Color(${TokenColorLightMediumContrast.onTertiaryContainer}), + tertiaryFixed: Color(${TokenColorLightMediumContrast.tertiaryFixed}), + tertiaryFixedDim: Color(${TokenColorLightMediumContrast.tertiaryFixedDim}), + onTertiaryFixed: Color(${TokenColorLightMediumContrast.onTertiaryFixed}), + onTertiaryFixedVariant: Color(${TokenColorLightMediumContrast.onTertiaryFixedVariant}), + error: Color(${TokenColorLightMediumContrast.error}), + onError: Color(${TokenColorLightMediumContrast.onError}), + errorContainer: Color(${TokenColorLightMediumContrast.errorContainer}), + onErrorContainer: Color(${TokenColorLightMediumContrast.onErrorContainer}), + onBackground: Color(${TokenColorLightMediumContrast.onBackground}), + onSurface: Color(${TokenColorLightMediumContrast.onSurface}), + onSurfaceVariant: Color(${TokenColorLightMediumContrast.onSurfaceVariant}), + outline: Color(${TokenColorLightMediumContrast.outline}), + outlineVariant: Color(${TokenColorLightMediumContrast.outlineVariant}), + onInverseSurface: Color(${TokenColorLightMediumContrast.inverseOnSurface}), + // The following color roles have the same values as the roles in the light color scheme _colorSchemeLightM3. + background: Color(${TokenColor.background}), + surface: Color(${TokenColor.surface}), + surfaceBright: Color(${TokenColor.surfaceBright}), + surfaceContainerLowest: Color(${TokenColor.surfaceContainerLowest}), + surfaceContainerLow: Color(${TokenColor.surfaceContainerLow}), + surfaceContainer: Color(${TokenColor.surfaceContainer}), + surfaceContainerHigh: Color(${TokenColor.surfaceContainerHigh}), + surfaceContainerHighest: Color(${TokenColor.surfaceContainerHighest}), + surfaceDim: Color(${TokenColor.surfaceDim}), + surfaceVariant: Color(${TokenColor.surfaceVariant}), + shadow: Color(${TokenColor.shadow}), + scrim: Color(${TokenColor.scrim}), + inverseSurface: Color(${TokenColor.inverseSurface}), + inversePrimary: Color(${TokenColor.inversePrimary}), +); + +const ColorScheme _colorSchemeLightHighContrastM3 = ColorScheme( + brightness: Brightness.light, + primary: Color(${TokenColorLightHighContrast.primary}), + onPrimary: Color(${TokenColorLightHighContrast.onPrimary}), + primaryContainer: Color(${TokenColorLightHighContrast.primaryContainer}), + onPrimaryContainer: Color(${TokenColorLightHighContrast.onPrimaryContainer}), + primaryFixed: Color(${TokenColorLightHighContrast.primaryFixed}), + primaryFixedDim: Color(${TokenColorLightHighContrast.primaryFixedDim}), + onPrimaryFixed: Color(${TokenColorLightHighContrast.onPrimaryFixed}), + onPrimaryFixedVariant: Color(${TokenColorLightHighContrast.onPrimaryFixedVariant}), + secondary: Color(${TokenColorLightHighContrast.secondary}), + onSecondary: Color(${TokenColorLightHighContrast.onSecondary}), + secondaryContainer: Color(${TokenColorLightHighContrast.secondaryContainer}), + onSecondaryContainer: Color(${TokenColorLightHighContrast.onSecondaryContainer}), + secondaryFixed: Color(${TokenColorLightHighContrast.secondaryFixed}), + secondaryFixedDim: Color(${TokenColorLightHighContrast.secondaryFixedDim}), + onSecondaryFixed: Color(${TokenColorLightHighContrast.onSecondaryFixed}), + onSecondaryFixedVariant: Color(${TokenColorLightHighContrast.onSecondaryFixedVariant}), + tertiary: Color(${TokenColorLightHighContrast.tertiary}), + onTertiary: Color(${TokenColorLightHighContrast.onTertiary}), + tertiaryContainer: Color(${TokenColorLightHighContrast.tertiaryContainer}), + onTertiaryContainer: Color(${TokenColorLightHighContrast.onTertiaryContainer}), + tertiaryFixed: Color(${TokenColorLightHighContrast.tertiaryFixed}), + tertiaryFixedDim: Color(${TokenColorLightHighContrast.tertiaryFixedDim}), + onTertiaryFixed: Color(${TokenColorLightHighContrast.onTertiaryFixed}), + onTertiaryFixedVariant: Color(${TokenColorLightHighContrast.onTertiaryFixedVariant}), + error: Color(${TokenColorLightHighContrast.error}), + onError: Color(${TokenColorLightHighContrast.onError}), + errorContainer: Color(${TokenColorLightHighContrast.errorContainer}), + onErrorContainer: Color(${TokenColorLightHighContrast.onErrorContainer}), + onBackground: Color(${TokenColorLightHighContrast.onBackground}), + onSurface: Color(${TokenColorLightHighContrast.onSurface}), + onSurfaceVariant: Color(${TokenColorLightHighContrast.onSurfaceVariant}), + outline: Color(${TokenColorLightHighContrast.outline}), + outlineVariant: Color(${TokenColorLightHighContrast.outlineVariant}), + onInverseSurface: Color(${TokenColorLightHighContrast.inverseOnSurface}), + // The following color roles have the same values as the roles in the light color scheme _colorSchemeLightM3. + background: Color(${TokenColor.background}), + surface: Color(${TokenColor.surface}), + surfaceBright: Color(${TokenColor.surfaceBright}), + surfaceContainerLowest: Color(${TokenColor.surfaceContainerLowest}), + surfaceContainerLow: Color(${TokenColor.surfaceContainerLow}), + surfaceContainer: Color(${TokenColor.surfaceContainer}), + surfaceContainerHigh: Color(${TokenColor.surfaceContainerHigh}), + surfaceContainerHighest: Color(${TokenColor.surfaceContainerHighest}), + surfaceDim: Color(${TokenColor.surfaceDim}), + surfaceVariant: Color(${TokenColor.surfaceVariant}), + shadow: Color(${TokenColor.shadow}), + scrim: Color(${TokenColor.scrim}), + inverseSurface: Color(${TokenColor.inverseSurface}), + inversePrimary: Color(${TokenColor.inversePrimary}), +); + +const ColorScheme _colorSchemeDarkMediumContrastM3 = ColorScheme( + brightness: Brightness.dark, + primary: Color(${TokenColorDarkMediumContrast.primary}), + onPrimary: Color(${TokenColorDarkMediumContrast.onPrimary}), + primaryContainer: Color(${TokenColorDarkMediumContrast.primaryContainer}), + onPrimaryContainer: Color(${TokenColorDarkMediumContrast.onPrimaryContainer}), + primaryFixed: Color(${TokenColorDarkMediumContrast.primaryFixed}), + primaryFixedDim: Color(${TokenColorDarkMediumContrast.primaryFixedDim}), + onPrimaryFixed: Color(${TokenColorDarkMediumContrast.onPrimaryFixed}), + onPrimaryFixedVariant: Color(${TokenColorDarkMediumContrast.onPrimaryFixedVariant}), + secondary: Color(${TokenColorDarkMediumContrast.secondary}), + onSecondary: Color(${TokenColorDarkMediumContrast.onSecondary}), + secondaryContainer: Color(${TokenColorDarkMediumContrast.secondaryContainer}), + onSecondaryContainer: Color(${TokenColorDarkMediumContrast.onSecondaryContainer}), + secondaryFixed: Color(${TokenColorDarkMediumContrast.secondaryFixed}), + secondaryFixedDim: Color(${TokenColorDarkMediumContrast.secondaryFixedDim}), + onSecondaryFixed: Color(${TokenColorDarkMediumContrast.onSecondaryFixed}), + onSecondaryFixedVariant: Color(${TokenColorDarkMediumContrast.onSecondaryFixedVariant}), + tertiary: Color(${TokenColorDarkMediumContrast.tertiary}), + onTertiary: Color(${TokenColorDarkMediumContrast.onTertiary}), + tertiaryContainer: Color(${TokenColorDarkMediumContrast.tertiaryContainer}), + onTertiaryContainer: Color(${TokenColorDarkMediumContrast.onTertiaryContainer}), + tertiaryFixed: Color(${TokenColorDarkMediumContrast.tertiaryFixed}), + tertiaryFixedDim: Color(${TokenColorDarkMediumContrast.tertiaryFixedDim}), + onTertiaryFixed: Color(${TokenColorDarkMediumContrast.onTertiaryFixed}), + onTertiaryFixedVariant: Color(${TokenColorDarkMediumContrast.onTertiaryFixedVariant}), + error: Color(${TokenColorDarkMediumContrast.error}), + onError: Color(${TokenColorDarkMediumContrast.onError}), + errorContainer: Color(${TokenColorDarkMediumContrast.errorContainer}), + onErrorContainer: Color(${TokenColorDarkMediumContrast.onErrorContainer}), + onBackground: Color(${TokenColorDarkMediumContrast.onBackground}), + onSurface: Color(${TokenColorDarkMediumContrast.onSurface}), + onSurfaceVariant: Color(${TokenColorDarkMediumContrast.onSurfaceVariant}), + outline: Color(${TokenColorDarkMediumContrast.outline}), + outlineVariant: Color(${TokenColorDarkMediumContrast.outlineVariant}), + onInverseSurface: Color(${TokenColorDarkMediumContrast.inverseOnSurface}), + inversePrimary: Color(${TokenColorDarkMediumContrast.inversePrimary}), + // The following color roles have the same values as the roles in the dark color scheme _colorSchemeDarkM3. + background: Color(${TokenColorDark.background}), + surface: Color(${TokenColorDark.surface}), + surfaceBright: Color(${TokenColorDark.surfaceBright}), + surfaceContainerLowest: Color(${TokenColorDark.surfaceContainerLowest}), + surfaceContainerLow: Color(${TokenColorDark.surfaceContainerLow}), + surfaceContainer: Color(${TokenColorDark.surfaceContainer}), + surfaceContainerHigh: Color(${TokenColorDark.surfaceContainerHigh}), + surfaceContainerHighest: Color(${TokenColorDark.surfaceContainerHighest}), + surfaceDim: Color(${TokenColorDark.surfaceDim}), + surfaceVariant: Color(${TokenColorDark.surfaceVariant}), + shadow: Color(${TokenColorDark.shadow}), + scrim: Color(${TokenColorDark.scrim}), + inverseSurface: Color(${TokenColorDark.inverseSurface}), +); + +const ColorScheme _colorSchemeDarkHighContrastM3 = ColorScheme( + brightness: Brightness.dark, + primary: Color(${TokenColorDarkHighContrast.primary}), + onPrimary: Color(${TokenColorDarkHighContrast.onPrimary}), + primaryContainer: Color(${TokenColorDarkHighContrast.primaryContainer}), + onPrimaryContainer: Color(${TokenColorDarkHighContrast.onPrimaryContainer}), + primaryFixed: Color(${TokenColorDarkHighContrast.primaryFixed}), + primaryFixedDim: Color(${TokenColorDarkHighContrast.primaryFixedDim}), + onPrimaryFixed: Color(${TokenColorDarkHighContrast.onPrimaryFixed}), + onPrimaryFixedVariant: Color(${TokenColorDarkHighContrast.onPrimaryFixedVariant}), + secondary: Color(${TokenColorDarkHighContrast.secondary}), + onSecondary: Color(${TokenColorDarkHighContrast.onSecondary}), + secondaryContainer: Color(${TokenColorDarkHighContrast.secondaryContainer}), + onSecondaryContainer: Color(${TokenColorDarkHighContrast.onSecondaryContainer}), + secondaryFixed: Color(${TokenColorDarkHighContrast.secondaryFixed}), + secondaryFixedDim: Color(${TokenColorDarkHighContrast.secondaryFixedDim}), + onSecondaryFixed: Color(${TokenColorDarkHighContrast.onSecondaryFixed}), + onSecondaryFixedVariant: Color(${TokenColorDarkHighContrast.onSecondaryFixedVariant}), + tertiary: Color(${TokenColorDarkHighContrast.tertiary}), + onTertiary: Color(${TokenColorDarkHighContrast.onTertiary}), + tertiaryContainer: Color(${TokenColorDarkHighContrast.tertiaryContainer}), + onTertiaryContainer: Color(${TokenColorDarkHighContrast.onTertiaryContainer}), + tertiaryFixed: Color(${TokenColorDarkHighContrast.tertiaryFixed}), + tertiaryFixedDim: Color(${TokenColorDarkHighContrast.tertiaryFixedDim}), + onTertiaryFixed: Color(${TokenColorDarkHighContrast.onTertiaryFixed}), + onTertiaryFixedVariant: Color(${TokenColorDarkHighContrast.onTertiaryFixedVariant}), + error: Color(${TokenColorDarkHighContrast.error}), + onError: Color(${TokenColorDarkHighContrast.onError}), + errorContainer: Color(${TokenColorDarkHighContrast.errorContainer}), + onErrorContainer: Color(${TokenColorDarkHighContrast.onErrorContainer}), + onBackground: Color(${TokenColorDarkHighContrast.onBackground}), + onSurface: Color(${TokenColorDarkHighContrast.onSurface}), + onSurfaceVariant: Color(${TokenColorDarkHighContrast.onSurfaceVariant}), + outline: Color(${TokenColorDarkHighContrast.outline}), + outlineVariant: Color(${TokenColorDarkHighContrast.outlineVariant}), + onInverseSurface: Color(${TokenColorDarkHighContrast.inverseOnSurface}), + inversePrimary: Color(${TokenColorDarkHighContrast.inversePrimary}), + // The following color roles have the same values as the roles in the dark color scheme _colorSchemeDarkM3. + background: Color(${TokenColorDark.background}), + surface: Color(${TokenColorDark.surface}), + surfaceBright: Color(${TokenColorDark.surfaceBright}), + surfaceContainerLowest: Color(${TokenColorDark.surfaceContainerLowest}), + surfaceContainerLow: Color(${TokenColorDark.surfaceContainerLow}), + surfaceContainer: Color(${TokenColorDark.surfaceContainer}), + surfaceContainerHigh: Color(${TokenColorDark.surfaceContainerHigh}), + surfaceContainerHighest: Color(${TokenColorDark.surfaceContainerHighest}), + surfaceDim: Color(${TokenColorDark.surfaceDim}), + surfaceVariant: Color(${TokenColorDark.surfaceVariant}), + shadow: Color(${TokenColorDark.shadow}), + scrim: Color(${TokenColorDark.scrim}), + inverseSurface: Color(${TokenColorDark.inverseSurface}), +); +'''; + } +} diff --git a/packages/material_ui/tool/gen_defaults/templates/template.dart b/packages/material_ui/tool/gen_defaults/templates/template.dart index 70ad11d702ed..5d512130fc6c 100644 --- a/packages/material_ui/tool/gen_defaults/templates/template.dart +++ b/packages/material_ui/tool/gen_defaults/templates/template.dart @@ -8,6 +8,7 @@ import 'package:meta/meta.dart'; import '../data/color_role.dart'; import '../data/shape_struct.dart'; +import '../data/typescale_struct.dart'; enum _MaterialVersion { material3, material3Expressive } @@ -75,12 +76,16 @@ abstract class TokenTemplate { /// The name of the class that will be generated (e.g. `_IconButtonDefaultsM3` /// or `_IconButtonDefaultsM3E`). - String get _className { + /// + /// Templates that generate top-level declarations instead of a class should + /// override and return an empty string. + @visibleForTesting + String get className { assert( _nameRegExp.hasMatch(name), 'The template name "$name" must use spaces and capitalized words (e.g., "Typography" or "Icon Button").', ); - final String camelName = name.replaceAll(' ', ''); + final String camelName = _joinAsCamelCase(name.split(' '), lowerCamelCase: false); return switch (_version) { _MaterialVersion.material3 => '_${camelName}DefaultsM3', _MaterialVersion.material3Expressive => '_${camelName}DefaultsM3E', @@ -89,11 +94,21 @@ abstract class TokenTemplate { /// The regular expression used to verify that the generated contents declare /// the class. - RegExp get _classRegExp => RegExp('class\\s+$_className\\b'); + 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', + }; + } /// Returns the body of the generated file as a string. /// - /// The [className] parameter must be used to declare the class. + /// The [className] parameter must be used to declare the class, unless it is + /// empty. String generateContents(String className); /// Generates a Dart number literal for token values. @@ -110,6 +125,12 @@ abstract class TokenTemplate { return '${color(role, prefix)}.withOpacity(${number(opacity)})'; } + /// Generate a [BorderSide] for the given component. + String border(String color, {double? width}) { + final widthString = (width != null && width != 1.0) ? ', width: $width' : ''; + return 'BorderSide(color: $color$widthString)'; + } + /// Generates an [OutlinedBorder] expression for a shape token. /// /// Currently supports: @@ -150,13 +171,34 @@ abstract class TokenTemplate { throw UnsupportedError('Unsupported shape family type: ${shape.family}'); } + /// Generate a [TextTheme] text style name for the given component token. + String textStyle(TypescaleStruct token, String prefix) { + final List nameAttributes = token.name.split('.'); + final String baseName = _joinAsCamelCase(nameAttributes.last.split('-')); + final bool isEmphasized = nameAttributes.contains('emphasized'); + return '$prefix.$baseName${isEmphasized ? 'Emphasized' : ''}'; + } + + /// Converts a list of sub-strings into a single camelcased string. + String _joinAsCamelCase(List subStrings, {bool lowerCamelCase = true}) { + if (subStrings.isEmpty) { + return ''; + } + var camelCased = ''; + for (var i = 0; i < subStrings.length; i++) { + final String subString = subStrings[i]; + if (subString.isEmpty) { + continue; + } + camelCased += (lowerCamelCase && i == 0) + ? subString.toLowerCase() + : subString[0].toUpperCase() + subString.substring(1).toLowerCase(); + } + return camelCased; + } + /// 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'); @@ -177,11 +219,13 @@ abstract class TokenTemplate { if (verbose) { stdout.writeln('Generating contents...'); } - final String contents = generateContents(_className); + final String generatedClassName = className; + final String contents = generateContents(generatedClassName); assert( - contents.contains(_classRegExp), - 'The generated contents for "$name" must define the class "$_className". ' - 'Make sure you are utilizing the passed `className` parameter.', + generatedClassName.isEmpty || contents.contains(_classRegExp), + 'The generated contents for "$name" must define the class "$generatedClassName". ' + 'Make sure you are utilizing the passed `className` parameter, or override ' + '`className` to be empty.', ); final buffer = StringBuffer(); @@ -197,7 +241,7 @@ abstract class TokenTemplate { if (verbose) { stdout.writeln('Formatting $fileName...'); } - final ProcessResult result = Process.runSync(Platform.isWindows ? 'dart.bat' : 'dart', [ + final ProcessResult result = Process.runSync(Platform.resolvedExecutable, [ 'format', fileName, ]); 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 02f8d08fafca..42798f835a07 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 @@ -8,6 +8,7 @@ import 'package:test/test.dart'; import '../data/color_role.dart'; import '../data/shape_struct.dart'; import '../templates/app_bar_template.dart'; +import '../templates/color_scheme_template.dart'; import '../templates/template.dart'; import 'test_fixtures/test_templates.dart'; @@ -206,8 +207,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', () { From 3a223dfd21829ef1d77a2e0e54be1f02d4209830 Mon Sep 17 00:00:00 2001 From: Qun Cheng Date: Thu, 23 Jul 2026 14:16:21 -0700 Subject: [PATCH 02/18] Update ColorScheme template --- .../generated/color_scheme_defaults.g.dart | 4 - .../templates/color_scheme_template.dart | 112 +++++++++--------- 2 files changed, 54 insertions(+), 62 deletions(-) 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 index 86893f9f60ad..20b2791bffc6 100644 --- a/packages/material_ui/lib/src/generated/color_scheme_defaults.g.dart +++ b/packages/material_ui/lib/src/generated/color_scheme_defaults.g.dart @@ -147,7 +147,6 @@ const ColorScheme _colorSchemeLightMediumContrastM3 = ColorScheme( outline: Color(0xFF49454F), outlineVariant: Color(0xFF79747E), onInverseSurface: Color(0xFFFFFFFF), - // The following color roles have the same values as the roles in the light color scheme _colorSchemeLightM3. background: Color(0xFFFEF7FF), surface: Color(0xFFFEF7FF), surfaceBright: Color(0xFFFEF7FF), @@ -200,7 +199,6 @@ const ColorScheme _colorSchemeLightHighContrastM3 = ColorScheme( outline: Color(0xFF322F37), outlineVariant: Color(0xFF49454F), onInverseSurface: Color(0xFFFFFFFF), - // The following color roles have the same values as the roles in the light color scheme _colorSchemeLightM3. background: Color(0xFFFEF7FF), surface: Color(0xFFFEF7FF), surfaceBright: Color(0xFFFEF7FF), @@ -254,7 +252,6 @@ const ColorScheme _colorSchemeDarkMediumContrastM3 = ColorScheme( outlineVariant: Color(0xFF938F99), onInverseSurface: Color(0xFF1D1B20), inversePrimary: Color(0xFF4F378B), - // The following color roles have the same values as the roles in the dark color scheme _colorSchemeDarkM3. background: Color(0xFF141218), surface: Color(0xFF141218), surfaceBright: Color(0xFF3B383E), @@ -307,7 +304,6 @@ const ColorScheme _colorSchemeDarkHighContrastM3 = ColorScheme( outlineVariant: Color(0xFFCAC4D0), onInverseSurface: Color(0xFF000000), inversePrimary: Color(0xFF381E72), - // The following color roles have the same values as the roles in the dark color scheme _colorSchemeDarkM3. background: Color(0xFF141218), surface: Color(0xFF141218), surfaceBright: Color(0xFF3B383E), 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 index 087cc40696c8..d0efe88581d0 100644 --- a/packages/material_ui/tool/gen_defaults/templates/color_scheme_template.dart +++ b/packages/material_ui/tool/gen_defaults/templates/color_scheme_template.dart @@ -168,21 +168,20 @@ const ColorScheme _colorSchemeLightMediumContrastM3 = ColorScheme( outline: Color(${TokenColorLightMediumContrast.outline}), outlineVariant: Color(${TokenColorLightMediumContrast.outlineVariant}), onInverseSurface: Color(${TokenColorLightMediumContrast.inverseOnSurface}), - // The following color roles have the same values as the roles in the light color scheme _colorSchemeLightM3. - background: Color(${TokenColor.background}), - surface: Color(${TokenColor.surface}), - surfaceBright: Color(${TokenColor.surfaceBright}), - surfaceContainerLowest: Color(${TokenColor.surfaceContainerLowest}), - surfaceContainerLow: Color(${TokenColor.surfaceContainerLow}), - surfaceContainer: Color(${TokenColor.surfaceContainer}), - surfaceContainerHigh: Color(${TokenColor.surfaceContainerHigh}), - surfaceContainerHighest: Color(${TokenColor.surfaceContainerHighest}), - surfaceDim: Color(${TokenColor.surfaceDim}), - surfaceVariant: Color(${TokenColor.surfaceVariant}), - shadow: Color(${TokenColor.shadow}), - scrim: Color(${TokenColor.scrim}), - inverseSurface: Color(${TokenColor.inverseSurface}), - inversePrimary: Color(${TokenColor.inversePrimary}), + background: Color(${TokenColorLightMediumContrast.background}), + surface: Color(${TokenColorLightMediumContrast.surface}), + surfaceBright: Color(${TokenColorLightMediumContrast.surfaceBright}), + surfaceContainerLowest: Color(${TokenColorLightMediumContrast.surfaceContainerLowest}), + surfaceContainerLow: Color(${TokenColorLightMediumContrast.surfaceContainerLow}), + surfaceContainer: Color(${TokenColorLightMediumContrast.surfaceContainer}), + surfaceContainerHigh: Color(${TokenColorLightMediumContrast.surfaceContainerHigh}), + surfaceContainerHighest: Color(${TokenColorLightMediumContrast.surfaceContainerHighest}), + surfaceDim: Color(${TokenColorLightMediumContrast.surfaceDim}), + surfaceVariant: Color(${TokenColorLightMediumContrast.surfaceVariant}), + shadow: Color(${TokenColorLightMediumContrast.shadow}), + scrim: Color(${TokenColorLightMediumContrast.scrim}), + inverseSurface: Color(${TokenColorLightMediumContrast.inverseSurface}), + inversePrimary: Color(${TokenColorLightMediumContrast.inversePrimary}), ); const ColorScheme _colorSchemeLightHighContrastM3 = ColorScheme( @@ -221,21 +220,20 @@ const ColorScheme _colorSchemeLightHighContrastM3 = ColorScheme( outline: Color(${TokenColorLightHighContrast.outline}), outlineVariant: Color(${TokenColorLightHighContrast.outlineVariant}), onInverseSurface: Color(${TokenColorLightHighContrast.inverseOnSurface}), - // The following color roles have the same values as the roles in the light color scheme _colorSchemeLightM3. - background: Color(${TokenColor.background}), - surface: Color(${TokenColor.surface}), - surfaceBright: Color(${TokenColor.surfaceBright}), - surfaceContainerLowest: Color(${TokenColor.surfaceContainerLowest}), - surfaceContainerLow: Color(${TokenColor.surfaceContainerLow}), - surfaceContainer: Color(${TokenColor.surfaceContainer}), - surfaceContainerHigh: Color(${TokenColor.surfaceContainerHigh}), - surfaceContainerHighest: Color(${TokenColor.surfaceContainerHighest}), - surfaceDim: Color(${TokenColor.surfaceDim}), - surfaceVariant: Color(${TokenColor.surfaceVariant}), - shadow: Color(${TokenColor.shadow}), - scrim: Color(${TokenColor.scrim}), - inverseSurface: Color(${TokenColor.inverseSurface}), - inversePrimary: Color(${TokenColor.inversePrimary}), + background: Color(${TokenColorLightHighContrast.background}), + surface: Color(${TokenColorLightHighContrast.surface}), + surfaceBright: Color(${TokenColorLightHighContrast.surfaceBright}), + surfaceContainerLowest: Color(${TokenColorLightHighContrast.surfaceContainerLowest}), + surfaceContainerLow: Color(${TokenColorLightHighContrast.surfaceContainerLow}), + surfaceContainer: Color(${TokenColorLightHighContrast.surfaceContainer}), + surfaceContainerHigh: Color(${TokenColorLightHighContrast.surfaceContainerHigh}), + surfaceContainerHighest: Color(${TokenColorLightHighContrast.surfaceContainerHighest}), + surfaceDim: Color(${TokenColorLightHighContrast.surfaceDim}), + surfaceVariant: Color(${TokenColorLightHighContrast.surfaceVariant}), + shadow: Color(${TokenColorLightHighContrast.shadow}), + scrim: Color(${TokenColorLightHighContrast.scrim}), + inverseSurface: Color(${TokenColorLightHighContrast.inverseSurface}), + inversePrimary: Color(${TokenColorLightHighContrast.inversePrimary}), ); const ColorScheme _colorSchemeDarkMediumContrastM3 = ColorScheme( @@ -275,20 +273,19 @@ const ColorScheme _colorSchemeDarkMediumContrastM3 = ColorScheme( outlineVariant: Color(${TokenColorDarkMediumContrast.outlineVariant}), onInverseSurface: Color(${TokenColorDarkMediumContrast.inverseOnSurface}), inversePrimary: Color(${TokenColorDarkMediumContrast.inversePrimary}), - // The following color roles have the same values as the roles in the dark color scheme _colorSchemeDarkM3. - background: Color(${TokenColorDark.background}), - surface: Color(${TokenColorDark.surface}), - surfaceBright: Color(${TokenColorDark.surfaceBright}), - surfaceContainerLowest: Color(${TokenColorDark.surfaceContainerLowest}), - surfaceContainerLow: Color(${TokenColorDark.surfaceContainerLow}), - surfaceContainer: Color(${TokenColorDark.surfaceContainer}), - surfaceContainerHigh: Color(${TokenColorDark.surfaceContainerHigh}), - surfaceContainerHighest: Color(${TokenColorDark.surfaceContainerHighest}), - surfaceDim: Color(${TokenColorDark.surfaceDim}), - surfaceVariant: Color(${TokenColorDark.surfaceVariant}), - shadow: Color(${TokenColorDark.shadow}), - scrim: Color(${TokenColorDark.scrim}), - inverseSurface: Color(${TokenColorDark.inverseSurface}), + background: Color(${TokenColorDarkMediumContrast.background}), + surface: Color(${TokenColorDarkMediumContrast.surface}), + surfaceBright: Color(${TokenColorDarkMediumContrast.surfaceBright}), + surfaceContainerLowest: Color(${TokenColorDarkMediumContrast.surfaceContainerLowest}), + surfaceContainerLow: Color(${TokenColorDarkMediumContrast.surfaceContainerLow}), + surfaceContainer: Color(${TokenColorDarkMediumContrast.surfaceContainer}), + surfaceContainerHigh: Color(${TokenColorDarkMediumContrast.surfaceContainerHigh}), + surfaceContainerHighest: Color(${TokenColorDarkMediumContrast.surfaceContainerHighest}), + surfaceDim: Color(${TokenColorDarkMediumContrast.surfaceDim}), + surfaceVariant: Color(${TokenColorDarkMediumContrast.surfaceVariant}), + shadow: Color(${TokenColorDarkMediumContrast.shadow}), + scrim: Color(${TokenColorDarkMediumContrast.scrim}), + inverseSurface: Color(${TokenColorDarkMediumContrast.inverseSurface}), ); const ColorScheme _colorSchemeDarkHighContrastM3 = ColorScheme( @@ -328,20 +325,19 @@ const ColorScheme _colorSchemeDarkHighContrastM3 = ColorScheme( outlineVariant: Color(${TokenColorDarkHighContrast.outlineVariant}), onInverseSurface: Color(${TokenColorDarkHighContrast.inverseOnSurface}), inversePrimary: Color(${TokenColorDarkHighContrast.inversePrimary}), - // The following color roles have the same values as the roles in the dark color scheme _colorSchemeDarkM3. - background: Color(${TokenColorDark.background}), - surface: Color(${TokenColorDark.surface}), - surfaceBright: Color(${TokenColorDark.surfaceBright}), - surfaceContainerLowest: Color(${TokenColorDark.surfaceContainerLowest}), - surfaceContainerLow: Color(${TokenColorDark.surfaceContainerLow}), - surfaceContainer: Color(${TokenColorDark.surfaceContainer}), - surfaceContainerHigh: Color(${TokenColorDark.surfaceContainerHigh}), - surfaceContainerHighest: Color(${TokenColorDark.surfaceContainerHighest}), - surfaceDim: Color(${TokenColorDark.surfaceDim}), - surfaceVariant: Color(${TokenColorDark.surfaceVariant}), - shadow: Color(${TokenColorDark.shadow}), - scrim: Color(${TokenColorDark.scrim}), - inverseSurface: Color(${TokenColorDark.inverseSurface}), + background: Color(${TokenColorDarkHighContrast.background}), + surface: Color(${TokenColorDarkHighContrast.surface}), + surfaceBright: Color(${TokenColorDarkHighContrast.surfaceBright}), + surfaceContainerLowest: Color(${TokenColorDarkHighContrast.surfaceContainerLowest}), + surfaceContainerLow: Color(${TokenColorDarkHighContrast.surfaceContainerLow}), + surfaceContainer: Color(${TokenColorDarkHighContrast.surfaceContainer}), + surfaceContainerHigh: Color(${TokenColorDarkHighContrast.surfaceContainerHigh}), + surfaceContainerHighest: Color(${TokenColorDarkHighContrast.surfaceContainerHighest}), + surfaceDim: Color(${TokenColorDarkHighContrast.surfaceDim}), + surfaceVariant: Color(${TokenColorDarkHighContrast.surfaceVariant}), + shadow: Color(${TokenColorDarkHighContrast.shadow}), + scrim: Color(${TokenColorDarkHighContrast.scrim}), + inverseSurface: Color(${TokenColorDarkHighContrast.inverseSurface}), ); '''; } From bea48d75104ed71b6907928f0f0c73ccbf1132ff Mon Sep 17 00:00:00 2001 From: Qun Cheng Date: Thu, 23 Jul 2026 15:53:55 -0700 Subject: [PATCH 03/18] Update colorScheme template --- .../templates/color_scheme_template.dart | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) 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 index d0efe88581d0..e4d200b65881 100644 --- a/packages/material_ui/tool/gen_defaults/templates/color_scheme_template.dart +++ b/packages/material_ui/tool/gen_defaults/templates/color_scheme_template.dart @@ -86,26 +86,26 @@ const ColorScheme _colorSchemeDarkM3 = ColorScheme( onPrimary: Color(${TokenColorDark.onPrimary}), primaryContainer: Color(${TokenColorDark.primaryContainer}), onPrimaryContainer: Color(${TokenColorDark.onPrimaryContainer}), - primaryFixed: Color(${TokenColor.primaryFixed}), - primaryFixedDim: Color(${TokenColor.primaryFixedDim}), - onPrimaryFixed: Color(${TokenColor.onPrimaryFixed}), - onPrimaryFixedVariant: Color(${TokenColor.onPrimaryFixedVariant}), + primaryFixed: Color(${TokenColorDark.primaryFixed}), + primaryFixedDim: Color(${TokenColorDark.primaryFixedDim}), + onPrimaryFixed: Color(${TokenColorDark.onPrimaryFixed}), + onPrimaryFixedVariant: Color(${TokenColorDark.onPrimaryFixedVariant}), secondary: Color(${TokenColorDark.secondary}), onSecondary: Color(${TokenColorDark.onSecondary}), secondaryContainer: Color(${TokenColorDark.secondaryContainer}), onSecondaryContainer: Color(${TokenColorDark.onSecondaryContainer}), - secondaryFixed: Color(${TokenColor.secondaryFixed}), - secondaryFixedDim: Color(${TokenColor.secondaryFixedDim}), - onSecondaryFixed: Color(${TokenColor.onSecondaryFixed}), - onSecondaryFixedVariant: Color(${TokenColor.onSecondaryFixedVariant}), + secondaryFixed: Color(${TokenColorDark.secondaryFixed}), + secondaryFixedDim: Color(${TokenColorDark.secondaryFixedDim}), + onSecondaryFixed: Color(${TokenColorDark.onSecondaryFixed}), + onSecondaryFixedVariant: Color(${TokenColorDark.onSecondaryFixedVariant}), tertiary: Color(${TokenColorDark.tertiary}), onTertiary: Color(${TokenColorDark.onTertiary}), tertiaryContainer: Color(${TokenColorDark.tertiaryContainer}), onTertiaryContainer: Color(${TokenColorDark.onTertiaryContainer}), - tertiaryFixed: Color(${TokenColor.tertiaryFixed}), - tertiaryFixedDim: Color(${TokenColor.tertiaryFixedDim}), - onTertiaryFixed: Color(${TokenColor.onTertiaryFixed}), - onTertiaryFixedVariant: Color(${TokenColor.onTertiaryFixedVariant}), + tertiaryFixed: Color(${TokenColorDark.tertiaryFixed}), + tertiaryFixedDim: Color(${TokenColorDark.tertiaryFixedDim}), + onTertiaryFixed: Color(${TokenColorDark.onTertiaryFixed}), + onTertiaryFixedVariant: Color(${TokenColorDark.onTertiaryFixedVariant}), error: Color(${TokenColorDark.error}), onError: Color(${TokenColorDark.onError}), errorContainer: Color(${TokenColorDark.errorContainer}), From 8945251a78a6646888e8798cf62ff373eacd50bc Mon Sep 17 00:00:00 2001 From: Qun Cheng Date: Thu, 23 Jul 2026 16:28:14 -0700 Subject: [PATCH 04/18] Remove migrated ColorScheme files from temporarily_excluded --- .../generated/color_scheme_defaults.g.dart | 111 -------------- .../templates/color_scheme_template.dart | 144 ------------------ 2 files changed, 255 deletions(-) delete mode 100644 packages/material_ui/tool/gen_defaults/temporarily_excluded/generated/color_scheme_defaults.g.dart delete mode 100644 packages/material_ui/tool/gen_defaults/temporarily_excluded/templates/color_scheme_template.dart 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 900e943c8b26..000000000000 --- a/packages/material_ui/tool/gen_defaults/temporarily_excluded/templates/color_scheme_template.dart +++ /dev/null @@ -1,144 +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')}), -); -'''; -} From 17f4cea5cf997e3844f1f2307e0fbd6938e51971 Mon Sep 17 00:00:00 2001 From: Qun Cheng Date: Wed, 29 Jul 2026 17:10:21 -0700 Subject: [PATCH 05/18] Use fallback tokens for contrast ColorSchemes --- .../generated/color_scheme_defaults.g.dart | 52 +- packages/material_ui/lib/src/theme_data.dart | 4 +- .../templates/color_scheme_template.dart | 661 ++++++++++-------- 3 files changed, 379 insertions(+), 338 deletions(-) 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 index 20b2791bffc6..8784f617ab8a 100644 --- a/packages/material_ui/lib/src/generated/color_scheme_defaults.g.dart +++ b/packages/material_ui/lib/src/generated/color_scheme_defaults.g.dart @@ -141,13 +141,8 @@ const ColorScheme _colorSchemeLightMediumContrastM3 = ColorScheme( 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), background: Color(0xFFFEF7FF), + onBackground: Color(0xFF000000), surface: Color(0xFFFEF7FF), surfaceBright: Color(0xFFFEF7FF), surfaceContainerLowest: Color(0xFFFFFFFF), @@ -156,10 +151,15 @@ const ColorScheme _colorSchemeLightMediumContrastM3 = ColorScheme( surfaceContainerHigh: Color(0xFFECE6F0), surfaceContainerHighest: Color(0xFFE6E0E9), surfaceDim: Color(0xFFDED8E1), + onSurface: Color(0xFF000000), surfaceVariant: Color(0xFFE7E0EC), + onSurfaceVariant: Color(0xFF322F37), + outline: Color(0xFF49454F), + outlineVariant: Color(0xFF79747E), shadow: Color(0xFF000000), scrim: Color(0xFF000000), inverseSurface: Color(0xFF322F35), + onInverseSurface: Color(0xFFFFFFFF), inversePrimary: Color(0xFFD0BCFF), ); @@ -193,13 +193,8 @@ const ColorScheme _colorSchemeLightHighContrastM3 = ColorScheme( 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), background: Color(0xFFFEF7FF), + onBackground: Color(0xFF000000), surface: Color(0xFFFEF7FF), surfaceBright: Color(0xFFFEF7FF), surfaceContainerLowest: Color(0xFFFFFFFF), @@ -208,10 +203,15 @@ const ColorScheme _colorSchemeLightHighContrastM3 = ColorScheme( surfaceContainerHigh: Color(0xFFECE6F0), surfaceContainerHighest: Color(0xFFE6E0E9), surfaceDim: Color(0xFFDED8E1), + onSurface: Color(0xFF000000), surfaceVariant: Color(0xFFE7E0EC), + onSurfaceVariant: Color(0xFF000000), + outline: Color(0xFF322F37), + outlineVariant: Color(0xFF49454F), shadow: Color(0xFF000000), scrim: Color(0xFF000000), inverseSurface: Color(0xFF322F35), + onInverseSurface: Color(0xFFFFFFFF), inversePrimary: Color(0xFFD0BCFF), ); @@ -245,14 +245,8 @@ const ColorScheme _colorSchemeDarkMediumContrastM3 = ColorScheme( 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), background: Color(0xFF141218), + onBackground: Color(0xFFFFFFFF), surface: Color(0xFF141218), surfaceBright: Color(0xFF3B383E), surfaceContainerLowest: Color(0xFF0F0D13), @@ -261,10 +255,16 @@ const ColorScheme _colorSchemeDarkMediumContrastM3 = ColorScheme( surfaceContainerHigh: Color(0xFF2B2930), surfaceContainerHighest: Color(0xFF36343B), surfaceDim: Color(0xFF141218), + onSurface: Color(0xFFFFFFFF), surfaceVariant: Color(0xFF49454F), + onSurfaceVariant: Color(0xFFE7E0EC), + outline: Color(0xFFAEA9B4), + outlineVariant: Color(0xFF938F99), shadow: Color(0xFF000000), scrim: Color(0xFF000000), inverseSurface: Color(0xFFE6E0E9), + onInverseSurface: Color(0xFF1D1B20), + inversePrimary: Color(0xFF4F378B), ); const ColorScheme _colorSchemeDarkHighContrastM3 = ColorScheme( @@ -297,14 +297,8 @@ const ColorScheme _colorSchemeDarkHighContrastM3 = ColorScheme( 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), background: Color(0xFF141218), + onBackground: Color(0xFFFFFFFF), surface: Color(0xFF141218), surfaceBright: Color(0xFF3B383E), surfaceContainerLowest: Color(0xFF0F0D13), @@ -313,8 +307,14 @@ const ColorScheme _colorSchemeDarkHighContrastM3 = ColorScheme( surfaceContainerHigh: Color(0xFF2B2930), surfaceContainerHighest: Color(0xFF36343B), surfaceDim: Color(0xFF141218), + onSurface: Color(0xFFFFFFFF), surfaceVariant: Color(0xFF49454F), + onSurfaceVariant: Color(0xFFFFFFFF), + outline: Color(0xFFF5EEFA), + outlineVariant: Color(0xFFCAC4D0), shadow: Color(0xFF000000), scrim: Color(0xFF000000), inverseSurface: Color(0xFFE6E0E9), + onInverseSurface: Color(0xFF000000), + inversePrimary: Color(0xFF381E72), ); diff --git a/packages/material_ui/lib/src/theme_data.dart b/packages/material_ui/lib/src/theme_data.dart index 68ac04845c2b..fc3609d96c15 100644 --- a/packages/material_ui/lib/src/theme_data.dart +++ b/packages/material_ui/lib/src/theme_data.dart @@ -287,8 +287,8 @@ class ThemeData with Diagnosticable { /// Material 3 color scheme is selected from [brightness] and [contrastLevel]. /// [ContrastLevel.standard], [ContrastLevel.medium], and [ContrastLevel.high] /// select token-backed default color schemes. Custom [contrastLevel] values - /// can only be used when [colorSchemeSeed] is provided; otherwise they use - /// the standard contrast default color scheme. + /// can only be used when [colorSchemeSeed] is provided. Otherwise they are + /// ignored and the standard contrast default color scheme is used. /// /// If the app wants to customize a generated color scheme, it can use /// [ColorScheme.fromSeed] directly and then [ColorScheme.copyWith] on the 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 index e4d200b65881..ddaace800590 100644 --- a/packages/material_ui/tool/gen_defaults/templates/color_scheme_template.dart +++ b/packages/material_ui/tool/gen_defaults/templates/color_scheme_template.dart @@ -25,320 +25,361 @@ class ColorSchemeTemplateM3 extends TokenTemplateM3 { @override bool get requiresGeneratedClass => false; - @override - String generateContents(String className) { - return ''' -const ColorScheme _colorSchemeLightM3 = ColorScheme( - brightness: Brightness.light, - primary: Color(${TokenColor.primary}), - onPrimary: Color(${TokenColor.onPrimary}), - primaryContainer: Color(${TokenColor.primaryContainer}), - onPrimaryContainer: Color(${TokenColor.onPrimaryContainer}), - primaryFixed: Color(${TokenColor.primaryFixed}), - primaryFixedDim: Color(${TokenColor.primaryFixedDim}), - onPrimaryFixed: Color(${TokenColor.onPrimaryFixed}), - onPrimaryFixedVariant: Color(${TokenColor.onPrimaryFixedVariant}), - secondary: Color(${TokenColor.secondary}), - onSecondary: Color(${TokenColor.onSecondary}), - secondaryContainer: Color(${TokenColor.secondaryContainer}), - onSecondaryContainer: Color(${TokenColor.onSecondaryContainer}), - secondaryFixed: Color(${TokenColor.secondaryFixed}), - secondaryFixedDim: Color(${TokenColor.secondaryFixedDim}), - onSecondaryFixed: Color(${TokenColor.onSecondaryFixed}), - onSecondaryFixedVariant: Color(${TokenColor.onSecondaryFixedVariant}), - tertiary: Color(${TokenColor.tertiary}), - onTertiary: Color(${TokenColor.onTertiary}), - tertiaryContainer: Color(${TokenColor.tertiaryContainer}), - onTertiaryContainer: Color(${TokenColor.onTertiaryContainer}), - tertiaryFixed: Color(${TokenColor.tertiaryFixed}), - tertiaryFixedDim: Color(${TokenColor.tertiaryFixedDim}), - onTertiaryFixed: Color(${TokenColor.onTertiaryFixed}), - onTertiaryFixedVariant: Color(${TokenColor.onTertiaryFixedVariant}), - error: Color(${TokenColor.error}), - onError: Color(${TokenColor.onError}), - errorContainer: Color(${TokenColor.errorContainer}), - onErrorContainer: Color(${TokenColor.onErrorContainer}), - background: Color(${TokenColor.background}), - onBackground: Color(${TokenColor.onBackground}), - surface: Color(${TokenColor.surface}), - surfaceBright: Color(${TokenColor.surfaceBright}), - surfaceContainerLowest: Color(${TokenColor.surfaceContainerLowest}), - surfaceContainerLow: Color(${TokenColor.surfaceContainerLow}), - surfaceContainer: Color(${TokenColor.surfaceContainer}), - surfaceContainerHigh: Color(${TokenColor.surfaceContainerHigh}), - surfaceContainerHighest: Color(${TokenColor.surfaceContainerHighest}), - surfaceDim: Color(${TokenColor.surfaceDim}), - onSurface: Color(${TokenColor.onSurface}), - surfaceVariant: Color(${TokenColor.surfaceVariant}), - onSurfaceVariant: Color(${TokenColor.onSurfaceVariant}), - outline: Color(${TokenColor.outline}), - outlineVariant: Color(${TokenColor.outlineVariant}), - shadow: Color(${TokenColor.shadow}), - scrim: Color(${TokenColor.scrim}), - inverseSurface: Color(${TokenColor.inverseSurface}), - onInverseSurface: Color(${TokenColor.inverseOnSurface}), - inversePrimary: Color(${TokenColor.inversePrimary}), -); + static const Map _lightTokens = { + 'background': TokenColor.background, + 'error': TokenColor.error, + 'errorContainer': TokenColor.errorContainer, + 'inverseOnSurface': TokenColor.inverseOnSurface, + 'inversePrimary': TokenColor.inversePrimary, + 'inverseSurface': TokenColor.inverseSurface, + 'onBackground': TokenColor.onBackground, + 'onError': TokenColor.onError, + 'onErrorContainer': TokenColor.onErrorContainer, + 'onPrimary': TokenColor.onPrimary, + 'onPrimaryContainer': TokenColor.onPrimaryContainer, + 'onPrimaryFixed': TokenColor.onPrimaryFixed, + 'onPrimaryFixedVariant': TokenColor.onPrimaryFixedVariant, + 'onSecondary': TokenColor.onSecondary, + 'onSecondaryContainer': TokenColor.onSecondaryContainer, + 'onSecondaryFixed': TokenColor.onSecondaryFixed, + 'onSecondaryFixedVariant': TokenColor.onSecondaryFixedVariant, + 'onSurface': TokenColor.onSurface, + 'onSurfaceVariant': TokenColor.onSurfaceVariant, + 'onTertiary': TokenColor.onTertiary, + 'onTertiaryContainer': TokenColor.onTertiaryContainer, + 'onTertiaryFixed': TokenColor.onTertiaryFixed, + 'onTertiaryFixedVariant': TokenColor.onTertiaryFixedVariant, + 'outline': TokenColor.outline, + 'outlineVariant': TokenColor.outlineVariant, + 'primary': TokenColor.primary, + 'primaryContainer': TokenColor.primaryContainer, + 'primaryFixed': TokenColor.primaryFixed, + 'primaryFixedDim': TokenColor.primaryFixedDim, + 'scrim': TokenColor.scrim, + 'secondary': TokenColor.secondary, + 'secondaryContainer': TokenColor.secondaryContainer, + 'secondaryFixed': TokenColor.secondaryFixed, + 'secondaryFixedDim': TokenColor.secondaryFixedDim, + 'shadow': TokenColor.shadow, + 'surface': TokenColor.surface, + 'surfaceBright': TokenColor.surfaceBright, + 'surfaceContainer': TokenColor.surfaceContainer, + 'surfaceContainerHigh': TokenColor.surfaceContainerHigh, + 'surfaceContainerHighest': TokenColor.surfaceContainerHighest, + 'surfaceContainerLow': TokenColor.surfaceContainerLow, + 'surfaceContainerLowest': TokenColor.surfaceContainerLowest, + 'surfaceDim': TokenColor.surfaceDim, + 'surfaceVariant': TokenColor.surfaceVariant, + 'tertiary': TokenColor.tertiary, + 'tertiaryContainer': TokenColor.tertiaryContainer, + 'tertiaryFixed': TokenColor.tertiaryFixed, + 'tertiaryFixedDim': TokenColor.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, + }; -const ColorScheme _colorSchemeDarkM3 = ColorScheme( - brightness: Brightness.dark, - primary: Color(${TokenColorDark.primary}), - onPrimary: Color(${TokenColorDark.onPrimary}), - primaryContainer: Color(${TokenColorDark.primaryContainer}), - onPrimaryContainer: Color(${TokenColorDark.onPrimaryContainer}), - primaryFixed: Color(${TokenColorDark.primaryFixed}), - primaryFixedDim: Color(${TokenColorDark.primaryFixedDim}), - onPrimaryFixed: Color(${TokenColorDark.onPrimaryFixed}), - onPrimaryFixedVariant: Color(${TokenColorDark.onPrimaryFixedVariant}), - secondary: Color(${TokenColorDark.secondary}), - onSecondary: Color(${TokenColorDark.onSecondary}), - secondaryContainer: Color(${TokenColorDark.secondaryContainer}), - onSecondaryContainer: Color(${TokenColorDark.onSecondaryContainer}), - secondaryFixed: Color(${TokenColorDark.secondaryFixed}), - secondaryFixedDim: Color(${TokenColorDark.secondaryFixedDim}), - onSecondaryFixed: Color(${TokenColorDark.onSecondaryFixed}), - onSecondaryFixedVariant: Color(${TokenColorDark.onSecondaryFixedVariant}), - tertiary: Color(${TokenColorDark.tertiary}), - onTertiary: Color(${TokenColorDark.onTertiary}), - tertiaryContainer: Color(${TokenColorDark.tertiaryContainer}), - onTertiaryContainer: Color(${TokenColorDark.onTertiaryContainer}), - tertiaryFixed: Color(${TokenColorDark.tertiaryFixed}), - tertiaryFixedDim: Color(${TokenColorDark.tertiaryFixedDim}), - onTertiaryFixed: Color(${TokenColorDark.onTertiaryFixed}), - onTertiaryFixedVariant: Color(${TokenColorDark.onTertiaryFixedVariant}), - error: Color(${TokenColorDark.error}), - onError: Color(${TokenColorDark.onError}), - errorContainer: Color(${TokenColorDark.errorContainer}), - onErrorContainer: Color(${TokenColorDark.onErrorContainer}), - background: Color(${TokenColorDark.background}), - onBackground: Color(${TokenColorDark.onBackground}), - surface: Color(${TokenColorDark.surface}), - surfaceBright: Color(${TokenColorDark.surfaceBright}), - surfaceContainerLowest: Color(${TokenColorDark.surfaceContainerLowest}), - surfaceContainerLow: Color(${TokenColorDark.surfaceContainerLow}), - surfaceContainer: Color(${TokenColorDark.surfaceContainer}), - surfaceContainerHigh: Color(${TokenColorDark.surfaceContainerHigh}), - surfaceContainerHighest: Color(${TokenColorDark.surfaceContainerHighest}), - surfaceDim: Color(${TokenColorDark.surfaceDim}), - onSurface: Color(${TokenColorDark.onSurface}), - surfaceVariant: Color(${TokenColorDark.surfaceVariant}), - onSurfaceVariant: Color(${TokenColorDark.onSurfaceVariant}), - outline: Color(${TokenColorDark.outline}), - outlineVariant: Color(${TokenColorDark.outlineVariant}), - shadow: Color(${TokenColorDark.shadow}), - scrim: Color(${TokenColorDark.scrim}), - inverseSurface: Color(${TokenColorDark.inverseSurface}), - onInverseSurface: Color(${TokenColorDark.inverseOnSurface}), - inversePrimary: Color(${TokenColorDark.inversePrimary}), -); + 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, + }; -const ColorScheme _colorSchemeLightMediumContrastM3 = ColorScheme( - brightness: Brightness.light, - primary: Color(${TokenColorLightMediumContrast.primary}), - onPrimary: Color(${TokenColorLightMediumContrast.onPrimary}), - primaryContainer: Color(${TokenColorLightMediumContrast.primaryContainer}), - onPrimaryContainer: Color(${TokenColorLightMediumContrast.onPrimaryContainer}), - primaryFixed: Color(${TokenColorLightMediumContrast.primaryFixed}), - primaryFixedDim: Color(${TokenColorLightMediumContrast.primaryFixedDim}), - onPrimaryFixed: Color(${TokenColorLightMediumContrast.onPrimaryFixed}), - onPrimaryFixedVariant: Color(${TokenColorLightMediumContrast.onPrimaryFixedVariant}), - secondary: Color(${TokenColorLightMediumContrast.secondary}), - onSecondary: Color(${TokenColorLightMediumContrast.onSecondary}), - secondaryContainer: Color(${TokenColorLightMediumContrast.secondaryContainer}), - onSecondaryContainer: Color(${TokenColorLightMediumContrast.onSecondaryContainer}), - secondaryFixed: Color(${TokenColorLightMediumContrast.secondaryFixed}), - secondaryFixedDim: Color(${TokenColorLightMediumContrast.secondaryFixedDim}), - onSecondaryFixed: Color(${TokenColorLightMediumContrast.onSecondaryFixed}), - onSecondaryFixedVariant: Color(${TokenColorLightMediumContrast.onSecondaryFixedVariant}), - tertiary: Color(${TokenColorLightMediumContrast.tertiary}), - onTertiary: Color(${TokenColorLightMediumContrast.onTertiary}), - tertiaryContainer: Color(${TokenColorLightMediumContrast.tertiaryContainer}), - onTertiaryContainer: Color(${TokenColorLightMediumContrast.onTertiaryContainer}), - tertiaryFixed: Color(${TokenColorLightMediumContrast.tertiaryFixed}), - tertiaryFixedDim: Color(${TokenColorLightMediumContrast.tertiaryFixedDim}), - onTertiaryFixed: Color(${TokenColorLightMediumContrast.onTertiaryFixed}), - onTertiaryFixedVariant: Color(${TokenColorLightMediumContrast.onTertiaryFixedVariant}), - error: Color(${TokenColorLightMediumContrast.error}), - onError: Color(${TokenColorLightMediumContrast.onError}), - errorContainer: Color(${TokenColorLightMediumContrast.errorContainer}), - onErrorContainer: Color(${TokenColorLightMediumContrast.onErrorContainer}), - onBackground: Color(${TokenColorLightMediumContrast.onBackground}), - onSurface: Color(${TokenColorLightMediumContrast.onSurface}), - onSurfaceVariant: Color(${TokenColorLightMediumContrast.onSurfaceVariant}), - outline: Color(${TokenColorLightMediumContrast.outline}), - outlineVariant: Color(${TokenColorLightMediumContrast.outlineVariant}), - onInverseSurface: Color(${TokenColorLightMediumContrast.inverseOnSurface}), - background: Color(${TokenColorLightMediumContrast.background}), - surface: Color(${TokenColorLightMediumContrast.surface}), - surfaceBright: Color(${TokenColorLightMediumContrast.surfaceBright}), - surfaceContainerLowest: Color(${TokenColorLightMediumContrast.surfaceContainerLowest}), - surfaceContainerLow: Color(${TokenColorLightMediumContrast.surfaceContainerLow}), - surfaceContainer: Color(${TokenColorLightMediumContrast.surfaceContainer}), - surfaceContainerHigh: Color(${TokenColorLightMediumContrast.surfaceContainerHigh}), - surfaceContainerHighest: Color(${TokenColorLightMediumContrast.surfaceContainerHighest}), - surfaceDim: Color(${TokenColorLightMediumContrast.surfaceDim}), - surfaceVariant: Color(${TokenColorLightMediumContrast.surfaceVariant}), - shadow: Color(${TokenColorLightMediumContrast.shadow}), - scrim: Color(${TokenColorLightMediumContrast.scrim}), - inverseSurface: Color(${TokenColorLightMediumContrast.inverseSurface}), - inversePrimary: Color(${TokenColorLightMediumContrast.inversePrimary}), -); + 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, + }; -const ColorScheme _colorSchemeLightHighContrastM3 = ColorScheme( - brightness: Brightness.light, - primary: Color(${TokenColorLightHighContrast.primary}), - onPrimary: Color(${TokenColorLightHighContrast.onPrimary}), - primaryContainer: Color(${TokenColorLightHighContrast.primaryContainer}), - onPrimaryContainer: Color(${TokenColorLightHighContrast.onPrimaryContainer}), - primaryFixed: Color(${TokenColorLightHighContrast.primaryFixed}), - primaryFixedDim: Color(${TokenColorLightHighContrast.primaryFixedDim}), - onPrimaryFixed: Color(${TokenColorLightHighContrast.onPrimaryFixed}), - onPrimaryFixedVariant: Color(${TokenColorLightHighContrast.onPrimaryFixedVariant}), - secondary: Color(${TokenColorLightHighContrast.secondary}), - onSecondary: Color(${TokenColorLightHighContrast.onSecondary}), - secondaryContainer: Color(${TokenColorLightHighContrast.secondaryContainer}), - onSecondaryContainer: Color(${TokenColorLightHighContrast.onSecondaryContainer}), - secondaryFixed: Color(${TokenColorLightHighContrast.secondaryFixed}), - secondaryFixedDim: Color(${TokenColorLightHighContrast.secondaryFixedDim}), - onSecondaryFixed: Color(${TokenColorLightHighContrast.onSecondaryFixed}), - onSecondaryFixedVariant: Color(${TokenColorLightHighContrast.onSecondaryFixedVariant}), - tertiary: Color(${TokenColorLightHighContrast.tertiary}), - onTertiary: Color(${TokenColorLightHighContrast.onTertiary}), - tertiaryContainer: Color(${TokenColorLightHighContrast.tertiaryContainer}), - onTertiaryContainer: Color(${TokenColorLightHighContrast.onTertiaryContainer}), - tertiaryFixed: Color(${TokenColorLightHighContrast.tertiaryFixed}), - tertiaryFixedDim: Color(${TokenColorLightHighContrast.tertiaryFixedDim}), - onTertiaryFixed: Color(${TokenColorLightHighContrast.onTertiaryFixed}), - onTertiaryFixedVariant: Color(${TokenColorLightHighContrast.onTertiaryFixedVariant}), - error: Color(${TokenColorLightHighContrast.error}), - onError: Color(${TokenColorLightHighContrast.onError}), - errorContainer: Color(${TokenColorLightHighContrast.errorContainer}), - onErrorContainer: Color(${TokenColorLightHighContrast.onErrorContainer}), - onBackground: Color(${TokenColorLightHighContrast.onBackground}), - onSurface: Color(${TokenColorLightHighContrast.onSurface}), - onSurfaceVariant: Color(${TokenColorLightHighContrast.onSurfaceVariant}), - outline: Color(${TokenColorLightHighContrast.outline}), - outlineVariant: Color(${TokenColorLightHighContrast.outlineVariant}), - onInverseSurface: Color(${TokenColorLightHighContrast.inverseOnSurface}), - background: Color(${TokenColorLightHighContrast.background}), - surface: Color(${TokenColorLightHighContrast.surface}), - surfaceBright: Color(${TokenColorLightHighContrast.surfaceBright}), - surfaceContainerLowest: Color(${TokenColorLightHighContrast.surfaceContainerLowest}), - surfaceContainerLow: Color(${TokenColorLightHighContrast.surfaceContainerLow}), - surfaceContainer: Color(${TokenColorLightHighContrast.surfaceContainer}), - surfaceContainerHigh: Color(${TokenColorLightHighContrast.surfaceContainerHigh}), - surfaceContainerHighest: Color(${TokenColorLightHighContrast.surfaceContainerHighest}), - surfaceDim: Color(${TokenColorLightHighContrast.surfaceDim}), - surfaceVariant: Color(${TokenColorLightHighContrast.surfaceVariant}), - shadow: Color(${TokenColorLightHighContrast.shadow}), - scrim: Color(${TokenColorLightHighContrast.scrim}), - inverseSurface: Color(${TokenColorLightHighContrast.inverseSurface}), - inversePrimary: Color(${TokenColorLightHighContrast.inversePrimary}), -); + @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'); + } -const ColorScheme _colorSchemeDarkMediumContrastM3 = ColorScheme( - brightness: Brightness.dark, - primary: Color(${TokenColorDarkMediumContrast.primary}), - onPrimary: Color(${TokenColorDarkMediumContrast.onPrimary}), - primaryContainer: Color(${TokenColorDarkMediumContrast.primaryContainer}), - onPrimaryContainer: Color(${TokenColorDarkMediumContrast.onPrimaryContainer}), - primaryFixed: Color(${TokenColorDarkMediumContrast.primaryFixed}), - primaryFixedDim: Color(${TokenColorDarkMediumContrast.primaryFixedDim}), - onPrimaryFixed: Color(${TokenColorDarkMediumContrast.onPrimaryFixed}), - onPrimaryFixedVariant: Color(${TokenColorDarkMediumContrast.onPrimaryFixedVariant}), - secondary: Color(${TokenColorDarkMediumContrast.secondary}), - onSecondary: Color(${TokenColorDarkMediumContrast.onSecondary}), - secondaryContainer: Color(${TokenColorDarkMediumContrast.secondaryContainer}), - onSecondaryContainer: Color(${TokenColorDarkMediumContrast.onSecondaryContainer}), - secondaryFixed: Color(${TokenColorDarkMediumContrast.secondaryFixed}), - secondaryFixedDim: Color(${TokenColorDarkMediumContrast.secondaryFixedDim}), - onSecondaryFixed: Color(${TokenColorDarkMediumContrast.onSecondaryFixed}), - onSecondaryFixedVariant: Color(${TokenColorDarkMediumContrast.onSecondaryFixedVariant}), - tertiary: Color(${TokenColorDarkMediumContrast.tertiary}), - onTertiary: Color(${TokenColorDarkMediumContrast.onTertiary}), - tertiaryContainer: Color(${TokenColorDarkMediumContrast.tertiaryContainer}), - onTertiaryContainer: Color(${TokenColorDarkMediumContrast.onTertiaryContainer}), - tertiaryFixed: Color(${TokenColorDarkMediumContrast.tertiaryFixed}), - tertiaryFixedDim: Color(${TokenColorDarkMediumContrast.tertiaryFixedDim}), - onTertiaryFixed: Color(${TokenColorDarkMediumContrast.onTertiaryFixed}), - onTertiaryFixedVariant: Color(${TokenColorDarkMediumContrast.onTertiaryFixedVariant}), - error: Color(${TokenColorDarkMediumContrast.error}), - onError: Color(${TokenColorDarkMediumContrast.onError}), - errorContainer: Color(${TokenColorDarkMediumContrast.errorContainer}), - onErrorContainer: Color(${TokenColorDarkMediumContrast.onErrorContainer}), - onBackground: Color(${TokenColorDarkMediumContrast.onBackground}), - onSurface: Color(${TokenColorDarkMediumContrast.onSurface}), - onSurfaceVariant: Color(${TokenColorDarkMediumContrast.onSurfaceVariant}), - outline: Color(${TokenColorDarkMediumContrast.outline}), - outlineVariant: Color(${TokenColorDarkMediumContrast.outlineVariant}), - onInverseSurface: Color(${TokenColorDarkMediumContrast.inverseOnSurface}), - inversePrimary: Color(${TokenColorDarkMediumContrast.inversePrimary}), - background: Color(${TokenColorDarkMediumContrast.background}), - surface: Color(${TokenColorDarkMediumContrast.surface}), - surfaceBright: Color(${TokenColorDarkMediumContrast.surfaceBright}), - surfaceContainerLowest: Color(${TokenColorDarkMediumContrast.surfaceContainerLowest}), - surfaceContainerLow: Color(${TokenColorDarkMediumContrast.surfaceContainerLow}), - surfaceContainer: Color(${TokenColorDarkMediumContrast.surfaceContainer}), - surfaceContainerHigh: Color(${TokenColorDarkMediumContrast.surfaceContainerHigh}), - surfaceContainerHighest: Color(${TokenColorDarkMediumContrast.surfaceContainerHighest}), - surfaceDim: Color(${TokenColorDarkMediumContrast.surfaceDim}), - surfaceVariant: Color(${TokenColorDarkMediumContrast.surfaceVariant}), - shadow: Color(${TokenColorDarkMediumContrast.shadow}), - scrim: Color(${TokenColorDarkMediumContrast.scrim}), - inverseSurface: Color(${TokenColorDarkMediumContrast.inverseSurface}), -); + 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, +'''); + for (final (parameterName, tokenName) in colorRoles) { + buffer.writeln(' $parameterName: Color(${_token(tokenName, tokens, fallbackTokens)}),'); + } + buffer.writeln(');\n'); + return buffer.toString(); + } -const ColorScheme _colorSchemeDarkHighContrastM3 = ColorScheme( - brightness: Brightness.dark, - primary: Color(${TokenColorDarkHighContrast.primary}), - onPrimary: Color(${TokenColorDarkHighContrast.onPrimary}), - primaryContainer: Color(${TokenColorDarkHighContrast.primaryContainer}), - onPrimaryContainer: Color(${TokenColorDarkHighContrast.onPrimaryContainer}), - primaryFixed: Color(${TokenColorDarkHighContrast.primaryFixed}), - primaryFixedDim: Color(${TokenColorDarkHighContrast.primaryFixedDim}), - onPrimaryFixed: Color(${TokenColorDarkHighContrast.onPrimaryFixed}), - onPrimaryFixedVariant: Color(${TokenColorDarkHighContrast.onPrimaryFixedVariant}), - secondary: Color(${TokenColorDarkHighContrast.secondary}), - onSecondary: Color(${TokenColorDarkHighContrast.onSecondary}), - secondaryContainer: Color(${TokenColorDarkHighContrast.secondaryContainer}), - onSecondaryContainer: Color(${TokenColorDarkHighContrast.onSecondaryContainer}), - secondaryFixed: Color(${TokenColorDarkHighContrast.secondaryFixed}), - secondaryFixedDim: Color(${TokenColorDarkHighContrast.secondaryFixedDim}), - onSecondaryFixed: Color(${TokenColorDarkHighContrast.onSecondaryFixed}), - onSecondaryFixedVariant: Color(${TokenColorDarkHighContrast.onSecondaryFixedVariant}), - tertiary: Color(${TokenColorDarkHighContrast.tertiary}), - onTertiary: Color(${TokenColorDarkHighContrast.onTertiary}), - tertiaryContainer: Color(${TokenColorDarkHighContrast.tertiaryContainer}), - onTertiaryContainer: Color(${TokenColorDarkHighContrast.onTertiaryContainer}), - tertiaryFixed: Color(${TokenColorDarkHighContrast.tertiaryFixed}), - tertiaryFixedDim: Color(${TokenColorDarkHighContrast.tertiaryFixedDim}), - onTertiaryFixed: Color(${TokenColorDarkHighContrast.onTertiaryFixed}), - onTertiaryFixedVariant: Color(${TokenColorDarkHighContrast.onTertiaryFixedVariant}), - error: Color(${TokenColorDarkHighContrast.error}), - onError: Color(${TokenColorDarkHighContrast.onError}), - errorContainer: Color(${TokenColorDarkHighContrast.errorContainer}), - onErrorContainer: Color(${TokenColorDarkHighContrast.onErrorContainer}), - onBackground: Color(${TokenColorDarkHighContrast.onBackground}), - onSurface: Color(${TokenColorDarkHighContrast.onSurface}), - onSurfaceVariant: Color(${TokenColorDarkHighContrast.onSurfaceVariant}), - outline: Color(${TokenColorDarkHighContrast.outline}), - outlineVariant: Color(${TokenColorDarkHighContrast.outlineVariant}), - onInverseSurface: Color(${TokenColorDarkHighContrast.inverseOnSurface}), - inversePrimary: Color(${TokenColorDarkHighContrast.inversePrimary}), - background: Color(${TokenColorDarkHighContrast.background}), - surface: Color(${TokenColorDarkHighContrast.surface}), - surfaceBright: Color(${TokenColorDarkHighContrast.surfaceBright}), - surfaceContainerLowest: Color(${TokenColorDarkHighContrast.surfaceContainerLowest}), - surfaceContainerLow: Color(${TokenColorDarkHighContrast.surfaceContainerLow}), - surfaceContainer: Color(${TokenColorDarkHighContrast.surfaceContainer}), - surfaceContainerHigh: Color(${TokenColorDarkHighContrast.surfaceContainerHigh}), - surfaceContainerHighest: Color(${TokenColorDarkHighContrast.surfaceContainerHighest}), - surfaceDim: Color(${TokenColorDarkHighContrast.surfaceDim}), - surfaceVariant: Color(${TokenColorDarkHighContrast.surfaceVariant}), - shadow: Color(${TokenColorDarkHighContrast.shadow}), - scrim: Color(${TokenColorDarkHighContrast.scrim}), - inverseSurface: Color(${TokenColorDarkHighContrast.inverseSurface}), -); -'''; + String _token(String name, Map tokens, Map? fallbackTokens) { + return tokens[name] ?? + fallbackTokens?[name] ?? + (throw StateError('No token is defined for $name.')); } } From 016632f30b2c2948d03276592cb8cbdcd0af42a3 Mon Sep 17 00:00:00 2001 From: Qun Cheng Date: Wed, 29 Jul 2026 17:13:07 -0700 Subject: [PATCH 06/18] Group fallback ColorScheme token roles --- .../generated/color_scheme_defaults.g.dart | 56 ++++++++++--------- .../templates/color_scheme_template.dart | 33 +++++++++-- 2 files changed, 57 insertions(+), 32 deletions(-) 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 index 8784f617ab8a..d6581af34aa7 100644 --- a/packages/material_ui/lib/src/generated/color_scheme_defaults.g.dart +++ b/packages/material_ui/lib/src/generated/color_scheme_defaults.g.dart @@ -141,8 +141,14 @@ const ColorScheme _colorSchemeLightMediumContrastM3 = ColorScheme( onError: Color(0xFFFFFFFF), errorContainer: Color(0xFFB3261E), onErrorContainer: Color(0xFFFFFFFF), - background: Color(0xFFFEF7FF), 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), @@ -151,15 +157,10 @@ const ColorScheme _colorSchemeLightMediumContrastM3 = ColorScheme( surfaceContainerHigh: Color(0xFFECE6F0), surfaceContainerHighest: Color(0xFFE6E0E9), surfaceDim: Color(0xFFDED8E1), - onSurface: Color(0xFF000000), surfaceVariant: Color(0xFFE7E0EC), - onSurfaceVariant: Color(0xFF322F37), - outline: Color(0xFF49454F), - outlineVariant: Color(0xFF79747E), shadow: Color(0xFF000000), scrim: Color(0xFF000000), inverseSurface: Color(0xFF322F35), - onInverseSurface: Color(0xFFFFFFFF), inversePrimary: Color(0xFFD0BCFF), ); @@ -193,8 +194,14 @@ const ColorScheme _colorSchemeLightHighContrastM3 = ColorScheme( onError: Color(0xFFFFFFFF), errorContainer: Color(0xFF8C1D18), onErrorContainer: Color(0xFFFFFFFF), - background: Color(0xFFFEF7FF), 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), @@ -203,15 +210,10 @@ const ColorScheme _colorSchemeLightHighContrastM3 = ColorScheme( surfaceContainerHigh: Color(0xFFECE6F0), surfaceContainerHighest: Color(0xFFE6E0E9), surfaceDim: Color(0xFFDED8E1), - onSurface: Color(0xFF000000), surfaceVariant: Color(0xFFE7E0EC), - onSurfaceVariant: Color(0xFF000000), - outline: Color(0xFF322F37), - outlineVariant: Color(0xFF49454F), shadow: Color(0xFF000000), scrim: Color(0xFF000000), inverseSurface: Color(0xFF322F35), - onInverseSurface: Color(0xFFFFFFFF), inversePrimary: Color(0xFFD0BCFF), ); @@ -245,8 +247,15 @@ const ColorScheme _colorSchemeDarkMediumContrastM3 = ColorScheme( onError: Color(0xFF410E0B), errorContainer: Color(0xFFE46962), onErrorContainer: Color(0xFF000000), - background: Color(0xFF141218), 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), @@ -255,16 +264,10 @@ const ColorScheme _colorSchemeDarkMediumContrastM3 = ColorScheme( surfaceContainerHigh: Color(0xFF2B2930), surfaceContainerHighest: Color(0xFF36343B), surfaceDim: Color(0xFF141218), - onSurface: Color(0xFFFFFFFF), surfaceVariant: Color(0xFF49454F), - onSurfaceVariant: Color(0xFFE7E0EC), - outline: Color(0xFFAEA9B4), - outlineVariant: Color(0xFF938F99), shadow: Color(0xFF000000), scrim: Color(0xFF000000), inverseSurface: Color(0xFFE6E0E9), - onInverseSurface: Color(0xFF1D1B20), - inversePrimary: Color(0xFF4F378B), ); const ColorScheme _colorSchemeDarkHighContrastM3 = ColorScheme( @@ -297,8 +300,15 @@ const ColorScheme _colorSchemeDarkHighContrastM3 = ColorScheme( onError: Color(0xFF000000), errorContainer: Color(0xFFF2B8B5), onErrorContainer: Color(0xFF000000), - background: Color(0xFF141218), 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), @@ -307,14 +317,8 @@ const ColorScheme _colorSchemeDarkHighContrastM3 = ColorScheme( surfaceContainerHigh: Color(0xFF2B2930), surfaceContainerHighest: Color(0xFF36343B), surfaceDim: Color(0xFF141218), - onSurface: Color(0xFFFFFFFF), surfaceVariant: Color(0xFF49454F), - onSurfaceVariant: Color(0xFFFFFFFF), - outline: Color(0xFFF5EEFA), - outlineVariant: Color(0xFFCAC4D0), shadow: Color(0xFF000000), scrim: Color(0xFF000000), inverseSurface: Color(0xFFE6E0E9), - onInverseSurface: Color(0xFF000000), - inversePrimary: Color(0xFF381E72), ); 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 index ddaace800590..1e19d0963ebe 100644 --- a/packages/material_ui/tool/gen_defaults/templates/color_scheme_template.dart +++ b/packages/material_ui/tool/gen_defaults/templates/color_scheme_template.dart @@ -370,16 +370,37 @@ class ColorSchemeTemplateM3 extends TokenTemplateM3 { const ColorScheme $name = ColorScheme( brightness: $brightness, '''); - for (final (parameterName, tokenName) in colorRoles) { - buffer.writeln(' $parameterName: Color(${_token(tokenName, tokens, fallbackTokens)}),'); + 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 _token(String name, Map tokens, Map? fallbackTokens) { - return tokens[name] ?? - fallbackTokens?[name] ?? - (throw StateError('No token is defined for $name.')); + 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.')); } } From aa354674d70e9897ef0d15b265f148b47fc6f066 Mon Sep 17 00:00:00 2001 From: Qun Cheng Date: Wed, 29 Jul 2026 17:40:41 -0700 Subject: [PATCH 07/18] Clarify generated color scheme docs --- packages/material_ui/lib/src/theme_data.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/material_ui/lib/src/theme_data.dart b/packages/material_ui/lib/src/theme_data.dart index fc3609d96c15..1fe380e70c10 100644 --- a/packages/material_ui/lib/src/theme_data.dart +++ b/packages/material_ui/lib/src/theme_data.dart @@ -278,8 +278,9 @@ class ThemeData with Diagnosticable { /// [colorScheme] is used directly and is not affected by [brightness], /// [colorSchemeSeed], or [contrastLevel]. /// - /// If a [colorSchemeSeed] is provided, a generated color scheme will be based - /// on the tones of [colorSchemeSeed] using [brightness] and [contrastLevel]. + /// If a [colorSchemeSeed] is provided, [ColorScheme.fromSeed] is used to + /// generate a color scheme from [colorSchemeSeed], [brightness], and + /// [contrastLevel]. /// All of its contrasting colors will meet accessibility guidelines for /// readability. (See [ColorScheme.fromSeed] for more details.) /// From d13f9fe03172dd72f6008f089500bd9b6fa13540 Mon Sep 17 00:00:00 2001 From: Qun Cheng Date: Wed, 29 Jul 2026 17:53:19 -0700 Subject: [PATCH 08/18] Consolidate ColorScheme generation docs --- packages/material_ui/lib/src/theme_data.dart | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/material_ui/lib/src/theme_data.dart b/packages/material_ui/lib/src/theme_data.dart index 1fe380e70c10..f6bf5ee54a32 100644 --- a/packages/material_ui/lib/src/theme_data.dart +++ b/packages/material_ui/lib/src/theme_data.dart @@ -274,16 +274,14 @@ class ThemeData with Diagnosticable { /// 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. A provided + /// the [colorScheme] parameter, or have one generated for them by using the + /// [colorSchemeSeed], [brightness], and [contrastLevel] parameters. A + /// generated color scheme will be based on the tones of [colorSchemeSeed], + /// and all of its contrasting colors will meet accessibility guidelines for + /// readability. (See [ColorScheme.fromSeed] for more details.) A provided /// [colorScheme] is used directly and is not affected by [brightness], /// [colorSchemeSeed], or [contrastLevel]. /// - /// If a [colorSchemeSeed] is provided, [ColorScheme.fromSeed] is used to - /// generate a color scheme from [colorSchemeSeed], [brightness], and - /// [contrastLevel]. - /// All of its contrasting colors will meet accessibility guidelines for - /// readability. (See [ColorScheme.fromSeed] for more details.) - /// /// If [colorSchemeSeed] is null and [useMaterial3] is true, the default /// Material 3 color scheme is selected from [brightness] and [contrastLevel]. /// [ContrastLevel.standard], [ContrastLevel.medium], and [ContrastLevel.high] From eb812e8abdce99477e6425ca4c82c1f7bd6526d9 Mon Sep 17 00:00:00 2001 From: Qun Cheng Date: Wed, 29 Jul 2026 18:09:48 -0700 Subject: [PATCH 09/18] Rephrase contrast level docs --- packages/material_ui/lib/src/theme_data.dart | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/material_ui/lib/src/theme_data.dart b/packages/material_ui/lib/src/theme_data.dart index f6bf5ee54a32..7ba8043ab5ef 100644 --- a/packages/material_ui/lib/src/theme_data.dart +++ b/packages/material_ui/lib/src/theme_data.dart @@ -284,10 +284,11 @@ class ThemeData with Diagnosticable { /// /// If [colorSchemeSeed] is null and [useMaterial3] is true, the default /// Material 3 color scheme is selected from [brightness] and [contrastLevel]. - /// [ContrastLevel.standard], [ContrastLevel.medium], and [ContrastLevel.high] - /// select token-backed default color schemes. Custom [contrastLevel] values - /// can only be used when [colorSchemeSeed] is provided. Otherwise they are - /// ignored and the standard contrast default color scheme is used. + /// Use [ContrastLevel.standard], [ContrastLevel.medium], or + /// [ContrastLevel.high] to choose the token-backed default color scheme for + /// that contrast level. Custom [contrastLevel] values can only be used when + /// [colorSchemeSeed] is provided. Otherwise they are ignored and the standard + /// contrast default color scheme is used. /// /// If the app wants to customize a generated color scheme, it can use /// [ColorScheme.fromSeed] directly and then [ColorScheme.copyWith] on the From 65fe69ffc2d440c7fc1192b9a8c288af00e493c9 Mon Sep 17 00:00:00 2001 From: Qun Cheng Date: Wed, 29 Jul 2026 18:24:55 -0700 Subject: [PATCH 10/18] Add contrast level doc example --- packages/material_ui/lib/src/theme_data.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/material_ui/lib/src/theme_data.dart b/packages/material_ui/lib/src/theme_data.dart index 7ba8043ab5ef..0c0aab1522e2 100644 --- a/packages/material_ui/lib/src/theme_data.dart +++ b/packages/material_ui/lib/src/theme_data.dart @@ -286,9 +286,9 @@ class ThemeData with Diagnosticable { /// Material 3 color scheme is selected from [brightness] and [contrastLevel]. /// Use [ContrastLevel.standard], [ContrastLevel.medium], or /// [ContrastLevel.high] to choose the token-backed default color scheme for - /// that contrast level. Custom [contrastLevel] values can only be used when - /// [colorSchemeSeed] is provided. Otherwise they are ignored and the standard - /// contrast default color scheme is used. + /// that contrast level. Custom [contrastLevel] values, such as 0.6, can only + /// be used when [colorSchemeSeed] is provided. Otherwise they are ignored and + /// the standard contrast default color scheme is used. /// /// If the app wants to customize a generated color scheme, it can use /// [ColorScheme.fromSeed] directly and then [ColorScheme.copyWith] on the From 84f68cf544fc0523d20f0dd180d8cf22877c5715 Mon Sep 17 00:00:00 2001 From: Qun Cheng Date: Wed, 29 Jul 2026 18:34:37 -0700 Subject: [PATCH 11/18] Reorganize contrast level docs --- packages/material_ui/lib/src/theme_data.dart | 26 +++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/packages/material_ui/lib/src/theme_data.dart b/packages/material_ui/lib/src/theme_data.dart index 0c0aab1522e2..4cb2b3269a0b 100644 --- a/packages/material_ui/lib/src/theme_data.dart +++ b/packages/material_ui/lib/src/theme_data.dart @@ -274,21 +274,23 @@ class ThemeData with Diagnosticable { /// 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], [brightness], and [contrastLevel] parameters. A - /// generated color scheme will be based on the tones of [colorSchemeSeed], - /// and all of its contrasting colors will meet accessibility guidelines for - /// readability. (See [ColorScheme.fromSeed] for more details.) A provided + /// 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 [colorSchemeSeed] is null and [useMaterial3] is true, the default - /// Material 3 color scheme is selected from [brightness] and [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 and [useMaterial3] is true, [brightness] and + /// [contrastLevel] select a token-backed Material 3 baseline color scheme. /// Use [ContrastLevel.standard], [ContrastLevel.medium], or - /// [ContrastLevel.high] to choose the token-backed default color scheme for - /// that contrast level. Custom [contrastLevel] values, such as 0.6, can only - /// be used when [colorSchemeSeed] is provided. Otherwise they are ignored and - /// the standard contrast default color scheme is used. + /// [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,7 +306,7 @@ class ThemeData with Diagnosticable { /// [primarySwatch] must all be null. /// /// [contrastLevel] sets the contrast level for generated Material 3 color - /// schemes. Values must be between -1.0 and 1.0 inclusive. + /// schemes. /// /// The [textTheme] [TextStyle] colors are black if the color scheme's /// brightness is [Brightness.light], and white for [Brightness.dark]. From d3f4789444043dfce91f94ef6154ba66725f1d9a Mon Sep 17 00:00:00 2001 From: Qun Cheng Date: Thu, 30 Jul 2026 11:51:11 -0700 Subject: [PATCH 12/18] Use light color tokens in ColorScheme template --- .../templates/color_scheme_template.dart | 98 +++++++++---------- 1 file changed, 49 insertions(+), 49 deletions(-) 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 index 1e19d0963ebe..9cfb3e03766f 100644 --- a/packages/material_ui/tool/gen_defaults/templates/color_scheme_template.dart +++ b/packages/material_ui/tool/gen_defaults/templates/color_scheme_template.dart @@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import '../data/color.dart'; 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'; @@ -26,54 +26,54 @@ class ColorSchemeTemplateM3 extends TokenTemplateM3 { bool get requiresGeneratedClass => false; static const Map _lightTokens = { - 'background': TokenColor.background, - 'error': TokenColor.error, - 'errorContainer': TokenColor.errorContainer, - 'inverseOnSurface': TokenColor.inverseOnSurface, - 'inversePrimary': TokenColor.inversePrimary, - 'inverseSurface': TokenColor.inverseSurface, - 'onBackground': TokenColor.onBackground, - 'onError': TokenColor.onError, - 'onErrorContainer': TokenColor.onErrorContainer, - 'onPrimary': TokenColor.onPrimary, - 'onPrimaryContainer': TokenColor.onPrimaryContainer, - 'onPrimaryFixed': TokenColor.onPrimaryFixed, - 'onPrimaryFixedVariant': TokenColor.onPrimaryFixedVariant, - 'onSecondary': TokenColor.onSecondary, - 'onSecondaryContainer': TokenColor.onSecondaryContainer, - 'onSecondaryFixed': TokenColor.onSecondaryFixed, - 'onSecondaryFixedVariant': TokenColor.onSecondaryFixedVariant, - 'onSurface': TokenColor.onSurface, - 'onSurfaceVariant': TokenColor.onSurfaceVariant, - 'onTertiary': TokenColor.onTertiary, - 'onTertiaryContainer': TokenColor.onTertiaryContainer, - 'onTertiaryFixed': TokenColor.onTertiaryFixed, - 'onTertiaryFixedVariant': TokenColor.onTertiaryFixedVariant, - 'outline': TokenColor.outline, - 'outlineVariant': TokenColor.outlineVariant, - 'primary': TokenColor.primary, - 'primaryContainer': TokenColor.primaryContainer, - 'primaryFixed': TokenColor.primaryFixed, - 'primaryFixedDim': TokenColor.primaryFixedDim, - 'scrim': TokenColor.scrim, - 'secondary': TokenColor.secondary, - 'secondaryContainer': TokenColor.secondaryContainer, - 'secondaryFixed': TokenColor.secondaryFixed, - 'secondaryFixedDim': TokenColor.secondaryFixedDim, - 'shadow': TokenColor.shadow, - 'surface': TokenColor.surface, - 'surfaceBright': TokenColor.surfaceBright, - 'surfaceContainer': TokenColor.surfaceContainer, - 'surfaceContainerHigh': TokenColor.surfaceContainerHigh, - 'surfaceContainerHighest': TokenColor.surfaceContainerHighest, - 'surfaceContainerLow': TokenColor.surfaceContainerLow, - 'surfaceContainerLowest': TokenColor.surfaceContainerLowest, - 'surfaceDim': TokenColor.surfaceDim, - 'surfaceVariant': TokenColor.surfaceVariant, - 'tertiary': TokenColor.tertiary, - 'tertiaryContainer': TokenColor.tertiaryContainer, - 'tertiaryFixed': TokenColor.tertiaryFixed, - 'tertiaryFixedDim': TokenColor.tertiaryFixedDim, + '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 = { From 94c64710f12f751c7e2f3c3dfd8b1b398758444d Mon Sep 17 00:00:00 2001 From: Qun Cheng Date: Thu, 30 Jul 2026 16:38:10 -0700 Subject: [PATCH 13/18] Update contrast level docs --- packages/material_ui/lib/src/theme_data.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/material_ui/lib/src/theme_data.dart b/packages/material_ui/lib/src/theme_data.dart index 4cb2b3269a0b..11cb6d2d9b05 100644 --- a/packages/material_ui/lib/src/theme_data.dart +++ b/packages/material_ui/lib/src/theme_data.dart @@ -285,8 +285,8 @@ class ThemeData with Diagnosticable { /// accessibility guidelines for readability. (See [ColorScheme.fromSeed] for /// more details.) /// - /// If [colorSchemeSeed] is null and [useMaterial3] is true, [brightness] and - /// [contrastLevel] select a token-backed Material 3 baseline color scheme. + /// 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 From 4a2f745cced7b93081e2201726f916fe4a0febc0 Mon Sep 17 00:00:00 2001 From: Qun Cheng Date: Thu, 30 Jul 2026 16:41:37 -0700 Subject: [PATCH 14/18] Remove redundant contrast level docs --- packages/material_ui/lib/src/theme_data.dart | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/material_ui/lib/src/theme_data.dart b/packages/material_ui/lib/src/theme_data.dart index 11cb6d2d9b05..6b5baedb3533 100644 --- a/packages/material_ui/lib/src/theme_data.dart +++ b/packages/material_ui/lib/src/theme_data.dart @@ -305,9 +305,6 @@ class ThemeData with Diagnosticable { /// If [colorSchemeSeed] is non-null then [colorScheme], [primaryColor] and /// [primarySwatch] must all be null. /// - /// [contrastLevel] sets the contrast level for generated Material 3 color - /// schemes. - /// /// The [textTheme] [TextStyle] colors are black if the color scheme's /// brightness is [Brightness.light], and white for [Brightness.dark]. /// From af7c3e2afbc6c467555293abfbb5b1cfc79a4a97 Mon Sep 17 00:00:00 2001 From: Qun Cheng Date: Mon, 10 Aug 2026 10:46:02 -0700 Subject: [PATCH 15/18] Format gen_defaults test --- .../tool/gen_defaults/test/gen_defaults_test.dart | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 42798f835a07..edb4121b7bab 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 @@ -87,6 +87,16 @@ void main() { ); }); + test('border generates border expression', () { + final template = IconButtonTemplateM3(testPath()); + expect(template.border('_colors.outline'), 'BorderSide(color: _colors.outline)'); + expect( + template.border('_colors.outline', width: 2.0), + 'BorderSide(color: _colors.outline, width: 2.0)', + ); + expect(template.border('_colors.outline', width: 1.0), 'BorderSide(color: _colors.outline)'); + }); + test('shape generates shape expressions', () { final template = IconButtonTemplateM3(testPath()); expect( From 9d74792e3f679be79e39821cde106d5727ae62c1 Mon Sep 17 00:00:00 2001 From: Qun Cheng Date: Mon, 24 Aug 2026 13:34:48 -0700 Subject: [PATCH 16/18] Address PR feedback --- .../tool/gen_defaults/templates/color_scheme_template.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 9cfb3e03766f..9b104f79e806 100644 --- a/packages/material_ui/tool/gen_defaults/templates/color_scheme_template.dart +++ b/packages/material_ui/tool/gen_defaults/templates/color_scheme_template.dart @@ -23,7 +23,7 @@ class ColorSchemeTemplateM3 extends TokenTemplateM3 { String get outputFileName => 'color_scheme_defaults.g.dart'; @override - bool get requiresGeneratedClass => false; + String get className => ''; static const Map _lightTokens = { 'background': TokenColorLight.background, From 618ab2c74bb172ec1d8fe44d211b700aeaedb8bf Mon Sep 17 00:00:00 2001 From: Qun Cheng Date: Mon, 24 Aug 2026 15:19:58 -0700 Subject: [PATCH 17/18] Address feedback --- .../material_ui/tool/gen_defaults/test/gen_defaults_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 edb4121b7bab..313cbde68ede 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 @@ -408,7 +408,7 @@ void main() { isA().having( (AssertionError e) => e.message, 'message', - contains('Make sure you are utilizing the passed `className` parameter.'), + contains('Make sure you are utilizing the passed `className` parameter,'), ), ), ); From 1042bc0f0043598bcad73e0709f1ba24e645709b Mon Sep 17 00:00:00 2001 From: Qun Cheng Date: Tue, 1 Sep 2026 18:13:19 -0700 Subject: [PATCH 18/18] Add material_ui release note --- .../pending_changelogs/change_2026_09_01_181259.yaml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 packages/material_ui/pending_changelogs/change_2026_09_01_181259.yaml diff --git a/packages/material_ui/pending_changelogs/change_2026_09_01_181259.yaml b/packages/material_ui/pending_changelogs/change_2026_09_01_181259.yaml new file mode 100644 index 000000000000..713661c9b863 --- /dev/null +++ b/packages/material_ui/pending_changelogs/change_2026_09_01_181259.yaml @@ -0,0 +1,3 @@ +changelog: | + - Adds support for standard, medium, and high contrast Material 3 color scheme baselines. +version: minor