Ripple

import '@vollowx/seele/m3/ripple/ripple.js';
<style>
  .row {
    align-items: center;
    display: flex;
    gap: 16px;
  }
  .container {
    align-items: center;
    border-radius: 24px;
    display: flex;
    height: 64px;
    justify-content: center;
    outline: 1px solid var(--md-sys-color-outline);
    padding: 16px;
    position: relative;
    width: 64px;
  }
  .container:has(.unbounded) {
    border-radius: 50%;
    outline-style: dashed;
  }
  .anchor {
    background: var(--md-sys-color-primary-container);
    border: 1px solid var(--md-sys-color-outline);
    border-radius: 50%;
    height: 24px;
    width: 24px;
    /* Recommended styles for an unbounded ripple's anchor. */
    display: grid;
    place-items: center;
    position: relative;
  }

  md-ripple.unbounded {
    height: 64px;
    width: 64px;
    /* Recommended styles for an unbounded ripple. */
    border-radius: 50%;
    inset: unset;
  }
</style>

<div class="row">
  <div class="container">
    <md-ripple></md-ripple>
  </div>
  <div class="container" id="touch">
    <div class="anchor">
      <md-ripple for="touch" class="unbounded"></md-ripple>
    </div>
  </div>
</div>

Ripples are attached to their parent nodes by default:

<button style="position: relative">
  <md-ripple></md-ripple>
  Native Button
</button>

They can also attach by reference:

<div style="position: relative; width: min-content">
  <md-ripple
    for="ripple-control-input"
    enterbehavior="none"
    spacebehavior="none">
  </md-ripple>
  <input id="ripple-control-input" />
</div>

Or manually:




<div style="position: relative; width: min-content">
  <md-ripple id="ripple"></md-ripple>
  <br />
  <button id="ripple-control">Button</button>
  <br />
  <br />
</div>

<script>
  const ripple = document.querySelector('#ripple');
  const control = document.querySelector('#ripple-control');
  onload = () => ripple.attach(control);
</script>

M3Ripple

Properties

name description
$ripples Dynamic array of HTMLSpanElement, all ripples shown

Methods

signature description
addRipple(e: MouseEvent?) -> null If e is not provided, the ripple will spread from the center
removeRipple(ripple: HTMLSpanElement) -> null
keepLastRipple() -> null