diff --git a/apps/web/src/components/tools/remove-bg-settings.tsx b/apps/web/src/components/tools/remove-bg-settings.tsx index 48d5b1f9..741ea759 100644 --- a/apps/web/src/components/tools/remove-bg-settings.tsx +++ b/apps/web/src/components/tools/remove-bg-settings.tsx @@ -1,17 +1,54 @@ -import { useState } from "react"; +import { useState, useEffect, useRef } from "react"; import { useFileStore } from "@/stores/file-store"; import { useToolProcessor } from "@/hooks/use-tool-processor"; import { Download, Loader2 } from "lucide-react"; -type BgModel = "u2net" | "isnet"; +type BgModel = + | "birefnet-general" + | "birefnet-general-lite" + | "birefnet-portrait" + | "bria-rmbg" + | "isnet-general-use" + | "u2net"; + +const MODELS: { value: BgModel; label: string; description: string }[] = [ + { value: "birefnet-general", label: "BiRefNet", description: "Best quality (recommended)" }, + { value: "birefnet-general-lite", label: "BiRefNet Lite", description: "Faster, slightly less accurate" }, + { value: "birefnet-portrait", label: "BiRefNet Portrait", description: "Optimized for people" }, + { value: "bria-rmbg", label: "BRIA RMBG", description: "Great for products" }, + { value: "isnet-general-use", label: "IS-Net", description: "Good general purpose" }, + { value: "u2net", label: "U2-Net", description: "Classic, fast" }, +]; + +const BG_PRESETS = [ + { color: "", label: "Transparent", preview: "checkerboard" }, + { color: "#FFFFFF", label: "White", preview: "#FFFFFF" }, + { color: "#000000", label: "Black", preview: "#000000" }, + { color: "#FF0000", label: "Red", preview: "#FF0000" }, + { color: "#00FF00", label: "Green", preview: "#00FF00" }, + { color: "#0000FF", label: "Blue", preview: "#0000FF" }, +]; export function RemoveBgSettings() { const { files } = useFileStore(); const { processFiles, processing, error, downloadUrl, originalSize, processedSize } = useToolProcessor("remove-background"); - const [model, setModel] = useState("u2net"); + const [model, setModel] = useState("birefnet-general"); const [bgColor, setBgColor] = useState(""); + const [elapsed, setElapsed] = useState(0); + const timerRef = useRef | null>(null); + + // Progress timer + useEffect(() => { + if (processing) { + setElapsed(0); + timerRef.current = setInterval(() => setElapsed((e) => e + 1), 1000); + } else { + if (timerRef.current) clearInterval(timerRef.current); + } + return () => { if (timerRef.current) clearInterval(timerRef.current); }; + }, [processing]); const handleProcess = () => { const settings: Record = { model }; @@ -21,6 +58,15 @@ export function RemoveBgSettings() { const hasFile = files.length > 0; + const progressStage = + elapsed < 3 ? "Loading AI model..." : + elapsed < 8 ? "Analyzing image..." : + elapsed < 15 ? "Removing background..." : + elapsed < 25 ? "Refining edges..." : + "Almost done..."; + + const progressPercent = Math.min(95, elapsed * 4); + return (
{/* Model selector */} @@ -31,51 +77,71 @@ export function RemoveBgSettings() { onChange={(e) => setModel(e.target.value as BgModel)} className="w-full mt-0.5 px-2 py-1.5 rounded border border-border bg-background text-sm text-foreground" > - - + {MODELS.map((m) => ( + + ))}
- {/* Background color */} + {/* Background color - intuitive preset buttons */}
-