UNPKG

7.2 kBSCSSView Raw
1@import 'variables';
2
3/**
4 * A collection of mixins and CSS classes that can be used to apply elevation to a material
5 * element.
6 * See: https://www.google.com/design/spec/what-is-material/elevation-shadows.html
7 * Examples:
8 *
9 *
10 * .md-foo {
11 * @include $md-elevation(2);
12 *
13 * &:active {
14 * @include $md-elevation(8);
15 * }
16 * }
17 *
18 * <div id="external-card" class="md-elevation-z2"><p>Some content</p></div>
19 *
20 * For an explanation of the design behind how elevation is implemented, see the design doc at
21 * https://goo.gl/Kq0k9Z.
22 */
23
24// Colors for umbra, penumbra, and ambient shadows. As described in the design doc, each elevation
25// level is created using a set of 3 shadow values, one for umbra (the shadow representing the
26// space completely obscured by an object relative to its light source), one for penumbra (the
27// space partially obscured by an object), and one for ambient (the space which contains the object
28// itself). For a further explanation of these terms and their meanings, see
29// https://en.wikipedia.org/wiki/Umbra,_penumbra_and_antumbra.
30
31$_umbra-color: rgba(black, 0.2);
32$_penumbra-color: rgba(black, 0.14);
33$_ambient-color: rgba(black, 0.12);
34
35// Maps for the different shadow sets and their values within each z-space. These values were
36// created by taking a few reference shadow sets created by Google's Designers and interpolating
37// all of the values between them.
38
39$_umbra-elevation-map: (
40 0: '0px 0px 0px 0px #{$_umbra-color}',
41 1: '0px 2px 1px -1px #{$_umbra-color}',
42 2: '0px 3px 1px -2px #{$_umbra-color}',
43 3: '0px 3px 3px -2px #{$_umbra-color}',
44 4: '0px 2px 4px -1px #{$_umbra-color}',
45 5: '0px 3px 5px -1px #{$_umbra-color}',
46 6: '0px 3px 5px -1px #{$_umbra-color}',
47 7: '0px 4px 5px -2px #{$_umbra-color}',
48 8: '0px 5px 5px -3px #{$_umbra-color}',
49 9: '0px 5px 6px -3px #{$_umbra-color}',
50 10: '0px 6px 6px -3px #{$_umbra-color}',
51 11: '0px 6px 7px -4px #{$_umbra-color}',
52 12: '0px 7px 8px -4px #{$_umbra-color}',
53 13: '0px 7px 8px -4px #{$_umbra-color}',
54 14: '0px 7px 9px -4px #{$_umbra-color}',
55 15: '0px 8px 9px -5px #{$_umbra-color}',
56 16: '0px 8px 10px -5px #{$_umbra-color}',
57 17: '0px 8px 11px -5px #{$_umbra-color}',
58 18: '0px 9px 11px -5px #{$_umbra-color}',
59 19: '0px 9px 12px -6px #{$_umbra-color}',
60 20: '0px 10px 13px -6px #{$_umbra-color}',
61 21: '0px 10px 13px -6px #{$_umbra-color}',
62 22: '0px 10px 14px -6px #{$_umbra-color}',
63 23: '0px 11px 14px -7px #{$_umbra-color}',
64 24: '0px 11px 15px -7px #{$_umbra-color}'
65);
66
67$_penumbra-elevation-map: (
68 0: '0px 0px 0px 0px #{$_penumbra-color}',
69 1: '0px 1px 1px 0px #{$_penumbra-color}',
70 2: '0px 2px 2px 0px #{$_penumbra-color}',
71 3: '0px 3px 4px 0px #{$_penumbra-color}',
72 4: '0px 4px 5px 0px #{$_penumbra-color}',
73 5: '0px 5px 8px 0px #{$_penumbra-color}',
74 6: '0px 6px 10px 0px #{$_penumbra-color}',
75 7: '0px 7px 10px 1px #{$_penumbra-color}',
76 8: '0px 8px 10px 1px #{$_penumbra-color}',
77 9: '0px 9px 12px 1px #{$_penumbra-color}',
78 10: '0px 10px 14px 1px #{$_penumbra-color}',
79 11: '0px 11px 15px 1px #{$_penumbra-color}',
80 12: '0px 12px 17px 2px #{$_penumbra-color}',
81 13: '0px 13px 19px 2px #{$_penumbra-color}',
82 14: '0px 14px 21px 2px #{$_penumbra-color}',
83 15: '0px 15px 22px 2px #{$_penumbra-color}',
84 16: '0px 16px 24px 2px #{$_penumbra-color}',
85 17: '0px 17px 26px 2px #{$_penumbra-color}',
86 18: '0px 18px 28px 2px #{$_penumbra-color}',
87 19: '0px 19px 29px 2px #{$_penumbra-color}',
88 20: '0px 20px 31px 3px #{$_penumbra-color}',
89 21: '0px 21px 33px 3px #{$_penumbra-color}',
90 22: '0px 22px 35px 3px #{$_penumbra-color}',
91 23: '0px 23px 36px 3px #{$_penumbra-color}',
92 24: '0px 24px 38px 3px #{$_penumbra-color}'
93);
94
95$_ambient-elevation-map: (
96 0: '0px 0px 0px 0px #{$_ambient-color}',
97 1: '0px 1px 3px 0px #{$_ambient-color}',
98 2: '0px 1px 5px 0px #{$_ambient-color}',
99 3: '0px 1px 8px 0px #{$_ambient-color}',
100 4: '0px 1px 10px 0px #{$_ambient-color}',
101 5: '0px 1px 14px 0px #{$_ambient-color}',
102 6: '0px 1px 18px 0px #{$_ambient-color}',
103 7: '0px 2px 16px 1px #{$_ambient-color}',
104 8: '0px 3px 14px 2px #{$_ambient-color}',
105 9: '0px 3px 16px 2px #{$_ambient-color}',
106 10: '0px 4px 18px 3px #{$_ambient-color}',
107 11: '0px 4px 20px 3px #{$_ambient-color}',
108 12: '0px 5px 22px 4px #{$_ambient-color}',
109 13: '0px 5px 24px 4px #{$_ambient-color}',
110 14: '0px 5px 26px 4px #{$_ambient-color}',
111 15: '0px 6px 28px 5px #{$_ambient-color}',
112 16: '0px 6px 30px 5px #{$_ambient-color}',
113 17: '0px 6px 32px 5px #{$_ambient-color}',
114 18: '0px 7px 34px 6px #{$_ambient-color}',
115 19: '0px 7px 36px 6px #{$_ambient-color}',
116 20: '0px 8px 38px 7px #{$_ambient-color}',
117 21: '0px 8px 40px 7px #{$_ambient-color}',
118 22: '0px 8px 42px 7px #{$_ambient-color}',
119 23: '0px 9px 44px 8px #{$_ambient-color}',
120 24: '0px 9px 46px 8px #{$_ambient-color}'
121);
122
123/**
124 * The css property used for elevation. In most cases this should not be changed. It is exposed
125 * as a variable for abstraction / easy use when needing to reference the property directly, for
126 * example in a will-change rule.
127 */
128$md-elevation-property: box-shadow !default;
129
130/** The default duration value for elevation transitions. */
131$md-elevation-transition-duration: 280ms !default;
132
133/** The default easing value for elevation transitions. */
134$md-elevation-transition-timing-function: $md-fast-out-slow-in-timing-function;
135
136/**
137 * Applies the correct css rules to an element to give it the elevation specified by $zValue.
138 * The $zValue must be between 0 and 24.
139 */
140@mixin md-elevation($zValue) {
141 @if type-of($zValue) != number or not unitless($zValue) {
142 @error '$zValue must be a unitless number';
143 }
144 @if $zValue < 0 or $zValue > 24 {
145 @error '$zValue must be between 0 and 24';
146 }
147
148 #{$md-elevation-property}: #{map-get($_umbra-elevation-map, $zValue)},
149 #{map-get($_penumbra-elevation-map, $zValue)},
150 #{map-get($_ambient-elevation-map, $zValue)};
151}
152
153/**
154 * Returns a string that can be used as the value for a transition property for elevation.
155 * Calling this function directly is useful in situations where a component needs to transition
156 * more than one property.
157 *
158 * .foo {
159 * transition: md-elevation-transition-property-value(), opacity 100ms ease;
160 * will-change: $md-elevation-property, opacity;
161 * }
162 */
163@function md-elevation-transition-property-value(
164 $duration: $md-elevation-transition-duration,
165 $easing: $md-elevation-transition-timing-function) {
166 @return #{$md-elevation-property} #{$duration} #{$easing};
167}
168
169/**
170 * Applies the correct css rules needed to have an element transition between elevations.
171 * This mixin should be applied to elements whose elevation values will change depending on their
172 * context (e.g. when active or disabled).
173 */
174// NOTE(traviskaufman): Both this mixin and the above function use default parameters so they can
175// be used in the same way by clients.
176@mixin md-elevation-transition(
177 $duration: $md-elevation-transition-duration,
178 $easing: $md-elevation-transition-timing-function) {
179 transition: md-elevation-transition-property-value($duration, $easing);
180 will-change: $md-elevation-property;
181}