// Umami: safe track (no-op if script blocked or not loaded) function umamiTrack(name, data) { if ( typeof window.umami !== 'undefined' && typeof window.umami.track === 'function' ) { if (data != null) window.umami.track(name, data); else window.umami.track(name); } } // Umami: scroll depth (25%, 50%, 75%, 100%) – once per milestone const scrollMilestones = new Set(); function onScroll() { const doc = document.documentElement; const scrollTop = doc.scrollTop || document.body.scrollTop; const scrollHeight = (doc.scrollHeight || document.body.scrollHeight) - window.innerHeight; if (scrollHeight <= 0) return; const pct = Math.round((scrollTop / scrollHeight) * 100); for (const m of [25, 50, 75, 100]) { if (pct >= m && !scrollMilestones.has(m)) { scrollMilestones.add(m); umamiTrack('scroll-depth', { depth: String(m) }); } } } window.addEventListener('scroll', onScroll, { passive: true });