diff --git a/website/js/notification-manager.js b/website/js/notification-manager.js index 8ac61c715..739417f77 100644 --- a/website/js/notification-manager.js +++ b/website/js/notification-manager.js @@ -139,7 +139,7 @@ class NotificationManager { toast.style.transform = 'translateY(-20px)'; // Respect reduced motion preference - const reduceMotion = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches; + const reduceMotion = window.matchMedia?.('(prefers-reduced-motion: reduce)')?.matches; if (reduceMotion) { toast.style.transition = 'none'; } diff --git a/website/test/setup.js b/website/test/setup.js index fb5ba73be..15d1e1d19 100644 --- a/website/test/setup.js +++ b/website/test/setup.js @@ -33,12 +33,21 @@ if (typeof navigator !== 'undefined') { }); } -// Optional: matchMedia stub +// Enhanced matchMedia mock for proper test environment support +// Only override if matchMedia is not already available (e.g., in certain test environments) if (!window.matchMedia) { - window.matchMedia = vi.fn().mockReturnValue({ - matches: false, - addEventListener: vi.fn(), - removeEventListener: vi.fn() + Object.defineProperty(window, 'matchMedia', { + writable: true, + value: vi.fn().mockImplementation(query => ({ + matches: false, + media: query, + onchange: null, + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + addListener: vi.fn(), // Deprecated since Chrome 64, Firefox 65, Safari 14; use addEventListener instead. Included for legacy code compatibility. + removeListener: vi.fn(), // Deprecated since Chrome 64, Firefox 65, Safari 14; use removeEventListener instead. Included for legacy code compatibility. + dispatchEvent: vi.fn() + })) }); } @@ -58,4 +67,4 @@ afterEach(() => { vi.restoreAllMocks(); vi.clearAllMocks(); document.body.innerHTML = ''; -}); \ No newline at end of file +});