From a9428e0b02256abea7df54fa2d5fb16affdd314c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel?= Date: Tue, 14 Apr 2026 03:37:40 +0200 Subject: [PATCH] feat(studio): format info tooltip on export selector (#257) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - Adds a hover tooltip (?) next to the format dropdown in the render queue export bar - Shows the selected format's details (codec, use case) plus a comparison with the other two formats - Helps users pick between MP4 (general), MOV/ProRes 4444 (transparent video for editors), and WebM/VP9 (transparent for web) ## Test plan - [x] Open studio, go to the render queue panel - [x] Hover over the (?) icon next to the format dropdown — tooltip appears above - [x] Switch format in the dropdown — tooltip content updates to show the selected format first - [x] Move pointer away — tooltip dismisses - [x] Verify tooltip doesn't clip or overflow the panel image --- .../src/components/renders/RenderQueue.tsx | 69 ++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/packages/studio/src/components/renders/RenderQueue.tsx b/packages/studio/src/components/renders/RenderQueue.tsx index c269e112e..654028433 100644 --- a/packages/studio/src/components/renders/RenderQueue.tsx +++ b/packages/studio/src/components/renders/RenderQueue.tsx @@ -11,6 +11,72 @@ interface RenderQueueProps { isRendering: boolean; } +const FORMAT_INFO: Record<"mp4" | "webm" | "mov", { label: string; desc: string }> = { + mp4: { label: "MP4", desc: "Best for general use. Smallest file, universal playback." }, + mov: { + label: "MOV (ProRes 4444)", + desc: "Transparent video. Works in CapCut, Final Cut Pro, Premiere, DaVinci Resolve, After Effects. Large files.", + }, + webm: { + label: "WebM (VP9)", + desc: "Transparent video for web. Smaller than MOV but limited editor support.", + }, +}; + +function FormatInfoTooltip({ format }: { format: "mp4" | "webm" | "mov" }) { + const [open, setOpen] = useState(false); + const timeoutRef = useRef>(undefined); + + const show = () => { + clearTimeout(timeoutRef.current); + setOpen(true); + }; + const hide = () => { + timeoutRef.current = setTimeout(() => setOpen(false), 120); + }; + + useEffect(() => () => clearTimeout(timeoutRef.current), []); + + const info = FORMAT_INFO[format]; + + return ( +
+ + + + + + {open && ( +
+

{info.label}

+

{info.desc}

+
+ {(["mp4", "mov", "webm"] as const) + .filter((f) => f !== format) + .map((f) => ( +

+ {FORMAT_INFO[f].label} + {" — "} + {FORMAT_INFO[f].desc} +

+ ))} +
+
+ )} +
+ ); +} + function FormatExportButton({ onStartRender, isRendering, @@ -21,7 +87,8 @@ function FormatExportButton({ const [format, setFormat] = useState<"mp4" | "webm" | "mov">("mp4"); return ( -
+
+