Skip to content

Toast

Source

Example CSS

css
@import "winduum/src/components/toast/props/content.css" layer(theme);
@import "winduum/src/components/toast/props/default.css" layer(theme);
@import "winduum/src/components/toast/content.css" layer(utilities);
@import "winduum/src/components/toast/default.css" layer(utilities);

/* Example customization */
@layer theme {
  :root, :host {
    --x-toast-inline-size: 8rem;
    --x-toast-transition-duration: 200ms;
  }
}

Winduum CSS Code

winduum/src/components/toast/props/content.css

css
:root, :host {
  --x-toast-content-border-radius: var(--radius-2xl);
  --x-toast-content-padding-block: calc(var(--spacing) * 3);
  --x-toast-content-padding-inline: calc(var(--spacing) * 4);
  --x-toast-content-gap: calc(var(--spacing) * 5);
  --x-toast-content-background-color: var(--color-body-primary);
}

winduum/src/components/toast/props/default.css

css
:root, :host {
  --x-toast-inline-size: 20rem;
  --x-toast-transition-duration: calc(var(--default-transition-duration) * 2);
}

winduum/src/components/toast/content.css

css
.x-toast-content {
  border-radius: var(--x-toast-content-border-radius);
  padding: var(--x-toast-content-padding-block) var(--x-toast-content-padding-inline);
  gap: var(--x-toast-content-gap);
  background-color: var(--x-toast-content-background-color);
  color: var(--x-toast-content-color, var(--color-accent));
  border:
    var(--x-toast-content-border-width, 1px) solid
    color-mix(
      in var(--x-toast-content-border-color-space, srgb),
      var(--x-toast-content-border-color, var(--color-accent)) var(--x-toast-content-border-color-opacity, 15%),
      var(--x-toast-content-border-color-mix, var(--color-body-primary))
    );
  box-shadow: 0 1px 3px 0 rgb(0 0 0 / 10%), 0 1px 2px -1px rgb(0 0 0 / 10%);
  align-items: center;
  display: flex;
  height: fit-content;
}

winduum/src/components/toast/default.css

css
.x-toast {
  inline-size: min(100%, var(--x-toast-inline-size));
  block-size: var(--x-toast-block-size);
  transition: all var(--x-toast-transition-duration) var(--x-toast-transition-timing-function, var(--ease-in-out));
  position: relative;
  pointer-events: auto;
  display: flex;
  flex-direction: column;
  visibility: hidden;
  opacity: 0%;

  .flex-col-reverse & {
    justify-content: flex-end;
  }

  &[data-open] {
    margin-block: var(--x-toaster-margin-block);
  }

  &[data-open]:where(:nth-last-child(-n+3)) {
    visibility: visible;
    opacity: 100%;
  }

  &[data-closed] {
    visibility: hidden;
    opacity: 0%;
    height: 0;
    margin-block: 0;
  }
}

Stimulus Actions

show

Shows an existing toast via showToast method.
You can add any params from options via Invoke params.

html
<button class="x-button" data-invoke-action="x-toast#show" data-invoke-target="#toastElement">
    Show toast
</button>

<ol class="x-toaster items-end">
    <li class="x-toast" role="status" aria-live="assertive" aria-atomic="true" data-controller="x-toast" id="toastElement">
        <div class="x-toast-content">
            <div class="flex-col">
                <div class="x-title">Hello toast</div>
                <div class="x-text">Fresh toast from oven</div>
            </div>
            <button class="x-button muted ml-auto" data-action="x-toast#close">Close</button>
        </div>
    </li>
</ol>

close

html
<li class="x-toast" role="status" aria-live="assertive" aria-atomic="true" data-controller="x-toast">
    <div class="x-toast-content">
        <button class="x-button muted ml-auto" data-action="x-toast#close">Close</button>
    </div>
</li>

Tips

  • To show toast programmatically, you can append the HTML to .x-toaster
javascript
document.querySelector('.x-toaster').insertAdjacentHTML('beforeend', `
    <li class="x-toast" role="status" aria-live="assertive" aria-atomic="true" data-controller="x-toast" data-x-toaster-show-value='{ "autohide": 3000 }'>
        <div class="x-toast-content">
            <button class="x-button muted ml-auto" data-action="x-toast#close">Close</button>
        </div>
    </li>
`)
  • You can also use the useController('x-toast', '#toastElement').invoke('show') invoke method to show existing toast.

Released under the MIT License.