Repository navigation
Expand file tree
/
Copy pathscript.js
More file actions
106 lines (86 loc) · 3.69 KB
/
Copy pathscript.js
File metadata and controls
106 lines (86 loc) · 3.69 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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// Hamburger Menu Toggle
const links = document.querySelectorAll('nav a');
links.forEach(link => {
link.addEventListener('click', () => {
links.forEach(l => l.classList.remove('current'));
link.classList.add('current');
});
});
const navbar = document.getElementById('navbar');
const certificates = document.getElementById('certificates');
window.addEventListener('scroll', () => {
if (window.innerWidth < 768) return; // desktop only
const scrollPosition = window.scrollY;
const certOffset = certificates.offsetTop - navbar.offsetHeight;
if (scrollPosition >= certOffset) {
navbar.classList.add('bg-black/50', 'backdrop-blur-2xl', 'transition-all', 'duration-300');
navbar.classList.remove('bg-transparent');
} else {
navbar.classList.remove('bg-black/50', 'backdrop-blur-sm');
navbar.classList.add('bg-transparent','backdrop-blur-sm', 'transition-all', 'duration-300');
}
});
const menuBtn = document.getElementById('menuBtn');
const mobileMenu = document.getElementById('mobileMenu');
menuBtn.addEventListener('click', () => mobileMenu.classList.toggle('hidden'));
// Scroll to Top & Fade-in Sections
const scrollBtn = document.getElementById('scrollBtn');
window.addEventListener('scroll', () => {
if(window.scrollY > 300) scrollBtn.classList.remove('hidden');
else scrollBtn.classList.add('hidden');
scrollBtn.addEventListener('click', () => {
window.scrollTo({ top: 0, behavior: 'smooth' });
});
document.querySelectorAll('.fade-in').forEach(section => {
const top = section.getBoundingClientRect().top;
if(top < window.innerHeight - 100) section.classList.add('visible');
});
});
scrollBtn.addEventListener('click', () => window.scrollTo({ top:0, behavior:'smooth' }));
// Lightbox for Projects & Certificates with navigation
const lightbox = document.getElementById('lightbox');
const lightboxImg = lightbox.querySelector('img');
let lightboxImgs = Array.from(document.querySelectorAll('.lightbox-img'));
let currentIndex = 0;
lightboxImgs.forEach((img, i) => {
img.addEventListener('click', () => {
currentIndex = i;
lightboxImg.src = img.src;
lightbox.classList.remove('hidden');
});
});
document.getElementById('prevBtn').addEventListener('click', () => {
currentIndex = (currentIndex - 1 + lightboxImgs.length) % lightboxImgs.length;
lightboxImg.src = lightboxImgs[currentIndex].src;
});
document.getElementById('nextBtn').addEventListener('click', () => {
currentIndex = (currentIndex + 1) % lightboxImgs.length;
lightboxImg.src = lightboxImgs[currentIndex].src;
});
lightbox.addEventListener('click', (e) => {
if(e.target === lightbox) lightbox.classList.add('hidden');
});
// Hero typing effect
const heroText = ["Hi, I'm Charan Mahendaran ", "Software Developer", "IoT Enthusiast", "Learner"];
let heroIndex = 0;
let charIndex = 0;
const heroElement = document.querySelector("#home h2");
function typeHeroText() {
if(heroIndex >= heroText.length) heroIndex = 0;
const currentText = heroText[heroIndex];
heroElement.textContent = currentText.slice(0, charIndex++);
if(charIndex <= currentText.length) setTimeout(typeHeroText, 100);
else {
setTimeout(() => { charIndex = 0; heroIndex++; typeHeroText(); }, 1500);
}
}
typeHeroText();
const btn = document.getElementById('gradientBtn');
btn.addEventListener('mouseenter', () => {
btn.style.background = 'linear-gradient(to right, #000 0%, #111 60%, #2a1b33 70%, #10b981 75%, #22c55e 100%)';
btn.querySelector('span').classList.add('text-amber-400');
});
btn.addEventListener('mouseleave', () => {
btn.style.background = 'linear-gradient(to right, #000 0%, #111 60%, #2a1b33 70%, #7c3aed 75%, #8b5cf6 100%)';
btn.querySelector('span').classList.remove('text-amber-400');
});