"use client"; import { useCanvasGraph } from "@/components/canvas/canvas-graph-context"; import { usePipelinePreview } from "@/hooks/use-pipeline-preview"; import { shouldFastPathPreviewPipeline, type RenderPreviewInput, } from "@/lib/canvas-render-preview"; import type { MixerPreviewState } from "@/lib/canvas-mixer-preview"; const EMPTY_STEPS: RenderPreviewInput["steps"] = []; type CompareSurfaceProps = { finalUrl?: string; label?: string; previewInput?: RenderPreviewInput; mixerPreviewState?: MixerPreviewState; nodeWidth: number; clipWidthPercent?: number; preferPreview?: boolean; }; export default function CompareSurface({ finalUrl, label, previewInput, mixerPreviewState, nodeWidth, clipWidthPercent, preferPreview, }: CompareSurfaceProps) { const graph = useCanvasGraph(); const usePreview = Boolean(previewInput && (preferPreview || !finalUrl)); const previewSourceUrl = usePreview ? previewInput?.sourceUrl ?? null : null; const previewSourceComposition = usePreview ? previewInput?.sourceComposition : undefined; const previewSteps = usePreview ? previewInput?.steps ?? EMPTY_STEPS : EMPTY_STEPS; const visibleFinalUrl = usePreview ? undefined : finalUrl; const previewDebounceMs = shouldFastPathPreviewPipeline( previewSteps, graph.previewNodeDataOverrides, ) ? 16 : undefined; const { canvasRef, isRendering, error } = usePipelinePreview({ sourceUrl: previewSourceUrl, sourceComposition: previewSourceComposition, steps: previewSteps, nodeWidth, includeHistogram: false, debounceMs: previewDebounceMs, // Compare-Nodes zeigen nur eine kompakte Live-Ansicht; kleinere Kacheln // halten lange Workflows spürbar reaktionsfreudiger. previewScale: 0.5, maxPreviewWidth: 720, maxDevicePixelRatio: 1.25, }); const hasPreview = Boolean(usePreview && previewInput); const hasMixerPreview = mixerPreviewState?.status === "ready"; const clipStyle = typeof clipWidthPercent === "number" ? { clipPath: `inset(0 ${100 - clipWidthPercent}% 0 0)`, WebkitClipPath: `inset(0 ${100 - clipWidthPercent}% 0 0)`, } : undefined; return (
{visibleFinalUrl ? ( // eslint-disable-next-line @next/next/no-img-element {label ) : hasPreview ? ( ) : hasMixerPreview ? ( <> {/* eslint-disable-next-line @next/next/no-img-element */} {label {/* eslint-disable-next-line @next/next/no-img-element */} {label ) : null} {hasPreview ? (
{isRendering ? "Live Preview..." : "Live Preview"}
) : null} {hasPreview && error ? (
Preview error
) : null}
); }