use maud::{html, Markup};
pub use super::toast::{render, Props, Variant};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Position {
TopLeft,
TopCenter,
TopRight,
BottomLeft,
BottomCenter,
#[default]
BottomRight,
}
impl Position {
pub fn data_value(&self) -> &'static str {
match self {
Self::TopLeft => "top-left",
Self::TopCenter => "top-center",
Self::TopRight => "top-right",
Self::BottomLeft => "bottom-left",
Self::BottomCenter => "bottom-center",
Self::BottomRight => "bottom-right",
}
}
}
pub fn viewport(position: Position) -> Markup {
viewport_with_id("mui-sonner-viewport", position)
}
pub fn viewport_with_id(id: &str, position: Position) -> Markup {
html! {
div id=(id)
class="mui-sonner"
data-mui="sonner-viewport"
data-position=(position.data_value())
aria-live="polite" {}
}
}
pub fn toast(props: Props) -> Markup {
render(props)
}
pub fn showcase() -> Markup {
let script = r#"
(function(){
var root = document.currentScript && document.currentScript.parentElement;
if (!root) return;
var vp = root.querySelector('.mui-sonner');
var btns = root.querySelectorAll('[data-sonner-pos]');
for (var i = 0; i < btns.length; i++) {
btns[i].addEventListener('click', function(e){
var pos = e.currentTarget.getAttribute('data-sonner-pos');
if (vp) vp.setAttribute('data-position', pos);
for (var j = 0; j < btns.length; j++) {
btns[j].setAttribute('aria-pressed', btns[j] === e.currentTarget ? 'true' : 'false');
}
});
}
var fire = root.querySelector('[data-sonner-fire]');
if (fire) {
fire.addEventListener('click', function(){
window.dispatchEvent(new CustomEvent('mui:sonner-toast', {
detail: {
variant: 'success',
title: 'Saved',
description: 'Your changes have been stored.',
duration_ms: 4000
}
}));
});
}
})();
"#;
html! {
div.mui-showcase__grid {
div {
p.mui-showcase__caption { "Position (pick one, then fire a toast)" }
(viewport(Position::BottomRight))
div style="display:grid;grid-template-columns:repeat(3,max-content);gap:0.5rem;margin-bottom:0.75rem" {
button type="button" class="mui-btn mui-btn--outline mui-btn--sm" data-sonner-pos="top-left" aria-pressed="false" { "top-left" }
button type="button" class="mui-btn mui-btn--outline mui-btn--sm" data-sonner-pos="top-center" aria-pressed="false" { "top-center" }
button type="button" class="mui-btn mui-btn--outline mui-btn--sm" data-sonner-pos="top-right" aria-pressed="false" { "top-right" }
button type="button" class="mui-btn mui-btn--outline mui-btn--sm" data-sonner-pos="bottom-left" aria-pressed="false" { "bottom-left" }
button type="button" class="mui-btn mui-btn--outline mui-btn--sm" data-sonner-pos="bottom-center" aria-pressed="false" { "bottom-center" }
button type="button" class="mui-btn mui-btn--outline mui-btn--sm" data-sonner-pos="bottom-right" aria-pressed="true" { "bottom-right" }
}
div.mui-showcase__row {
button type="button" class="mui-btn mui-btn--primary mui-btn--md" data-sonner-fire {
"Show toast"
}
}
script { (maud::PreEscaped(script)) }
}
}
}
}