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)
This commit is contained in:
vicrodh committed 2026-02-20 18:03:41 -06:00
1 parent fec3db17fa
commit e82940810b
6 files changed
+33 -8

No files matched your search

@@ -330,6 +330,8 @@
min-width: 100px; min-width: 100px;
height: 100%; height: 100%;
cursor: grab; cursor: grab;
-webkit-app-region: drag;
app-region: drag;
} }
.mode-toggle { .mode-toggle {
@@ -376,6 +378,8 @@
background: rgba(0, 0, 0, 0.5); background: rgba(0, 0, 0, 0.5);
border: 1px solid rgba(255, 255, 255, 0.15); border: 1px solid rgba(255, 255, 255, 0.15);
border-radius: 12px; border-radius: 12px;
-webkit-app-region: no-drag;
app-region: no-drag;
} }
.tab { .tab {
@@ -474,6 +478,8 @@
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
gap: 8px; gap: 8px;
-webkit-app-region: no-drag;
app-region: no-drag;
} }
/* Expandable Window Controls */ /* Expandable Window Controls */
@@ -379,6 +379,7 @@
</script> </script>
{#if isOpen} {#if isOpen}
<!-- svelte-ignore a11y_no_static_element_interactions -->
<div <div
class="immersive-player" class="immersive-player"
onmousemove={handleMouseMove} onmousemove={handleMouseMove}
@@ -387,6 +388,13 @@
aria-label="Now Playing" aria-label="Now Playing"
tabindex="-1" tabindex="-1"
> >
<!-- Persistent drag region for window movement (always active, unaffected by UI auto-hide) -->
<div
class="immersive-drag-region"
data-tauri-drag-region
ondblclick={toggleMaximize}
></div>
<!-- Background (skip for canvas-based visualizers that render their own black background) --> <!-- Background (skip for canvas-based visualizers that render their own black background) -->
{#if activeFocusTab !== 'visualizer' && activeFocusTab !== 'oscilloscope' && activeFocusTab !== 'spectral-ribbon' && activeFocusTab !== 'energy-bands' && activeFocusTab !== 'lissajous' && activeFocusTab !== 'transient-pulse'} {#if activeFocusTab !== 'visualizer' && activeFocusTab !== 'oscilloscope' && activeFocusTab !== 'spectral-ribbon' && activeFocusTab !== 'energy-bands' && activeFocusTab !== 'lissajous' && activeFocusTab !== 'transient-pulse'}
<ImmersiveBackground {artwork} /> <ImmersiveBackground {artwork} />
@@ -674,6 +682,17 @@
overflow: hidden; 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 { @keyframes fadeIn {
from { from {
opacity: 0; opacity: 0;
+2 -2
View File
@@ -442,8 +442,8 @@
"castToDevice": "An Gerät übertragen", "castToDevice": "An Gerät übertragen",
"castingManage": "Casting – klicken, um zu verwalten", "castingManage": "Casting – klicken, um zu verwalten",
"miniPlayer": "Mini-Player", "miniPlayer": "Mini-Player",
"fullScreen": "Vollbild", "fullScreen": "Immersiv-Modus",
"exitFullScreen": "Vollbild beenden", "exitFullScreen": "Immersiv-Modus beenden",
"maximize": "Maximieren", "maximize": "Maximieren",
"restore": "Wiederherstellen", "restore": "Wiederherstellen",
"minimize": "Minimieren", "minimize": "Minimieren",
+2 -2
View File
@@ -457,8 +457,8 @@
"castToDevice": "Cast to device", "castToDevice": "Cast to device",
"castingManage": "Casting - Click to manage", "castingManage": "Casting - Click to manage",
"miniPlayer": "Mini Player", "miniPlayer": "Mini Player",
"fullScreen": "Full Screen", "fullScreen": "Immersive Mode",
"exitFullScreen": "Exit Full Screen", "exitFullScreen": "Exit Immersive Mode",
"maximize": "Maximize", "maximize": "Maximize",
"restore": "Restore", "restore": "Restore",
"minimize": "Minimize", "minimize": "Minimize",
+2 -2
View File
@@ -457,8 +457,8 @@
"castToDevice": "Transmitir a dispositivo", "castToDevice": "Transmitir a dispositivo",
"castingManage": "Transmitiendo - Clic para administrar", "castingManage": "Transmitiendo - Clic para administrar",
"miniPlayer": "Mini Reproductor", "miniPlayer": "Mini Reproductor",
"fullScreen": "Pantalla Completa", "fullScreen": "Modo Inmersivo",
"exitFullScreen": "Salir de Pantalla Completa", "exitFullScreen": "Salir del Modo Inmersivo",
"maximize": "Maximizar", "maximize": "Maximizar",
"restore": "Restaurar", "restore": "Restaurar",
"minimize": "Minimizar", "minimize": "Minimizar",
+2 -2
View File
@@ -442,8 +442,8 @@
"castToDevice": "Caster vers un appareil", "castToDevice": "Caster vers un appareil",
"castingManage": "Casting - Cliquez pour gérer", "castingManage": "Casting - Cliquez pour gérer",
"miniPlayer": "Mini lecteur", "miniPlayer": "Mini lecteur",
"fullScreen": "Plein écran", "fullScreen": "Mode Immersif",
"exitFullScreen": "Quitter le plein écran", "exitFullScreen": "Quitter le Mode Immersif",
"maximize": "Agrandir", "maximize": "Agrandir",
"restore": "Restaurer", "restore": "Restaurer",
"minimize": "Réduire", "minimize": "Réduire",