29 lines
1021 B
JavaScript
29 lines
1021 B
JavaScript
// 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 });
|