diff --git a/checkbox/internal/_checkbox.scss b/checkbox/internal/_checkbox.scss index 548509c635..3f6fad43b3 100644 --- a/checkbox/internal/_checkbox.scss +++ b/checkbox/internal/_checkbox.scss @@ -149,6 +149,8 @@ $_checkmark-bottom-left: 7px, -14px; // Ripple + @include ripple.controls; + md-ripple { border-radius: map.get($tokens, 'state-layer-shape'); height: map.get($tokens, 'state-layer-size'); diff --git a/radio/internal/_radio.scss b/radio/internal/_radio.scss index 36610aa9d6..4a8048f0d0 100644 --- a/radio/internal/_radio.scss +++ b/radio/internal/_radio.scss @@ -33,6 +33,8 @@ $_md-sys-motion: tokens.md-sys-motion-values(); @mixin styles() { $tokens: tokens.md-comp-radio-values(); + @include ripple.controls; + @layer { :host { display: inline-flex; diff --git a/ripple/_ripple.scss b/ripple/_ripple.scss index 29623c48ea..7c25b2e8a9 100644 --- a/ripple/_ripple.scss +++ b/ripple/_ripple.scss @@ -4,3 +4,4 @@ // @forward './internal/ripple' show theme; +@forward './internal/ripple' show controls; diff --git a/ripple/internal/_ripple.scss b/ripple/internal/_ripple.scss index c9a5e63214..f4d0fe78e4 100644 --- a/ripple/internal/_ripple.scss +++ b/ripple/internal/_ripple.scss @@ -11,6 +11,28 @@ @use '../../tokens'; // go/keep-sorted end +@mixin ripple-hover($tokens) { + background-color: map.get($tokens, 'hover-color'); + opacity: map.get($tokens, 'hover-opacity'); +} + +@mixin ripple-active($tokens) { + opacity: map.get($tokens, 'pressed-opacity'); + transition-duration: 105ms; +} + +// controls for elements that might be triggered via a HTMLLabelElement +@mixin controls { + $tokens: tokens.md-comp-ripple-values(); + :host(:hover) md-ripple::part(surface)::before { + @include ripple-hover($tokens); + } + + :host(:active) md-ripple::part(surface)::after { + @include ripple-active($tokens); + } +} + @mixin theme($tokens) { $supported-tokens: tokens.$md-comp-ripple-supported-tokens; @each $token, $value in $tokens { @@ -80,13 +102,11 @@ } .hovered::before { - background-color: map.get($tokens, 'hover-color'); - opacity: map.get($tokens, 'hover-opacity'); + @include ripple-hover($tokens); } .pressed::after { // press ripple fade-in - opacity: map.get($tokens, 'pressed-opacity'); - transition-duration: 105ms; + @include ripple-active($tokens); } } diff --git a/ripple/internal/ripple.ts b/ripple/internal/ripple.ts index 6a0ed62899..38154e7560 100644 --- a/ripple/internal/ripple.ts +++ b/ripple/internal/ripple.ts @@ -150,13 +150,18 @@ export class Ripple extends LitElement implements Attachable { this.setAttribute('aria-hidden', 'true'); } + protected override firstUpdated(changedProperties: PropertyValues): void { + super.firstUpdated(changedProperties); + this.initPressAnimation(); + } + protected override render() { const classes = { 'hovered': this.hovered, 'pressed': this.pressed, }; - return html`
`; + return html``; } protected override update(changedProps: PropertyValues