202 lines
7.2 KiB
JavaScript
202 lines
7.2 KiB
JavaScript
// Lightbox functionality for the homepage screenshot
|
|
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
// Get the screenshot image
|
|
const screenshotImg = document.querySelector('.screenshot-container img');
|
|
|
|
// If the image exists
|
|
if (screenshotImg) {
|
|
// Create lightbox elements
|
|
const lightbox = document.createElement('div');
|
|
lightbox.className = 'satag-lightbox';
|
|
|
|
const closeBtn = document.createElement('span');
|
|
closeBtn.className = 'satag-lightbox-close';
|
|
closeBtn.innerHTML = '×';
|
|
|
|
const lightboxImg = document.createElement('img');
|
|
lightboxImg.className = 'satag-lightbox-img';
|
|
lightboxImg.src = screenshotImg.src;
|
|
lightboxImg.alt = screenshotImg.alt;
|
|
|
|
// Append elements to the lightbox
|
|
lightbox.appendChild(closeBtn);
|
|
lightbox.appendChild(lightboxImg);
|
|
|
|
// Remove any existing lightbox to avoid duplicates
|
|
const existingLightbox = document.querySelector('.satag-lightbox');
|
|
if (existingLightbox) {
|
|
document.body.removeChild(existingLightbox);
|
|
}
|
|
|
|
// Append lightbox to the body instead of the screenshot container
|
|
// This allows the lightbox to be as large as the viewport, not constrained by the container
|
|
document.body.appendChild(lightbox);
|
|
|
|
// Function to position the lightbox directly over the original image
|
|
function positionLightbox() {
|
|
// Get the position and dimensions of the original image
|
|
const imgRect = screenshotImg.getBoundingClientRect();
|
|
const screenshotContainer = document.querySelector('.screenshot-container');
|
|
const containerRect = screenshotContainer.getBoundingClientRect();
|
|
|
|
// Get the current scroll position
|
|
const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
|
|
const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;
|
|
|
|
// Get viewport dimensions
|
|
const viewportWidth = window.innerWidth;
|
|
const viewportHeight = window.innerHeight;
|
|
|
|
// Position the lightbox directly over the original image
|
|
lightbox.style.position = 'fixed';
|
|
lightbox.style.top = imgRect.top + 'px';
|
|
lightbox.style.left = imgRect.left + 'px';
|
|
lightbox.style.width = imgRect.width + 'px';
|
|
lightbox.style.height = imgRect.height + 'px';
|
|
lightbox.style.display = 'flex';
|
|
lightbox.style.alignItems = 'center';
|
|
lightbox.style.justifyContent = 'center';
|
|
|
|
// Set the lightbox image to fill the lightbox container
|
|
lightboxImg.style.position = 'relative';
|
|
lightboxImg.style.width = '100%';
|
|
lightboxImg.style.height = '100%';
|
|
lightboxImg.style.objectFit = 'contain';
|
|
|
|
// Position the close button in the top-right corner of the lightbox
|
|
closeBtn.style.top = '5px';
|
|
closeBtn.style.right = '5px';
|
|
}
|
|
|
|
// Function to check if lightbox should be enabled (screen width > 768px)
|
|
function shouldEnableLightbox() {
|
|
return window.innerWidth > 768;
|
|
}
|
|
|
|
// Update cursor style based on screen width
|
|
function updateCursorStyle() {
|
|
screenshotImg.style.cursor = shouldEnableLightbox() ? 'pointer' : 'default';
|
|
}
|
|
|
|
// Initial cursor style update
|
|
updateCursorStyle();
|
|
|
|
// Update cursor style when window is resized
|
|
window.addEventListener('resize', updateCursorStyle);
|
|
|
|
// Open lightbox when clicking on the screenshot (only if screen width > 768px)
|
|
screenshotImg.addEventListener('click', function(e) {
|
|
e.preventDefault(); // Prevent default behavior
|
|
|
|
// Only activate lightbox if screen width > 768px
|
|
if (!shouldEnableLightbox()) {
|
|
return;
|
|
}
|
|
|
|
// Position the lightbox over the original image
|
|
positionLightbox();
|
|
|
|
// Display the lightbox - use flex to match our CSS
|
|
lightbox.style.display = 'flex';
|
|
|
|
// Force a reflow to ensure the display change takes effect before adding the active class
|
|
void lightbox.offsetWidth;
|
|
|
|
// Apply transform scale to the lightbox to make it larger
|
|
const viewportWidth = window.innerWidth;
|
|
if (viewportWidth <= 479) { // Mobile
|
|
lightbox.style.transform = 'scale(1.2)';
|
|
} else if (viewportWidth <= 959) { // Tablet
|
|
lightbox.style.transform = 'scale(1.3)';
|
|
} else if (viewportWidth <= 1219) { // Medium screens
|
|
lightbox.style.transform = 'scale(1.4)';
|
|
} else { // Large screens
|
|
lightbox.style.transform = 'scale(1.5)';
|
|
}
|
|
|
|
// Add the active class to trigger the transition
|
|
lightbox.classList.add('active');
|
|
});
|
|
|
|
// Function to handle closing with transition
|
|
function closeLightboxWithTransition() {
|
|
lightbox.style.opacity = '0';
|
|
lightbox.style.transform = 'scale(1)'; // Reset scale to original size
|
|
|
|
// Wait for transition to complete before removing active class
|
|
setTimeout(function() {
|
|
lightbox.classList.remove('active');
|
|
|
|
// Reset display to none after the transition is complete
|
|
lightbox.style.display = 'none';
|
|
|
|
// Reset all inline styles after the lightbox is hidden
|
|
setTimeout(function() {
|
|
// Reset opacity and transform
|
|
lightbox.style.opacity = '';
|
|
lightbox.style.transform = '';
|
|
|
|
// Reset position and size styles
|
|
lightbox.style.position = '';
|
|
lightbox.style.top = '';
|
|
lightbox.style.left = '';
|
|
lightbox.style.width = '';
|
|
lightbox.style.height = '';
|
|
lightbox.style.alignItems = '';
|
|
lightbox.style.justifyContent = '';
|
|
|
|
// Reset image styles
|
|
lightboxImg.style.width = '';
|
|
lightboxImg.style.height = '';
|
|
lightboxImg.style.objectFit = '';
|
|
|
|
// Reset close button styles
|
|
closeBtn.style.top = '';
|
|
closeBtn.style.right = '';
|
|
}, 100);
|
|
}, 400); // Match the transition duration from CSS
|
|
}
|
|
|
|
// Close lightbox when clicking on the close button
|
|
closeBtn.addEventListener('click', function(e) {
|
|
e.stopPropagation(); // Prevent event from bubbling up
|
|
closeLightboxWithTransition();
|
|
});
|
|
|
|
// Close lightbox when clicking on the lightbox (outside the image)
|
|
lightbox.addEventListener('click', function(e) {
|
|
if (e.target === lightbox) {
|
|
closeLightboxWithTransition();
|
|
}
|
|
});
|
|
|
|
// Close lightbox when pressing Escape key
|
|
document.addEventListener('keydown', function(e) {
|
|
if (e.key === 'Escape' && lightbox.classList.contains('active')) {
|
|
closeLightboxWithTransition();
|
|
}
|
|
});
|
|
|
|
// Update lightbox position when window is resized
|
|
window.addEventListener('resize', function() {
|
|
if (lightbox.classList.contains('active')) {
|
|
// Reposition the lightbox based on new viewport dimensions
|
|
positionLightbox();
|
|
|
|
// Apply appropriate transform scale based on viewport width
|
|
const viewportWidth = window.innerWidth;
|
|
if (viewportWidth <= 479) { // Mobile
|
|
lightbox.style.transform = 'scale(1.2)';
|
|
} else if (viewportWidth <= 959) { // Tablet
|
|
lightbox.style.transform = 'scale(1.3)';
|
|
} else if (viewportWidth <= 1219) { // Medium screens
|
|
lightbox.style.transform = 'scale(1.4)';
|
|
} else { // Large screens
|
|
lightbox.style.transform = 'scale(1.5)';
|
|
}
|
|
}
|
|
});
|
|
}
|
|
});
|