Variants
import { html, renderApp } from 'mates';
import { FilledButton, DangerButton, OutlinedButton, useSnackbar } from 'mates-ui';
const App = () => {
const snack = useSnackbar();
return () => html`
<x-row gap="var(--md-space-2)" wrap>
${OutlinedButton("Default", { onClick: () => snack.default("Copied to clipboard") })}
${FilledButton("Success", { onClick: () => snack.success("Changes saved successfully") })}
${DangerButton("Error", { onClick: () => snack.error("Something went wrong. Please try again.") })}
${OutlinedButton("Warning", { onClick: () => snack.warning("You are running low on storage space.") })}
${OutlinedButton("Info", { onClick: () => snack.info("A new version is available.") })}
</x-row>
`;
};
renderApp(App, document.getElementById('app'));
Positions
import { html, renderApp } from 'mates';
import { OutlinedButton, FilledButton, useSnackbar } from 'mates-ui';
const App = () => {
const snack = useSnackbar();
return () => html`
<x-row gap="var(--md-space-2)" wrap>
${OutlinedButton("Top left", { size: "sm", onClick: () => snack.info("Top left", { position: "top-left", ttl: 2500 }) })}
${OutlinedButton("Top center", { size: "sm", onClick: () => snack.info("Top center", { position: "top-center", ttl: 2500 }) })}
${OutlinedButton("Top right", { size: "sm", onClick: () => snack.info("Top right", { position: "top-right", ttl: 2500 }) })}
${FilledButton("Bottom center", { size: "sm", onClick: () => snack.success("Bottom center", { position: "bottom-center", ttl: 2500 }) })}
${OutlinedButton("Bottom left", { size: "sm", onClick: () => snack.success("Bottom left", { position: "bottom-left", ttl: 2500 }) })}
${OutlinedButton("Bottom right", { size: "sm", onClick: () => snack.success("Bottom right", { position: "bottom-right", ttl: 2500 }) })}
</x-row>
`;
};
renderApp(App, document.getElementById('app'));
With action button
import { html, renderApp } from 'mates';
import { DangerButton, OutlinedButton, useSnackbar } from 'mates-ui';
const App = () => {
const snack = useSnackbar();
return () => html`
<x-row gap="var(--md-space-2)" wrap>
${OutlinedButton("Undo action", { onClick: () => snack.default("Item deleted", { action: { label: "Undo", onClick: () => snack.success("Undo successful") } }) })}
${DangerButton("Retry on error", { onClick: () => snack.error("Upload failed", { action: { label: "Retry", onClick: () => snack.info("Retrying…") }, ttl: -1 }) })}
${OutlinedButton("Manage storage", { onClick: () => snack.warning("Storage almost full", { action: { label: "Manage", onClick: () => snack.info("Opening storage…") } }) })}
</x-row>
`;
};
renderApp(App, document.getElementById('app'));
Persistent (ttl: -1)
import { html, renderApp } from 'mates';
import { DangerButton, OutlinedButton, useSnackbar } from 'mates-ui';
const App = () => {
const snack = useSnackbar();
return () => html`
<x-row gap="var(--md-space-2)" wrap>
${OutlinedButton("Start sync", {
onClick: () => {
snack.info("Syncing data…", { ttl: -1, dismissible: false, action: { label: "Cancel", onClick: () => {} } });
setTimeout(() => snack.success("Sync complete"), 3000);
},
})}
${DangerButton("Persistent error", {
onClick: () => snack.error("Connection lost — working offline", { ttl: -1, action: { label: "Dismiss", onClick: () => {} } }),
})}
</x-row>
`;
};
renderApp(App, document.getElementById('app'));
Without dismiss button
import { html, renderApp } from 'mates';
import { OutlinedButton, useSnackbar } from 'mates-ui';
const App = () => {
const snack = useSnackbar();
return () => html`
<x-row>
${OutlinedButton("No dismiss (3 s)", {
onClick: () => snack.success("Auto-dismisses in 3 seconds", { dismissible: false, ttl: 3000 }),
})}
</x-row>
`;
};
renderApp(App, document.getElementById('app'));
Stacking multiple
import { html, renderApp } from 'mates';
import { FilledButton, useSnackbar } from 'mates-ui';
const App = () => {
const snack = useSnackbar();
return () => html`
<x-row>
${FilledButton("Fire 3 toasts", {
onClick: () => {
snack.success("File uploaded");
snack.info("Processing started");
snack.warning("Low memory");
},
})}
</x-row>
`;
};
renderApp(App, document.getElementById('app'));
Static Snackbar component
import { html, atom, nothing, renderApp } from 'mates';
import { Snackbar, FilledButton, DangerButton, OutlinedButton, useSnackbar } from 'mates-ui';
const App = () => {
const snack = useSnackbar();
const open = atom(false);
const openSucc = atom(false);
const openErr = atom(false);
const openAct = atom(false);
return () => html`
<x-col gap="var(--md-space-4)">
<x-row gap="var(--md-space-2)" wrap>
${OutlinedButton("Default", { onClick: () => open.set(!open()) })}
${FilledButton("Success", { onClick: () => openSucc.set(!openSucc()) })}
${DangerButton("Error", { onClick: () => openErr.set(!openErr()) })}
${OutlinedButton("With action", { onClick: () => openAct.set(!openAct()) })}
</x-row>
${open() ? Snackbar({ message: "This is a default static snackbar.", position: "bottom-end", dismissible: true, onDismiss: () => open.set(false) }) : nothing}
${openSucc() ? Snackbar({ message: "Profile updated successfully.", variant: "success", position: "bottom-end", dismissible: true, onDismiss: () => openSucc.set(false) }) : nothing}
${openErr() ? Snackbar({ message: "Failed to save changes.", variant: "error", position: "bottom-end", dismissible: true, onDismiss: () => openErr.set(false) }) : nothing}
${openAct() ? Snackbar({ message: "Comment deleted.", position: "bottom-end", dismissible: true, action: { label: "Undo", onClick: () => { openAct.set(false); snack.success("Comment restored"); } }, onDismiss: () => openAct.set(false) }) : nothing}
</x-col>
`;
};
renderApp(App, document.getElementById('app'));