///|
fn toast_position_style(position : ToastPosition) -> String {
let top = position is ToastTopLeft ||
position is ToastTopCenter ||
position is ToastTopRight
let left = position is ToastTopLeft || position is ToastBottomLeft
let center = position is ToastTopCenter || position is ToastBottomCenter
"position:fixed;width:360px;max-width:calc(100vw - 24px);" +
(if top { "top:12px;bottom:auto;" } else { "bottom:24px;top:auto;" }) +
(if center {
"left:50%;right:auto;transform:translateX(-50%);"
} else if left {
"left:12px;right:auto;"
} else {
"right:12px;left:auto;"
})
}
///|
fn toast_variant_style(variant : ToastVariant, rich : Bool) -> String {
match variant {
ToastDefault => ""
ToastDestructive =>
"border-color:var(--mmui-destructive);color:var(--mmui-destructive);" +
(if rich { "background:var(--mmui-muted);" } else { "" })
ToastSuccess =>
if rich {
"border-color:#16a34a;color:#166534;background:#f0fdf4;"
} else {
"border-color:#16a34a;"
}
}
}
///|
pub fn dismiss_all_toasts(context : UiContext) -> @minimoon.Cmd {
(context.toasts.emit)(Clear)
}
///|
pub fn[C : @minimoon.IsChildren] toast_surface(
children : C,
variant? : ToastVariant = ToastDefault,
open? : Bool = true,
id? : String = "",
) -> @minimoon.Node {
if open {
ui_container(
"toast",
id~,
style=toast_variant_style(variant, false),
semantics=@minimoon.semantics(role=@minimoon.StatusRole, live="polite"),
children.to_nodes(),
)
} else {
@minimoon.nothing()
}
}
///|
pub fn toast_title(text : String) -> @minimoon.Node {
ui_container("toast-title", [@minimoon.text(text)])
}
///|
pub fn toast_description(text : String) -> @minimoon.Node {
ui_container("toast-description", [@minimoon.text(text)])
}
///|
pub fn[C : @minimoon.IsChildren] toast_action(
on_tap~ : @minimoon.Cmd,
children : C,
) -> @minimoon.Node {
@minimoon.button_children(on_tap~, class="mmui-toast-action", children)
}
///|
pub fn toast_close(
context : UiContext,
id~ : String,
label? : String = "Dismiss",
) -> @minimoon.Node {
@minimoon.button(
on_tap=dismiss_toast(context, id),
class="mmui-toast-close",
label,
)
}