-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathreading-progress.js
More file actions
73 lines (57 loc) · 2.36 KB
/
Copy pathreading-progress.js
File metadata and controls
73 lines (57 loc) · 2.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
export function initReadingProgress() {
const progressBar = document.getElementById('reading-progress-bar');
if (!progressBar) return;
const storageKey = 'about-scroll-pos';
const updateProgress = () => {
const scrollTop = window.scrollY || document.documentElement.scrollTop;
const calcHeight = document.documentElement.scrollHeight - document.documentElement.clientHeight;
const progress = calcHeight > 0 ? (scrollTop / calcHeight) * 100 : 0;
progressBar.style.width = `${progress}%`;
sessionStorage.setItem(storageKey, scrollTop.toString());
};
window.addEventListener('scroll', updateProgress, { passive: true });
window.addEventListener('resize', updateProgress, { passive: true });
const savedPosStr = sessionStorage.getItem(storageKey);
const savedPos = savedPosStr ? parseInt(savedPosStr, 10) : 0;
const currentPos = window.scrollY || document.documentElement.scrollTop;
if (savedPos > 300 && currentPos < 100) {
showResumePrompt(savedPos);
}
updateProgress();
}
function showResumePrompt(savedPos) {
const promptContainer = document.createElement('div');
promptContainer.className = 'resume-prompt-container';
const textNode = document.createElement('span');
textNode.textContent = 'Resume reading where you left off?';
const resumeBtn = document.createElement('button');
resumeBtn.textContent = 'Resume';
resumeBtn.className = 'resume-btn';
resumeBtn.addEventListener('click', () => {
window.scrollTo({
top: savedPos,
behavior: 'smooth'
});
hidePrompt();
});
const closeBtn = document.createElement('button');
closeBtn.textContent = '✕';
closeBtn.className = 'close-btn';
closeBtn.setAttribute('aria-label', 'Dismiss');
closeBtn.addEventListener('click', () => {
hidePrompt();
});
function hidePrompt() {
promptContainer.classList.add('hide');
setTimeout(() => promptContainer.remove(), 400);
}
promptContainer.appendChild(textNode);
promptContainer.appendChild(resumeBtn);
promptContainer.appendChild(closeBtn);
document.body.appendChild(promptContainer);
requestAnimationFrame(() => {
requestAnimationFrame(() => {
promptContainer.classList.add('show');
});
});
}