39 lines
1.2 KiB
JavaScript
39 lines
1.2 KiB
JavaScript
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
// Theme toggle
|
|
const themeToggle = document.getElementById('theme-toggle');
|
|
const htmlElement = document.documentElement;
|
|
|
|
// Set initial theme based on saved preference or system setting
|
|
if (localStorage.getItem('theme') === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
|
|
htmlElement.classList.add('dark');
|
|
} else {
|
|
htmlElement.classList.remove('dark');
|
|
}
|
|
|
|
themeToggle.addEventListener('click', () => {
|
|
if (htmlElement.classList.contains('dark')) {
|
|
htmlElement.classList.remove('dark');
|
|
localStorage.setItem('theme', 'light');
|
|
} else {
|
|
htmlElement.classList.add('dark');
|
|
localStorage.setItem('theme', 'dark');
|
|
}
|
|
});
|
|
|
|
// Scroll animations
|
|
const observer = new IntersectionObserver((entries) => {
|
|
entries.forEach(entry => {
|
|
if (entry.isIntersecting) {
|
|
entry.target.classList.add('fade-in-up-visible');
|
|
}
|
|
});
|
|
}, {
|
|
threshold: 0.1
|
|
});
|
|
|
|
document.querySelectorAll('.fade-in-up').forEach(el => {
|
|
observer.observe(el);
|
|
});
|
|
});
|