Skip to content

Commit e1cdb85

Browse files
fix: remove <source> elements on error for correct picture fallback
When responsive variants don't exist (404), the browser picks from <source> srcset but doesn't fall through on failure. Fix: strip <source> elements in onError so img.src = plot.png actually works. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 3d0aef3 commit e1cdb85

File tree

4 files changed

+9
-1
lines changed

4 files changed

+9
-1
lines changed

app/src/components/ImageCard.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,11 @@ export const ImageCard = memo(function ImageCard({
181181
}}
182182
onError={(e: React.SyntheticEvent<HTMLImageElement>) => {
183183
const target = e.target as HTMLImageElement;
184-
// Fallback to original plot.png if responsive variant not available
184+
// Remove <source> elements so browser uses img.src fallback
185185
if (!target.dataset.fallback) {
186186
target.dataset.fallback = '1';
187+
const picture = target.closest('picture');
188+
picture?.querySelectorAll('source').forEach(s => s.remove());
187189
target.src = image.url;
188190
} else {
189191
target.style.display = 'none';

app/src/components/SpecDetailView.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ export function SpecDetailView({
118118
const target = e.target as HTMLImageElement;
119119
if (!target.dataset.fallback) {
120120
target.dataset.fallback = '1';
121+
const picture = target.closest('picture');
122+
picture?.querySelectorAll('source').forEach(s => s.remove());
121123
target.src = currentImpl.preview_url!;
122124
}
123125
}}

app/src/components/SpecOverview.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ function ImplementationCard({
177177
const target = e.target as HTMLImageElement;
178178
if (!target.dataset.fallback) {
179179
target.dataset.fallback = '1';
180+
const picture = target.closest('picture');
181+
picture?.querySelectorAll('source').forEach(s => s.remove());
180182
target.src = impl.preview_url!;
181183
}
182184
}}

app/src/pages/CatalogPage.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,8 @@ export function CatalogPage() {
275275
const target = e.target as HTMLImageElement;
276276
if (!target.dataset.fallback) {
277277
target.dataset.fallback = '1';
278+
const picture = target.closest('picture');
279+
picture?.querySelectorAll('source').forEach(s => s.remove());
278280
target.src = currentImage.url;
279281
}
280282
}}

0 commit comments

Comments
 (0)