/**
* @license
* Copyright 2020 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
@use 'sass:map';
@use 'sass:selector';
@use '@material/elevation/elevation-theme';
@use '@material/ripple/ripple-theme' as mdc-ripple-theme;
@use '@material/shape/shape';
@use '@material/theme/css';
@use '@material/theme/theme-color';
@use '@material/theme/shadow-dom';
@use '@material/button/button-theme';
@use '@material/mwc-ripple/ripple-theme';
$_primary: theme-color.$primary;
$_on-primary: theme-color.$on-primary;
$_primary-opacities: mdc-ripple-theme.$dark-ink-opacities;
$_on-primary-opacities: mdc-ripple-theme.$light-ink-opacities;
$light-theme: (
text: (
label-color: $_primary,
label-disabled-color: button-theme.$disabled-ink-color,
label-focus-color: null,
label-hover-color: null,
label-press-color: null,
shape: shape.$small-component-radius,
),
outlined: (
label-color: $_primary,
label-disabled-color: button-theme.$disabled-ink-color,
label-focus-color: null,
label-hover-color: null,
label-press-color: null,
outline-color: null,
outline-disabled-color: null,
shape: shape.$small-component-radius,
),
contained: (
container-color: $_primary,
container-disabled-color: button-theme.$disabled-container-color,
label-color: $_on-primary,
label-disabled-color: button-theme.$disabled-ink-color,
label-focus-color: null,
label-hover-color: null,
label-press-color: null,
shape: shape.$small-component-radius,
elevation-shadow-color: elevation-theme.$baseline-color,
),
);
@mixin theme($theme: $light-theme) {
// text buttons
$text: map.get($theme, text);
@if $text {
@include _text-theme($text);
}
// outlined buttons
$outlined: map.get($theme, outlined);
@if $outlined {
@include shadow-dom.host-aware(selector.append(&, '[outlined]')) {
@include _outlined-theme($outlined);
}
}
// contained buttons
$contained: map.get($theme, contained);
@if $contained {
@include shadow-dom.host-aware(selector.append(&, '[raised]')) {
@include _raised-elevations($contained);
}
@include shadow-dom.host-aware(
selector.append(&, '[raised]'),
selector.append(&, '[unelevated]')
) {
@include _contained-theme($contained);
}
}
}
@mixin _text-theme($text) {
@include css.declaration(--mdc-theme-primary, map.get($text, label-color));
@include css.declaration(
--mdc-button-disabled-ink-color,
map.get($text, label-disabled-color)
);
@include shadow-dom.host-aware(selector.append(&, ':hover')) {
@include css.declaration(
--mdc-theme-primary,
map.get($text, label-hover-color)
);
}
@include shadow-dom.host-aware(selector.append(&, ':focus-within')) {
@include css.declaration(
--mdc-theme-primary,
map.get($text, label-focus-color)
);
}
@include shadow-dom.host-aware(selector.append(&, ':active')) {
@include css.declaration(
--mdc-theme-primary,
map.get($text, label-pressed-color)
);
}
// TODO(dfreedm): infer ripple opacities from label-color
@include ripple-theme.theme-deprecated(
(
state: map.get($text, ripple-color),
opacity: map.get($text, ripple-opacity),
)
);
@include css.declaration(--mdc-shape-small, map.get($text, shape));
}
@mixin _outlined-theme($outlined) {
@include css.declaration(
--mdc-theme-primary,
map.get($outlined, label-color)
);
@include css.declaration(
--mdc-button-disabled-ink-color,
map.get($outlined, label-disabled-color)
);
@include css.declaration(
--mdc-button-outline-color,
map.get($outlined, outline-color)
);
@include css.declaration(
--mdc-button-disabled-outline-color,
map.get($outlined, outline-disabled-color)
);
@include shadow-dom.host-aware(selector.append(&, ':hover')) {
@include css.declaration(
--mdc-theme-primary,
map.get($outlined, label-hover-color)
);
@include css.declaration(
--mdc-button-outline-color,
map.get($outlined, outline-hover-color)
);
}
@include shadow-dom.host-aware(
selector.append(&, ':focus'),
selector.append(&, ':focus-within')
) {
@include css.declaration(
--mdc-theme-primary,
map.get($outlined, label-focus-color)
);
@include css.declaration(
--mdc-button-outline-color,
map.get($outlined, outline-focus-color)
);
}
@include shadow-dom.host-aware(selector.append(&, ':active')) {
@include css.declaration(
--mdc-theme-primary,
map.get($outlined, label-pressed-color)
);
@include css.declaration(
--mdc-button-outline-color,
map.get($outlined, outline-pressed-color)
);
}
// TODO(dfreedm): infer ripple opacities from label-color
@include ripple-theme.theme-deprecated(
(
state: map.get($outlined, ripple-color),
opacity: map.get($outlined, ripple-opacity),
)
);
@include css.declaration(--mdc-shape-small, map.get($outlined, shape));
}
@mixin _raised-elevations($contained) {
$elevation-shadow-color: map.get($contained, elevation-shadow-color);
@if $elevation-shadow-color {
@include css.declaration(
--mdc-button-raised-box-shadow,
elevation-theme.elevation-box-shadow(2, $elevation-shadow-color)
);
@include css.declaration(
--mdc-button-raised-box-shadow-active,
elevation-theme.elevation-box-shadow(8, $elevation-shadow-color)
);
@include css.declaration(
--mdc-button-raised-box-shadow-disabled,
elevation-theme.elevation-box-shadow(0, $elevation-shadow-color)
);
@include css.declaration(
--mdc-button-raised-box-shadow-hover,
elevation-theme.elevation-box-shadow(4, $elevation-shadow-color)
);
@include css.declaration(
--mdc-button-raised-box-shadow-focus,
elevation-theme.elevation-box-shadow(4, $elevation-shadow-color)
);
}
}
@mixin _contained-theme($contained) {
@include css.declaration(
--mdc-theme-primary,
map.get($contained, container-color)
);
@include css.declaration(
--mdc-button-disabled-fill-color,
map.get($contained, container-disabled-color)
);
@include css.declaration(
--mdc-theme-on-primary,
map.get($contained, label-color)
);
@include css.declaration(
--mdc-button-disabled-ink-color,
map.get($contained, label-disabled-color)
);
@include shadow-dom.host-aware(selector.append(&, ':hover')) {
@include css.declaration(
--mdc-theme-on-primary,
map.get($contained, label-hover-color)
);
}
@include shadow-dom.host-aware(
selector.append(&, ':focus'),
selector.append(&, ':focus-within')
) {
@include css.declaration(
--mdc-theme-on-primary,
map.get($contained, label-focus-color)
);
}
@include shadow-dom.host-aware(selector.append(&, ':active')) {
@include css.declaration(
--mdc-theme-on-primary,
map.get($contained, label-pressed-color)
);
}
// TODO(dfreedm): infer ripple opacities from label-color
@include ripple-theme.theme-deprecated(
(
state: map.get($contained, ripple-color),
opacity: map.get($contained, ripple-opacity),
)
);
@include css.declaration(--mdc-shape-small, map.get($contained, shape));
}