diff --git a/components/email/email-viewer.tsx b/components/email/email-viewer.tsx index 691a980b..de779ed4 100644 --- a/components/email/email-viewer.tsx +++ b/components/email/email-viewer.tsx @@ -2528,14 +2528,21 @@ export function EmailViewer({ // If email has native dark mode, let it handle its own theming // Otherwise, use CSS filter inversion for dark mode (preserves layout) + // Re-invert leaf media elements so they appear normal. + // Container selectors (bgcolor, background, etc.) use :not(:has(...)) to avoid + // double re-inverting images nested inside those containers. const darkModeCSS = isDark && !emailHasNativeDarkMode ? ` html { background: #1a1a1a; } body { filter: invert(1) hue-rotate(180deg); } - img, video, picture, svg, canvas, object, embed, - [style*="background-image"], [style*="background:"], - [background], [bgcolor], - td[background], table[background], - img[src], input[type="image"] { + img, video, svg, canvas, object, embed, input[type="image"] { + filter: invert(1) hue-rotate(180deg); + } + [style*="background-image"]:not(:has(img, video, svg, canvas, object, embed)), + [style*="background:"]:not(:has(img, video, svg, canvas, object, embed)), + [background]:not(:has(img, video, svg, canvas, object, embed)), + [bgcolor]:not(:has(img, video, svg, canvas, object, embed)), + td[background]:not(:has(img, video, svg, canvas, object, embed)), + table[background]:not(:has(img, video, svg, canvas, object, embed)) { filter: invert(1) hue-rotate(180deg); } ` : ''; @@ -2574,11 +2581,35 @@ export function EmailViewer({ a.setAttribute('target', '_blank'); a.setAttribute('rel', 'noopener noreferrer'); }); + + // Dark mode: re-invert elements with stylesheet-defined background images + // (CSS attribute selectors only catch inline styles, not