-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlogo.js
More file actions
51 lines (44 loc) · 1.65 KB
/
Copy pathlogo.js
File metadata and controls
51 lines (44 loc) · 1.65 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
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';
});
});