173 lines
5.8 KiB
JavaScript
173 lines
5.8 KiB
JavaScript
import './style.css'
|
|
|
|
// Smooth scrolling for navigation links
|
|
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
|
anchor.addEventListener('click', function (e) {
|
|
e.preventDefault();
|
|
const target = document.querySelector(this.getAttribute('href'));
|
|
if (target) {
|
|
window.scrollTo({
|
|
top: target.offsetTop,
|
|
behavior: 'smooth'
|
|
});
|
|
}
|
|
});
|
|
});
|
|
|
|
// Update navbar styling on scroll
|
|
const navbar = document.getElementById('navbar');
|
|
window.addEventListener('scroll', () => {
|
|
if (window.scrollY > 50) {
|
|
navbar.classList.add('scrolled');
|
|
} else {
|
|
navbar.classList.remove('scrolled');
|
|
}
|
|
});
|
|
|
|
// Scroll Reveal Animation Initialization using IntersectionObserver
|
|
const revealElements = document.querySelectorAll('.scroll-reveal');
|
|
|
|
const revealOptions = {
|
|
threshold: 0.15,
|
|
rootMargin: "0px 0px -50px 0px"
|
|
};
|
|
|
|
const scrollObserver = new IntersectionObserver((entries, observer) => {
|
|
entries.forEach(entry => {
|
|
if (entry.isIntersecting) {
|
|
entry.target.classList.add('active');
|
|
// Optional: stop observing once revealed
|
|
// observer.unobserve(entry.target);
|
|
}
|
|
});
|
|
}, revealOptions);
|
|
|
|
revealElements.forEach(el => {
|
|
scrollObserver.observe(el);
|
|
});
|
|
|
|
// Theme toggling logic
|
|
const themeToggleBtn = document.getElementById('theme-toggle');
|
|
const moonIcon = document.getElementById('moon-icon');
|
|
const sunIcon = document.getElementById('sun-icon');
|
|
|
|
// Check for saved theme preference or use system preference (default to light)
|
|
const savedTheme = localStorage.getItem('theme');
|
|
const systemPrefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
let currentTheme = savedTheme || (systemPrefersDark ? 'dark' : 'light');
|
|
|
|
function applyTheme(theme) {
|
|
if (theme === 'dark') {
|
|
document.documentElement.setAttribute('data-theme', 'dark');
|
|
moonIcon.style.display = 'none';
|
|
sunIcon.style.display = 'block';
|
|
} else {
|
|
document.documentElement.removeAttribute('data-theme');
|
|
moonIcon.style.display = 'block';
|
|
sunIcon.style.display = 'none';
|
|
}
|
|
}
|
|
|
|
// Initial appliance
|
|
applyTheme(currentTheme);
|
|
|
|
themeToggleBtn.addEventListener('click', () => {
|
|
currentTheme = currentTheme === 'dark' ? 'light' : 'dark';
|
|
localStorage.setItem('theme', currentTheme);
|
|
applyTheme(currentTheme);
|
|
});
|
|
|
|
// Gallery Grid & Lightbox Logic
|
|
const finalImages = [
|
|
"aamiainen-2-768x432.jpeg", "kipinatie10.jpeg", "kipinatie10_13.jpeg", "kipinatie10_14.jpeg",
|
|
"kipinatie10_15.jpeg", "kipinatie10_2-2.jpeg", "kipinatie10_20.jpeg", "kipinatie10_28.jpeg",
|
|
"kipinatie10_3.jpeg", "kipinatie10_36-7.jpeg", "kipinatie10_37.jpeg", "kipinatie10_5.jpeg",
|
|
"kipinatie10_50-5.jpeg", "kipinatie10_52.jpeg", "kipinatie10_53.jpeg", "kipinatie10_54.jpeg",
|
|
"kipinatie10_57.jpeg", "kipinatie10_58-2.jpeg", "kipinatie10_59.jpeg", "kipinatie10_6.jpeg",
|
|
"kipinatie10_60.jpeg", "kipinatie10_61.jpeg", "kipinatie10_62.jpeg", "kipinatie10_64.jpeg",
|
|
"kipinatie10_65.jpeg", "kipinatie10_68.jpeg", "kipinatie10_69-0.jpeg", "kipinatie10_70-2.jpeg",
|
|
"kipinatie10_71-3.jpeg", "kipinatie10_8.jpeg", "kipinatie10_9.jpeg", "ranta-aurinko.jpeg"
|
|
];
|
|
|
|
const galleryImages = finalImages.map(src => ({ src, title: 'Kipinä Lomat Kuvagalleria' }));
|
|
|
|
const galleryGrid = document.getElementById('gallery-grid');
|
|
const lightbox = document.getElementById('lightbox');
|
|
const lightboxImg = document.getElementById('lightbox-img');
|
|
const lightboxCaption = document.getElementById('lightbox-caption');
|
|
const lightboxClose = document.getElementById('lightbox-close');
|
|
const lightboxPrev = document.getElementById('lightbox-prev');
|
|
const lightboxNext = document.getElementById('lightbox-next');
|
|
|
|
let currentLightboxIndex = 0;
|
|
|
|
if (galleryGrid && lightbox) {
|
|
galleryGrid.innerHTML = '';
|
|
// Populate Gallery Grid
|
|
galleryImages.forEach((item, index) => {
|
|
const galleryItem = document.createElement('div');
|
|
galleryItem.className = 'gallery-item';
|
|
|
|
const imgEl = document.createElement('img');
|
|
imgEl.src = `/img/${item.src}`;
|
|
imgEl.alt = item.title;
|
|
imgEl.loading = 'lazy';
|
|
|
|
galleryItem.appendChild(imgEl);
|
|
galleryGrid.appendChild(galleryItem);
|
|
|
|
// Open Lightbox on Click
|
|
galleryItem.addEventListener('click', () => openLightbox(index));
|
|
});
|
|
|
|
// Lightbox Functions
|
|
function openLightbox(index) {
|
|
currentLightboxIndex = index;
|
|
updateLightboxImage();
|
|
lightbox.classList.add('active');
|
|
document.body.style.overflow = 'hidden';
|
|
}
|
|
|
|
function closeLightbox() {
|
|
lightbox.classList.remove('active');
|
|
document.body.style.overflow = 'auto';
|
|
}
|
|
|
|
function updateLightboxImage() {
|
|
lightboxImg.classList.remove('loaded');
|
|
const currentItem = galleryImages[currentLightboxIndex];
|
|
setTimeout(() => {
|
|
lightboxImg.src = `/img/${currentItem.src}`;
|
|
lightboxCaption.textContent = currentItem.title;
|
|
setTimeout(() => lightboxImg.classList.add('loaded'), 50);
|
|
}, 200);
|
|
}
|
|
|
|
function showNext() {
|
|
currentLightboxIndex = (currentLightboxIndex + 1) % galleryImages.length;
|
|
updateLightboxImage();
|
|
}
|
|
|
|
function showPrev() {
|
|
currentLightboxIndex = (currentLightboxIndex - 1 + galleryImages.length) % galleryImages.length;
|
|
updateLightboxImage();
|
|
}
|
|
|
|
lightboxClose.addEventListener('click', closeLightbox);
|
|
lightboxNext.addEventListener('click', (e) => { e.stopPropagation(); showNext(); });
|
|
lightboxPrev.addEventListener('click', (e) => { e.stopPropagation(); showPrev(); });
|
|
|
|
lightbox.addEventListener('click', (e) => {
|
|
if (e.target === lightbox || e.target === document.querySelector('.lightbox-content-wrapper')) {
|
|
closeLightbox();
|
|
}
|
|
});
|
|
|
|
document.addEventListener('keydown', (e) => {
|
|
if (!lightbox.classList.contains('active')) return;
|
|
if (e.key === 'Escape') closeLightbox();
|
|
if (e.key === 'ArrowRight') showNext();
|
|
if (e.key === 'ArrowLeft') showPrev();
|
|
});
|
|
}
|