From e82940810bf658a2dc74637811647570e684ac67 Mon Sep 17 00:00:00 2001
From: vicrodh <103399283+vicrodh@users.noreply.github.com>
Date: Fri, 20 Feb 2026 18:03:41 -0600
Subject: [PATCH] feat(immersive): make window draggable and rename to
Immersive Mode
- Add persistent drag region (32px strip) at top of immersive overlay
that remains active even when the header auto-hides after 4 seconds
- Add app-region: drag CSS to ImmersiveHeader's left spacer for proper
drag support when header is visible
- Add app-region: no-drag to tabs and window controls to keep them
clickable
- Double-click on drag strip toggles maximize
- Rename "Full Screen" to "Immersive Mode" in all 4 locales (en/es/de/fr)
---
.../immersive/ImmersiveHeader.svelte | 6 ++++++
.../immersive/ImmersivePlayer.svelte | 19 +++++++++++++++++++
src/lib/i18n/locales/de.json | 4 ++--
src/lib/i18n/locales/en.json | 4 ++--
src/lib/i18n/locales/es.json | 4 ++--
src/lib/i18n/locales/fr.json | 4 ++--
6 files changed, 33 insertions(+), 8 deletions(-)
diff --git a/src/lib/components/immersive/ImmersiveHeader.svelte b/src/lib/components/immersive/ImmersiveHeader.svelte
index 3046c7489..993ede9d2 100644
--- a/src/lib/components/immersive/ImmersiveHeader.svelte
+++ b/src/lib/components/immersive/ImmersiveHeader.svelte
@@ -330,6 +330,8 @@
min-width: 100px;
height: 100%;
cursor: grab;
+ -webkit-app-region: drag;
+ app-region: drag;
}
.mode-toggle {
@@ -376,6 +378,8 @@
background: rgba(0, 0, 0, 0.5);
border: 1px solid rgba(255, 255, 255, 0.15);
border-radius: 12px;
+ -webkit-app-region: no-drag;
+ app-region: no-drag;
}
.tab {
@@ -474,6 +478,8 @@
display: flex;
justify-content: flex-end;
gap: 8px;
+ -webkit-app-region: no-drag;
+ app-region: no-drag;
}
/* Expandable Window Controls */
diff --git a/src/lib/components/immersive/ImmersivePlayer.svelte b/src/lib/components/immersive/ImmersivePlayer.svelte
index b21d757ad..ae9eed053 100644
--- a/src/lib/components/immersive/ImmersivePlayer.svelte
+++ b/src/lib/components/immersive/ImmersivePlayer.svelte
@@ -379,6 +379,7 @@
{#if isOpen}
+
+
+
+
{#if activeFocusTab !== 'visualizer' && activeFocusTab !== 'oscilloscope' && activeFocusTab !== 'spectral-ribbon' && activeFocusTab !== 'energy-bands' && activeFocusTab !== 'lissajous' && activeFocusTab !== 'transient-pulse'}
@@ -674,6 +682,17 @@
overflow: hidden;
}
+ .immersive-drag-region {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 32px;
+ z-index: 15; /* Above content (1-5), below header controls (20) */
+ -webkit-app-region: drag;
+ app-region: drag;
+ }
+
@keyframes fadeIn {
from {
opacity: 0;
diff --git a/src/lib/i18n/locales/de.json b/src/lib/i18n/locales/de.json
index c50d0152e..1b7fd34d2 100644
--- a/src/lib/i18n/locales/de.json
+++ b/src/lib/i18n/locales/de.json
@@ -442,8 +442,8 @@
"castToDevice": "An Gerät übertragen",
"castingManage": "Casting – klicken, um zu verwalten",
"miniPlayer": "Mini-Player",
- "fullScreen": "Vollbild",
- "exitFullScreen": "Vollbild beenden",
+ "fullScreen": "Immersiv-Modus",
+ "exitFullScreen": "Immersiv-Modus beenden",
"maximize": "Maximieren",
"restore": "Wiederherstellen",
"minimize": "Minimieren",
diff --git a/src/lib/i18n/locales/en.json b/src/lib/i18n/locales/en.json
index b9ca63912..bcf5bae4d 100644
--- a/src/lib/i18n/locales/en.json
+++ b/src/lib/i18n/locales/en.json
@@ -457,8 +457,8 @@
"castToDevice": "Cast to device",
"castingManage": "Casting - Click to manage",
"miniPlayer": "Mini Player",
- "fullScreen": "Full Screen",
- "exitFullScreen": "Exit Full Screen",
+ "fullScreen": "Immersive Mode",
+ "exitFullScreen": "Exit Immersive Mode",
"maximize": "Maximize",
"restore": "Restore",
"minimize": "Minimize",
diff --git a/src/lib/i18n/locales/es.json b/src/lib/i18n/locales/es.json
index 7db987a63..80fa2ce9d 100644
--- a/src/lib/i18n/locales/es.json
+++ b/src/lib/i18n/locales/es.json
@@ -457,8 +457,8 @@
"castToDevice": "Transmitir a dispositivo",
"castingManage": "Transmitiendo - Clic para administrar",
"miniPlayer": "Mini Reproductor",
- "fullScreen": "Pantalla Completa",
- "exitFullScreen": "Salir de Pantalla Completa",
+ "fullScreen": "Modo Inmersivo",
+ "exitFullScreen": "Salir del Modo Inmersivo",
"maximize": "Maximizar",
"restore": "Restaurar",
"minimize": "Minimizar",
diff --git a/src/lib/i18n/locales/fr.json b/src/lib/i18n/locales/fr.json
index 4e1b05148..abd5b530a 100644
--- a/src/lib/i18n/locales/fr.json
+++ b/src/lib/i18n/locales/fr.json
@@ -442,8 +442,8 @@
"castToDevice": "Caster vers un appareil",
"castingManage": "Casting - Cliquez pour gérer",
"miniPlayer": "Mini lecteur",
- "fullScreen": "Plein écran",
- "exitFullScreen": "Quitter le plein écran",
+ "fullScreen": "Mode Immersif",
+ "exitFullScreen": "Quitter le Mode Immersif",
"maximize": "Agrandir",
"restore": "Restaurer",
"minimize": "Réduire",