{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "toast",
  "title": "Toast",
  "description": "Notification toast with provider, hook, container, and theme variants.",
  "dependencies": ["class-variance-authority", "lucide-react"],
  "registryDependencies": ["https://indiacn.in/r/theme.json"],
  "files": [
    {
      "path": "components/ui/toast.tsx",
      "content": "'use client';\n/* eslint-disable eslint-frontend-rules/top-level-const-snake */\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { X } from 'lucide-react';\nimport { ComponentProps, createContext, useCallback, useContext, useState } from 'react';\n\nimport { cn } from '@/lib/utils';\n\n/*\n * UX4G toast: max-width 350px, font-size 0.875rem, border-radius 0.5rem,\n * border 1px solid neutral-200,\n * shadow: 0px 4px 6px -2px rgba(33,33,33,0.03), 0px 12px 16px -4px rgba(33,33,33,0.08).\n * Header: padding 0.75rem, NO border-bottom. Body: padding 0.75rem.\n */\nconst TOAST_VARIANTS = cva(\n  'pointer-events-auto relative flex w-[350px] max-w-full items-center justify-between overflow-hidden rounded-lg border p-3 text-sm shadow-lg transition-all',\n  {\n    variants: {\n      theme: {\n        default: 'bg-neutral-0 text-neutral border-neutral-200',\n        primary: 'bg-primary text-neutral-0 border-transparent',\n        secondary: 'bg-secondary text-neutral-0 border-transparent',\n        success: 'bg-success text-neutral-0 border-transparent',\n        danger: 'bg-danger text-neutral-0 border-transparent',\n        warning: 'bg-warning text-neutral-0 border-transparent',\n        info: 'bg-info text-neutral-0 border-transparent',\n      },\n    },\n    defaultVariants: {\n      theme: 'default',\n    },\n  },\n);\n\ntype TToastTheme = NonNullable<VariantProps<typeof TOAST_VARIANTS>['theme']>;\n\ninterface IToast {\n  id: string;\n  title?: string;\n  description?: string;\n  theme?: TToastTheme;\n  duration?: number;\n}\n\ninterface IToastContext {\n  toasts: IToast[];\n  addToast: (toast: Omit<IToast, 'id'>) => void;\n  removeToast: (id: string) => void;\n}\n\nconst ToastContext = createContext<IToastContext>({\n  toasts: [],\n  addToast: () => {},\n  removeToast: () => {},\n});\n\n/** Context provider that manages toast state. */\nfunction ToastProvider({ children }: { children: React.ReactNode }) {\n  const [toasts, setToasts] = useState<IToast[]>([]);\n\n  const addToast = useCallback((toast: Omit<IToast, 'id'>) => {\n    const id = Math.random().toString(36).slice(2);\n    setToasts(prev => [...prev, { ...toast, id }]);\n\n    if (toast.duration !== 0) {\n      setTimeout(() => {\n        setToasts(prev => prev.filter(t => t.id !== id));\n      }, toast.duration ?? 5000);\n    }\n  }, []);\n\n  const removeToast = useCallback((id: string) => {\n    setToasts(prev => prev.filter(t => t.id !== id));\n  }, []);\n\n  return (\n    <ToastContext.Provider value={{ toasts, addToast, removeToast }}>\n      {children}\n    </ToastContext.Provider>\n  );\n}\n\n/** Hook to create and dismiss toast notifications. */\nfunction useToast() {\n  const context = useContext(ToastContext);\n  return { toast: context.addToast, dismiss: context.removeToast, toasts: context.toasts };\n}\n\ninterface IToastProps extends ComponentProps<'div'>, VariantProps<typeof TOAST_VARIANTS> {\n  onDismiss?: () => void;\n}\n\n/** Dismissable toast notification component. */\nfunction Toast({ className, theme, onDismiss, children, ...props }: IToastProps) {\n  return (\n    <div\n      role='alert'\n      aria-live='assertive'\n      aria-atomic='true'\n      className={cn(TOAST_VARIANTS({ theme, className }))}\n      {...props}\n    >\n      <div className='flex-1'>{children}</div>\n      {onDismiss && (\n        <button\n          type='button'\n          onClick={onDismiss}\n          className='ml-2 shrink-0 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none'\n          aria-label='Close'\n        >\n          <X className='size-4' />\n        </button>\n      )}\n    </div>\n  );\n}\n\n/** Title heading for a toast notification. */\nfunction ToastTitle({ className, ...props }: ComponentProps<'div'>) {\n  return <div className={cn('text-sm font-semibold', className)} {...props} />;\n}\n\n/** Description body text for a toast notification. */\nfunction ToastDescription({ className, ...props }: ComponentProps<'div'>) {\n  return <div className={cn('text-sm opacity-90', className)} {...props} />;\n}\n\n/** Fixed-position container for stacking toast notifications. */\nfunction ToastContainer({\n  className,\n  position = 'bottom-right',\n  ...props\n}: ComponentProps<'div'> & {\n  position?:\n    | 'top-left'\n    | 'top-right'\n    | 'top-center'\n    | 'bottom-left'\n    | 'bottom-right'\n    | 'bottom-center';\n}) {\n  const positionClasses = {\n    'top-left': 'top-4 left-4',\n    'top-right': 'top-4 right-4',\n    'top-center': 'top-4 left-1/2 -translate-x-1/2',\n    'bottom-left': 'bottom-4 left-4',\n    'bottom-right': 'bottom-4 right-4',\n    'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2',\n  };\n\n  return (\n    <div\n      className={cn(\n        'fixed z-50 flex w-full max-w-sm flex-col gap-2',\n        positionClasses[position],\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nexport {\n  Toast,\n  ToastTitle,\n  ToastDescription,\n  ToastContainer,\n  ToastProvider,\n  useToast,\n  TOAST_VARIANTS,\n};\n",
      "type": "registry:ui"
    }
  ],
  "type": "registry:ui"
}
