Files
JL Kruger 855f0bdba9 Add mobile dropdown nav to image collection pages
Desktop: two nav buttons side by side (unchanged).
Mobile: collapses to a ☰ Menu toggle, dropdown reveals both links.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 20:42:06 +02:00

367 lines
13 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WayBack (20102014) | Singular Particular Space</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Rubik+Glitch&family=Lora:ital,wght@0,400..700;1,400..700&family=Share+Tech+Mono&display=swap" rel="stylesheet">
<style>
:root {
--bg-void: #04060b;
--bg-deep: #050810;
--bg-warm: #0d1320;
--fire-coral: #d4654a;
--text-warm: #e8d5b8;
--text-muted: #6a7a8a;
--accent: var(--fire-coral);
--accent-glow: rgba(212, 101, 74, 0.3);
--transition: 100ms ease;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
border-radius: 0 !important;
}
body {
background-color: var(--bg-void);
color: var(--text-warm);
font-family: 'Lora', serif;
line-height: 1.6;
min-height: 100vh;
display: flex;
flex-direction: column;
}
header {
padding: 2rem;
border-bottom: 2px solid var(--accent);
display: flex;
justify-content: space-between;
align-items: center;
background: var(--bg-deep);
position: sticky;
top: 0;
z-index: 100;
box-shadow: 0 4px 15px var(--accent-glow);
}
.header-title-wrap {
text-align: left;
}
h1 {
font-family: 'Rubik Glitch', system-ui;
font-size: 3rem;
color: var(--accent);
line-height: 1;
text-shadow: 0 0 15px var(--accent-glow);
}
.subtitle {
font-family: 'Share Tech Mono', monospace;
font-size: 0.9rem;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.1em;
}
.nav-back {
font-family: 'Share Tech Mono', monospace;
color: var(--text-muted);
text-decoration: none;
text-transform: uppercase;
border: 1px solid var(--text-muted);
padding: 0.5rem 1.5rem;
transition: var(--transition);
}
.nav-back:hover {
color: var(--accent);
border-color: var(--accent);
background: var(--accent-glow);
box-shadow: 0 0 10px var(--accent-glow);
}
.nav-menu { position: relative; }
.nav-menu-toggle {
display: none;
font-family: 'Share Tech Mono', monospace;
background: none;
border: 1px solid var(--text-muted);
color: var(--text-muted);
padding: 0.5rem 1rem;
cursor: pointer;
font-size: 1rem;
letter-spacing: 0.05em;
transition: var(--transition);
}
.nav-menu-toggle:hover {
color: var(--accent);
border-color: var(--accent);
background: var(--accent-glow);
}
.nav-menu-links {
display: flex;
gap: 1rem;
}
@media (max-width: 600px) {
.nav-menu-toggle { display: block; }
.nav-menu-links {
display: none;
flex-direction: column;
position: absolute;
right: 0;
top: calc(100% + 4px);
background: var(--bg-deep);
border: 1px solid var(--accent);
box-shadow: 0 4px 15px var(--accent-glow);
padding: 0.5rem;
gap: 0.5rem;
z-index: 200;
min-width: 180px;
}
.nav-menu-links.open { display: flex; }
}
main {
flex: 1;
padding: 2rem;
}
#gallery {
column-count: 5;
column-gap: 1.5rem;
width: 100%;
}
@media (max-width: 1200px) {
#gallery { column-count: 4; }
}
@media (max-width: 900px) {
#gallery { column-count: 3; }
}
@media (max-width: 600px) {
#gallery { column-count: 2; }
h1 { font-size: 2rem; }
}
.thumb-link {
display: inline-block;
width: 100%;
margin-bottom: 1.5rem;
break-inside: avoid;
border: 1px solid var(--bg-warm);
overflow: hidden;
transition: var(--transition);
background: var(--bg-deep);
cursor: pointer;
position: relative;
}
.thumb-link:hover {
border-color: var(--accent);
box-shadow: 0 0 15px var(--accent-glow);
z-index: 10;
}
.thumb-link img {
width: 100%;
height: auto;
display: block;
transition: var(--transition);
filter: grayscale(0.4) contrast(1.1);
}
.thumb-link:hover img {
filter: grayscale(0) contrast(1);
}
/* Lightbox */
#lightbox {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(4, 6, 11, 0.98);
display: none;
justify-content: center;
align-items: center;
z-index: 1000;
padding: 2rem;
}
.lightbox-content {
position: relative;
max-width: 100%;
max-height: 90vh;
display: flex;
flex-direction: column;
align-items: center;
overflow-y: auto;
}
#lightbox-img {
max-width: 100%;
max-height: 80vh;
object-fit: contain;
border: 2px solid var(--accent);
box-shadow: 0 0 30px var(--accent-glow);
}
.lightbox-controls {
margin-top: 1.5rem;
display: flex;
gap: 1.5rem;
align-items: center;
width: 100%;
justify-content: center;
}
.lightbox-btn {
background: var(--bg-deep);
border: 1px solid var(--text-muted);
color: var(--text-warm);
padding: 0.75rem 1.5rem;
cursor: pointer;
font-family: 'Share Tech Mono', monospace;
transition: var(--transition);
text-transform: uppercase;
}
.lightbox-btn:hover {
border-color: var(--accent);
color: var(--accent);
background: var(--accent-glow);
box-shadow: 0 0 10px var(--accent-glow);
}
.close-btn {
position: absolute;
top: -4rem;
right: 0;
}
#lightbox-filename {
font-family: 'Share Tech Mono', monospace;
font-size: 0.9rem;
color: var(--text-muted);
margin-top: 0.75rem;
letter-spacing: 0.05em;
}
</style>
</head>
<body>
<header>
<div class="header-title-wrap">
<span class="subtitle">20102014 Collection</span>
<h1>WayBack</h1>
</div>
<div class="nav-menu">
<button class="nav-menu-toggle" id="nav-toggle" aria-label="Menu">&#9776; Menu</button>
<div class="nav-menu-links" id="nav-links">
<a href="images.html" class="nav-back">← Back to Hub</a>
<a href="https://files.exopraxist.org/share/voxb2LeQ" class="nav-back" target="_blank">↓ Download Folder</a>
</div>
</div>
</header>
<main>
<div id="gallery"></div>
</main>
<div id="lightbox">
<div class="lightbox-content">
<button class="lightbox-btn close-btn" id="close-btn">CLOSE [ESC]</button>
<img id="lightbox-img" src="" alt="">
<div id="lightbox-filename"></div>
<div class="lightbox-controls">
<button class="lightbox-btn" id="prev-btn">PREV</button>
<button class="lightbox-btn" id="next-btn">NEXT</button>
</div>
</div>
</div>
<script>
const THUMBNAILS =["3DCB5B82-94E6-4BA0-A382-3A98007038F2.jpg","BreakermanAvatar1.jpg","ChristmiesPortrait3_low.jpg","ChristmiesPortrait_low.jpg","_DSC3150.jpg","Enlight100.jpg","Enlight1-2.jpg","Enlight1-4 (copy 1).jpg","Enlight1-4.jpg","Enlight27.jpg","Enlight33.jpg","Enlight37.jpg","Enlight38.jpg","Enlight39.jpg","Enlight40.jpg","Enlight44.jpg","Enlight46.jpg","Enlight47.jpg","Enlight48.jpg","Enlight49.jpg","Enlight50.jpg","Enlight51.jpg","Enlight54.jpg","Enlight55.jpg","Enlight56.jpg","Enlight68.jpg","Enlight70.jpg","Enlight71.jpg","Enlight72.jpg","Enlight73.jpg","Enlight74.jpg","Enlight76.jpg","Enlight94.jpg","Enlight95.jpg","Enlight98.jpg","Enlight99.jpg","Enlight9.jpg","IMG_0375.jpg","IMG_0787.jpg","IMG_0791.jpg","IMG_0828.jpg","IMG_0831.jpg","IMG_0835.jpg","IMG_0941.jpg","IMG_0944.jpg","IMG_0948.jpg","IMG_0970.jpg","IMG_0971.jpg","IMG_0972.jpg","IMG_1207.jpg","IMG_1208.jpg","IMG_1209.jpg","IMG_1210.jpg","IMG_1211.jpg","IMG_1212.jpg","IMG_1214.jpg","IMG_1215.jpg","IMG_1216.jpg","IMG_2610.jpg","IMG_2611.jpg","IMG_2612.jpg","IMG_2613.jpg","IMG_2614.jpg","IMG_2615.jpg","IMG_2616.jpg","IMG_2669.jpg","IMG_2684.jpg","IMG_2685.jpg","IMG_2696.jpg","IMG_2697.jpg","IMG_3123.jpg","IMG_3124.jpg","IMG_3188.jpg","IMG_3190.jpg","IMG_3482.jpg","IMG_3483.jpg","IMG_3484.jpg","IMG_3485.jpg","IMG_3486.jpg","IMG_3509.jpg","IMG_3512.jpg","IMG_3515.jpg","IMG_3516.jpg","IMG_3517.jpg","IMG_3751.jpg","IMG_3752.jpg","IMG_3760.jpg","JncPortraits1.jpg","JncPortraits2.jpg","JncPortraits3.jpg","Jnc_Teaser2.jpg","JnC_Teaser3.jpg","JnC_Teaser4.jpg","JnC_Teaser.jpg","ORT_ad1.jpg","ORT_ad2.jpg","ORT_ad3.jpg","ORT_ad4.jpg","TJF Cover photo2.jpg","TJF Cover photo3.jpg","TJF Cover photo4.jpg","TJF Cover photo5.jpg","TJF Cover photo6.jpg"];
let currentIndex = -1;
const galleryEl = document.getElementById('gallery');
const lightboxEl = document.getElementById('lightbox');
const lightboxImg = document.getElementById('lightbox-img');
const lightboxFilename = document.getElementById('lightbox-filename');
function renderGallery() {
THUMBNAILS.forEach((filename, index) => {
const thumbSrc = `WayBack/thumbnails/${filename}`;
const link = document.createElement('div');
link.className = 'thumb-link';
link.innerHTML = `<img src="${thumbSrc}" alt="${filename}" loading="lazy">`;
link.onclick = () => openLightbox(index);
galleryEl.appendChild(link);
});
}
function openLightbox(index) {
currentIndex = index;
const thumbFilename = THUMBNAILS[currentIndex];
lightboxImg.src = `WayBack/thumbnails/${thumbFilename}`;
lightboxFilename.textContent = thumbFilename;
lightboxEl.style.display = 'flex';
document.body.style.overflow = 'hidden';
}
function closeLightbox() {
lightboxEl.style.display = 'none';
lightboxImg.src = '';
document.body.style.overflow = 'auto';
}
function nextImage() {
currentIndex = (currentIndex + 1) % THUMBNAILS.length;
openLightbox(currentIndex);
}
function prevImage() {
currentIndex = (currentIndex - 1 + THUMBNAILS.length) % THUMBNAILS.length;
openLightbox(currentIndex);
}
document.getElementById('close-btn').onclick = closeLightbox;
document.getElementById('next-btn').onclick = nextImage;
document.getElementById('prev-btn').onclick = prevImage;
lightboxEl.onclick = (e) => {
if (e.target === lightboxEl) closeLightbox();
};
window.addEventListener('keydown', (e) => {
if (lightboxEl.style.display === 'flex') {
if (e.key === 'Escape') closeLightbox();
if (e.key === 'ArrowRight') nextImage();
if (e.key === 'ArrowLeft') prevImage();
}
});
document.addEventListener('DOMContentLoaded', renderGallery);
document.getElementById('nav-toggle').onclick = function() {
document.getElementById('nav-links').classList.toggle('open');
};
</script>
</body>
</html>