@material/mwc-button
Version:
Material Design button web component
254 lines (217 loc) • 5.66 kB
Plain Text
/**
* @license
* Copyright 2020 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
@use 'sass:math';
@use 'sass:map';
@use '@material/button/button';
@use '@material/button/button-theme';
@use '@material/elevation/elevation-theme';
@use '@material/ripple/ripple-theme' as mdc-ripple-theme;
@use '@material/rtl/rtl';
@use '@material/theme/custom-properties';
@use '@material/theme/theme';
@use '@material/theme/theme-color';
@use '@material/mwc-ripple/ripple-theme';
@mixin core-styles() {
@include button.without-ripple();
:host {
display: inline-flex;
outline: none;
-webkit-tap-highlight-color: transparent;
/**
* Override vertical-align with shortest value "top". Vertical-align's default
* "baseline" value causes buttons to be misaligned next to each other if one
* button has an icon and the other does not.
*/
vertical-align: top;
}
:host([fullwidth]) {
width: 100%;
}
:host([raised]),
:host([unelevated]) {
$ripple-config: (
state: theme-color.$on-primary,
opacity: mdc-ripple-theme.$light-ink-opacities,
);
@include ripple-theme.theme-deprecated($ripple-config);
}
.trailing-icon,
.leading-icon {
::slotted(*),
.mdc-button__icon {
@include button.deprecated-icon();
}
}
.trailing-icon {
::slotted(*),
.mdc-button__icon {
@include button.deprecated-icon-trailing();
}
}
.slot-container {
display: inline-flex;
align-items: center;
justify-content: center;
&.flex {
flex: auto;
}
}
$text-padding: custom-properties.create(
--mdc-button-horizontal-padding,
button-theme.$horizontal-padding
);
$contained-padding: custom-properties.create(
--mdc-button-horizontal-padding,
button-theme.$contained-horizontal-padding
);
.mdc-button {
flex: auto;
overflow: hidden;
@include _horizontal-padding($text-padding);
}
.mdc-button--raised {
@include theme.property(
box-shadow,
custom-properties.create(
--mdc-button-raised-box-shadow,
elevation-theme.elevation-box-shadow(2)
)
);
&:focus {
@include theme.property(
box-shadow,
custom-properties.create(
--mdc-button-raised-box-shadow-focus,
custom-properties.create(
--mdc-button-raised-box-shadow-hover,
elevation-theme.elevation-box-shadow(4)
)
)
);
}
&:hover {
@include theme.property(
box-shadow,
custom-properties.create(
--mdc-button-raised-box-shadow-hover,
elevation-theme.elevation-box-shadow(4)
)
);
}
&:active {
@include theme.property(
box-shadow,
custom-properties.create(
--mdc-button-raised-box-shadow-active,
elevation-theme.elevation-box-shadow(8)
)
);
}
&:disabled {
@include theme.property(
box-shadow,
custom-properties.create(
--mdc-button-raised-box-shadow-disabled,
elevation-theme.elevation-box-shadow(0)
)
);
}
}
.mdc-button--raised,
.mdc-button--unelevated {
@include _horizontal-padding($contained-padding);
}
.mdc-button--outlined {
$outline-width: custom-properties.create(
--mdc-button-outline-width,
button-theme.$outlined-border-width
);
@include _outline-width($outline-width, $contained-padding);
// TODO(dfreedm): remove over-specificity in MDC button mixin
&:not(:disabled) {
@include theme.property(
border-color,
custom-properties.create(
--mdc-button-outline-color,
button-theme.$outline-color
)
);
}
.ripple {
@include _outline-ripple($outline-width);
}
}
.mdc-button--dense {
@include button-theme.density(-2);
}
:host([disabled]) {
pointer-events: none;
.mdc-button {
@include theme.property(
color,
custom-properties.create(
--mdc-button-disabled-ink-color,
button-theme.$disabled-ink-color
)
);
}
.mdc-button--raised,
.mdc-button--unelevated {
@include theme.property(
background-color,
custom-properties.create(
--mdc-button-disabled-fill-color,
button-theme.$outline-color
)
);
}
.mdc-button--outlined {
@include theme.property(
border-color,
custom-properties.create(
--mdc-button-disabled-outline-color,
button-theme.$disabled-container-color
)
);
}
}
}
@mixin _horizontal-padding($padding) {
@include theme.property(padding-left, $padding, $gss: (noflip: true));
@include theme.property(padding-right, $padding, $gss: (noflip: true));
}
@mixin _outline-width(
$outline-width,
$padding: button-theme.$contained-horizontal-padding
) {
@include theme.property(border-width, $outline-width);
$replace: (
padding: $padding,
outline: $outline-width,
);
@include theme.property(
padding-left,
'calc(padding - outline)',
$gss: (noflip: true),
$replace: $replace
);
@include theme.property(
padding-right,
'calc(padding - outline)',
$gss: (noflip: true),
$replace: $replace
);
}
@mixin _outline-ripple($width) {
$replace: (
width: $width,
);
@include theme.property(top, 'calc(-1 * width)', $replace: $replace);
@include rtl.reflexive-position(left, 'calc(-1 * width)', $replace: $replace);
@include theme.property(border-width, $width);
border-style: solid;
border-color: transparent;
}