From c293786e9de6eb0ba3ae9f09e0be594d4c239fdf Mon Sep 17 00:00:00 2001 From: "arunkumar.a" Date: Sat, 23 May 2026 23:29:29 +0530 Subject: [PATCH 1/2] Add vertical tray layout toggle --- src/components/launch/LaunchWindow.tsx | 65 +++++++++++++++++++++++--- src/i18n/locales/ar/launch.json | 4 +- src/i18n/locales/en/launch.json | 4 +- src/i18n/locales/es/launch.json | 4 +- src/i18n/locales/fr/launch.json | 4 +- src/i18n/locales/it/launch.json | 4 +- src/i18n/locales/ja-JP/launch.json | 4 +- src/i18n/locales/ko-KR/launch.json | 4 +- src/i18n/locales/ru/launch.json | 4 +- src/i18n/locales/tr/launch.json | 4 +- src/i18n/locales/vi/launch.json | 4 +- src/i18n/locales/zh-CN/launch.json | 4 +- src/i18n/locales/zh-TW/launch.json | 4 +- src/lib/userPreferences.test.ts | 22 ++++++++- src/lib/userPreferences.ts | 7 +++ 15 files changed, 121 insertions(+), 21 deletions(-) diff --git a/src/components/launch/LaunchWindow.tsx b/src/components/launch/LaunchWindow.tsx index 570ec2809..5b3b4af7f 100644 --- a/src/components/launch/LaunchWindow.tsx +++ b/src/components/launch/LaunchWindow.tsx @@ -1,4 +1,4 @@ -import { Check, ChevronDown, Languages } from "lucide-react"; +import { Check, ChevronDown, Columns3, Languages, Rows3 } from "lucide-react"; import { useCallback, useEffect, useRef, useState } from "react"; import { createPortal } from "react-dom"; import { BsPauseCircle, BsPlayCircle, BsRecordCircle } from "react-icons/bs"; @@ -27,6 +27,7 @@ import { useCameraDevices } from "../../hooks/useCameraDevices"; import { useMicrophoneDevices } from "../../hooks/useMicrophoneDevices"; import { useScreenRecorder } from "../../hooks/useScreenRecorder"; import { requestCameraAccess } from "../../lib/requestCameraAccess"; +import { loadUserPreferences, saveUserPreferences } from "../../lib/userPreferences"; import { formatTimePadded } from "../../utils/timeUtils"; import { AudioLevelMeter } from "../ui/audio-level-meter"; import { Button } from "../ui/button"; @@ -77,6 +78,8 @@ const windowBtnClasses = "flex h-8 w-8 items-center justify-center rounded-lg transition-all duration-150 cursor-pointer opacity-50 hover:opacity-90 hover:bg-white/[0.08]"; const hudSidebarClasses = "ml-0.5 pl-1.5 border-l border-white/10 flex items-center gap-0.5"; +const hudSidebarVerticalClasses = + "mt-0.5 pt-1.5 border-t border-white/10 flex flex-col items-center gap-0.5"; export function LaunchWindow() { const t = useScopedT("launch"); @@ -128,6 +131,9 @@ export function LaunchWindow() { const [isWebcamFocused, setIsWebcamFocused] = useState(false); const webcamExpanded = isWebcamHovered || isWebcamFocused; const [isLanguageMenuOpen, setIsLanguageMenuOpen] = useState(false); + const [trayLayout, setTrayLayout] = useState<"horizontal" | "vertical">( + () => loadUserPreferences().trayLayout, + ); const [supportsCursorModeToggle, setSupportsCursorModeToggle] = useState(false); const languageTriggerRef = useRef(null); const languageMenuPanelRef = useRef(null); @@ -365,6 +371,11 @@ export function LaunchWindow() { window.electronAPI.hudOverlayClose(); } }; + const toggleTrayLayout = () => { + const nextLayout = trayLayout === "horizontal" ? "vertical" : "horizontal"; + setTrayLayout(nextLayout); + saveUserPreferences({ trayLayout: nextLayout }); + }; const toggleMicrophone = () => { if (!recording) { @@ -589,7 +600,12 @@ export function LaunchWindow() { {/* HUD bar — fixed at bottom center, viewport-relative, never moves */}
setHudMouseEventsEnabled(true)} onPointerDown={() => setHudMouseEventsEnabled(true)} onMouseEnter={() => setHudMouseEventsEnabled(true)} @@ -610,6 +626,33 @@ export function LaunchWindow() { {getIcon("drag", "text-white/30")}
+ + + + {/* Source selector */}