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
@@ -86,8 +94,9 @@ $_cached-token-slots: null;
8694/// Generates a set of namespaced tokens for all components.
8795/// @param {Map} $systems The MDC system tokens
8896/// @param {Boolean} $include-non-systemized Whether to include non-systemized tokens
97+ /// @param {Boolean} $include-density Whether to include density tokens
8998/// @return {Map} A map of namespaced tokens
90- @function _generate-tokens ($systems , $include-non-systemized : false ) {
99+ @function _generate-tokens ($systems , $include-non-systemized : false , $include-density : false ) {
91100 $systems : map .merge ((
92101 md- sys- color: (),
93102 md- sys- elevation: (),
@@ -116,16 +125,63 @@ $_cached-token-slots: null;
116125 // Strip out tokens that are systemized by our made up density system.
117126 @each $namespace , $tokens in $result {
118127 @each $token , $value in $tokens {
119- @if density .is-systemized ($namespace , $token ) {
128+ @if density .is-systemized ($namespace , $token ) and not $include-density {
120129 $tokens : map .remove ($tokens , $token );
121130 }
122131 }
123132 $result : map .set ($result , $namespace , $tokens );
124133 }
134+
125135 @return $result ;
126136}
127137
128- @mixin system-level-colors ($theme , $overrides : ()) {
138+ // Return a new map where the values are the same as the provided map's
139+ // keys, prefixed with "--mat-app-". For example:
140+ // (key1: '', key2: '') --> (key1: --mat-app-key1, key2: --mat-app-key2)
141+ @function _create-system-app-vars-map ($map ) {
142+ $new-map : ();
143+ @each $key , $value in $map {
144+ $new-map : map .set ($new-map , $key , --#{$_system-fallback-prefix}-#{$key} );
145+ }
146+ @return $new-map ;
147+ }
148+
149+ // Create a components tokens map where values are based on
150+ // system fallback variables referencing Material's system keys.
151+ // Includes density token fallbacks where density is 0.
152+ @function create-system-fallbacks () {
153+ $app-vars : (
154+ ' md-sys-color' :
155+ _create-system-app-vars-map (m3-token-definitions .md-sys-color-values-light ()),
156+ ' md-sys-typescale' :
157+ _create-system-app-vars-map (m3-token-definitions .md-sys-typescale-values ()),
158+ ' md-sys-elevation' :
159+ _create-system-app-vars-map (m3-token-definitions .md-sys-elevation-values ()),
160+ ' md-sys-state' :
161+ _create-system-app-vars-map (m3-token-definitions .md-sys-state-values ()),
162+ ' md-sys-shape' :
163+ _create-system-app-vars-map (m3-token-definitions .md-sys-shape-values ()),
164+ );
165+
166+ @return sass-utils .deep-merge-all (
167+ _generate-tokens ($app-vars , true , true ),
168+ generate-density-tokens (0 )
169+ );
170+ }
171+
172+ // Emits CSS variables for Material's system level values. Uses the
173+ // namespace prefix in $_system-fallback-prefix.
174+ // e.g. --mat-app-surface: #E5E5E5
175+ @mixin theme ($theme , $overrides : ()) {
176+ @include system-level-colors ($theme , $overrides , $_system-fallback-prefix );
177+ @include system-level-typography ($theme , $overrides , $_system-fallback-prefix );
178+ @include system-level-elevation ($theme , $overrides , $_system-fallback-prefix );
179+ @include system-level-shape ($theme , $overrides , $_system-fallback-prefix );
180+ @include system-level-motion ($theme , $overrides , $_system-fallback-prefix );
181+ @include system-level-state ($theme , $overrides , $_system-fallback-prefix );
182+ }
183+
184+ @mixin system-level-colors ($theme , $overrides : (), $prefix : null) {
129185 $palettes : map .get ($theme , _mat-theming-internals-do-not-access , palettes );
130186 $base-palettes : (
131187 neutral: map .get ($palettes , neutral ),
@@ -135,12 +191,15 @@ $_cached-token-slots: null;
135191 );
136192
137193 $type : map .get ($theme , _mat-theming-internals-do-not-access , theme-type );
138- $system-variables-prefix : map .get ($theme , _mat-theming-internals-do-not-access ,
139- color-system-variables-prefix ) or sys;
140194 $primary : map .merge (map .get ($palettes , primary ), $base-palettes );
141195 $tertiary : map .merge (map .get ($palettes , tertiary ), $base-palettes );
142196 $error : map .get ($palettes , error );
143197
198+ @if (not $prefix ) {
199+ $prefix : map .get ($theme , _mat-theming-internals-do-not-access ,
200+ color-system-variables-prefix ) or $_system-level-prefix ;
201+ }
202+
144203 $ref : (
145204 md- ref- palette: _generate-ref-palette-tokens ($primary , $tertiary , $error )
146205 );
@@ -150,27 +209,28 @@ $_cached-token-slots: null;
150209 m3-token-definitions .md-sys-color-values-light ($ref ));
151210
152211 @each $name , $value in $sys-colors {
153- -- #{$system-variables- prefix } - #{$name } : #{map .get ($overrides , $name ) or $value } ;
212+ -- #{$prefix } - #{$name } : #{map .get ($overrides , $name ) or $value } ;
154213 }
155214}
156215
157- @mixin system-level-typography ($theme , $overrides : ()) {
216+ @mixin system-level-typography ($theme , $overrides : (), $prefix : null ) {
158217 $font-definition : map .get ($theme , _mat-theming-internals-do-not-access , font-definition );
159218 $brand : map .get ($font-definition , brand );
160219 $plain : map .get ($font-definition , plain );
161220 $bold : map .get ($font-definition , bold );
162221 $medium : map .get ($font-definition , medium );
163222 $regular : map .get ($font-definition , regular );
164- $system-variables-prefix : map .get ($theme , _mat-theming-internals-do-not-access ,
165- typography-system-variables-prefix ) or sys;
166223 $ref : (
167224 md- ref- typeface: _generate-ref-typeface-tokens ($brand , $plain , $bold , $medium , $regular )
168225 );
169226
170- $sys-typescale : m3-token-definitions .md-sys-typescale-values ($ref );
227+ @if (not $prefix ) {
228+ $prefix : map .get ($theme , _mat-theming-internals-do-not-access ,
229+ typography-system-variables-prefix ) or $_system-level-prefix ;
230+ }
171231
172- @each $name , $value in $ sys-typescale {
173- -- #{$system-variables- prefix } - #{$name } : #{map .get ($overrides , $name ) or $value } ;
232+ @each $name , $value in m3-token-definitions . md- sys-typescale-values ( $ref ) {
233+ -- #{$prefix } - #{$name } : #{map .get ($overrides , $name ) or $value } ;
174234 }
175235}
176236
@@ -182,6 +242,40 @@ $_cached-token-slots: null;
182242 @return $result ;
183243}
184244
245+ @mixin system-level-elevation ($theme , $overrides : (), $prefix : $_system-level-prefix ) {
246+ $shadow-color : map .get (
247+ $theme , _mat-theming-internals-do-not-access , color-tokens , (mdc, theme), shadow );
248+
249+ @for $level from 0 through 24 {
250+ $value : elevation .get-box-shadow ($level , $shadow-color );
251+ -- #{$prefix } -elevation-shadow-level- #{$level } : #{$value } ;
252+ }
253+
254+ @each $name , $value in m3-token-definitions .md-sys-elevation-values () {
255+ $level : map .get ($overrides , $name ) or $value ;
256+ $value : elevation .get-box-shadow ($level , $shadow-color );
257+ -- #{$prefix } - #{$name } : #{$value } ;
258+ }
259+ }
260+
261+ @mixin system-level-shape ($theme , $overrides : (), $prefix : $_system-level-prefix ) {
262+ @each $name , $value in m3-token-definitions .md-sys-shape-values () {
263+ -- #{$prefix } - #{$name } : #{map .get ($overrides , $name ) or $value } ;
264+ }
265+ }
266+
267+ @mixin system-level-state ($theme , $overrides : (), $prefix : $_system-level-prefix ) {
268+ @each $name , $value in m3-token-definitions .md-sys-state-values () {
269+ -- #{$prefix } - #{$name } : #{map .get ($overrides , $name ) or $value } ;
270+ }
271+ }
272+
273+ @mixin system-level-motion ($theme , $overrides : (), $prefix : $_system-level-prefix ) {
274+ @each $name , $value in m3-token-definitions .md-sys-motion-values () {
275+ -- #{$prefix } - #{$name } : #{map .get ($overrides , $name ) or $value } ;
276+ }
277+ }
278+
185279@function _get-sys-color ($type , $ref , $prefix ) {
186280 $mdc-sys-color : if ($type == dark ,
187281 m3-token-definitions .md-sys-color-values-dark ($ref ),
0 commit comments