A toast notification component that demonstrates Lume’s template system for dynamically creating elements.
<div data-lume="toast" data-lume-id="toaster" class="toast-container">
<template data-lume-part="item">
<div class="toast" role="status">
<span data-lume-part="message"></span>
<button type="button" data-lume-part="close">Close</button>
</div>
</template>
</div>
<button type="button" id="trigger">Show Toast</button>
.toast-container {
position: fixed;
bottom: 1rem;
right: 1rem;
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.toast {
background: #333;
color: #fff;
padding: 0.75rem 1rem;
border-radius: 4px;
display: flex;
align-items: center;
gap: 1rem;
}
import { defineComponent } from "@beardcoder/lume";
export const toast = defineComponent(({ root, template }) => {
const createItem = template("item");
function show(message: string) {
const frag = createItem();
const item = frag.querySelector(".toast")!;
const msgEl = frag.querySelector("[data-lume-part='message']")!;
const closeBtn = frag.querySelector("[data-lume-part='close']")!;
msgEl.textContent = message;
closeBtn.addEventListener("click", () => item.remove());
root.appendChild(frag);
// Auto-dismiss after 5 seconds
setTimeout(() => item.remove(), 5000);
}
return { show };
});
import { createLume } from "@beardcoder/lume";
import { toast } from "./toast";
const app = createLume();
app.component("toast", toast).mount();
// Show a toast from anywhere
const toaster = app.require<{ show(msg: string): void }>("toaster");
toaster.show("Hello from Lume!");
- Native templates: Uses
<template> elements for zero-cost DOM cloning
- No innerHTML: All content is set safely via DOM APIs
- Self-cleaning: Each toast can remove itself via the close button
- Public API: The
show() method can be called from anywhere via app.require()