setHovered(true)}
+ onMouseLeave={() => setHovered(false)}
+ >
+ {/* Circle video frame */}
+
+
+
+
+
+ {/* Hover controls */}
+ {hovered && (
+
+ )}
+
+
+ );
+}
diff --git a/src/components/launch/LaunchWindow.tsx b/src/components/launch/LaunchWindow.tsx
index 249dd77d..27eb3425 100644
--- a/src/components/launch/LaunchWindow.tsx
+++ b/src/components/launch/LaunchWindow.tsx
@@ -152,6 +152,19 @@ export function LaunchWindow() {
}
}, [selectedCameraId, setWebcamDeviceId]);
+ // Show live camera preview as soon as webcam is enabled (before and during recording).
+ // Only retrigger when webcamEnabled flips — not on every device-list load.
+ useEffect(() => {
+ if (!window.electronAPI) return;
+ if (webcamEnabled) {
+ const deviceId = webcamDeviceId || selectedCameraId || "";
+ window.electronAPI.showCameraPreview(deviceId);
+ } else {
+ window.electronAPI.hideCameraPreview();
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [webcamEnabled]);
+
useEffect(() => {
if (!import.meta.env.DEV) {
return;
diff --git a/src/hooks/useScreenRecorder.ts b/src/hooks/useScreenRecorder.ts
index 5cbc54a1..f08ddfb4 100644
--- a/src/hooks/useScreenRecorder.ts
+++ b/src/hooks/useScreenRecorder.ts
@@ -555,6 +555,7 @@ export function useScreenRecorder(): UseScreenRecorderReturn {
setElapsedSeconds(0);
window.electronAPI?.setRecordingState(true);
+
const activeScreenRecorder = screenRecorder.current;
const activeWebcamRecorder = webcamRecorder.current;
const activeRecordingId = recordingId.current;
diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts
index d76ee157..c4f8d3aa 100644
--- a/src/vite-env.d.ts
+++ b/src/vite-env.d.ts
@@ -118,6 +118,8 @@ interface Window {
onMenuLoadProject: (callback: () => void) => () => void;
onMenuSaveProject: (callback: () => void) => () => void;
onMenuSaveProjectAs: (callback: () => void) => () => void;
+ showCameraPreview: (deviceId: string) => void;
+ hideCameraPreview: () => void;
setMicrophoneExpanded: (expanded: boolean) => void;
setHasUnsavedChanges: (hasChanges: boolean) => void;
onRequestSaveBeforeClose: (callback: () => Promise