/** * Preview Panel - Main UI for real-time preview */ import { Eye, EyeOff, Layers, Monitor, Settings, Zap } from "lucide-react" import { useEffect, useRef, useState } from "react" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Card } from "@/components/ui/card" import { useRealtimePreview } from "../hooks/use-realtime-preview" import { EffectChainList } from "./effect-chain-list" import { PresetGallery } from "./preset-gallery" import { QualityControls } from "./quality-controls" interface PreviewPanelProps { className?: string } export function PreviewPanel({ className }: PreviewPanelProps) { const [showEffects, setShowEffects] = useState(true) const [showPresets, setShowPresets] = useState(false) const [showQuality, setShowQuality] = useState(false) const [previewEnabled, setPreviewEnabled] = useState(true) const { canvasRef, videoRef, previewFrame, isInitialized, gpuTier, quality, setQuality, cacheStats } = useRealtimePreview({ cacheSize: 100, prefetchRange: 2, updateInterval: 33, }) const canvasContainerRef = useRef(null) // Update canvas size when container resizes useEffect(() => { if (!canvasContainerRef.current) return const resizeObserver = new ResizeObserver((entries) => { const entry = entries[0] const { width, height } = entry.contentRect if (canvasRef && typeof canvasRef === "function") { // Canvas size will be handled by the hook } }) resizeObserver.observe(canvasContainerRef.current) return () => resizeObserver.disconnect() }, [canvasRef]) const getGPUTierBadge = () => { const variants = { high: "default", medium: "secondary", low: "destructive", } as const return ( GPU: {gpuTier.toUpperCase()} ) } const getCacheStats = () => { if (!cacheStats) return null return (
Cache: {cacheStats.entries} frames ({cacheStats.sizeMB.toFixed(1)}MB)
) } return ( {/* Header */}

Real-time Preview

{getGPUTierBadge()}
{/* Canvas Container */}
{previewEnabled ? ( <> {/* Hidden video element for frame extraction */}
{/* Controls Panel */} {previewEnabled && (
{/* Cache Stats */}
Performance
{getCacheStats()} FPS: {quality.fps} Resolution: {(quality.resolution * 100).toFixed(0)}%
{/* Effect Chain List */} {showEffects && (
)} {/* Preset Gallery */} {showPresets && (
)} {/* Quality Controls */} {showQuality && (
)}
)}
) }