diff --git a/src/components/ui/MarkdownRenderer.tsx b/src/components/ui/MarkdownRenderer.tsx
index 49cf1c561e..7b31fa48f6 100644
--- a/src/components/ui/MarkdownRenderer.tsx
+++ b/src/components/ui/MarkdownRenderer.tsx
@@ -7,6 +7,7 @@ import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';
import { vscDarkPlus } from 'react-syntax-highlighter/dist/esm/styles/prism';
import { Box, Text, Stack } from '@/layouts/Primitives';
import { Link } from 'react-router-dom';
+import { cn } from '@/lib/utils';
import { normalizeAsset } from '@/lib/content';
import { Notice } from './Notice';
import { AffiliateCard } from './AffiliateCard';
@@ -143,21 +144,47 @@ export function MarkdownRenderer({ content }: MarkdownRendererProps) {
td: ({node: _node, ...props}) => (
),
- img: ({node: _node, src, alt, ...props}) => {
+ img: ({ node: _node, src, alt, className, title, width, height, srcSet, sizes, ...rest }: React.ImgHTMLAttributes & { node?: unknown }): JSX.Element | null => {
const normalizedSrc = normalizeAsset(src || '');
+ if (!normalizedSrc) return null;
+
+ const isExternal = /^(https?:)?\/\//.test(normalizedSrc);
+
+ // Sanitize width/height to ensure they are valid numeric values
+ const sanitizeDimension = (val: string | number | undefined) => {
+ if (val === undefined || val === null) return undefined;
+ const num = typeof val === 'number' ? val : parseFloat(String(val));
+ return !isNaN(num) && isFinite(num) ? num : undefined;
+ };
+
return (
+ maxHeight={{ base: "50vh", lg: 96 }}
+ >
+
+
);
},
diff --git a/tests/visual.spec.ts-snapshots/detail_page_desktop_v2.png b/tests/visual.spec.ts-snapshots/detail_page_desktop_v2.png
index 778e9647f0..e7d785657f 100644
Binary files a/tests/visual.spec.ts-snapshots/detail_page_desktop_v2.png and b/tests/visual.spec.ts-snapshots/detail_page_desktop_v2.png differ
diff --git a/tests/visual.spec.ts-snapshots/detail_page_mobile_v2.png b/tests/visual.spec.ts-snapshots/detail_page_mobile_v2.png
index 8affba95ec..7ab47074e3 100644
Binary files a/tests/visual.spec.ts-snapshots/detail_page_mobile_v2.png and b/tests/visual.spec.ts-snapshots/detail_page_mobile_v2.png differ
diff --git a/tests/visual.spec.ts-snapshots/homepage_desktop_v2.png b/tests/visual.spec.ts-snapshots/homepage_desktop_v2.png
index 5a6353891a..2a813a76db 100644
Binary files a/tests/visual.spec.ts-snapshots/homepage_desktop_v2.png and b/tests/visual.spec.ts-snapshots/homepage_desktop_v2.png differ
diff --git a/tests/visual.spec.ts-snapshots/homepage_mobile_v2.png b/tests/visual.spec.ts-snapshots/homepage_mobile_v2.png
index a06db3605f..896ccc02a5 100644
Binary files a/tests/visual.spec.ts-snapshots/homepage_mobile_v2.png and b/tests/visual.spec.ts-snapshots/homepage_mobile_v2.png differ
diff --git a/tests/visual.spec.ts-snapshots/mobile-research-blog-drafter.png b/tests/visual.spec.ts-snapshots/mobile-research-blog-drafter.png
index de00cc7a25..64a6159067 100644
Binary files a/tests/visual.spec.ts-snapshots/mobile-research-blog-drafter.png and b/tests/visual.spec.ts-snapshots/mobile-research-blog-drafter.png differ
diff --git a/tests/visual.spec.ts-snapshots/mobile-research-wcs-scraper.png b/tests/visual.spec.ts-snapshots/mobile-research-wcs-scraper.png
index 0310827ad9..45390026c5 100644
Binary files a/tests/visual.spec.ts-snapshots/mobile-research-wcs-scraper.png and b/tests/visual.spec.ts-snapshots/mobile-research-wcs-scraper.png differ
diff --git a/tests/visual.spec.ts-snapshots/mobile-ux-auditor.png b/tests/visual.spec.ts-snapshots/mobile-ux-auditor.png
index fcb28291ea..a8976b2bd0 100644
Binary files a/tests/visual.spec.ts-snapshots/mobile-ux-auditor.png and b/tests/visual.spec.ts-snapshots/mobile-ux-auditor.png differ