Files
kipinalomat-web/main.js
2026-03-30 07:24:09 +03:00

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();
});
}