fix(toaster): render error toasts on a red surface
Error toasts previously used the same neutral popover background as success toasts, so a failure (e.g. a save while the backend is down) read like a normal 'Canvas saved'. Set sonner's per-type --error-bg/ --error-text/--error-border so errors stand out in red.
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
import { describe, it, expect, afterEach, beforeAll, vi } from 'vitest'
|
||||
import { render, cleanup, waitFor } from '@testing-library/react'
|
||||
import { toast } from 'sonner'
|
||||
import { Toaster } from '../sonner'
|
||||
|
||||
beforeAll(() => {
|
||||
// sonner reads matchMedia for theme detection; jsdom doesn't provide it.
|
||||
window.matchMedia = vi.fn().mockImplementation((query: string) => ({
|
||||
matches: false,
|
||||
media: query,
|
||||
onchange: null,
|
||||
addEventListener: vi.fn(),
|
||||
removeEventListener: vi.fn(),
|
||||
addListener: vi.fn(),
|
||||
removeListener: vi.fn(),
|
||||
dispatchEvent: vi.fn(),
|
||||
}))
|
||||
})
|
||||
|
||||
afterEach(() => cleanup())
|
||||
|
||||
describe('Toaster', () => {
|
||||
it('renders error toasts on a red surface so failures are visible', async () => {
|
||||
render(<Toaster />)
|
||||
toast.error('Save failed')
|
||||
// The style (with the CSS vars) lands on the toast list, mounted on first toast.
|
||||
const list = await waitFor(() => {
|
||||
const el = document.querySelector('[data-sonner-toaster]') as HTMLElement | null
|
||||
expect(el).not.toBeNull()
|
||||
return el!
|
||||
})
|
||||
const style = list.getAttribute('style') ?? ''
|
||||
expect(style).toContain('--error-bg: #f85149')
|
||||
expect(style).toContain('--error-text: #ffffff')
|
||||
})
|
||||
})
|
||||
@@ -34,6 +34,11 @@ const Toaster = ({ ...props }: ToasterProps) => {
|
||||
"--normal-text": "var(--popover-foreground)",
|
||||
"--normal-border": "var(--border)",
|
||||
"--border-radius": "var(--radius)",
|
||||
// Errors use a red surface so failures (e.g. a failed save while the
|
||||
// backend is down) stand out instead of reading like a normal toast.
|
||||
"--error-bg": "#f85149",
|
||||
"--error-text": "#ffffff",
|
||||
"--error-border": "#da3633",
|
||||
} as React.CSSProperties
|
||||
}
|
||||
toastOptions={{
|
||||
|
||||
Reference in New Issue
Block a user