diff --git a/src/components/launch/LaunchWindow.module.css b/src/components/launch/LaunchWindow.module.css
index 2ca0623e..adc4dd6f 100644
--- a/src/components/launch/LaunchWindow.module.css
+++ b/src/components/launch/LaunchWindow.module.css
@@ -19,6 +19,24 @@
inset 0 1px 0 rgba(255, 255, 255, 0.04);
overflow: visible;
position: relative;
+ transform-origin: center bottom;
+}
+
+.barStateViewport {
+ position: relative;
+ display: flex;
+ align-items: center;
+ min-height: 46px;
+ min-width: 0;
+}
+
+.barState {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ white-space: nowrap;
+ min-width: 0;
+ pointer-events: auto;
}
.sep {
diff --git a/src/components/launch/LaunchWindow.tsx b/src/components/launch/LaunchWindow.tsx
index 9a16bff7..c8ec7135 100644
--- a/src/components/launch/LaunchWindow.tsx
+++ b/src/components/launch/LaunchWindow.tsx
@@ -1,5 +1,6 @@
import type { ReactNode } from "react";
import { useCallback, useEffect, useRef, useState } from "react";
+import { AnimatePresence, motion } from "motion/react";
import {
Monitor,
Mic,
@@ -472,12 +473,119 @@ export function LaunchWindow() {
const screenSources = sources.filter((s) => s.sourceType === "screen");
const windowSources = sources.filter((s) => s.sourceType === "window");
+ const hudStateTransition = { duration: 0.24, ease: [0.22, 1, 0.36, 1] as const };
const toggleWebcam = () => {
if (recording) return;
toggleDropdown("webcam");
};
+ const recordingControls = (
+ <>
+
+
+
+ {paused ? t("recording.paused") : t("recording.rec")}
+
+
+
+
+ {formatTime(elapsed)}
+
+
+
+
+
+ {microphoneEnabled ? : }
+
+
+
+
+
+ {paused ? : }
+
+
+
+
+
+
+ window.electronAPI?.hudOverlayHide?.()} title={t("recording.hideHud")}>
+
+
+
+
+
+
+ >
+ );
+
+ const idleControls = (
+ <>
+
+
+
+
+
+ {microphoneEnabled ? : }
+
+
+
+ {webcamEnabled ? : }
+
+
+ toggleDropdown("countdown")}
+ title={t("recording.countdownDelay")}
+ className={countdownDelay > 0 ? styles.ibActive : ""}
+ >
+
+
+
+
+
+
+
+
+
+ toggleDropdown("more")} title={t("recording.more")}>
+
+
+
+ window.electronAPI?.hudOverlayHide?.()} title={t("recording.hideHud")}>
+
+
+
+ window.electronAPI?.hudOverlayClose?.()} title={t("recording.closeApp")}>
+
+
+ >
+ );
+
return (
-
-
-
-
-
- {recording ? (
- <>
-
-
-
- {paused ? t("recording.paused") : t("recording.rec")}
-
+
+
+
-
- {formatTime(elapsed)}
-
-
-
-
-
- {microphoneEnabled ? : }
-
-
-
-
-
- {paused ? : }
-
-
-
-
-
-
- window.electronAPI?.hudOverlayHide?.()} title={t("recording.hideHud")}>
-
-
-
-
-
-
- >
- ) : (
- <>
-
-
-
-
-
- {microphoneEnabled ? : }
-
-
-
- {webcamEnabled ? : }
-
-
- toggleDropdown("countdown")}
- title={t("recording.countdownDelay")}
- className={countdownDelay > 0 ? styles.ibActive : ""}
- >
-
-
-
-
-
-
-
-
-
- toggleDropdown("more")} title={t("recording.more")}>
-
-
-
- window.electronAPI?.hudOverlayHide?.()} title={t("recording.hideHud")}>
-
-
-
- window.electronAPI?.hudOverlayClose?.()} title={t("recording.closeApp")}>
-
-
- >
- )}
-
+
+
+
+ {recording ? recordingControls : idleControls}
+
+
+
+