|
| 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