https://user-images.githubusercontent.com/36730035/220868994-f0c92862-7e7d-487c-ab3a-540e7b48ab4a.mp4 # Introduction [Sonner](https://sonner.emilkowal.ski/) is an opinionated toast component for React. It's customizable, but styled by default. Comes with a swipe to dismiss animation. ## Usage To start using the library, install it in your project: ```bash npm install sonner ``` Add `` to your app, it will be the place where all your toasts will be rendered. After that you can use `toast()` from anywhere in your app. ```jsx import { Toaster, toast } from 'sonner'; // ... function App() { return (
); } ``` ## Types ### Default Most basic toast. You can customize it (and any other type) by passing an options object as the second argument. ```jsx toast('Event has been created'); ``` With custom icon and description: ```jsx toast('Event has been created', { description: 'Monday, January 3rd at 6:00pm', icon: , }); ``` ### Success Renders a checkmark icon in front of the message. ```jsx toast.success('Event has been created'); ``` ### Error Renders an error icon in front of the message. ```jsx toast.error('Event has not been created'); ``` ### Action Renders a button. ```jsx toast('Event has been created', { action: { label: 'Undo', onClick: () => console.log('Undo'), }, }); ``` ### Promise Starts in a loading state and will update automatically after the promise resolves or fails. ```jsx toast.promise(() => new Promise((resolve) => setTimeout(resolve, 2000)), { loading: 'Loading', success: 'Success', error: 'Error', }); ``` You can pass a function to the success/error messages to incorporate the result/error of the promise. ```jsx toast.promise(promise, { loading: 'Loading...', success: (data) => { return `${data.name} has been added!`; }, error: 'Error', }); ``` ### Custom JSX You can pass jsx as the first argument instead of a string to render custom jsx while maintaining default styling. You can use the headless version below for a custom, unstyled toast. ```jsx toast(
A custom toast with default styling
); ``` ## Customization ### Headless You can use `toast.custom` to render an unstyled toast with custom jsx while maintaining the functionality. ```jsx toast.custom((t) => (
This is a custom component
)); ``` ### Theme You can change the theme using the `theme` prop. Default theme is light. ```jsx ``` ### Position You can change the position through the `position` prop on the `` component. Default is `bottom-right`. ```jsx // Available positions // top-left, top-center, top-right, bottom-left, bottom-center, bottom-right ``` ### Expanded Toasts can also be expanded by default through the `expand` prop. You can also change the amount of visible toasts which is 3 by default. ```jsx ``` ### Styling for all toasts You can style your toasts globally with the `toastOptions` prop in the `Toaster` component. ```jsx ``` ### Styling for individual toast ```jsx toast('Event has been created', { style: { background: 'red', }, className: 'my-toast', descriptionClassName: 'my-toast-description', }); ``` ### Close button Add a close button to all toasts that shows on hover by adding the `closeButton` prop. ```jsx ``` ### Rich colors You can make error and success state more colorful by adding the `richColors` prop. ```jsx ``` ### Custom offset Offset from the edges of the screen. ```jsx ``` ### Programmatically remove toast To remove a toast programmatically use `toast.dismiss(id)`. ```jsx const toastId = toast('Event has been created'); toast.dismiss(toastId); ``` ## Keyboard focus You can focus on the toast area by pressing ⌥/alt + T. You can override it by providing an array of event.code values for each key. ```jsx ```