From 2a75af9d78b18b33c9b329886464a20c11bd7a65 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sat, 25 Apr 2026 22:48:38 +0300 Subject: Add opt-in ambient music control (task o8) - Change ambient playback hotkey from 'm' to 'p' - Move flash effect hotkey from 'p' to 'f' - Update nav button labels: 'p music' and 'f flash' - Update splash hint to advertise 'p' music alongside 'w' wild - Add 'p' and 'f' hotkey support in splash and modal states - Persist ambient enabled/disabled state in localStorage (snonuxAmbientEnabled) - Default off; restore preference on page load without overwriting via wild mode - Improve accessibility with explicit aria-labels and aria-pressed state sync --- internal/generator/templates/shared/nav.tmpl | 4 +-- internal/generator/templates/shared/shared.js | 35 ++++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 6 deletions(-) (limited to 'internal') diff --git a/internal/generator/templates/shared/nav.tmpl b/internal/generator/templates/shared/nav.tmpl index b22ae0a..4f620a5 100644 --- a/internal/generator/templates/shared/nav.tmpl +++ b/internal/generator/templates/shared/nav.tmpl @@ -58,8 +58,8 @@ - - + + t theme diff --git a/internal/generator/templates/shared/shared.js b/internal/generator/templates/shared/shared.js index 31c19ed..eb7e8e5 100644 --- a/internal/generator/templates/shared/shared.js +++ b/internal/generator/templates/shared/shared.js @@ -1242,10 +1242,18 @@ syncFxButtonStates(); } + function snonuxAmbientSavePreference(enabled) { + try { localStorage.setItem('snonuxAmbientEnabled', enabled ? '1' : '0'); } catch (_) {} + } + function snonuxAmbientLoadPreference() { + try { return localStorage.getItem('snonuxAmbientEnabled') === '1'; } catch (_) { return false; } + } + function toggleAmbientMode() { if (window.snonuxAmbientToggle) window.snonuxAmbientToggle(); pulseFxButton('ambient'); syncFxButtonStates(); + snonuxAmbientSavePreference(window.snonuxAmbientIsPlaying && window.snonuxAmbientIsPlaying()); } function triggerFlashEffect() { @@ -1277,13 +1285,21 @@ syncFxButtonStates(); })(); + // Restore ambient preference on load (opt-in; default off). + (function initAmbientPreference() { + if (snonuxAmbientLoadPreference() && window.snonuxAmbientStart) { + window.snonuxAmbientStart('restore'); + } + syncFxButtonStates(); + })(); + // Inject keyboard controls hint into splash overlay (all themes) (function enhanceSplashHint() { var hint = document.querySelector('#splash-overlay .splash-hint'); if (!hint || document.querySelector('#splash-overlay .splash-controls')) return; var extra = document.createElement('div'); extra.className = 'splash-controls'; - extra.innerHTML = ' drift \u2022 w wild \u2022 m ambient \u2022 Enter open'; + extra.innerHTML = ' drift \u2022 w wild \u2022 p music \u2022 Enter open'; hint.appendChild(extra); })(); @@ -1350,9 +1366,12 @@ } else if (e.key === 'w' && !e.repeat) { e.preventDefault(); toggleWildMode({ splashMode: true, kickSplash: true }); - } else if (e.key === 'm' && !e.repeat) { + } else if (e.key === 'p' && !e.repeat) { e.preventDefault(); toggleAmbientMode(); + } else if (e.key === 'f' && !e.repeat) { + e.preventDefault(); + triggerFlashEffect(); } else if (e.key === 'c' && !e.repeat) { e.preventDefault(); toggleCrtMode(); @@ -1370,6 +1389,14 @@ } if (document.getElementById('post-modal').classList.contains('active')) { if (e.key === 'Escape') { closeModal(); e.preventDefault(); } + else if (e.key === 'p' && !e.repeat) { + e.preventDefault(); + toggleAmbientMode(); + } + else if (e.key === 'f' && !e.repeat) { + e.preventDefault(); + triggerFlashEffect(); + } else if (e.key === 't' && !e.repeat) { e.preventDefault(); var pick = snonuxRandomTheme(); @@ -1416,7 +1443,7 @@ toggleWildMode(); e.preventDefault(); break; } - case 'm': { + case 'p': { toggleAmbientMode(); e.preventDefault(); break; } @@ -1426,7 +1453,7 @@ case 'g': toggleGhostMode(); e.preventDefault(); break; - case 'p': + case 'f': triggerFlashEffect(); e.preventDefault(); break; case 'x': -- cgit v1.2.3