1
1
@use ' sass:map' ;
2
+ @use ' sass:math' ;
2
3
@use ' sass:meta' ;
3
- @use ' variables' ;
4
- @use ' @material/elevation/elevation-theme' as mdc-elevation ;
4
+ @use ' sass:string' ;
5
+ @use ' ./variables' ;
6
+
7
+ $_umbra-opacity : 0.2 ;
8
+ $_penumbra-opacity : 0.14 ;
9
+ $_ambient-opacity : 0.12 ;
10
+
11
+ $_umbra-map : (
12
+ 0 : ' 0px 0px 0px 0px' ,
13
+ 1 : ' 0px 2px 1px -1px' ,
14
+ 2 : ' 0px 3px 1px -2px' ,
15
+ 3 : ' 0px 3px 3px -2px' ,
16
+ 4 : ' 0px 2px 4px -1px' ,
17
+ 5 : ' 0px 3px 5px -1px' ,
18
+ 6 : ' 0px 3px 5px -1px' ,
19
+ 7 : ' 0px 4px 5px -2px' ,
20
+ 8 : ' 0px 5px 5px -3px' ,
21
+ 9 : ' 0px 5px 6px -3px' ,
22
+ 10 : ' 0px 6px 6px -3px' ,
23
+ 11 : ' 0px 6px 7px -4px' ,
24
+ 12 : ' 0px 7px 8px -4px' ,
25
+ 13 : ' 0px 7px 8px -4px' ,
26
+ 14 : ' 0px 7px 9px -4px' ,
27
+ 15 : ' 0px 8px 9px -5px' ,
28
+ 16 : ' 0px 8px 10px -5px' ,
29
+ 17 : ' 0px 8px 11px -5px' ,
30
+ 18 : ' 0px 9px 11px -5px' ,
31
+ 19 : ' 0px 9px 12px -6px' ,
32
+ 20 : ' 0px 10px 13px -6px' ,
33
+ 21 : ' 0px 10px 13px -6px' ,
34
+ 22 : ' 0px 10px 14px -6px' ,
35
+ 23 : ' 0px 11px 14px -7px' ,
36
+ 24 : ' 0px 11px 15px -7px' ,
37
+ );
38
+
39
+ $_penumbra-map : (
40
+ 0 : ' 0px 0px 0px 0px' ,
41
+ 1 : ' 0px 1px 1px 0px' ,
42
+ 2 : ' 0px 2px 2px 0px' ,
43
+ 3 : ' 0px 3px 4px 0px' ,
44
+ 4 : ' 0px 4px 5px 0px' ,
45
+ 5 : ' 0px 5px 8px 0px' ,
46
+ 6 : ' 0px 6px 10px 0px' ,
47
+ 7 : ' 0px 7px 10px 1px' ,
48
+ 8 : ' 0px 8px 10px 1px' ,
49
+ 9 : ' 0px 9px 12px 1px' ,
50
+ 10 : ' 0px 10px 14px 1px' ,
51
+ 11 : ' 0px 11px 15px 1px' ,
52
+ 12 : ' 0px 12px 17px 2px' ,
53
+ 13 : ' 0px 13px 19px 2px' ,
54
+ 14 : ' 0px 14px 21px 2px' ,
55
+ 15 : ' 0px 15px 22px 2px' ,
56
+ 16 : ' 0px 16px 24px 2px' ,
57
+ 17 : ' 0px 17px 26px 2px' ,
58
+ 18 : ' 0px 18px 28px 2px' ,
59
+ 19 : ' 0px 19px 29px 2px' ,
60
+ 20 : ' 0px 20px 31px 3px' ,
61
+ 21 : ' 0px 21px 33px 3px' ,
62
+ 22 : ' 0px 22px 35px 3px' ,
63
+ 23 : ' 0px 23px 36px 3px' ,
64
+ 24 : ' 0px 24px 38px 3px' ,
65
+ );
66
+
67
+ $_ambient-map : (
68
+ 0 : ' 0px 0px 0px 0px' ,
69
+ 1 : ' 0px 1px 3px 0px' ,
70
+ 2 : ' 0px 1px 5px 0px' ,
71
+ 3 : ' 0px 1px 8px 0px' ,
72
+ 4 : ' 0px 1px 10px 0px' ,
73
+ 5 : ' 0px 1px 14px 0px' ,
74
+ 6 : ' 0px 1px 18px 0px' ,
75
+ 7 : ' 0px 2px 16px 1px' ,
76
+ 8 : ' 0px 3px 14px 2px' ,
77
+ 9 : ' 0px 3px 16px 2px' ,
78
+ 10 : ' 0px 4px 18px 3px' ,
79
+ 11 : ' 0px 4px 20px 3px' ,
80
+ 12 : ' 0px 5px 22px 4px' ,
81
+ 13 : ' 0px 5px 24px 4px' ,
82
+ 14 : ' 0px 5px 26px 4px' ,
83
+ 15 : ' 0px 6px 28px 5px' ,
84
+ 16 : ' 0px 6px 30px 5px' ,
85
+ 17 : ' 0px 6px 32px 5px' ,
86
+ 18 : ' 0px 7px 34px 6px' ,
87
+ 19 : ' 0px 7px 36px 6px' ,
88
+ 20 : ' 0px 8px 38px 7px' ,
89
+ 21 : ' 0px 8px 40px 7px' ,
90
+ 22 : ' 0px 8px 42px 7px' ,
91
+ 23 : ' 0px 9px 44px 8px' ,
92
+ 24 : ' 0px 9px 46px 8px' ,
93
+ );
5
94
6
95
// A collection of mixins and CSS classes that can be used to apply elevation to a material
7
96
// element.
@@ -37,29 +126,7 @@ $prefix: 'mat-elevation-z';
37
126
// Applies the correct css rules to an element to give it the elevation specified by $zValue.
38
127
// The $zValue must be between 0 and 24.
39
128
@mixin elevation ($zValue , $color : $color , $opacity : null) {
40
- @if meta .type-of ($color ) == color and $opacity == null {
41
- @include mdc-elevation .elevation ($zValue , $color );
42
- }
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
-
50
- $color-opacity : if ($opacity != null , $opacity , 1 );
51
- $umbra-color : _compute-color-opacity ($color , mdc-elevation .$umbra-opacity * $color-opacity );
52
- $penumbra-color :
53
- _compute-color-opacity ($color , mdc-elevation .$penumbra-opacity * $color-opacity );
54
- $ambient-color : _compute-color-opacity ($color , mdc-elevation .$ambient-opacity * $color-opacity );
55
-
56
- $box-shadow : (
57
- #{' #{$umbra-z-value } #{$umbra-color } ' } ,
58
- #{' #{$penumbra-z-value } #{$penumbra-color } ' } ,
59
- #{$ambient-z-value } $ambient-color
60
- );
61
- @include mdc-elevation .shadow ($box-shadow );
62
- }
129
+ box-shadow : get-box-shadow ($zValue , $color , $opacity );
63
130
}
64
131
65
132
// Applies the elevation to an element in a manner that allows
@@ -71,8 +138,30 @@ $prefix: 'mat-elevation-z';
71
138
}
72
139
73
140
// Gets the box shadow value for a specific elevation.
74
- @function get-box-shadow ($z-value , $shadow-color : black ) {
75
- @return mdc-elevation .elevation-box-shadow ($z-value , $shadow-color );
141
+ @function get-box-shadow ($zValue , $shadow-color : black , $opacity : null ) {
142
+ @if $zValue == null {
143
+ @return null;
144
+ }
145
+
146
+ @if meta .type-of ($zValue ) != number or not math .is-unitless ($zValue ) {
147
+ @error ' $zValue must be a unitless number, but received `#{$zValue } `' ;
148
+ }
149
+
150
+ @if $zValue < 0 or $zValue > 24 {
151
+ @error ' $zValue must be between 0 and 24, but received `#{$zValue } `' ;
152
+ }
153
+
154
+ $umbra-z-value : map .get ($_umbra-map , $zValue );
155
+ $penumbra-z-value : map .get ($_penumbra-map , $zValue );
156
+ $ambient-z-value : map .get ($_ambient-map , $zValue );
157
+
158
+ $color-opacity : if ($opacity != null , $opacity , 1 );
159
+ $umbra-color : _compute-color-opacity ($shadow-color , $_umbra-opacity * $color-opacity );
160
+ $penumbra-color : _compute-color-opacity ($shadow-color , $_penumbra-opacity * $color-opacity );
161
+ $ambient-color : _compute-color-opacity ($shadow-color , $_ambient-opacity * $color-opacity );
162
+
163
+ @return string .unquote (' #{$umbra-z-value } #{$umbra-color } , #{$penumbra-z-value } ' +
164
+ ' #{$penumbra-color } , #{$ambient-z-value } #{$ambient-color } ' );
76
165
}
77
166
78
167
// Returns a string that can be used as the value for a transition property for elevation.
0 commit comments