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 }} + > + {alt + ); }, 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