diff --git a/app.js b/app.js index 64d3ed9..135edc7 100644 --- a/app.js +++ b/app.js @@ -639,6 +639,8 @@ let cleanTapTimes = []; let cleanMetroTimer = null; let metroPendulumFrame = null; let metroPendulumStartedAt = 0; +let metroWasRunningBeforeModal = false; +let metroPausedByModal = false; function metronomeHtml(){ const meterLabel = meter === 6 ? '6/8' : `${meter}/4`; @@ -718,6 +720,8 @@ function metronomeHtml(){ } function initMetronome(){ + metroWasRunningBeforeModal = false; + metroPausedByModal = false; renderMetroControls(); syncCleanMetronomeUi(); setBpm(bpm, {restart:false}); @@ -733,6 +737,7 @@ function initMetronome(){ document.querySelector('#openAccentModal')?.addEventListener('click', () => openMetroSettings('metroAccentModal')); document.querySelector('#metroTapInfoClean')?.addEventListener('click', () => { const modal = document.querySelector('#tapHelpModal'); + pauseMetronomeForModal(); modal?.classList.add('open'); modal?.setAttribute('aria-hidden','false'); }); @@ -747,7 +752,27 @@ function initMetronome(){ })); } +function pauseMetronomeForModal(){ + if(metroPausedByModal) return; + metroWasRunningBeforeModal = metroRunning; + if(metroRunning) stopMetronome(); + metroPausedByModal = metroWasRunningBeforeModal; +} +function isAnyMetroModalOpen(){ + const settingsOpen = Array.from(document.querySelectorAll('.metro-settings-modal')).some(m => m.classList.contains('visible')); + const tapHelpOpen = document.querySelector('#tapHelpModal')?.classList.contains('open'); + return settingsOpen || Boolean(tapHelpOpen); +} +function resumeMetronomeAfterModal(){ + if(isAnyMetroModalOpen()) return; + const shouldResume = metroPausedByModal && metroWasRunningBeforeModal; + metroPausedByModal = false; + metroWasRunningBeforeModal = false; + if(shouldResume && !metroRunning) startMetronome(); +} + function openMetroSettings(id){ + pauseMetronomeForModal(); document.querySelectorAll('.metro-settings-modal').forEach(m => { m.classList.remove('visible'); m.setAttribute('aria-hidden','true'); @@ -762,6 +787,7 @@ function closeMetroSettings(){ m.classList.remove('visible'); m.setAttribute('aria-hidden','true'); }); + resumeMetronomeAfterModal(); } function closeTapHelpModal(){ @@ -769,6 +795,7 @@ function closeTapHelpModal(){ if(!modal) return; modal.classList.remove('open'); modal.setAttribute('aria-hidden','true'); + resumeMetronomeAfterModal(); } function renderMetroControls(){ diff --git a/styles.css b/styles.css index 9a2ff33..bb8c88a 100644 --- a/styles.css +++ b/styles.css @@ -4497,6 +4497,58 @@ label[for="chordSearch"]{ animation:metroAccentFlash .14s ease-out 1 !important; } +/* EasyTune v54 — mobile metronome fit */ +@media (max-width: 430px){ + .metro-clean-screen{ + padding:12px 10px calc(12px + env(safe-area-inset-bottom, 0px)) !important; + } + .metro-clean-main{ + gap:10px !important; + } + .metro-clean-visual{ + min-height:min(42vh,300px) !important; + border-radius:18px !important; + } + .metro-clean-pendulum{ + top:54px !important; + height:165px !important; + } + .metro-clean-bpm strong{ + font-size:clamp(56px,17vw,78px) !important; + } + .metro-clean-beats{ + min-height:52px !important; + padding:10px 8px !important; + gap:8px !important; + } + .metro-clean-meta{ + gap:8px !important; + } + .metro-clean-meta button{ + min-height:54px !important; + } + .metro-clean-actions .primary-btn{ + min-height:50px !important; + font-size:17px !important; + } +} +@media (max-width: 430px) and (max-height: 760px){ + .metro-clean-visual{ + min-height:min(36vh,250px) !important; + } + .metro-clean-pendulum{ + top:44px !important; + height:140px !important; + } + .metro-clean-meta button{ + min-height:50px !important; + padding:7px 4px !important; + } + .metro-clean-meta strong{ + font-size:15px !important; + } +} + /* EasyTune v47 — no frame flash; JS-only needle */ .metro-clean-pendulum, .metro-clean-visual.running .metro-clean-pendulum,