From 3ff76c8c331a971d08e1fe0e046e4658346ce7fa Mon Sep 17 00:00:00 2001 From: Amit Haridas Date: Fri, 5 Jun 2026 22:50:07 +0530 Subject: [PATCH] feat(renderer): add shadcn Toaster primitive --- src/renderer/components/ui/sonner.tsx | 34 +++++++++++++++++++++++++++ tests/component/ui/sonner.test.tsx | 17 ++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/renderer/components/ui/sonner.tsx create mode 100644 tests/component/ui/sonner.test.tsx diff --git a/src/renderer/components/ui/sonner.tsx b/src/renderer/components/ui/sonner.tsx new file mode 100644 index 0000000..b24d6c3 --- /dev/null +++ b/src/renderer/components/ui/sonner.tsx @@ -0,0 +1,34 @@ +"use client" + +import { useTheme } from "next-themes" +import { Toaster as Sonner } from "sonner" + +type ToasterProps = React.ComponentProps + +const Toaster = ({ ...props }: ToasterProps) => { + const { theme = "system" } = useTheme() + + return ( + + ) +} + +export { Toaster } \ No newline at end of file diff --git a/tests/component/ui/sonner.test.tsx b/tests/component/ui/sonner.test.tsx new file mode 100644 index 0000000..91f224f --- /dev/null +++ b/tests/component/ui/sonner.test.tsx @@ -0,0 +1,17 @@ +import { describe, it, expect } from 'vitest'; +import { render } from '@testing-library/react'; +import { Toaster } from '@/components/ui/sonner'; +import { ThemeProvider } from '@/components/theme-provider'; + +describe('Toaster', () => { + it('renders inside ThemeProvider without crashing', () => { + const { container } = render( + + + + ); + // The Toaster portal is mounted at body level, so the container may be empty + // but the test should not throw + expect(container).toBeDefined(); + }); +}); \ No newline at end of file