solid-sonner
v0.3.2
Published
An opinionated toast component for Solid.
Readme
solid-sonner
An opinionated toast component for Solid.
This package tracks the React Sonner API as closely as possible while keeping the implementation Solid-friendly.
Install
npm i solid-sonner
# or
yarn add solid-sonner
# or
pnpm add solid-sonnerQuick start
import { Toaster, toast } from 'solid-sonner';
export default function App() {
return (
<div>
<Toaster />
<button onClick={() => toast('My first toast')}>Give me a toast</button>
</div>
);
}API
Exports:
ToastertoastuseSonner- types:
Action,ExternalToast,ToastClassnames,ToastT,ToastToDismiss,ToasterProps
Toast types
toast('Event has been created');
toast.success('Event has been created');
toast.info('Event has new information');
toast.warning('Event has warning');
toast.error('Event has not been created');
toast.loading('Loading data');With description, icon, and actions:
toast('Event has been created', {
description: 'Monday, January 3rd at 6:00pm',
icon: <MyIcon />,
action: {
label: 'Undo',
onClick: () => console.log('Undo'),
},
cancel: {
label: 'Cancel',
},
});Promise toasts
toast.promise(fetchData(), {
loading: 'Loading...',
success: (data) => `${data.name} has been added!`,
error: 'Error',
});Extended results are supported too:
toast.promise(saveProject(), {
loading: 'Saving...',
success: (result) => ({
message: 'Project saved',
description: result.id,
}),
error: (error) => ({
message: 'Save failed',
description: String(error),
}),
});Updating and dismissing
const id = toast('Uploading...', { duration: Number.POSITIVE_INFINITY });
toast.success('Done', { id });
toast.dismiss(id);
toast.dismiss();Headless custom toasts
toast.custom((id) => (
<div>
Custom toast <button onClick={() => toast.dismiss(id)}>close</button>
</div>
));Read current state
const { toasts } = useSonner();
toast.getToasts();
toast.getHistory();Toaster props
<Toaster
theme="system"
position="top-right"
richColors
closeButton
expand
visibleToasts={5}
duration={5000}
gap={14}
offset={32}
mobileOffset={{ bottom: 24, left: 16, right: 16 }}
hotkey={['altKey', 'KeyT']}
dir="auto"
swipeDirections={['top', 'right']}
containerAriaLabel="Notifications"
toastOptions={{
className: 'my-toast',
descriptionClassName: 'my-toast-description',
closeButtonAriaLabel: 'Close notification',
classNames: {
toast: 'toast',
title: 'title',
description: 'description',
},
}}
/>Legacy aliases from older solid-sonner versions still work for compatibility:
class->classNameclasses->classNamesdescriptionClass->descriptionClassName
Multiple toasters
<>
<Toaster />
<Toaster id="sidebar" position="top-left" />
</>;
toast('Global toast');
toast('Sidebar toast', { toasterId: 'sidebar' });Tailwind / unstyled mode
<Toaster
toastOptions={{
unstyled: true,
classNames: {
toast: 'bg-blue-500 text-white',
title: 'font-semibold',
description: 'text-blue-100',
actionButton: 'bg-white text-blue-700',
cancelButton: 'bg-blue-700 text-white',
closeButton: 'bg-white text-black',
},
}}
/>Notes
pauseWhenPageIsHiddenis available and defaults to Sonner-like hidden-page pausing behavior- Per-toast
closeButton,dismissible,richColors,testId, andtoasterIdare supported actionrespectsevent.preventDefault()and will keep the toast open
License
MIT
