{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "sonner", "dependencies": [ "sonner", "next-themes" ], "registryDependencies": [ "https://powui.dev/r/utils.json", "https://powui.dev/r/filters.json", "https://powui.dev/r/theme.json" ], "files": [ { "path": "src/components/ui/sonner.tsx", "content": "\"use client\";\n\nimport * as React from \"react\";\nimport {\n Toaster as Sonner,\n toast,\n type ExternalToast,\n type ToasterProps,\n} from \"sonner\";\nimport { Filters } from \"@/components/ui/filters\";\nimport { cn } from \"@/lib/utils\";\n\n// ─── Design tokens per variant ───────────────────────────────────────────────\n\nexport type ComicToastVariant =\n | \"default\"\n | \"success\"\n | \"error\"\n | \"warning\"\n | \"info\";\n\nexport const variantTokens: Record<\n ComicToastVariant,\n { badge: string; bg: string; rotate: string; badgeBg: string }\n> = {\n default: {\n badge: \"HEY!\",\n bg: \"var(--toast-default-bg)\",\n rotate: \"-3deg\",\n badgeBg: \"var(--toast-default-badge-bg)\",\n },\n success: {\n badge: \"POW!\",\n bg: \"var(--toast-success-bg)\",\n rotate: \"3deg\",\n badgeBg: \"var(--toast-success-badge-bg)\",\n },\n error: {\n badge: \"ZAP!\",\n bg: \"var(--toast-error-bg)\",\n rotate: \"-4deg\",\n badgeBg: \"var(--toast-error-badge-bg)\",\n },\n warning: {\n badge: \"UH-OH!\",\n bg: \"var(--toast-warning-bg)\",\n rotate: \"2deg\",\n badgeBg: \"var(--toast-warning-badge-bg)\",\n },\n info: {\n badge: \"HMM...\",\n bg: \"var(--toast-info-bg)\",\n rotate: \"-2deg\",\n badgeBg: \"var(--toast-info-badge-bg)\",\n },\n};\n\n// ─── Comic toast JSX ─────────────────────────────────────────────────────────\n\ninterface ComicToastProps {\n title: React.ReactNode;\n description?: React.ReactNode;\n variant?: ComicToastVariant;\n containerClassName?: string;\n}\n\nexport function ComicToast({\n title,\n description,\n variant = \"default\",\n containerClassName,\n}: ComicToastProps) {\n const { badge, bg, rotate, badgeBg } = variantTokens[variant];\n const isDark = [\"success\", \"error\", \"warning\", \"info\"].includes(variant);\n const textColor = isDark ? \"white\" : \"light-dark(black, white)\";\n\n return (\n \n \n {/* Exclamation badge — top-right corner */}\n \n {badge}\n \n\n {/* Title */}\n \n {title}\n \n\n {/* Description — solid pill for legibility over halftone */}\n {description && (\n \n {description}\n \n )}\n \n \n );\n}\n\n// ─── Convenience fire functions ───────────────────────────────────────────────\n\nfunction fireComicToast(\n variant: ComicToastVariant,\n title: React.ReactNode,\n description?: React.ReactNode,\n data?: ExternalToast & { containerClassName?: string },\n) {\n toast.custom(\n () => (\n \n ),\n data,\n );\n}\n\ntype TComicToastFunc = (\n title: React.ReactNode,\n description?: React.ReactNode,\n data?: ExternalToast & {\n containerClassName?: string;\n },\n) => void;\n\nconst comicToastCurry =\n (variant: ComicToastVariant) =>\n (\n title: React.ReactNode,\n description?: React.ReactNode,\n data?: ExternalToast & { containerClassName?: string },\n ) =>\n fireComicToast(variant, title, description, data);\n\nexport const comicToast: {\n default: TComicToastFunc;\n success: TComicToastFunc;\n error: TComicToastFunc;\n warning: TComicToastFunc;\n info: TComicToastFunc;\n} = {\n default: comicToastCurry(\"default\"),\n success: comicToastCurry(\"success\"),\n error: comicToastCurry(\"error\"),\n warning: comicToastCurry(\"warning\"),\n info: comicToastCurry(\"info\"),\n};\n\n// ─── Toaster (place once in app root) ────────────────────────────────────────\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n return (\n \n );\n};\n\nexport { Toaster };\n", "type": "registry:ui" } ], "cssVars": { "light": { "toast-default-bg": "#f59e0b", "toast-default-badge-bg": "#fcd34d", "toast-success-bg": "#16a34a", "toast-success-badge-bg": "#4ade80", "toast-error-bg": "#dc2626", "toast-error-badge-bg": "#f87171", "toast-warning-bg": "#ea580c", "toast-warning-badge-bg": "#fb923c", "toast-info-bg": "#2563eb", "toast-info-badge-bg": "#60a5fa" }, "dark": { "toast-default-bg": "oklch(0.5 0.12 60)", "toast-default-badge-bg": "oklch(0.7 0.1 80)", "toast-success-bg": "oklch(0.48 0.13 142)", "toast-success-badge-bg": "oklch(0.7 0.12 142)", "toast-error-bg": "oklch(0.5 0.16 27)", "toast-error-badge-bg": "oklch(0.7 0.13 27)", "toast-warning-bg": "oklch(0.55 0.15 50)", "toast-warning-badge-bg": "oklch(0.72 0.12 50)", "toast-info-bg": "oklch(0.48 0.14 245)", "toast-info-badge-bg": "oklch(0.68 0.12 245)" } }, "type": "registry:ui" }