Skip to content

Commit af430cf

Browse files
committed
feat(multiple): fallback to system level variables
1 parent fd47a0e commit af430cf

File tree

7 files changed

+203
-55
lines changed

7 files changed

+203
-55
lines changed

src/material/_index.scss

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
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, system-level-typography;
21+
@forward './core/tokens/m3-tokens' show system-level-colors,
22+
system-level-typography, system-level-elevation, system-level-shape,
23+
system-level-motion, system-level-state;
2224

2325
// Private/Internal
2426
@forward './core/density/private/all-density' show all-component-densities;

src/material/core/style/_elevation.scss

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,11 @@ $prefix: 'mat-elevation-z';
143143
@return null;
144144
}
145145

146+
// Return the value if it is a CSS variable name
147+
@if (meta.type-of($zValue) == string and string.index($zValue, '--') == 1) {
148+
@return $zValue;
149+
}
150+
146151
@if meta.type-of($zValue) != number or not math.is-unitless($zValue) {
147152
@error '$zValue must be a unitless number, but received `#{$zValue}`';
148153
}

src/material/core/style/_sass-utils.scss

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
@use 'sass:color';
2+
@use 'sass:string';
23
@use 'sass:list';
34
@use 'sass:map';
45
@use 'sass:meta';
@@ -67,9 +68,18 @@ $use-system-typography-variables: false;
6768
@if (meta.type-of($color) == 'color') {
6869
@return color.change($color, $args...);
6970
}
70-
@else if ($color != null and map.get($args, alpha) != null and $use-system-color-variables) {
71+
@else if ($color != null and map.get($args, alpha) != null) {
7172
$opacity: map.get($args, alpha);
72-
@return #{color-mix(in srgb, #{$color} #{($opacity * 100) + '%'}, transparent)};
73+
@if meta.type-of($opacity) == number {
74+
$opacity: ($opacity * 100) + '%';
75+
}
76+
77+
// Wrap the $color as a `var()` if it's the name of a CSS variable
78+
@if (meta.type-of($opacity) == string and string.index($color, '--') == 1) {
79+
$color: var($color);
80+
}
81+
82+
@return #{color-mix(in srgb, #{$color} #{$opacity}, transparent)};
7383
}
7484
@return $color;
7585
}

src/material/core/tokens/_m3-tokens.scss

Lines changed: 105 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,17 @@
44
@use './m3';
55
@use './m3/definitions' as m3-token-definitions;
66
@use '../tokens/m2' as m2-tokens;
7+
@use '../style/elevation';
78
@use './density';
89
@use './format-tokens';
910

11+
// Default system level prefix to use when directly calling the `system-level-*` mixins
12+
$system-level-prefix: sys;
13+
14+
// Prefix used for component token fallback variables, e.g.
15+
// `color: var(--mdc-text-button-label-text-color, var(--mat-app-primary));`
16+
$system-fallback-prefix: mat-app;
17+
1018
/// Generates tokens for the given palette with the given prefix.
1119
/// @param {Map} $palette The palette to generate tokens for
1220
/// @param {String} $prefix The key prefix used to name the tokens
@@ -87,7 +95,7 @@ $_cached-token-slots: null;
8795
/// @param {Map} $systems The MDC system tokens
8896
/// @param {Boolean} $include-non-systemized Whether to include non-systemized tokens
8997
/// @return {Map} A map of namespaced tokens
90-
@function _generate-tokens($systems, $include-non-systemized: false) {
98+
@function _generate-tokens($systems, $include-non-systemized: false, $include-density: false) {
9199
$systems: map.merge((
92100
md-sys-color: (),
93101
md-sys-elevation: (),
@@ -116,16 +124,63 @@ $_cached-token-slots: null;
116124
// Strip out tokens that are systemized by our made up density system.
117125
@each $namespace, $tokens in $result {
118126
@each $token, $value in $tokens {
119-
@if density.is-systemized($namespace, $token) {
127+
@if density.is-systemized($namespace, $token) and not $include-density {
120128
$tokens: map.remove($tokens, $token);
121129
}
122130
}
123131
$result: map.set($result, $namespace, $tokens);
124132
}
133+
125134
@return $result;
126135
}
127136

128-
@mixin system-level-colors($theme, $overrides: ()) {
137+
// Return a new map where the values are the same as the provided map's
138+
// keys, prefixed with "--mat-app-". For example:
139+
// (key1: '', key2: '') --> (key1: --mat-app-key1, key2: --mat-app-key2)
140+
@function create-system-app-vars-map($map) {
141+
$new-map: ();
142+
@each $key, $value in $map {
143+
$new-map: map.set($new-map, $key, --#{$system-fallback-prefix}-#{$key});
144+
}
145+
@return $new-map;
146+
}
147+
148+
// Create a components tokens map where values are based on
149+
// system fallback variables referencing Material's system keys.
150+
// Includes density token fallbacks where density is 0.
151+
@function create-system-fallbacks() {
152+
$app-vars: (
153+
'md-sys-color':
154+
create-system-app-vars-map(m3-token-definitions.md-sys-color-values-light()),
155+
'md-sys-typescale':
156+
create-system-app-vars-map(m3-token-definitions.md-sys-typescale-values()),
157+
'md-sys-elevation':
158+
create-system-app-vars-map(m3-token-definitions.md-sys-elevation-values()),
159+
'md-sys-state':
160+
create-system-app-vars-map(m3-token-definitions.md-sys-state-values()),
161+
'md-sys-shape':
162+
create-system-app-vars-map(m3-token-definitions.md-sys-shape-values()),
163+
);
164+
165+
@return sass-utils.deep-merge-all(
166+
_generate-tokens($app-vars, true, true),
167+
generate-density-tokens(0)
168+
);
169+
}
170+
171+
// Emits CSS variables for Material's system level values. Uses the
172+
// namespace prefix in $system-fallback-prefix.
173+
// e.g. --mat-app-surface: #E5E5E5
174+
@mixin theme($theme, $overrides: ()) {
175+
@include system-level-colors($theme, $overrides, $system-fallback-prefix);
176+
@include system-level-typography($theme, $overrides, $system-fallback-prefix);
177+
@include system-level-elevation($theme, $overrides, $system-fallback-prefix);
178+
@include system-level-shape($theme, $overrides, $system-fallback-prefix);
179+
@include system-level-motion($theme, $overrides, $system-fallback-prefix);
180+
@include system-level-state($theme, $overrides, $system-fallback-prefix);
181+
}
182+
183+
@mixin system-level-colors($theme, $overrides: (), $prefix: null) {
129184
$palettes: map.get($theme, _mat-theming-internals-do-not-access, palettes);
130185
$base-palettes: (
131186
neutral: map.get($palettes, neutral),
@@ -135,11 +190,15 @@ $_cached-token-slots: null;
135190
);
136191

137192
$type: map.get($theme, _mat-theming-internals-do-not-access, theme-type);
138-
$system-variables-prefix: map.get($theme, system-variables-prefix) or sys;
139193
$primary: map.merge(map.get($palettes, primary), $base-palettes);
140194
$tertiary: map.merge(map.get($palettes, tertiary), $base-palettes);
141195
$error: map.get($palettes, error);
142196

197+
@if (not $prefix) {
198+
// TODO: Change this after #29513 is merged.
199+
$prefix: map.get($theme, system-variables-prefix) or $system-level-prefix;
200+
}
201+
143202
$ref: (
144203
md-ref-palette: _generate-ref-palette-tokens($primary, $tertiary, $error)
145204
);
@@ -149,26 +208,28 @@ $_cached-token-slots: null;
149208
m3-token-definitions.md-sys-color-values-light($ref));
150209

151210
@each $name, $value in $sys-colors {
152-
--#{$system-variables-prefix}-#{$name}: #{map.get($overrides, $name) or $value};
211+
--#{$prefix}-#{$name}: #{map.get($overrides, $name) or $value};
153212
}
154213
}
155214

156-
@mixin system-level-typography($theme, $overrides: ()) {
215+
@mixin system-level-typography($theme, $overrides: (), $prefix: null) {
157216
$font-definition: map.get($theme, _mat-theming-internals-do-not-access, font-definition);
158217
$brand: map.get($font-definition, brand);
159218
$plain: map.get($font-definition, plain);
160219
$bold: map.get($font-definition, bold);
161220
$medium: map.get($font-definition, medium);
162221
$regular: map.get($font-definition, regular);
163-
$system-variables-prefix: map.get($theme, system-variables-prefix) or sys;
164222
$ref: (
165223
md-ref-typeface: _generate-ref-typeface-tokens($brand, $plain, $bold, $medium, $regular)
166224
);
167225

168-
$sys-typescale: m3-token-definitions.md-sys-typescale-values($ref);
226+
@if (not $prefix) {
227+
// TODO: Change this after #29513 is merged.
228+
$prefix: map.get($theme, system-variables-prefix) or $system-level-prefix;
229+
}
169230

170-
@each $name, $value in $sys-typescale {
171-
--#{$system-variables-prefix}-#{$name}: #{map.get($overrides, $name) or $value};
231+
@each $name, $value in m3-token-definitions.md-sys-typescale-values($ref) {
232+
--#{$prefix}-#{$name}: #{map.get($overrides, $name) or $value};
172233
}
173234
}
174235

@@ -180,6 +241,40 @@ $_cached-token-slots: null;
180241
@return $result;
181242
}
182243

244+
@mixin system-level-elevation($theme, $overrides: (), $prefix: $system-level-prefix) {
245+
$shadow-color: map.get(
246+
$theme, _mat-theming-internals-do-not-access, color-tokens, (mdc, theme), shadow);
247+
248+
@for $level from 0 through 24 {
249+
$value: elevation.get-box-shadow($level, $shadow-color);
250+
--#{$prefix}-elevation-shadow-level-#{$level}: #{$value};
251+
}
252+
253+
@each $name, $value in m3-token-definitions.md-sys-elevation-values() {
254+
$level: map.get($overrides, $name) or $value;
255+
$value: elevation.get-box-shadow($level, $shadow-color);
256+
--#{$prefix}-#{$name}: #{$value};
257+
}
258+
}
259+
260+
@mixin system-level-shape($theme, $overrides: (), $prefix: $system-level-prefix) {
261+
@each $name, $value in m3-token-definitions.md-sys-shape-values() {
262+
--#{$prefix}-#{$name}: #{map.get($overrides, $name) or $value};
263+
}
264+
}
265+
266+
@mixin system-level-state($theme, $overrides: (), $prefix: $system-level-prefix) {
267+
@each $name, $value in m3-token-definitions.md-sys-state-values() {
268+
--#{$prefix}-#{$name}: #{map.get($overrides, $name) or $value};
269+
}
270+
}
271+
272+
@mixin system-level-motion($theme, $overrides: (), $prefix: $system-level-prefix) {
273+
@each $name, $value in m3-token-definitions.md-sys-motion-values() {
274+
--#{$prefix}-#{$name}: #{map.get($overrides, $name) or $value};
275+
}
276+
}
277+
183278
@function _get-sys-color($type, $ref, $prefix) {
184279
$mdc-sys-color: if($type == dark,
185280
m3-token-definitions.md-sys-color-values-dark($ref),

src/material/core/tokens/_token-definition.scss

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
@use 'sass:list';
33
@use 'sass:map';
44
@use 'sass:meta';
5+
@use 'sass:string';
56
@use 'sass:math';
67
@use '../m2/palette' as m2-palette;
78
@use '../m2/theming' as m2-theming;
@@ -161,6 +162,12 @@ $_system-fallbacks: null;
161162
$color-key: map.get($pair, color);
162163
$opacity-key: map.get($pair, opacity);
163164
$color: map.get($tokens, $color-key);
165+
166+
// If the color is a CSS variable name, wrap it in a `var()` statement
167+
@if (meta.type-of($color) == 'string' and string.index($color, '--') == 1) {
168+
$color: var(#{$color});
169+
}
170+
164171
$opacity: map.get($opacity-lookup, $opacity-key);
165172

166173
@if(meta.type-of($color) == 'color') {

0 commit comments

Comments
 (0)