1
1
@use ' sass:map' ;
2
- @use ' sass:math' ;
3
2
@use ' sass:meta' ;
4
3
@use ' variables' ;
5
-
4
+ @use ' @material/elevation/elevation-theme ' as mdc-elevation ;
6
5
7
6
// A collection of mixins and CSS classes that can be used to apply elevation to a material
8
7
// element.
23
22
// For an explanation of the design behind how elevation is implemented, see the design doc at
24
23
// https://goo.gl/Kq0k9Z.
25
24
26
- // Colors for umbra, penumbra, and ambient shadows. As described in the design doc, each elevation
27
- // level is created using a set of 3 shadow values, one for umbra (the shadow representing the
28
- // space completely obscured by an object relative to its light source), one for penumbra (the
29
- // space partially obscured by an object), and one for ambient (the space which contains the object
30
- // itself). For a further explanation of these terms and their meanings, see
31
- // https://en.wikipedia.org/wiki/Umbra,_penumbra_and_antumbra.
32
-
33
- // Maps for the different shadow sets and their values within each z-space. These values were
34
- // created by taking a few reference shadow sets created by Google's Designers and interpolating
35
- // all of the values between them.
36
-
37
- @function _get-umbra-map ($color , $opacity ) {
38
- $shadow-color : if (meta .type-of ($color ) == color , rgba ($color , $opacity * 0.2 ), $color );
39
-
40
- @return (
41
- 0 : ' 0px 0px 0px 0px #{$shadow-color } ' ,
42
- 1 : ' 0px 2px 1px -1px #{$shadow-color } ' ,
43
- 2 : ' 0px 3px 1px -2px #{$shadow-color } ' ,
44
- 3 : ' 0px 3px 3px -2px #{$shadow-color } ' ,
45
- 4 : ' 0px 2px 4px -1px #{$shadow-color } ' ,
46
- 5 : ' 0px 3px 5px -1px #{$shadow-color } ' ,
47
- 6 : ' 0px 3px 5px -1px #{$shadow-color } ' ,
48
- 7 : ' 0px 4px 5px -2px #{$shadow-color } ' ,
49
- 8 : ' 0px 5px 5px -3px #{$shadow-color } ' ,
50
- 9 : ' 0px 5px 6px -3px #{$shadow-color } ' ,
51
- 10 : ' 0px 6px 6px -3px #{$shadow-color } ' ,
52
- 11 : ' 0px 6px 7px -4px #{$shadow-color } ' ,
53
- 12 : ' 0px 7px 8px -4px #{$shadow-color } ' ,
54
- 13 : ' 0px 7px 8px -4px #{$shadow-color } ' ,
55
- 14 : ' 0px 7px 9px -4px #{$shadow-color } ' ,
56
- 15 : ' 0px 8px 9px -5px #{$shadow-color } ' ,
57
- 16 : ' 0px 8px 10px -5px #{$shadow-color } ' ,
58
- 17 : ' 0px 8px 11px -5px #{$shadow-color } ' ,
59
- 18 : ' 0px 9px 11px -5px #{$shadow-color } ' ,
60
- 19 : ' 0px 9px 12px -6px #{$shadow-color } ' ,
61
- 20 : ' 0px 10px 13px -6px #{$shadow-color } ' ,
62
- 21 : ' 0px 10px 13px -6px #{$shadow-color } ' ,
63
- 22 : ' 0px 10px 14px -6px #{$shadow-color } ' ,
64
- 23 : ' 0px 11px 14px -7px #{$shadow-color } ' ,
65
- 24 : ' 0px 11px 15px -7px #{$shadow-color } '
66
- );
67
- }
68
-
69
- @function _get-penumbra-map ($color , $opacity ) {
70
- $shadow-color : if (meta .type-of ($color ) == color , rgba ($color , $opacity * 0.14 ), $color );
71
-
72
- @return (
73
- 0 : ' 0px 0px 0px 0px #{$shadow-color } ' ,
74
- 1 : ' 0px 1px 1px 0px #{$shadow-color } ' ,
75
- 2 : ' 0px 2px 2px 0px #{$shadow-color } ' ,
76
- 3 : ' 0px 3px 4px 0px #{$shadow-color } ' ,
77
- 4 : ' 0px 4px 5px 0px #{$shadow-color } ' ,
78
- 5 : ' 0px 5px 8px 0px #{$shadow-color } ' ,
79
- 6 : ' 0px 6px 10px 0px #{$shadow-color } ' ,
80
- 7 : ' 0px 7px 10px 1px #{$shadow-color } ' ,
81
- 8 : ' 0px 8px 10px 1px #{$shadow-color } ' ,
82
- 9 : ' 0px 9px 12px 1px #{$shadow-color } ' ,
83
- 10 : ' 0px 10px 14px 1px #{$shadow-color } ' ,
84
- 11 : ' 0px 11px 15px 1px #{$shadow-color } ' ,
85
- 12 : ' 0px 12px 17px 2px #{$shadow-color } ' ,
86
- 13 : ' 0px 13px 19px 2px #{$shadow-color } ' ,
87
- 14 : ' 0px 14px 21px 2px #{$shadow-color } ' ,
88
- 15 : ' 0px 15px 22px 2px #{$shadow-color } ' ,
89
- 16 : ' 0px 16px 24px 2px #{$shadow-color } ' ,
90
- 17 : ' 0px 17px 26px 2px #{$shadow-color } ' ,
91
- 18 : ' 0px 18px 28px 2px #{$shadow-color } ' ,
92
- 19 : ' 0px 19px 29px 2px #{$shadow-color } ' ,
93
- 20 : ' 0px 20px 31px 3px #{$shadow-color } ' ,
94
- 21 : ' 0px 21px 33px 3px #{$shadow-color } ' ,
95
- 22 : ' 0px 22px 35px 3px #{$shadow-color } ' ,
96
- 23 : ' 0px 23px 36px 3px #{$shadow-color } ' ,
97
- 24 : ' 0px 24px 38px 3px #{$shadow-color } '
98
- );
99
- }
100
-
101
- @function _get-ambient-map ($color , $opacity ) {
102
- $shadow-color : if (meta .type-of ($color ) == color , rgba ($color , $opacity * 0.12 ), $color );
103
-
104
- @return (
105
- 0 : ' 0px 0px 0px 0px #{$shadow-color } ' ,
106
- 1 : ' 0px 1px 3px 0px #{$shadow-color } ' ,
107
- 2 : ' 0px 1px 5px 0px #{$shadow-color } ' ,
108
- 3 : ' 0px 1px 8px 0px #{$shadow-color } ' ,
109
- 4 : ' 0px 1px 10px 0px #{$shadow-color } ' ,
110
- 5 : ' 0px 1px 14px 0px #{$shadow-color } ' ,
111
- 6 : ' 0px 1px 18px 0px #{$shadow-color } ' ,
112
- 7 : ' 0px 2px 16px 1px #{$shadow-color } ' ,
113
- 8 : ' 0px 3px 14px 2px #{$shadow-color } ' ,
114
- 9 : ' 0px 3px 16px 2px #{$shadow-color } ' ,
115
- 10 : ' 0px 4px 18px 3px #{$shadow-color } ' ,
116
- 11 : ' 0px 4px 20px 3px #{$shadow-color } ' ,
117
- 12 : ' 0px 5px 22px 4px #{$shadow-color } ' ,
118
- 13 : ' 0px 5px 24px 4px #{$shadow-color } ' ,
119
- 14 : ' 0px 5px 26px 4px #{$shadow-color } ' ,
120
- 15 : ' 0px 6px 28px 5px #{$shadow-color } ' ,
121
- 16 : ' 0px 6px 30px 5px #{$shadow-color } ' ,
122
- 17 : ' 0px 6px 32px 5px #{$shadow-color } ' ,
123
- 18 : ' 0px 7px 34px 6px #{$shadow-color } ' ,
124
- 19 : ' 0px 7px 36px 6px #{$shadow-color } ' ,
125
- 20 : ' 0px 8px 38px 7px #{$shadow-color } ' ,
126
- 21 : ' 0px 8px 40px 7px #{$shadow-color } ' ,
127
- 22 : ' 0px 8px 42px 7px #{$shadow-color } ' ,
128
- 23 : ' 0px 9px 44px 8px #{$shadow-color } ' ,
129
- 24 : ' 0px 9px 46px 8px #{$shadow-color } '
130
- );
131
- }
132
-
133
25
// The default duration value for elevation transitions.
134
26
$transition-duration : 280ms !default ;
135
27
@@ -139,35 +31,35 @@ $transition-timing-function: variables.$fast-out-slow-in-timing-function;
139
31
// The default color for elevation shadows.
140
32
$color : black !default ;
141
33
142
- // The default opacity scaling value for elevation shadows.
143
- $opacity : 1 !default ;
144
-
145
34
// Prefix for elevation-related selectors.
146
35
$prefix : ' mat-elevation-z' ;
147
36
148
37
// Applies the correct css rules to an element to give it the elevation specified by $zValue.
149
38
// The $zValue must be between 0 and 24.
150
- @mixin elevation ($zValue , $color : $color , $opacity : $opacity ) {
151
- @if meta .type-of ($zValue ) != number or not math . is-unitless ( $zValue ) {
152
- @error ' $zValue must be a unitless number ' ;
39
+ @mixin elevation ($zValue , $color : $color ) {
40
+ @if meta .type-of ($color ) == color {
41
+ @include mdc-elevation . elevation ( $zValue , $color ) ;
153
42
}
154
- @if $zValue < 0 or $zValue > 24 {
155
- @error ' $zValue must be between 0 and 24' ;
43
+ @else {
44
+ // Copied from @material/elevation/_elevation-theme.scss#_box-shadow
45
+ // TODO(mmalerba): Add support for graceful handling of CSS var color to MDC.
46
+ $umbra-z-value : map .get (mdc-elevation .$umbra-map , $zValue );
47
+ $penumbra-z-value : map .get (mdc-elevation .$penumbra-map , $zValue );
48
+ $ambient-z-value : map .get (mdc-elevation .$ambient-map , $zValue );
49
+ $box-shadow : (
50
+ #{' #{$umbra-z-value } #{$color } ' } ,
51
+ #{' #{$penumbra-z-value } #{$color } ' } ,
52
+ #{$ambient-z-value } $color
53
+ );
54
+ @include mdc-elevation .shadow ($box-shadow );
156
55
}
157
-
158
- box-shadow : #{map .get (_get-umbra-map ($color , $opacity ), $zValue )} ,
159
- #{map .get (_get-penumbra-map ($color , $opacity ), $zValue )} ,
160
- #{map .get (_get-ambient-map ($color , $opacity ), $zValue )} ;
161
56
}
162
57
163
58
// Applies the elevation to an element in a manner that allows
164
59
// consumers to override it via the Material elevation classes.
165
- @mixin overridable-elevation (
166
- $zValue ,
167
- $color : $color ,
168
- $opacity : $opacity ) {
60
+ @mixin overridable-elevation ($zValue , $color : $color ) {
169
61
& :not ([class *= ' #{$prefix}' ]) {
170
- @include elevation ($zValue , $color , $opacity );
62
+ @include elevation ($zValue , $color );
171
63
}
172
64
}
173
65
0 commit comments