{/* Preview area */}
{displayImage ? (
<>

{
setImageRetryNonce(0);
const image = event.currentTarget;
if ((renderedImageSrc === nodeData.outputImage || renderedImageSrc === storedImage) && image.naturalWidth > 0 && image.naturalHeight > 0) {
const dimensions = { width: image.naturalWidth, height: image.naturalHeight };
setCropImageDimensions(dimensions);
updateMediaNodeData(id, { dimensions }, dimensions);
}
}}
onError={() => {
if (primaryPreviewImage && displayImage === primaryPreviewImage && primaryImage && primaryImage !== primaryPreviewImage) {
setDisplayFallbackImage(primaryImage);
setImageRetryNonce(0);
return;
}
const retryIndex = imageRetryNonce;
const retryDelay = IMAGE_LOAD_RETRY_DELAYS_MS[retryIndex];
if (retryDelay !== undefined && displayImage && /^https?:\/\//i.test(displayImage)) {
window.setTimeout(() => {
setImageRetryNonce((current) => current === retryIndex ? current + 1 : current);
}, retryDelay);
}
}}
onDoubleClick={(e) => {
e.preventDefault();
e.stopPropagation();
setIsPreviewOpen(true);
}}
className={getAutoMediaElementClassName(overlayImageDimensions, "cursor-zoom-in")}
/>
{isCropping && (
)}
{isOutpainting && (
)}
{isInpainting && editableImage && (
{
closeNodeTool();
}}
/>
)}
{isCropping && (
{
closeNodeTool();
}}
context={{
value: cropAspectRatio,
onChange: setCropAspectRatio,
onConfirm: () => {
if (cropPayload) void handleConfirmCrop(cropPayload);
},
}}
toolComponents={{
[MEDIA_EDIT_TOOL.crop]: CropRatioSelect,
}}
/>
)}
{isOutpainting && (
{
closeNodeTool();
}}
onConfirm={() => {
if (outpaintingParams) void handleConfirmOutpainting(outpaintingParams);
}}
/>
)}
{isSplitGrid && gridSelection && (
)}
{/* Loading overlay for generation */}
{nodeData.status === "loading" && (
)}
{/* Error overlay when generation failed */}
{nodeData.status === "error" && (
{t("node.generationFailed")}
See toast for details
)}
{/* Loading overlay for carousel navigation */}
{isLoadingCarouselImage && (
)}
{/* Carousel controls - overlaid on image bottom */}
{hasCarouselImages && (
{(nodeData.selectedHistoryIndex || 0) + 1} / {(nodeData.imageHistory || []).length}
)}
>
) : (
{nodeData.status === "loading" ? (
) : nodeData.status === "error" ? (
{displayError || "Failed"}
) : (
)}
)}