Sonner
सेव पुष्टि, अपलोड और अनडू विंडो के लिए स्टैक्ड टोस्ट सूचनाएं — नियोब्रूटलिस्ट बॉर्डर्स-एंड-शैडोज़ ट्रीटमेंट के साथ।
"use client"
import { toast } from "sonner"Sonner एक ही toast() कॉल से स्क्रीन पर स्टैक होते हुए, अपने आप ग़ायब होने वाले टोस्ट दिखा देता है — एक <Toaster /> माउंट करें और कहीं से भी नोटिफ़िकेशन भेजें, कोई कॉन्टेक्स्ट वायरिंग नहीं। यह Radix या Base UI प्रिमिटिव नहीं है: दोनों बैकएंड वैरिएंट emilkowalski की उसी Sonner लाइब्रेरी को रैप करते हैं, जिसे नियोब्रूटलिस्ट रेसिपी के अनुसार स्टाइल किया गया है: मोटे बॉर्डर, कठोर छायाएँ और बोल्ड टाइपोग्राफ़ी।
इसे इन स्थितियों में चुनें:
- क्रिया की प्रतिक्रिया — म्यूटेशन पूरा होने पर "सेव हो गया", "क्लिपबोर्ड पर कॉपी हो गया", "सेटिंग्स अपडेट हो गईं" जैसे संदेश।
- एसिंक ऑपरेशन —
toast.promise()किसी अपलोड या डिप्लॉय को लोडिंग से लेकर सफलता या एरर तक एक ही टोस्ट में ट्रैक करता है। - अनडू की मोहलत — डिलीट और आर्काइव के साथ एक ऐक्शन बटन दें, ताकि विनाशकारी कामों के लिए थोड़ा वक़्त मिल जाए।
परिचय#
Sonner को emilkowalski द्वारा बनाया और मेंटेन किया जाता है।
इंस्टॉलेशन#
निम्नलिखित कमांड चलाएँ:
pnpm dlx shadcn@latest add https://neobrutalism.com/r/base/sonner.jsonnpx shadcn@latest add https://neobrutalism.com/r/base/sonner.jsonyarn dlx shadcn@latest add https://neobrutalism.com/r/base/sonner.jsonbunx --bun shadcn@latest add https://neobrutalism.com/r/base/sonner.json
Toaster कंपोनेंट जोड़ें।
import { Toaster } from "@/components/ui/sonner"
export default function RootLayout({ children }) {
return (
<html lang="en">
<head />
<body>
<main>{children}</main>
<Toaster />
</body>
</html>
)
}निम्नलिखित डिपेंडेंसीज़ इंस्टॉल करें:
pnpm add sonner next-themesnpm install sonner next-themesyarn add sonner next-themesbun add sonner next-themes
निम्नलिखित कोड को कॉपी करके अपने प्रोजेक्ट में पेस्ट करें।
"use client"
import {
CircleCheckIcon,
InfoIcon,
Loader2Icon,
OctagonXIcon,
TriangleAlertIcon,
} from "lucide-react"
import { useTheme } from "next-themes"
import { Toaster as Sonner, type ToasterProps } from "sonner"
const Toaster = ({ ...props }: ToasterProps) => {
const { theme = "system" } = useTheme()
return (
<Sonner
theme={theme as ToasterProps["theme"]}
className="toaster group"
icons={{
success: <CircleCheckIcon className="size-4" />,
info: <InfoIcon className="size-4" />,
warning: <TriangleAlertIcon className="size-4" />,
error: <OctagonXIcon className="size-4" />,
loading: <Loader2Icon className="size-4 animate-spin" />,
}}
toastOptions={{
// Fully unstyled so the neobrutalist recipe below owns every surface:
// hard offset shadow, 2px border, square corners, press-down buttons.
unstyled: true,
classNames: {
toast:
"group/toast relative flex w-(--width) items-center gap-3 rounded border-2 border-border bg-popover p-4 font-sans text-popover-foreground shadow-md",
content: "flex min-w-0 flex-col gap-0.5",
title: "font-head text-sm font-medium",
description: "text-sm text-muted-foreground",
icon: "shrink-0",
actionButton:
"ms-auto h-fit min-w-fit shrink-0 rounded border-2 border-border bg-primary px-2 py-1 text-xs font-medium text-primary-foreground shadow-sm transition-all duration-200 hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none",
cancelButton:
"ms-auto h-fit min-w-fit shrink-0 rounded border-2 border-border bg-muted px-2 py-1 text-xs font-medium text-foreground shadow-sm transition-all duration-200 hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none",
closeButton:
"absolute -top-2 -start-2 rounded-full border-2 border-border bg-background p-0.5 transition-colors hover:bg-muted",
success: "[&_[data-icon]]:text-chart-2",
warning: "[&_[data-icon]]:text-chart-1",
error: "[&_[data-icon]]:text-destructive",
},
}}
{...props}
/>
)
}
export { Toaster }
Toaster कंपोनेंट जोड़ें।
import { Toaster } from "@/components/ui/sonner"
export default function RootLayout({ children }) {
return (
<html lang="en">
<head />
<body>
<Toaster />
<main>{children}</main>
</body>
</html>
)
}उपयोग#
import { toast } from "sonner"toast("Event has been created.")उदाहरण#
प्रकार#
"use client"
import { toast } from "sonner"विवरण#
"use client"
import { toast } from "sonner"पोज़िशन#
toast की पोज़िशन बदलने के लिए position प्रॉप का उपयोग करें।
"use client"
import { toast } from "sonner"एक्सेसिबिलिटी#
टोस्ट के लिए WAI-ARIA APG में कोई अलग पैटर्न नहीं है; सबसे नज़दीकी मार्गदर्शन Alert पैटर्न है। Sonner टोस्ट को एक पोलाइट ARIA लाइव रीजन में रेंडर करता है, इसलिए स्क्रीन रीडर फ़ोकस छीने बिना उनकी घोषणा करते हैं। यह रीजन सामान्य टैब क्रम से बाहर रहता है — वहाँ सिर्फ़ हॉटकी से पहुँचा जा सकता है — और जब स्टैक पर पॉइंटर हो, उस पर फ़ोकस हो या टैब छिपा हो, तब डिसमिस टाइमर रुक जाते हैं।
कीबोर्ड इंटरैक्शन:
| कुंजी | क्रिया |
|---|---|
Alt + T | टोस्ट स्टैक पर फ़ोकस करें और उसे फैलाएँ (Toaster के hotkey प्रॉप से बदला जा सकता है) |
Tab / Shift + Tab | टोस्ट और उनके ऐक्शन / क्लोज़ बटन के बीच आगे बढ़ें |
Enter / Space | फ़ोकस किया गया ऐक्शन या क्लोज़ बटन चलाएँ |
Escape | फ़ोकस स्टैक के भीतर रहते हुए टोस्ट स्टैक समेटें |
API रेफ़रेंस#
अधिक जानकारी के लिए Sonner API रेफ़रेंस देखें।