|
21 | 21 | //
|
22 | 22 |
|
23 | 23 | @import "@material/elevation/mixins";
|
| 24 | +@import "@material/feature-targeting/functions"; |
| 25 | +@import "@material/feature-targeting/mixins"; |
24 | 26 | @import "@material/ripple/mixins";
|
25 | 27 | @import "@material/rtl/mixins";
|
26 | 28 | @import "@material/theme/functions";
|
|
30 | 32 | @import "@material/shape/functions";
|
31 | 33 | @import "./variables";
|
32 | 34 |
|
| 35 | +@mixin mdc-button($query: mdc-feature-all()) { |
| 36 | + $feat-color: mdc-feature-create-target($query, color); |
| 37 | + $feat-structure: mdc-feature-create-target($query, structure); |
| 38 | + |
| 39 | + @include mdc-ripple-common($query); |
| 40 | + |
| 41 | + // postcss-bem-linter: define button |
| 42 | + .mdc-button { |
| 43 | + @include mdc-button-base_($query); |
| 44 | + |
| 45 | + @include mdc-feature-targets($feat-structure) { |
| 46 | + @include mdc-button-shape-radius(small); |
| 47 | + // This fits under structure because it doesn't depend on the theme. |
| 48 | + @include mdc-button-container-fill-color(transparent); |
| 49 | + |
| 50 | + // The icon CSS class overrides styles defined in the .material-icons CSS |
| 51 | + // class, which is loaded separately so the order of CSS definitions is not |
| 52 | + // guaranteed. Therefore, increase specifity by nesting this class to ensure |
| 53 | + // overrides apply. |
| 54 | + .mdc-button__icon { |
| 55 | + @include mdc-button__icon_; |
| 56 | + } |
| 57 | + } |
| 58 | + |
| 59 | + @include mdc-feature-targets($feat-color) { |
| 60 | + @include mdc-button-ink-color(primary); |
| 61 | + } |
| 62 | + |
| 63 | + @include mdc-states(primary, false, $query); |
| 64 | + } |
| 65 | + |
| 66 | + @include mdc-feature-targets($feat-structure) { |
| 67 | + .mdc-button__label + .mdc-button__icon { |
| 68 | + @include mdc-button__icon-trailing_; |
| 69 | + } |
| 70 | + |
| 71 | + // stylelint-disable-next-line selector-no-qualifying-type |
| 72 | + svg.mdc-button__icon { |
| 73 | + @include mdc-button__icon-svg_; |
| 74 | + } |
| 75 | + |
| 76 | + .mdc-button--raised, |
| 77 | + .mdc-button--unelevated, |
| 78 | + .mdc-button--outlined { |
| 79 | + .mdc-button__icon { |
| 80 | + // Icons inside contained buttons have different styles due to increased button padding |
| 81 | + @include mdc-button__icon-contained_; |
| 82 | + } |
| 83 | + |
| 84 | + .mdc-button__label + .mdc-button__icon { |
| 85 | + @include mdc-button__icon-contained-trailing_; |
| 86 | + } |
| 87 | + } |
| 88 | + } |
| 89 | + |
| 90 | + .mdc-button--raised, |
| 91 | + .mdc-button--unelevated { |
| 92 | + @include mdc-button--filled_($query); |
| 93 | + |
| 94 | + @include mdc-feature-targets($feat-color) { |
| 95 | + @include mdc-button-container-fill-color(primary); |
| 96 | + @include mdc-button-ink-color(on-primary); |
| 97 | + } |
| 98 | + |
| 99 | + @include mdc-states(on-primary, false, $query); |
| 100 | + } |
| 101 | + |
| 102 | + .mdc-button--raised { |
| 103 | + @include mdc-button--raised_($query); |
| 104 | + } |
| 105 | + |
| 106 | + .mdc-button--outlined { |
| 107 | + @include mdc-button--outlined_($query); |
| 108 | + |
| 109 | + @include mdc-feature-targets($feat-structure) { |
| 110 | + @include mdc-button-outline-width(2px); |
| 111 | + } |
| 112 | + |
| 113 | + @include mdc-feature-targets($feat-color) { |
| 114 | + @include mdc-button-outline-color(primary); |
| 115 | + } |
| 116 | + } |
| 117 | + |
| 118 | + .mdc-button--dense { |
| 119 | + @include mdc-feature-targets($feat-structure) { |
| 120 | + @include mdc-button--dense_; |
| 121 | + } |
| 122 | + } |
| 123 | + // postcss-bem-linter: end |
| 124 | +} |
| 125 | + |
33 | 126 | @mixin mdc-button-filled-accessible($container-fill-color) {
|
34 | 127 | $fill-tone: mdc-theme-tone($container-fill-color);
|
35 | 128 |
|
|
92 | 185 | border-width: $outline-width;
|
93 | 186 | }
|
94 | 187 |
|
95 |
| -@mixin mdc-button-base_() { |
96 |
| - @include mdc-typography(button); |
97 |
| - @include mdc-ripple-surface; |
98 |
| - @include mdc-ripple-radius-bounded; |
99 |
| - @include mdc-button-horizontal-padding($mdc-button-horizontal-padding); |
100 |
| - |
101 |
| - display: inline-flex; |
102 |
| - position: relative; |
103 |
| - align-items: center; |
104 |
| - justify-content: center; |
105 |
| - box-sizing: border-box; |
106 |
| - min-width: 64px; |
107 |
| - height: $mdc-button-height; |
108 |
| - border: none; |
109 |
| - outline: none; |
110 |
| - /* @alternate */ |
111 |
| - line-height: inherit; |
112 |
| - user-select: none; |
113 |
| - -webkit-appearance: none; |
114 |
| - overflow: hidden; |
115 |
| - vertical-align: middle; |
116 |
| - |
117 |
| - &::-moz-focus-inner { |
118 |
| - padding: 0; |
119 |
| - border: 0; |
120 |
| - } |
121 |
| - |
122 |
| - // postcss-bem-linter: ignore |
123 |
| - &:active { |
124 |
| - outline: none; |
| 188 | +@mixin mdc-button-base_($query) { |
| 189 | + $feat-color: mdc-feature-create-target($query, color); |
| 190 | + $feat-structure: mdc-feature-create-target($query, structure); |
| 191 | + $feat-typography: mdc-feature-create-target($query, typography); |
| 192 | + |
| 193 | + @include mdc-feature-targets($feat-typography) { |
| 194 | + @include mdc-typography(button); |
125 | 195 | }
|
126 | 196 |
|
127 |
| - &:hover { |
128 |
| - cursor: pointer; |
| 197 | + @include mdc-ripple-surface($query); |
| 198 | + |
| 199 | + @include mdc-feature-targets($feat-structure) { |
| 200 | + @include mdc-ripple-radius-bounded; |
| 201 | + @include mdc-button-horizontal-padding($mdc-button-horizontal-padding); |
| 202 | + |
| 203 | + display: inline-flex; |
| 204 | + position: relative; |
| 205 | + align-items: center; |
| 206 | + justify-content: center; |
| 207 | + box-sizing: border-box; |
| 208 | + min-width: 64px; |
| 209 | + height: $mdc-button-height; |
| 210 | + border: none; |
| 211 | + outline: none; |
| 212 | + /* @alternate */ |
| 213 | + line-height: inherit; |
| 214 | + user-select: none; |
| 215 | + -webkit-appearance: none; |
| 216 | + overflow: hidden; |
| 217 | + vertical-align: middle; |
| 218 | + |
| 219 | + &::-moz-focus-inner { |
| 220 | + padding: 0; |
| 221 | + border: 0; |
| 222 | + } |
| 223 | + |
| 224 | + // postcss-bem-linter: ignore |
| 225 | + &:active { |
| 226 | + outline: none; |
| 227 | + } |
| 228 | + |
| 229 | + &:hover { |
| 230 | + cursor: pointer; |
| 231 | + } |
129 | 232 | }
|
130 | 233 |
|
131 | 234 | &:disabled {
|
132 |
| - @include mdc-theme-prop(background-color, transparent); |
| 235 | + @include mdc-feature-targets($feat-color) { |
| 236 | + @include mdc-theme-prop(background-color, transparent); |
| 237 | + |
| 238 | + color: $mdc-button-disabled-ink-color; |
| 239 | + } |
133 | 240 |
|
134 |
| - color: $mdc-button-disabled-ink-color; |
135 |
| - cursor: default; |
136 |
| - pointer-events: none; |
| 241 | + @include mdc-feature-targets($feat-structure) { |
| 242 | + cursor: default; |
| 243 | + pointer-events: none; |
| 244 | + } |
137 | 245 | }
|
138 | 246 | }
|
139 | 247 |
|
|
163 | 271 | @include mdc-rtl-reflexive-property(margin, 8px, -4px);
|
164 | 272 | }
|
165 | 273 |
|
166 |
| -@mixin mdc-button--outlined_() { |
167 |
| - border-style: solid; |
| 274 | +@mixin mdc-button--outlined_($query) { |
| 275 | + $feat-color: mdc-feature-create-target($query, color); |
| 276 | + $feat-structure: mdc-feature-create-target($query, structure); |
168 | 277 |
|
169 |
| - &:disabled { |
170 |
| - border-color: $mdc-button-disabled-ink-color; |
| 278 | + @include mdc-feature-targets($feat-structure) { |
| 279 | + border-style: solid; |
| 280 | + } |
| 281 | + |
| 282 | + @include mdc-feature-targets($feat-color) { |
| 283 | + &:disabled { |
| 284 | + border-color: $mdc-button-disabled-ink-color; |
| 285 | + } |
171 | 286 | }
|
172 | 287 | }
|
173 | 288 |
|
174 |
| -@mixin mdc-button--filled_() { |
175 |
| - @include mdc-button-horizontal-padding($mdc-button-contained-horizontal-padding); |
| 289 | +@mixin mdc-button--filled_($query) { |
| 290 | + $feat-color: mdc-feature-create-target($query, color); |
| 291 | + $feat-structure: mdc-feature-create-target($query, structure); |
176 | 292 |
|
177 |
| - &:disabled { |
178 |
| - background-color: rgba(mdc-theme-prop-value(on-surface), .12); |
179 |
| - color: $mdc-button-disabled-ink-color; |
| 293 | + @include mdc-feature-targets($feat-structure) { |
| 294 | + @include mdc-button-horizontal-padding($mdc-button-contained-horizontal-padding); |
| 295 | + } |
| 296 | + |
| 297 | + @include mdc-feature-targets($feat-color) { |
| 298 | + &:disabled { |
| 299 | + background-color: rgba(mdc-theme-prop-value(on-surface), .12); |
| 300 | + color: $mdc-button-disabled-ink-color; |
| 301 | + } |
180 | 302 | }
|
181 | 303 | }
|
182 | 304 |
|
183 |
| -@mixin mdc-button--raised_() { |
184 |
| - @include mdc-elevation(2); |
| 305 | +@mixin mdc-button--raised_($query) { |
| 306 | + $feat-animation: mdc-feature-create-target($query, animation); |
| 307 | + $feat-color: mdc-feature-create-target($query, color); |
185 | 308 |
|
186 |
| - transition: mdc-elevation-transition-value(); |
| 309 | + @include mdc-feature-targets($feat-color) { |
| 310 | + @include mdc-elevation(2); |
187 | 311 |
|
188 |
| - &:hover, |
189 |
| - &:focus { |
190 |
| - @include mdc-elevation(4); |
191 |
| - } |
| 312 | + &:hover, |
| 313 | + &:focus { |
| 314 | + @include mdc-elevation(4); |
| 315 | + } |
192 | 316 |
|
193 |
| - &:active { |
194 |
| - @include mdc-elevation(8); |
| 317 | + &:active { |
| 318 | + @include mdc-elevation(8); |
| 319 | + } |
| 320 | + |
| 321 | + &:disabled { |
| 322 | + @include mdc-elevation(0); |
| 323 | + } |
195 | 324 | }
|
196 | 325 |
|
197 |
| - &:disabled { |
198 |
| - @include mdc-elevation(0); |
| 326 | + @include mdc-feature-targets($feat-animation) { |
| 327 | + transition: mdc-elevation-transition-value(); |
199 | 328 | }
|
200 | 329 | }
|
201 | 330 |
|
|
0 commit comments