import * as React from "react"; export interface ImagePlaceholderProps { src?: string; alt: string; /** Caption shown on the load-error placeholder. */ label: React.ReactNode; /** Small monospace hint under the label, e.g. an expected filename. */ hint?: React.ReactNode; /** Placeholder icon override - defaults to a simple image glyph. */ icon?: React.ReactNode; size?: "default" | "mini" | "round"; className?: string; } const DEFAULT_ICON = ( ); export function ImagePlaceholder({ src, alt, label, hint, icon, size = "default", className, }: ImagePlaceholderProps) { /* * Gemerkt wird die Adresse, die fehlgeschlagen ist - nicht ein blosses * "ist fehlgeschlagen". * * Der Unterschied ist der Fehler, den das behebt: In der Fotogalerie unter * "Mein Audi" bleibt dieselbe Komponente stehen und bekommt nur eine neue * src. Mit einem blossen Wahrheitswert blieb ein einmal gesetztes true fuer * immer stehen - sobald ein noch leerer Platz durchlaufen war, zeigten auch * alle folgenden Plaetze mit echtem Foto nur noch den Platzhalter. Erst ein * Seitenwechsel setzte den Zustand zurueck, weil die Komponente dabei neu * entsteht (gemeldet vom Eigentuemer, 2026-08-31). * * Bewusst ohne useEffect: ein Vergleich beim Rendern kommt ohne den * zusaetzlichen Durchlauf aus, den ein Zuruecksetzen im Effekt braucht - * und in dem waere fuer einen Wimpernschlag das falsche Bild zu sehen. */ const [fehlgeschlagen, setzeFehlgeschlagen] = React.useState(null); const classes = ["ads-bildbox"]; if (size === "mini") classes.push("ads-bildbox--mini"); if (size === "round") classes.push("ads-bildbox--round"); if (className) classes.push(className); const showPlaceholder = !src || fehlgeschlagen === src; return (
{!showPlaceholder && ( {alt} setzeFehlgeschlagen(src)} /> )} {showPlaceholder && (
{icon ?? DEFAULT_ICON} {label} {hint !== undefined && {hint}}
)}
); }