सामग्री पर जाएँ

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.json
npx shadcn@latest add https://neobrutalism.com/r/base/sonner.json
yarn dlx shadcn@latest add https://neobrutalism.com/r/base/sonner.json
bunx --bun shadcn@latest add https://neobrutalism.com/r/base/sonner.json

Toaster कंपोनेंट जोड़ें।

app/layout.tsx
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-themes
npm install sonner next-themes
yarn add sonner next-themes
bun add sonner next-themes

निम्नलिखित कोड को कॉपी करके अपने प्रोजेक्ट में पेस्ट करें।

components/ui/sonner.tsx
"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 कंपोनेंट जोड़ें।

app/layout.tsx
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 रेफ़रेंस देखें।