-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.js
More file actions
68 lines (57 loc) · 2.04 KB
/
Copy pathmain.js
File metadata and controls
68 lines (57 loc) · 2.04 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
let openBtn = document.querySelector(".bi-list")
let closeBtn = document.querySelector(".bi-x")
let menu = document.querySelector(".options")
openBtn.addEventListener("click", () => {
openBtn.classList.toggle("hide")
closeBtn.classList.toggle("hide")
menu.classList.toggle("hidden")
})
closeBtn.addEventListener("click", () => {
openBtn.classList.toggle("hide")
closeBtn.classList.toggle("hide")
menu.classList.toggle("hidden")
})
const nameEl = document.getElementById('siteName');
// Split the text into individual letter spans
const text = nameEl.textContent;
nameEl.textContent = '';
const letters = [...text].map(ch => {
const span = document.createElement('span');
span.className = 'letter';
span.textContent = ch === ' ' ? '\u00A0' : ch;
nameEl.appendChild(span);
return span;
});
const RADIUS = 120; // how far the effect reaches (px)
const MAX_LIFT = 10; // max upward shift (px)
const MAX_SCALE = 0.25; // max extra scale
function updateLetters(mouseX, mouseY) {
letters.forEach(letter => {
const rect = letter.getBoundingClientRect();
const cx = rect.left + rect.width / 2;
const cy = rect.top + rect.height / 2;
const dist = Math.hypot(mouseX - cx, mouseY - cy);
if (dist < RADIUS) {
const strength = 1 - dist / RADIUS;
const lift = MAX_LIFT * strength;
const scale = 1 + MAX_SCALE * strength;
letter.style.transform = `translateY(${-lift}px) scale(${scale})`;
letter.style.color = `hsl(${174 + strength * 40}, 70%, ${55 + strength * 20}%)`;
letter.style.textShadow = `0 0 ${strength * 18}px rgba(79, 209, 197, ${strength})`;
} else {
letter.style.transform = 'translateY(0) scale(1)';
letter.style.color = '';
letter.style.textShadow = 'none';
}
});
}
window.addEventListener('mousemove', e => {
updateLetters(e.clientX, e.clientY);
});
window.addEventListener('mouseleave', () => {
letters.forEach(letter => {
letter.style.transform = 'translateY(0) scale(1)';
letter.style.color = '';
letter.style.textShadow = 'none';
});
});