Skip to content

Commit 30ef87c

Browse files
Merge pull request #53 from Muckenbatscher/spec-2026
Spec 2026
2 parents f20b80e + d5570e4 commit 30ef87c

507 files changed

Lines changed: 36244 additions & 275 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/official_commit_verify.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
GIT_DIR_NAME: "material-color-utilities"
1515
GIT_BRANCH: "main"
1616
JAVA_IMPL_PATH: "java"
17-
EXPECTED_COMMIT: a285736f
17+
EXPECTED_COMMIT: 4578d0a1
1818
steps:
1919
- name: Get the latest commit hash
2020
id: latest_official

Directory.Build.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
</PropertyGroup>
99

1010
<PropertyGroup>
11+
<ProduceReferenceAssembly>true</ProduceReferenceAssembly>
1112
<LangVersion>14</LangVersion>
1213
<Nullable>enable</Nullable>
1314
<ImplicitUsings>enable</ImplicitUsings>

MaterialTheming.Tests/CmfTests.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace MaterialTheming.Tests;
2+
3+
[TestClass]
4+
public class CmfTests : TestThemeTests
5+
{
6+
protected override Variant ThemeVariant => Variant.CMF;
7+
}

MaterialTheming.Tests/ColorValidation/ThemeValidationResult.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ namespace MaterialTheming.Tests.ColorValidation;
44

55
internal class ThemeValidationResult
66
{
7-
public ThemeValidationResult(IEnumerable<ColorDifference> outOfSpecColorDifferences)
7+
public ThemeValidationResult(Type testThemeType, IEnumerable<ColorDifference> outOfSpecColorDifferences)
88
{
9+
TestThemeType = testThemeType;
910
OutOfSpecColorDifferences = outOfSpecColorDifferences.ToList();
1011
}
11-
12-
public ICollection<ColorDifference> OutOfSpecColorDifferences;
12+
public Type TestThemeType { get; }
13+
public ICollection<ColorDifference> OutOfSpecColorDifferences { get; }
1314
public bool IsValid => OutOfSpecColorDifferences.Count == 0;
1415
}

MaterialTheming.Tests/ColorValidation/ThemeValidator.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public static ThemeValidationResult ValidateThemeColors<TTestTheme>()
1111
{
1212
var theme = ThemeCreationService.CreateThemeColors<TTestTheme>();
1313
return CreateFromColorDifferences(
14+
typeof(TTestTheme),
1415
ColorDifferenceService.GetColorDifferences<TTestTheme>(theme));
1516
}
1617

@@ -19,11 +20,12 @@ public static ThemeValidationResult ValidateThemeColors(ITestTheme testTheme)
1920
var themeColors = ThemeCreationService.CreateThemeColors(testTheme);
2021

2122
return CreateFromColorDifferences(
23+
testTheme.GetType(),
2224
ColorDifferenceService.GetColorDifferences(themeColors, testTheme));
2325
}
24-
private static ThemeValidationResult CreateFromColorDifferences(IEnumerable<ColorDifference> colorDifferences)
26+
private static ThemeValidationResult CreateFromColorDifferences(Type testThemeType, IEnumerable<ColorDifference> colorDifferences)
2527
{
2628
var outOfSpecColorDifferences = ColorDifferenceValidationService.FilterToOutOfSpecColorDifferences(colorDifferences);
27-
return new ThemeValidationResult(outOfSpecColorDifferences);
29+
return new ThemeValidationResult(testThemeType, outOfSpecColorDifferences);
2830
}
2931
}

MaterialTheming.Tests/FailedValidationMessageBuilder.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@ public string GetFailedValidationMessage()
1616
var differenceInfos = themeValidationResult.OutOfSpecColorDifferences
1717
.Select(difference => GetDashEnumeratedColorDifferenceInfo(difference, maxColorRoleNameLength));
1818

19-
var messageLines = differenceInfos
20-
.Prepend("Theme validation failed. The following color differences are out of specification:");
21-
return string.Join(Environment.NewLine, messageLines);
19+
IEnumerable<string> messageLines = [
20+
$"[{themeValidationResult.TestThemeType.Name}]",
21+
"Theme validation failed. The following color differences are out of specification:" ];
22+
return string.Join(Environment.NewLine, messageLines.Concat(differenceInfos));
2223
}
2324
}
2425
private static string GetDashEnumeratedColorDifferenceInfo(ColorDifference difference, int maxColorRoleNameLength)
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
namespace MaterialTheming.Tests.KnownTestThemes.CMF;
2+
3+
internal class DarkMode_HighContrast_Spec2026_Blue : ITestTheme
4+
{
5+
public string SourceColor => "#185FAA"; //Blue
6+
public bool IsDark => true;
7+
public Variant Variant => Variant.CMF;
8+
public double ContrastLevelValue => 1.0;
9+
public SpecVersion SpecVersion => SpecVersion.Spec2026;
10+
11+
// Primary
12+
public string Primary => "#D9E6FF";
13+
public string OnPrimary => "#002C58";
14+
public string PrimaryContainer => "#6DA5F5";
15+
public string OnPrimaryContainer => "#000000";
16+
// Secondary
17+
public string Secondary => "#D9E6FF";
18+
public string OnSecondary => "#182D48";
19+
public string SecondaryContainer => "#91A5C7";
20+
public string OnSecondaryContainer => "#000000";
21+
// Tertiary
22+
public string Tertiary => "#D9E6FF";
23+
public string OnTertiary => "#002C58";
24+
public string TertiaryContainer => "#81A5DD";
25+
public string OnTertiaryContainer => "#000000";
26+
// Error
27+
public string Error => "#FFDEDB";
28+
public string OnError => "#5A0D0E";
29+
public string ErrorContainer => "#F5827A";
30+
public string OnErrorContainer => "#000000";
31+
// Surface
32+
public string Surface => "#090E17";
33+
public string SurfaceVariant => "#1B2637";
34+
public string OnSurface => "#FFFFFF";
35+
public string OnSurfaceVariant => "#DBE6FD";
36+
public string SurfaceDim => "#090E17";
37+
public string SurfaceBright => "#212D3E";
38+
public string SurfaceTint => "#D9E6FF";
39+
// Background
40+
public string Background => "#090E17";
41+
public string OnBackground => "#FFFFFF";
42+
// Outline
43+
public string Outline => "#AEB9CF";
44+
public string OutlineVariant => "#99A4BA";
45+
// Shadow
46+
public string Shadow => "#000000";
47+
public string Scrim => "#000000";
48+
// Inverse
49+
public string InverseSurface => "#F9F9FF";
50+
public string InverseOnSurface => "#000000";
51+
public string InversePrimary => "#00386D";
52+
// Primary Fixed
53+
public string PrimaryFixed => "#6DA5F5";
54+
public string OnPrimaryFixed => "#000000";
55+
public string PrimaryFixedDim => "#6DA5F5";
56+
public string OnPrimaryFixedVariant => "#000000";
57+
// Secondary Fixed
58+
public string SecondaryFixed => "#C1D5F9";
59+
public string OnSecondaryFixed => "#000000";
60+
public string SecondaryFixedDim => "#B3C7EB";
61+
public string OnSecondaryFixedVariant => "#001128";
62+
// Tertiary Fixed
63+
public string TertiaryFixed => "#81A5DD";
64+
public string OnTertiaryFixed => "#000000";
65+
public string TertiaryFixedDim => "#81A5DD";
66+
public string OnTertiaryFixedVariant => "#000000";
67+
// Surface Container
68+
public string SurfaceContainerLowest => "#000000";
69+
public string SurfaceContainerLow => "#0C141F";
70+
public string SurfaceContainer => "#111A27";
71+
public string SurfaceContainerHigh => "#17202E";
72+
public string SurfaceContainerHighest => "#1B2637";
73+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
namespace MaterialTheming.Tests.KnownTestThemes.CMF;
2+
3+
internal class DarkMode_HighContrast_Spec2026_Cyan : ITestTheme
4+
{
5+
public string SourceColor => "#00BCD1"; //Cyan
6+
public bool IsDark => true;
7+
public Variant Variant => Variant.CMF;
8+
public double ContrastLevelValue => 1.0;
9+
public SpecVersion SpecVersion => SpecVersion.Spec2026;
10+
11+
// Primary
12+
public string Primary => "#A7F1FF";
13+
public string OnPrimary => "#003138";
14+
public string PrimaryContainer => "#00BCD1";
15+
public string OnPrimaryContainer => "#000000";
16+
// Secondary
17+
public string Secondary => "#BEEEF7";
18+
public string OnSecondary => "#003138";
19+
public string SecondaryContainer => "#7DABB4";
20+
public string OnSecondaryContainer => "#000000";
21+
// Tertiary
22+
public string Tertiary => "#A7F1FF";
23+
public string OnTertiary => "#003138";
24+
public string TertiaryContainer => "#61B7C6";
25+
public string OnTertiaryContainer => "#000000";
26+
// Error
27+
public string Error => "#FFDEDB";
28+
public string OnError => "#5A0D0E";
29+
public string ErrorContainer => "#F5827A";
30+
public string OnErrorContainer => "#000000";
31+
// Surface
32+
public string Surface => "#051012";
33+
public string SurfaceVariant => "#0E292E";
34+
public string OnSurface => "#FFFFFF";
35+
public string OnSurfaceVariant => "#CEEBF0";
36+
public string SurfaceDim => "#051012";
37+
public string SurfaceBright => "#153034";
38+
public string SurfaceTint => "#A7F1FF";
39+
// Background
40+
public string Background => "#051012";
41+
public string OnBackground => "#FFFFFF";
42+
// Outline
43+
public string Outline => "#A2BEC3";
44+
public string OutlineVariant => "#8DA8AE";
45+
// Shadow
46+
public string Shadow => "#000000";
47+
public string Scrim => "#000000";
48+
// Inverse
49+
public string InverseSurface => "#EDFCFF";
50+
public string InverseOnSurface => "#000000";
51+
public string InversePrimary => "#003F47";
52+
// Primary Fixed
53+
public string PrimaryFixed => "#00BCD1";
54+
public string OnPrimaryFixed => "#000000";
55+
public string PrimaryFixedDim => "#00B4C8";
56+
public string OnPrimaryFixedVariant => "#000000";
57+
// Secondary Fixed
58+
public string SecondaryFixed => "#BBEBF4";
59+
public string OnSecondaryFixed => "#000000";
60+
public string SecondaryFixedDim => "#ADDCE6";
61+
public string OnSecondaryFixedVariant => "#002429";
62+
// Tertiary Fixed
63+
public string TertiaryFixed => "#61B7C6";
64+
public string OnTertiaryFixed => "#000000";
65+
public string TertiaryFixedDim => "#59B0BE";
66+
public string OnTertiaryFixedVariant => "#000000";
67+
// Surface Container
68+
public string SurfaceContainerLowest => "#000000";
69+
public string SurfaceContainerLow => "#051619";
70+
public string SurfaceContainer => "#081C20";
71+
public string SurfaceContainerHigh => "#0C2326";
72+
public string SurfaceContainerHighest => "#0E292E";
73+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
namespace MaterialTheming.Tests.KnownTestThemes.CMF;
2+
3+
internal class DarkMode_HighContrast_Spec2026_Green : ITestTheme
4+
{
5+
public string SourceColor => "#338745"; //Green
6+
public bool IsDark => true;
7+
public Variant Variant => Variant.CMF;
8+
public double ContrastLevelValue => 1.0;
9+
public SpecVersion SpecVersion => SpecVersion.Spec2026;
10+
11+
// Primary
12+
public string Primary => "#A2F9AA";
13+
public string OnPrimary => "#003411";
14+
public string PrimaryContainer => "#62B56E";
15+
public string OnPrimaryContainer => "#000000";
16+
// Secondary
17+
public string Secondary => "#CBEFC9";
18+
public string OnSecondary => "#143219";
19+
public string SecondaryContainer => "#8AAC8A";
20+
public string OnSecondaryContainer => "#000000";
21+
// Tertiary
22+
public string Tertiary => "#B8F4BA";
23+
public string OnTertiary => "#003411";
24+
public string TertiaryContainer => "#78B17C";
25+
public string OnTertiaryContainer => "#000000";
26+
// Error
27+
public string Error => "#FFDEDB";
28+
public string OnError => "#5A0D0E";
29+
public string ErrorContainer => "#F5827A";
30+
public string OnErrorContainer => "#000000";
31+
// Surface
32+
public string Surface => "#081008";
33+
public string SurfaceVariant => "#182A1A";
34+
public string OnSurface => "#FFFFFF";
35+
public string OnSurfaceVariant => "#D6EBD2";
36+
public string SurfaceDim => "#081008";
37+
public string SurfaceBright => "#1E3020";
38+
public string SurfaceTint => "#A2F9AA";
39+
// Background
40+
public string Background => "#081008";
41+
public string OnBackground => "#FFFFFF";
42+
// Outline
43+
public string Outline => "#A9BEA7";
44+
public string OutlineVariant => "#94A992";
45+
// Shadow
46+
public string Shadow => "#000000";
47+
public string Scrim => "#000000";
48+
// Inverse
49+
public string InverseSurface => "#EBFFE7";
50+
public string InverseOnSurface => "#000000";
51+
public string InversePrimary => "#004217";
52+
// Primary Fixed
53+
public string PrimaryFixed => "#62B56E";
54+
public string OnPrimaryFixed => "#000000";
55+
public string PrimaryFixedDim => "#62B56E";
56+
public string OnPrimaryFixedVariant => "#000000";
57+
// Secondary Fixed
58+
public string SecondaryFixed => "#C8ECC6";
59+
public string OnSecondaryFixed => "#000000";
60+
public string SecondaryFixedDim => "#BADEB9";
61+
public string OnSecondaryFixedVariant => "#06250D";
62+
// Tertiary Fixed
63+
public string TertiaryFixed => "#78B17C";
64+
public string OnTertiaryFixed => "#000000";
65+
public string TertiaryFixedDim => "#78B17C";
66+
public string OnTertiaryFixedVariant => "#000000";
67+
// Surface Container
68+
public string SurfaceContainerLowest => "#000000";
69+
public string SurfaceContainerLow => "#0B160B";
70+
public string SurfaceContainer => "#0F1D10";
71+
public string SurfaceContainerHigh => "#142315";
72+
public string SurfaceContainerHighest => "#182A1A";
73+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
namespace MaterialTheming.Tests.KnownTestThemes.CMF;
2+
3+
internal class DarkMode_HighContrast_Spec2026_Magenta : ITestTheme
4+
{
5+
public string SourceColor => "#E85DAE"; //Magenta
6+
public bool IsDark => true;
7+
public Variant Variant => Variant.CMF;
8+
public double ContrastLevelValue => 1.0;
9+
public SpecVersion SpecVersion => SpecVersion.Spec2026;
10+
11+
// Primary
12+
public string Primary => "#FFDCEA";
13+
public string OnPrimary => "#5A003D";
14+
public string PrimaryContainer => "#FF71C2";
15+
public string OnPrimaryContainer => "#000000";
16+
// Secondary
17+
public string Secondary => "#FFDCEA";
18+
public string OnSecondary => "#4C1A37";
19+
public string SecondaryContainer => "#D58FB1";
20+
public string OnSecondaryContainer => "#000000";
21+
// Tertiary
22+
public string Tertiary => "#FFDCEA";
23+
public string OnTertiary => "#59033D";
24+
public string TertiaryContainer => "#EB81BA";
25+
public string OnTertiaryContainer => "#000000";
26+
// Error
27+
public string Error => "#FFDEDB";
28+
public string OnError => "#600008";
29+
public string ErrorContainer => "#FF7C74";
30+
public string OnErrorContainer => "#000000";
31+
// Surface
32+
public string Surface => "#190911";
33+
public string SurfaceVariant => "#3B1B2C";
34+
public string OnSurface => "#FFFFFF";
35+
public string OnSurfaceVariant => "#FFDCEA";
36+
public string SurfaceDim => "#190911";
37+
public string SurfaceBright => "#422133";
38+
public string SurfaceTint => "#FFDCEA";
39+
// Background
40+
public string Background => "#190911";
41+
public string OnBackground => "#FFFFFF";
42+
// Outline
43+
public string Outline => "#DCABC1";
44+
public string OutlineVariant => "#C696AC";
45+
// Shadow
46+
public string Shadow => "#000000";
47+
public string Scrim => "#000000";
48+
// Inverse
49+
public string InverseSurface => "#FFF8F8";
50+
public string InverseOnSurface => "#000000";
51+
public string InversePrimary => "#70004D";
52+
// Primary Fixed
53+
public string PrimaryFixed => "#FF71C2";
54+
public string OnPrimaryFixed => "#000000";
55+
public string PrimaryFixedDim => "#FF71C2";
56+
public string OnPrimaryFixedVariant => "#000000";
57+
// Secondary Fixed
58+
public string SecondaryFixed => "#FBB1D5";
59+
public string OnSecondaryFixed => "#000000";
60+
public string SecondaryFixedDim => "#ECA3C7";
61+
public string OnSecondaryFixedVariant => "#000000";
62+
// Tertiary Fixed
63+
public string TertiaryFixed => "#EB81BA";
64+
public string OnTertiaryFixed => "#000000";
65+
public string TertiaryFixedDim => "#EB81BA";
66+
public string OnTertiaryFixedVariant => "#000000";
67+
// Surface Container
68+
public string SurfaceContainerLowest => "#000000";
69+
public string SurfaceContainerLow => "#210C18";
70+
public string SurfaceContainer => "#2A111F";
71+
public string SurfaceContainerHigh => "#321725";
72+
public string SurfaceContainerHighest => "#3B1B2C";
73+
}

0 commit comments

Comments
 (0)