Skip to content

Commit da57ca0

Browse files
authored
refactor(material/core): split out m3 theme mixins (#29619)
1 parent cb1450f commit da57ca0

File tree

4 files changed

+168
-164
lines changed

4 files changed

+168
-164
lines changed

src/material/_index.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
@forward './core/typography/typography' show typography-hierarchy;
1919
@forward './core/typography/typography-utils' show font-shorthand;
2020
@forward './core/tokens/m2' show m2-tokens-from-theme;
21-
@forward './core/tokens/m3-tokens' show system-level-colors,
21+
@forward './core/tokens/m3-system' show system-level-colors,
2222
system-level-typography, system-level-elevation, system-level-shape,
2323
system-level-motion, system-level-state;
2424

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
@use '../style/elevation';
2+
@use '../style/sass-utils';
3+
@use './m3-tokens';
4+
@use './m3/definitions';
5+
@use 'sass:map';
6+
7+
// Prefix used for component token fallback variables, e.g.
8+
// `color: var(--mdc-text-button-label-text-color, var(--mat-app-primary));`
9+
$_system-fallback-prefix: mat-app;
10+
11+
// Default system level prefix to use when directly calling the `system-level-*` mixins
12+
$_system-level-prefix: sys;
13+
14+
// Emits CSS variables for Material's system level values. Uses the
15+
// namespace prefix in $_system-fallback-prefix.
16+
// e.g. --mat-app-surface: #E5E5E5
17+
@mixin theme($theme, $overrides: ()) {
18+
@include system-level-colors($theme, $overrides, $_system-fallback-prefix);
19+
@include system-level-typography($theme, $overrides, $_system-fallback-prefix);
20+
@include system-level-elevation($theme, $overrides, $_system-fallback-prefix);
21+
@include system-level-shape($theme, $overrides, $_system-fallback-prefix);
22+
@include system-level-motion($theme, $overrides, $_system-fallback-prefix);
23+
@include system-level-state($theme, $overrides, $_system-fallback-prefix);
24+
}
25+
26+
@mixin system-level-colors($theme, $overrides: (), $prefix: null) {
27+
$palettes: map.get($theme, _mat-theming-internals-do-not-access, palettes);
28+
$base-palettes: (
29+
neutral: map.get($palettes, neutral),
30+
neutral-variant: map.get($palettes, neutral-variant),
31+
secondary: map.get($palettes, secondary),
32+
error: map.get($palettes, error),
33+
);
34+
35+
$type: map.get($theme, _mat-theming-internals-do-not-access, theme-type);
36+
$primary: map.merge(map.get($palettes, primary), $base-palettes);
37+
$tertiary: map.merge(map.get($palettes, tertiary), $base-palettes);
38+
$error: map.get($palettes, error);
39+
40+
@if (not $prefix) {
41+
$prefix: map.get($theme, _mat-theming-internals-do-not-access,
42+
color-system-variables-prefix) or $_system-level-prefix;
43+
}
44+
45+
$ref: (
46+
md-ref-palette: m3-tokens.generate-ref-palette-tokens($primary, $tertiary, $error)
47+
);
48+
49+
$sys-colors: if($type == dark,
50+
definitions.md-sys-color-values-dark($ref),
51+
definitions.md-sys-color-values-light($ref));
52+
53+
& {
54+
@each $name, $value in $sys-colors {
55+
--#{$prefix}-#{$name}: #{map.get($overrides, $name) or $value};
56+
}
57+
}
58+
}
59+
60+
@mixin system-level-typography($theme, $overrides: (), $prefix: null) {
61+
$font-definition: map.get($theme, _mat-theming-internals-do-not-access, font-definition);
62+
$brand: map.get($font-definition, brand);
63+
$plain: map.get($font-definition, plain);
64+
$bold: map.get($font-definition, bold);
65+
$medium: map.get($font-definition, medium);
66+
$regular: map.get($font-definition, regular);
67+
$ref: (md-ref-typeface:
68+
m3-tokens.generate-ref-typeface-tokens($brand, $plain, $bold, $medium, $regular)
69+
);
70+
71+
@if (not $prefix) {
72+
$prefix: map.get($theme, _mat-theming-internals-do-not-access,
73+
typography-system-variables-prefix) or $_system-level-prefix;
74+
}
75+
76+
& {
77+
@each $name, $value in definitions.md-sys-typescale-values($ref) {
78+
--#{$prefix}-#{$name}: #{map.get($overrides, $name) or $value};
79+
}
80+
}
81+
}
82+
83+
@mixin system-level-elevation($theme, $overrides: (), $prefix: $_system-level-prefix) {
84+
$shadow-color: map.get(
85+
$theme, _mat-theming-internals-do-not-access, color-tokens, (mdc, theme), shadow);
86+
87+
@for $level from 0 through 24 {
88+
$value: elevation.get-box-shadow($level, $shadow-color);
89+
--#{$prefix}-elevation-shadow-level-#{$level}: #{$value};
90+
}
91+
92+
@each $name, $value in definitions.md-sys-elevation-values() {
93+
$level: map.get($overrides, $name) or $value;
94+
$value: elevation.get-box-shadow($level, $shadow-color);
95+
--#{$prefix}-#{$name}: #{$value};
96+
}
97+
}
98+
99+
@mixin system-level-shape($theme, $overrides: (), $prefix: $_system-level-prefix) {
100+
& {
101+
@each $name, $value in definitions.md-sys-shape-values() {
102+
--#{$prefix}-#{$name}: #{map.get($overrides, $name) or $value};
103+
}
104+
}
105+
}
106+
107+
@mixin system-level-state($theme, $overrides: (), $prefix: $_system-level-prefix) {
108+
& {
109+
@each $name, $value in definitions.md-sys-state-values() {
110+
--#{$prefix}-#{$name}: #{map.get($overrides, $name) or $value};
111+
}
112+
}
113+
}
114+
115+
@mixin system-level-motion($theme, $overrides: (), $prefix: $_system-level-prefix) {
116+
& {
117+
@each $name, $value in definitions.md-sys-motion-values() {
118+
--#{$prefix}-#{$name}: #{map.get($overrides, $name) or $value};
119+
}
120+
}
121+
}
122+
123+
// Return a new map where the values are the same as the provided map's
124+
// keys, prefixed with "--mat-app-". For example:
125+
// (key1: '', key2: '') --> (key1: --mat-app-key1, key2: --mat-app-key2)
126+
@function _create-system-app-vars-map($map) {
127+
$new-map: ();
128+
@each $key, $value in $map {
129+
$new-map: map.set($new-map, $key, --#{$_system-fallback-prefix}-#{$key});
130+
}
131+
@return $new-map;
132+
}
133+
134+
// Create a components tokens map where values are based on
135+
// system fallback variables referencing Material's system keys.
136+
// Includes density token fallbacks where density is 0.
137+
@function create-system-fallbacks() {
138+
$app-vars: (
139+
'md-sys-color':
140+
_create-system-app-vars-map(definitions.md-sys-color-values-light()),
141+
'md-sys-typescale':
142+
_create-system-app-vars-map(definitions.md-sys-typescale-values()),
143+
'md-sys-elevation':
144+
_create-system-app-vars-map(definitions.md-sys-elevation-values()),
145+
'md-sys-state':
146+
_create-system-app-vars-map(definitions.md-sys-state-values()),
147+
'md-sys-shape':
148+
_create-system-app-vars-map(definitions.md-sys-shape-values()),
149+
);
150+
151+
@return sass-utils.deep-merge-all(
152+
m3-tokens.generate-tokens($app-vars, true, true),
153+
m3-tokens.generate-density-tokens(0)
154+
);
155+
}

0 commit comments

Comments
 (0)