Spaces:
Running
Running
Commit ·
4d83ec2
1
Parent(s): 8361df7
added artworks
Browse files- .gitattributes +1 -0
- 404-heart-not-found.webp +3 -0
- README.md +8 -5
- index.html +184 -18
- script.js +122 -0
- steampunk-surgery-gone-wrong.webp +3 -0
- style.css +650 -17
- the-ribcage-plays-beethoven.webp +3 -0
- thorax-civil-war.webp +3 -0
- you-are-engraved-in-my-heart.webp +3 -0
- you-are-my-heart-you-are-my-soul.webp +3 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
*.webp filter=lfs diff=lfs merge=lfs -text
|
404-heart-not-found.webp
ADDED
|
Git LFS Details
|
README.md
CHANGED
|
@@ -1,11 +1,14 @@
|
|
| 1 |
---
|
| 2 |
title: CXART
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
-
license: apache-2.0
|
| 9 |
---
|
| 10 |
|
| 11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
title: CXART
|
| 3 |
+
emoji: 🩻
|
| 4 |
+
colorFrom: gray
|
| 5 |
+
colorTo: purple
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
+
# CXART — When AI Dreams of X-Rays
|
| 11 |
+
|
| 12 |
+
A gallery of artefactual chest X-ray images generated by a Diffusion Transformer (DiT) model.
|
| 13 |
+
|
| 14 |
+
Where radiology meets hallucination.
|
index.html
CHANGED
|
@@ -1,19 +1,185 @@
|
|
| 1 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
</html>
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8" />
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 6 |
+
<title>CXART | When AI Dreams of X-Rays</title>
|
| 7 |
+
<meta name="description" content="A gallery of artefactual chest X-ray images generated by a Diffusion Transformer (DiT) model. Where radiology meets hallucination." />
|
| 8 |
+
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🩻</text></svg>" />
|
| 9 |
+
<link rel="stylesheet" href="style.css" />
|
| 10 |
+
</head>
|
| 11 |
+
<body>
|
| 12 |
+
|
| 13 |
+
<!-- Ambient Background -->
|
| 14 |
+
<div class="ambient-bg">
|
| 15 |
+
<div class="ambient-bg__orb ambient-bg__orb--1"></div>
|
| 16 |
+
<div class="ambient-bg__orb ambient-bg__orb--2"></div>
|
| 17 |
+
<div class="ambient-bg__orb ambient-bg__orb--3"></div>
|
| 18 |
+
</div>
|
| 19 |
+
|
| 20 |
+
<!-- Particle Canvas -->
|
| 21 |
+
<canvas id="particles"></canvas>
|
| 22 |
+
|
| 23 |
+
<!-- Texture overlays -->
|
| 24 |
+
<div class="noise"></div>
|
| 25 |
+
<div class="scanlines"></div>
|
| 26 |
+
|
| 27 |
+
<!-- Main Content -->
|
| 28 |
+
<div class="content">
|
| 29 |
+
|
| 30 |
+
<!-- ===== Hero ===== -->
|
| 31 |
+
<header class="hero">
|
| 32 |
+
<div class="hero__badge">DiT Generated · Artefactual CXR</div>
|
| 33 |
+
<h1 class="hero__title">CXART</h1>
|
| 34 |
+
<p class="hero__subtitle">
|
| 35 |
+
What happens when you ask a Diffusion Transformer to generate chest X-rays?
|
| 36 |
+
Keyboards for ribs, clockwork lungs, and the occasional renaissance angel.
|
| 37 |
+
</p>
|
| 38 |
+
<hr class="hero__divider" />
|
| 39 |
+
<p class="hero__meta">
|
| 40 |
+
<span>6</span> artefacts · <span>1</span> DiT model · <span>∞</span> confusion
|
| 41 |
+
</p>
|
| 42 |
+
</header>
|
| 43 |
+
|
| 44 |
+
<!-- ===== Gallery ===== -->
|
| 45 |
+
<main class="gallery" id="gallery">
|
| 46 |
+
|
| 47 |
+
<!-- Card 1 -->
|
| 48 |
+
<article class="card" id="card-1">
|
| 49 |
+
<span class="card__number">01</span>
|
| 50 |
+
<div class="card__image-wrap">
|
| 51 |
+
<img class="card__image" src="the-ribcage-plays-beethoven.webp" alt="AI-generated chest X-ray with keyboard-like rib structures" loading="lazy" />
|
| 52 |
+
</div>
|
| 53 |
+
<div class="card__body">
|
| 54 |
+
<h2 class="card__title">The Ribcage Plays Beethoven</h2>
|
| 55 |
+
<p class="card__tagline">When the model confuses anatomy with an office supplies catalog</p>
|
| 56 |
+
<p class="card__description">
|
| 57 |
+
The DiT model got its wires crossed, literally. Instead of ribs, it generated
|
| 58 |
+
what appears to be a full QWERTY keyboard embedded in the thorax. Each "key" sits
|
| 59 |
+
neatly between intercostal spaces. The AI apparently thinks touch-typing is an
|
| 60 |
+
organ function.
|
| 61 |
+
</p>
|
| 62 |
+
<span class="card__tag">keyboard thorax</span>
|
| 63 |
+
</div>
|
| 64 |
+
</article>
|
| 65 |
+
|
| 66 |
+
<!-- Card 2 -->
|
| 67 |
+
<article class="card" id="card-2">
|
| 68 |
+
<span class="card__number">02</span>
|
| 69 |
+
<div class="card__image-wrap">
|
| 70 |
+
<img class="card__image" src="steampunk-surgery-gone-wrong.webp" alt="AI-generated chest X-ray with clockwork gears in lung" loading="lazy" />
|
| 71 |
+
</div>
|
| 72 |
+
<div class="card__body">
|
| 73 |
+
<h2 class="card__title">Steampunk Surgery Gone Wrong</h2>
|
| 74 |
+
<p class="card__tagline">Victorian engineers have entered the radiology department</p>
|
| 75 |
+
<p class="card__description">
|
| 76 |
+
Intricate clockwork gears and mechanical components have invaded the right lung
|
| 77 |
+
field. The left lung looks relatively normal, as if the AI ran out of steampunk
|
| 78 |
+
ideas halfway through. A catheter-like tube snakes through the scene for good measure.
|
| 79 |
+
</p>
|
| 80 |
+
<span class="card__tag">mechanical lung</span>
|
| 81 |
+
</div>
|
| 82 |
+
</article>
|
| 83 |
+
|
| 84 |
+
<!-- Card 3 -->
|
| 85 |
+
<article class="card" id="card-3">
|
| 86 |
+
<span class="card__number">03</span>
|
| 87 |
+
<div class="card__image-wrap">
|
| 88 |
+
<img class="card__image" src="thorax-civil-war.webp" alt="AI-generated double-exposure chest X-ray with reality tear" loading="lazy" />
|
| 89 |
+
</div>
|
| 90 |
+
<div class="card__body">
|
| 91 |
+
<h2 class="card__title">Thorax: Civil War</h2>
|
| 92 |
+
<p class="card__tagline">Even the AI couldn't commit to a single chest</p>
|
| 93 |
+
<p class="card__description">
|
| 94 |
+
Two separate chest X-rays collide in one frame, split by a jagged vertical tear.
|
| 95 |
+
The heart shadow is displaced, caught between dimensions. It's as if the model tried
|
| 96 |
+
to generate two patients simultaneously and just said "why not both?"
|
| 97 |
+
</p>
|
| 98 |
+
<span class="card__tag">dimensional rift</span>
|
| 99 |
+
</div>
|
| 100 |
+
</article>
|
| 101 |
+
|
| 102 |
+
<!-- Card 4 -->
|
| 103 |
+
<article class="card" id="card-4">
|
| 104 |
+
<span class="card__number">04</span>
|
| 105 |
+
<div class="card__image-wrap">
|
| 106 |
+
<img class="card__image" src="404-heart-not-found.webp" alt="AI-generated chest X-ray with circuit board patterns and text hallucinations" loading="lazy" />
|
| 107 |
+
</div>
|
| 108 |
+
<div class="card__body">
|
| 109 |
+
<h2 class="card__title">404: Heart Not Found</h2>
|
| 110 |
+
<p class="card__tagline">Have you tried turning your ribcage off and on again?</p>
|
| 111 |
+
<p class="card__description">
|
| 112 |
+
Circuit boards, electronic chips, and mysterious text hallucinations ("OMO XC")
|
| 113 |
+
replace the organs entirely. The trachea branches into what looks like wiring.
|
| 114 |
+
Somewhere in there, a motherboard is serving as the mediastinum. The model
|
| 115 |
+
went full cyberpunk.
|
| 116 |
+
</p>
|
| 117 |
+
<span class="card__tag">digital anatomy</span>
|
| 118 |
+
</div>
|
| 119 |
+
</article>
|
| 120 |
+
|
| 121 |
+
<!-- Card 5 -->
|
| 122 |
+
<article class="card" id="card-5">
|
| 123 |
+
<span class="card__number">05</span>
|
| 124 |
+
<div class="card__image-wrap">
|
| 125 |
+
<img class="card__image" src="you-are-engraved-in-my-heart.webp" alt="AI-generated X-ray with hallucinated text scrawled across it" loading="lazy" />
|
| 126 |
+
</div>
|
| 127 |
+
<div class="card__body">
|
| 128 |
+
<h2 class="card__title">You Are Engraved In My Heart</h2>
|
| 129 |
+
<p class="card__tagline">Roses are red, violets are blue, "RRQYEN" means I love you</p>
|
| 130 |
+
<p class="card__description">
|
| 131 |
+
The model went rogue and decided to graffiti the X-ray. Bold, hallucinated text
|
| 132 |
+
"RRQYEN" is scrawled across what appears to be a pelvic/abdominal view instead
|
| 133 |
+
of a proper chest X-ray. Grid artifacts and checkerboard patterns round out this
|
| 134 |
+
beautifully unhinged composition.
|
| 135 |
+
</p>
|
| 136 |
+
<span class="card__tag">text hallucination</span>
|
| 137 |
+
</div>
|
| 138 |
+
</article>
|
| 139 |
+
|
| 140 |
+
<!-- Card 6 -->
|
| 141 |
+
<article class="card" id="card-6">
|
| 142 |
+
<span class="card__number">06</span>
|
| 143 |
+
<div class="card__image-wrap">
|
| 144 |
+
<img class="card__image" src="you-are-my-heart-you-are-my-soul.webp" alt="AI-generated surreal humanoid mannequin with rib-bone wings" loading="lazy" />
|
| 145 |
+
</div>
|
| 146 |
+
<div class="card__body">
|
| 147 |
+
<h2 class="card__title">You Are My Heart, You Are My Soul</h2>
|
| 148 |
+
<p class="card__tagline">Asked for a chest X-ray, got a renaissance angel with commitment issues</p>
|
| 149 |
+
<p class="card__description">
|
| 150 |
+
The crown jewel of the collection. Instead of an X-ray, the DiT model generated
|
| 151 |
+
a full humanoid mannequin figure with what can only be described as rib-bone wings.
|
| 152 |
+
The uncanny valley energy is off the charts. This is what the model dreams about
|
| 153 |
+
when it closes its weights.
|
| 154 |
+
</p>
|
| 155 |
+
<span class="card__tag">uncanny valley</span>
|
| 156 |
+
</div>
|
| 157 |
+
</article>
|
| 158 |
+
|
| 159 |
+
</main>
|
| 160 |
+
|
| 161 |
+
<!-- ===== Lightbox ===== -->
|
| 162 |
+
<div class="lightbox" id="lightbox">
|
| 163 |
+
<div class="lightbox__inner">
|
| 164 |
+
<button class="lightbox__close" id="lightbox-close" aria-label="Close lightbox">✕</button>
|
| 165 |
+
<img class="lightbox__image" id="lightbox-img" src="" alt="Full size X-ray" />
|
| 166 |
+
<div class="lightbox__caption">
|
| 167 |
+
<p class="lightbox__caption-title" id="lightbox-title"></p>
|
| 168 |
+
<p class="lightbox__caption-tagline" id="lightbox-tagline"></p>
|
| 169 |
+
</div>
|
| 170 |
+
</div>
|
| 171 |
+
</div>
|
| 172 |
+
|
| 173 |
+
<!-- ===== Footer ===== -->
|
| 174 |
+
<footer class="footer">
|
| 175 |
+
<p class="footer__text">
|
| 176 |
+
CXART | Artefactual chest X-rays generated by a DiT model<br />
|
| 177 |
+
Built with questionable taste and zero medical accuracy
|
| 178 |
+
</p>
|
| 179 |
+
</footer>
|
| 180 |
+
|
| 181 |
+
</div>
|
| 182 |
+
|
| 183 |
+
<script src="script.js"></script>
|
| 184 |
+
</body>
|
| 185 |
</html>
|
script.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// ===== CXART Gallery — Interactions & Particles =====
|
| 2 |
+
|
| 3 |
+
document.addEventListener('DOMContentLoaded', () => {
|
| 4 |
+
|
| 5 |
+
// ---------- Floating Particles ----------
|
| 6 |
+
const canvas = document.getElementById('particles');
|
| 7 |
+
const ctx = canvas.getContext('2d');
|
| 8 |
+
let particles = [];
|
| 9 |
+
let animFrameId;
|
| 10 |
+
|
| 11 |
+
function resizeCanvas() {
|
| 12 |
+
canvas.width = window.innerWidth;
|
| 13 |
+
canvas.height = window.innerHeight;
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
+
function createParticles() {
|
| 17 |
+
particles = [];
|
| 18 |
+
const count = Math.floor((canvas.width * canvas.height) / 18000);
|
| 19 |
+
for (let i = 0; i < count; i++) {
|
| 20 |
+
particles.push({
|
| 21 |
+
x: Math.random() * canvas.width,
|
| 22 |
+
y: Math.random() * canvas.height,
|
| 23 |
+
radius: Math.random() * 1.2 + 0.3,
|
| 24 |
+
alpha: Math.random() * 0.4 + 0.05,
|
| 25 |
+
dx: (Math.random() - 0.5) * 0.15,
|
| 26 |
+
dy: (Math.random() - 0.5) * 0.1 - 0.05,
|
| 27 |
+
pulse: Math.random() * Math.PI * 2,
|
| 28 |
+
pulseSpeed: Math.random() * 0.008 + 0.003,
|
| 29 |
+
});
|
| 30 |
+
}
|
| 31 |
+
}
|
| 32 |
+
|
| 33 |
+
function drawParticles() {
|
| 34 |
+
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
| 35 |
+
particles.forEach((p) => {
|
| 36 |
+
p.x += p.dx;
|
| 37 |
+
p.y += p.dy;
|
| 38 |
+
p.pulse += p.pulseSpeed;
|
| 39 |
+
|
| 40 |
+
// Wrap around
|
| 41 |
+
if (p.x < -5) p.x = canvas.width + 5;
|
| 42 |
+
if (p.x > canvas.width + 5) p.x = -5;
|
| 43 |
+
if (p.y < -5) p.y = canvas.height + 5;
|
| 44 |
+
if (p.y > canvas.height + 5) p.y = -5;
|
| 45 |
+
|
| 46 |
+
const currentAlpha = p.alpha * (0.6 + 0.4 * Math.sin(p.pulse));
|
| 47 |
+
ctx.beginPath();
|
| 48 |
+
ctx.arc(p.x, p.y, p.radius, 0, Math.PI * 2);
|
| 49 |
+
ctx.fillStyle = `rgba(139, 92, 246, ${currentAlpha})`;
|
| 50 |
+
ctx.fill();
|
| 51 |
+
});
|
| 52 |
+
animFrameId = requestAnimationFrame(drawParticles);
|
| 53 |
+
}
|
| 54 |
+
|
| 55 |
+
resizeCanvas();
|
| 56 |
+
createParticles();
|
| 57 |
+
drawParticles();
|
| 58 |
+
|
| 59 |
+
window.addEventListener('resize', () => {
|
| 60 |
+
resizeCanvas();
|
| 61 |
+
createParticles();
|
| 62 |
+
});
|
| 63 |
+
|
| 64 |
+
// ---------- Scroll-triggered card reveal ----------
|
| 65 |
+
const cards = document.querySelectorAll('.card');
|
| 66 |
+
|
| 67 |
+
const observer = new IntersectionObserver(
|
| 68 |
+
(entries) => {
|
| 69 |
+
entries.forEach((entry) => {
|
| 70 |
+
if (entry.isIntersecting) {
|
| 71 |
+
entry.target.classList.add('visible');
|
| 72 |
+
observer.unobserve(entry.target);
|
| 73 |
+
}
|
| 74 |
+
});
|
| 75 |
+
},
|
| 76 |
+
{ threshold: 0.08, rootMargin: '0px 0px -30px 0px' }
|
| 77 |
+
);
|
| 78 |
+
|
| 79 |
+
cards.forEach((card) => observer.observe(card));
|
| 80 |
+
|
| 81 |
+
// ---------- Lightbox ----------
|
| 82 |
+
const lightbox = document.getElementById('lightbox');
|
| 83 |
+
const lightboxImg = document.getElementById('lightbox-img');
|
| 84 |
+
const lightboxTitle = document.getElementById('lightbox-title');
|
| 85 |
+
const lightboxTagline = document.getElementById('lightbox-tagline');
|
| 86 |
+
const lightboxClose = document.getElementById('lightbox-close');
|
| 87 |
+
|
| 88 |
+
function openLightbox(imgSrc, title, tagline) {
|
| 89 |
+
lightboxImg.src = imgSrc;
|
| 90 |
+
lightboxTitle.textContent = title;
|
| 91 |
+
lightboxTagline.textContent = tagline;
|
| 92 |
+
lightbox.classList.add('active');
|
| 93 |
+
document.body.style.overflow = 'hidden';
|
| 94 |
+
}
|
| 95 |
+
|
| 96 |
+
function closeLightbox() {
|
| 97 |
+
lightbox.classList.remove('active');
|
| 98 |
+
document.body.style.overflow = '';
|
| 99 |
+
}
|
| 100 |
+
|
| 101 |
+
cards.forEach((card) => {
|
| 102 |
+
card.addEventListener('click', () => {
|
| 103 |
+
const img = card.querySelector('.card__image');
|
| 104 |
+
const title = card.querySelector('.card__title').textContent;
|
| 105 |
+
const tagline = card.querySelector('.card__tagline').textContent;
|
| 106 |
+
openLightbox(img.src, title, tagline);
|
| 107 |
+
});
|
| 108 |
+
});
|
| 109 |
+
|
| 110 |
+
lightboxClose.addEventListener('click', (e) => {
|
| 111 |
+
e.stopPropagation();
|
| 112 |
+
closeLightbox();
|
| 113 |
+
});
|
| 114 |
+
|
| 115 |
+
lightbox.addEventListener('click', (e) => {
|
| 116 |
+
if (e.target === lightbox) closeLightbox();
|
| 117 |
+
});
|
| 118 |
+
|
| 119 |
+
document.addEventListener('keydown', (e) => {
|
| 120 |
+
if (e.key === 'Escape') closeLightbox();
|
| 121 |
+
});
|
| 122 |
+
});
|
steampunk-surgery-gone-wrong.webp
ADDED
|
Git LFS Details
|
style.css
CHANGED
|
@@ -1,28 +1,661 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
body {
|
| 2 |
-
|
| 3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
}
|
| 5 |
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
}
|
| 10 |
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
margin-bottom: 10px;
|
| 15 |
-
margin-top: 5px;
|
| 16 |
}
|
| 17 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
.card {
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
}
|
| 25 |
|
| 26 |
-
|
| 27 |
-
|
| 28 |
}
|
|
|
|
| 1 |
+
/* ===== CXART Gallery — Premium Dark Radiology Aesthetic ===== */
|
| 2 |
+
|
| 3 |
+
@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;700&family=Playfair+Display:ital,wght@0,700;0,800;1,700&display=swap');
|
| 4 |
+
|
| 5 |
+
/* ---------- Design Tokens ---------- */
|
| 6 |
+
:root {
|
| 7 |
+
--bg-void: #030308;
|
| 8 |
+
--bg-primary: #06070e;
|
| 9 |
+
--bg-secondary: #0a0c18;
|
| 10 |
+
--bg-card: rgba(12, 14, 28, 0.7);
|
| 11 |
+
--bg-card-solid: #0c0e1c;
|
| 12 |
+
--bg-card-hover: rgba(18, 20, 40, 0.8);
|
| 13 |
+
|
| 14 |
+
--border-subtle: rgba(139, 92, 246, 0.08);
|
| 15 |
+
--border-mid: rgba(139, 92, 246, 0.18);
|
| 16 |
+
--border-glow: rgba(139, 92, 246, 0.4);
|
| 17 |
+
|
| 18 |
+
--text-primary: #f0eef8;
|
| 19 |
+
--text-secondary: #a09cb8;
|
| 20 |
+
--text-muted: #5c577a;
|
| 21 |
+
--text-accent: #c4b5fd;
|
| 22 |
+
|
| 23 |
+
--accent-purple: #8b5cf6;
|
| 24 |
+
--accent-violet: #a78bfa;
|
| 25 |
+
--accent-cyan: #22d3ee;
|
| 26 |
+
--accent-pink: #f472b6;
|
| 27 |
+
--accent-emerald: #34d399;
|
| 28 |
+
|
| 29 |
+
--gradient-title: linear-gradient(135deg, #f0eef8 0%, #c4b5fd 40%, #8b5cf6 65%, #22d3ee 100%);
|
| 30 |
+
--gradient-card-border: linear-gradient(145deg, rgba(139, 92, 246, 0.25), rgba(34, 211, 238, 0.1), rgba(139, 92, 246, 0.05));
|
| 31 |
+
--gradient-glow-bg: radial-gradient(ellipse at 50% 0%, rgba(139, 92, 246, 0.08) 0%, transparent 70%);
|
| 32 |
+
|
| 33 |
+
--shadow-card: 0 4px 24px rgba(0, 0, 0, 0.3), 0 1px 3px rgba(0, 0, 0, 0.2);
|
| 34 |
+
--shadow-card-hover: 0 12px 48px rgba(139, 92, 246, 0.12), 0 4px 16px rgba(0, 0, 0, 0.4);
|
| 35 |
+
--shadow-lightbox: 0 0 80px rgba(139, 92, 246, 0.15), 0 30px 100px rgba(0, 0, 0, 0.6);
|
| 36 |
+
|
| 37 |
+
--radius-sm: 8px;
|
| 38 |
+
--radius-md: 14px;
|
| 39 |
+
--radius-lg: 22px;
|
| 40 |
+
--radius-xl: 28px;
|
| 41 |
+
|
| 42 |
+
--font-display: 'Playfair Display', Georgia, serif;
|
| 43 |
+
--font-sans: 'Space Grotesk', -apple-system, BlinkMacSystemFont, sans-serif;
|
| 44 |
+
--font-mono: 'JetBrains Mono', 'Fira Code', monospace;
|
| 45 |
+
|
| 46 |
+
--ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
|
| 47 |
+
--ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
|
| 48 |
+
--transition-fast: 0.2s var(--ease-out-expo);
|
| 49 |
+
--transition-smooth: 0.45s var(--ease-out-expo);
|
| 50 |
+
--transition-spring: 0.55s var(--ease-spring);
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
/* ---------- Reset & Base ---------- */
|
| 54 |
+
*, *::before, *::after {
|
| 55 |
+
margin: 0;
|
| 56 |
+
padding: 0;
|
| 57 |
+
box-sizing: border-box;
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
html {
|
| 61 |
+
scroll-behavior: smooth;
|
| 62 |
+
font-size: 16px;
|
| 63 |
+
}
|
| 64 |
+
|
| 65 |
body {
|
| 66 |
+
font-family: var(--font-sans);
|
| 67 |
+
background: var(--bg-void);
|
| 68 |
+
color: var(--text-primary);
|
| 69 |
+
min-height: 100vh;
|
| 70 |
+
overflow-x: hidden;
|
| 71 |
+
-webkit-font-smoothing: antialiased;
|
| 72 |
+
-moz-osx-font-smoothing: grayscale;
|
| 73 |
+
position: relative;
|
| 74 |
+
}
|
| 75 |
+
|
| 76 |
+
/* ---------- Particle Canvas ---------- */
|
| 77 |
+
#particles {
|
| 78 |
+
position: fixed;
|
| 79 |
+
inset: 0;
|
| 80 |
+
z-index: 0;
|
| 81 |
+
pointer-events: none;
|
| 82 |
+
}
|
| 83 |
+
|
| 84 |
+
/* ---------- Ambient Background Effects ---------- */
|
| 85 |
+
.ambient-bg {
|
| 86 |
+
position: fixed;
|
| 87 |
+
inset: 0;
|
| 88 |
+
z-index: 0;
|
| 89 |
+
pointer-events: none;
|
| 90 |
+
overflow: hidden;
|
| 91 |
+
}
|
| 92 |
+
|
| 93 |
+
.ambient-bg__orb {
|
| 94 |
+
position: absolute;
|
| 95 |
+
border-radius: 50%;
|
| 96 |
+
filter: blur(120px);
|
| 97 |
+
opacity: 0.5;
|
| 98 |
+
animation: orb-drift 20s ease-in-out infinite alternate;
|
| 99 |
+
}
|
| 100 |
+
|
| 101 |
+
.ambient-bg__orb--1 {
|
| 102 |
+
width: 600px; height: 600px;
|
| 103 |
+
background: rgba(139, 92, 246, 0.07);
|
| 104 |
+
top: -10%; left: 15%;
|
| 105 |
+
animation-duration: 25s;
|
| 106 |
+
}
|
| 107 |
+
|
| 108 |
+
.ambient-bg__orb--2 {
|
| 109 |
+
width: 500px; height: 500px;
|
| 110 |
+
background: rgba(34, 211, 238, 0.04);
|
| 111 |
+
bottom: -15%; right: 10%;
|
| 112 |
+
animation-duration: 30s;
|
| 113 |
+
animation-delay: -10s;
|
| 114 |
+
}
|
| 115 |
+
|
| 116 |
+
.ambient-bg__orb--3 {
|
| 117 |
+
width: 400px; height: 400px;
|
| 118 |
+
background: rgba(244, 114, 182, 0.03);
|
| 119 |
+
top: 40%; left: 60%;
|
| 120 |
+
animation-duration: 22s;
|
| 121 |
+
animation-delay: -5s;
|
| 122 |
+
}
|
| 123 |
+
|
| 124 |
+
@keyframes orb-drift {
|
| 125 |
+
0% { transform: translate(0, 0) scale(1); }
|
| 126 |
+
33% { transform: translate(30px, -20px) scale(1.1); }
|
| 127 |
+
66% { transform: translate(-20px, 30px) scale(0.95); }
|
| 128 |
+
100% { transform: translate(15px, -15px) scale(1.05); }
|
| 129 |
+
}
|
| 130 |
+
|
| 131 |
+
/* ---------- Scanline Overlay ---------- */
|
| 132 |
+
.scanlines {
|
| 133 |
+
position: fixed;
|
| 134 |
+
inset: 0;
|
| 135 |
+
z-index: 9998;
|
| 136 |
+
pointer-events: none;
|
| 137 |
+
background: repeating-linear-gradient(
|
| 138 |
+
0deg,
|
| 139 |
+
transparent,
|
| 140 |
+
transparent 2px,
|
| 141 |
+
rgba(139, 92, 246, 0.012) 2px,
|
| 142 |
+
rgba(139, 92, 246, 0.012) 4px
|
| 143 |
+
);
|
| 144 |
+
}
|
| 145 |
+
|
| 146 |
+
/* ---------- Noise texture overlay ---------- */
|
| 147 |
+
.noise {
|
| 148 |
+
position: fixed;
|
| 149 |
+
inset: 0;
|
| 150 |
+
z-index: 9997;
|
| 151 |
+
pointer-events: none;
|
| 152 |
+
opacity: 0.025;
|
| 153 |
+
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
|
| 154 |
+
background-size: 256px 256px;
|
| 155 |
+
}
|
| 156 |
+
|
| 157 |
+
/* ---------- Content wrapper ---------- */
|
| 158 |
+
.content {
|
| 159 |
+
position: relative;
|
| 160 |
+
z-index: 1;
|
| 161 |
+
}
|
| 162 |
+
|
| 163 |
+
/* ---------- Hero Section ---------- */
|
| 164 |
+
.hero {
|
| 165 |
+
text-align: center;
|
| 166 |
+
padding: 120px 24px 80px;
|
| 167 |
+
position: relative;
|
| 168 |
+
}
|
| 169 |
+
|
| 170 |
+
.hero__badge {
|
| 171 |
+
display: inline-flex;
|
| 172 |
+
align-items: center;
|
| 173 |
+
gap: 10px;
|
| 174 |
+
padding: 8px 20px;
|
| 175 |
+
border-radius: 100px;
|
| 176 |
+
background: rgba(139, 92, 246, 0.06);
|
| 177 |
+
border: 1px solid rgba(139, 92, 246, 0.15);
|
| 178 |
+
color: var(--accent-violet);
|
| 179 |
+
font-family: var(--font-mono);
|
| 180 |
+
font-size: 0.7rem;
|
| 181 |
+
font-weight: 500;
|
| 182 |
+
letter-spacing: 0.15em;
|
| 183 |
+
text-transform: uppercase;
|
| 184 |
+
margin-bottom: 36px;
|
| 185 |
+
backdrop-filter: blur(10px);
|
| 186 |
+
}
|
| 187 |
+
|
| 188 |
+
.hero__badge::before {
|
| 189 |
+
content: '';
|
| 190 |
+
width: 7px;
|
| 191 |
+
height: 7px;
|
| 192 |
+
border-radius: 50%;
|
| 193 |
+
background: var(--accent-emerald);
|
| 194 |
+
box-shadow: 0 0 8px rgba(52, 211, 153, 0.6);
|
| 195 |
+
animation: pulse-dot 2s ease-in-out infinite;
|
| 196 |
+
}
|
| 197 |
+
|
| 198 |
+
@keyframes pulse-dot {
|
| 199 |
+
0%, 100% { opacity: 1; transform: scale(1); box-shadow: 0 0 8px rgba(52, 211, 153, 0.6); }
|
| 200 |
+
50% { opacity: 0.5; transform: scale(0.7); box-shadow: 0 0 4px rgba(52, 211, 153, 0.3); }
|
| 201 |
}
|
| 202 |
|
| 203 |
+
.hero__title {
|
| 204 |
+
font-family: var(--font-display);
|
| 205 |
+
font-size: clamp(3.5rem, 9vw, 7rem);
|
| 206 |
+
font-weight: 800;
|
| 207 |
+
letter-spacing: -0.02em;
|
| 208 |
+
line-height: 1;
|
| 209 |
+
margin-bottom: 28px;
|
| 210 |
+
background: var(--gradient-title);
|
| 211 |
+
-webkit-background-clip: text;
|
| 212 |
+
background-clip: text;
|
| 213 |
+
-webkit-text-fill-color: transparent;
|
| 214 |
+
animation: title-shimmer 6s ease-in-out infinite alternate;
|
| 215 |
+
background-size: 200% 200%;
|
| 216 |
}
|
| 217 |
|
| 218 |
+
@keyframes title-shimmer {
|
| 219 |
+
0% { background-position: 0% 50%; }
|
| 220 |
+
100% { background-position: 100% 50%; }
|
|
|
|
|
|
|
| 221 |
}
|
| 222 |
|
| 223 |
+
.hero__subtitle {
|
| 224 |
+
font-size: clamp(1.05rem, 2.5vw, 1.3rem);
|
| 225 |
+
color: var(--text-secondary);
|
| 226 |
+
max-width: 600px;
|
| 227 |
+
margin: 0 auto 16px;
|
| 228 |
+
line-height: 1.75;
|
| 229 |
+
font-weight: 300;
|
| 230 |
+
letter-spacing: 0.01em;
|
| 231 |
+
}
|
| 232 |
+
|
| 233 |
+
.hero__divider {
|
| 234 |
+
width: 60px;
|
| 235 |
+
height: 2px;
|
| 236 |
+
background: linear-gradient(90deg, transparent, var(--accent-purple), transparent);
|
| 237 |
+
margin: 28px auto;
|
| 238 |
+
border: none;
|
| 239 |
+
}
|
| 240 |
+
|
| 241 |
+
.hero__meta {
|
| 242 |
+
font-family: var(--font-mono);
|
| 243 |
+
font-size: 0.78rem;
|
| 244 |
+
color: var(--text-muted);
|
| 245 |
+
letter-spacing: 0.05em;
|
| 246 |
+
}
|
| 247 |
+
|
| 248 |
+
.hero__meta span {
|
| 249 |
+
color: var(--accent-violet);
|
| 250 |
+
font-weight: 600;
|
| 251 |
+
}
|
| 252 |
+
|
| 253 |
+
/* ---------- Gallery Grid ---------- */
|
| 254 |
+
.gallery {
|
| 255 |
+
max-width: 1320px;
|
| 256 |
+
margin: 0 auto;
|
| 257 |
+
padding: 0 28px 120px;
|
| 258 |
+
display: grid;
|
| 259 |
+
grid-template-columns: repeat(3, 1fr);
|
| 260 |
+
gap: 24px;
|
| 261 |
+
}
|
| 262 |
+
|
| 263 |
+
/* ---------- Card ---------- */
|
| 264 |
.card {
|
| 265 |
+
position: relative;
|
| 266 |
+
background: var(--bg-card);
|
| 267 |
+
border-radius: var(--radius-lg);
|
| 268 |
+
overflow: hidden;
|
| 269 |
+
cursor: pointer;
|
| 270 |
+
transition: transform var(--transition-smooth),
|
| 271 |
+
box-shadow var(--transition-smooth);
|
| 272 |
+
backdrop-filter: blur(12px);
|
| 273 |
+
box-shadow: var(--shadow-card);
|
| 274 |
+
|
| 275 |
+
/* Animated gradient border */
|
| 276 |
+
border: 1px solid transparent;
|
| 277 |
+
background-clip: padding-box;
|
| 278 |
+
|
| 279 |
+
/* Scroll animation initial state */
|
| 280 |
+
opacity: 0;
|
| 281 |
+
transform: translateY(50px) scale(0.97);
|
| 282 |
+
}
|
| 283 |
+
|
| 284 |
+
/* Animated border via pseudo-element */
|
| 285 |
+
.card::before {
|
| 286 |
+
content: '';
|
| 287 |
+
position: absolute;
|
| 288 |
+
inset: -1px;
|
| 289 |
+
border-radius: var(--radius-lg);
|
| 290 |
+
padding: 1px;
|
| 291 |
+
background: linear-gradient(
|
| 292 |
+
160deg,
|
| 293 |
+
rgba(139, 92, 246, 0.2),
|
| 294 |
+
rgba(34, 211, 238, 0.08),
|
| 295 |
+
rgba(139, 92, 246, 0.05),
|
| 296 |
+
transparent 60%
|
| 297 |
+
);
|
| 298 |
+
-webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
|
| 299 |
+
mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
|
| 300 |
+
-webkit-mask-composite: xor;
|
| 301 |
+
mask-composite: exclude;
|
| 302 |
+
z-index: 1;
|
| 303 |
+
pointer-events: none;
|
| 304 |
+
transition: opacity var(--transition-smooth);
|
| 305 |
+
}
|
| 306 |
+
|
| 307 |
+
/* Top glow line */
|
| 308 |
+
.card::after {
|
| 309 |
+
content: '';
|
| 310 |
+
position: absolute;
|
| 311 |
+
top: 0;
|
| 312 |
+
left: 20%;
|
| 313 |
+
right: 20%;
|
| 314 |
+
height: 1px;
|
| 315 |
+
background: linear-gradient(90deg, transparent, rgba(139, 92, 246, 0.4), transparent);
|
| 316 |
+
z-index: 2;
|
| 317 |
+
pointer-events: none;
|
| 318 |
+
opacity: 0;
|
| 319 |
+
transition: opacity var(--transition-smooth);
|
| 320 |
+
}
|
| 321 |
+
|
| 322 |
+
.card.visible {
|
| 323 |
+
opacity: 1;
|
| 324 |
+
transform: translateY(0) scale(1);
|
| 325 |
+
transition: opacity 0.7s var(--ease-out-expo),
|
| 326 |
+
transform 0.7s var(--ease-out-expo),
|
| 327 |
+
box-shadow var(--transition-smooth);
|
| 328 |
+
}
|
| 329 |
+
|
| 330 |
+
.card:hover {
|
| 331 |
+
transform: translateY(-8px) scale(1.01);
|
| 332 |
+
box-shadow: var(--shadow-card-hover);
|
| 333 |
+
}
|
| 334 |
+
|
| 335 |
+
.card.visible:hover {
|
| 336 |
+
transform: translateY(-8px) scale(1.01);
|
| 337 |
+
}
|
| 338 |
+
|
| 339 |
+
.card:hover::before {
|
| 340 |
+
opacity: 1;
|
| 341 |
+
background: linear-gradient(
|
| 342 |
+
160deg,
|
| 343 |
+
rgba(139, 92, 246, 0.4),
|
| 344 |
+
rgba(34, 211, 238, 0.2),
|
| 345 |
+
rgba(139, 92, 246, 0.1),
|
| 346 |
+
transparent 60%
|
| 347 |
+
);
|
| 348 |
+
}
|
| 349 |
+
|
| 350 |
+
.card:hover::after {
|
| 351 |
+
opacity: 1;
|
| 352 |
+
}
|
| 353 |
+
|
| 354 |
+
/* Card Number Badge */
|
| 355 |
+
.card__number {
|
| 356 |
+
position: absolute;
|
| 357 |
+
top: 16px;
|
| 358 |
+
left: 16px;
|
| 359 |
+
z-index: 4;
|
| 360 |
+
width: 36px;
|
| 361 |
+
height: 36px;
|
| 362 |
+
display: flex;
|
| 363 |
+
align-items: center;
|
| 364 |
+
justify-content: center;
|
| 365 |
+
border-radius: 10px;
|
| 366 |
+
background: rgba(6, 7, 14, 0.7);
|
| 367 |
+
backdrop-filter: blur(12px);
|
| 368 |
+
border: 1px solid rgba(139, 92, 246, 0.25);
|
| 369 |
+
font-family: var(--font-mono);
|
| 370 |
+
font-size: 0.72rem;
|
| 371 |
+
font-weight: 700;
|
| 372 |
+
color: var(--accent-violet);
|
| 373 |
+
letter-spacing: 0.02em;
|
| 374 |
+
}
|
| 375 |
+
|
| 376 |
+
/* Image Container */
|
| 377 |
+
.card__image-wrap {
|
| 378 |
+
position: relative;
|
| 379 |
+
width: 100%;
|
| 380 |
+
aspect-ratio: 1 / 1;
|
| 381 |
+
overflow: hidden;
|
| 382 |
+
background: var(--bg-secondary);
|
| 383 |
+
}
|
| 384 |
+
|
| 385 |
+
.card__image-wrap::after {
|
| 386 |
+
content: '';
|
| 387 |
+
position: absolute;
|
| 388 |
+
bottom: 0;
|
| 389 |
+
left: 0;
|
| 390 |
+
right: 0;
|
| 391 |
+
height: 60%;
|
| 392 |
+
background: linear-gradient(to top, var(--bg-card-solid) 0%, transparent 100%);
|
| 393 |
+
pointer-events: none;
|
| 394 |
+
z-index: 2;
|
| 395 |
+
}
|
| 396 |
+
|
| 397 |
+
.card__image {
|
| 398 |
+
width: 100%;
|
| 399 |
+
height: 100%;
|
| 400 |
+
object-fit: cover;
|
| 401 |
+
transition: transform 0.6s var(--ease-out-expo), filter 0.6s var(--ease-out-expo);
|
| 402 |
+
filter: brightness(0.85) contrast(1.08) saturate(0.9);
|
| 403 |
+
}
|
| 404 |
+
|
| 405 |
+
.card:hover .card__image {
|
| 406 |
+
transform: scale(1.1);
|
| 407 |
+
filter: brightness(0.95) contrast(1.12) saturate(1);
|
| 408 |
+
}
|
| 409 |
+
|
| 410 |
+
/* Card Body */
|
| 411 |
+
.card__body {
|
| 412 |
+
padding: 24px 26px 30px;
|
| 413 |
+
position: relative;
|
| 414 |
+
z-index: 3;
|
| 415 |
+
}
|
| 416 |
+
|
| 417 |
+
.card__title {
|
| 418 |
+
font-family: var(--font-sans);
|
| 419 |
+
font-size: 1.2rem;
|
| 420 |
+
font-weight: 600;
|
| 421 |
+
line-height: 1.3;
|
| 422 |
+
margin-bottom: 8px;
|
| 423 |
+
color: var(--text-primary);
|
| 424 |
+
letter-spacing: -0.01em;
|
| 425 |
+
}
|
| 426 |
+
|
| 427 |
+
.card__tagline {
|
| 428 |
+
font-family: var(--font-display);
|
| 429 |
+
font-style: italic;
|
| 430 |
+
font-size: 0.88rem;
|
| 431 |
+
color: var(--accent-violet);
|
| 432 |
+
margin-bottom: 14px;
|
| 433 |
+
line-height: 1.55;
|
| 434 |
+
font-weight: 400;
|
| 435 |
+
opacity: 0.85;
|
| 436 |
+
}
|
| 437 |
+
|
| 438 |
+
.card__description {
|
| 439 |
+
font-size: 0.84rem;
|
| 440 |
+
color: var(--text-secondary);
|
| 441 |
+
line-height: 1.7;
|
| 442 |
+
font-weight: 300;
|
| 443 |
+
}
|
| 444 |
+
|
| 445 |
+
.card__tag {
|
| 446 |
+
display: inline-flex;
|
| 447 |
+
align-items: center;
|
| 448 |
+
gap: 6px;
|
| 449 |
+
margin-top: 18px;
|
| 450 |
+
padding: 5px 14px;
|
| 451 |
+
border-radius: 100px;
|
| 452 |
+
background: rgba(139, 92, 246, 0.06);
|
| 453 |
+
border: 1px solid rgba(139, 92, 246, 0.12);
|
| 454 |
+
font-family: var(--font-mono);
|
| 455 |
+
font-size: 0.65rem;
|
| 456 |
+
color: var(--text-muted);
|
| 457 |
+
letter-spacing: 0.08em;
|
| 458 |
+
text-transform: uppercase;
|
| 459 |
+
transition: border-color var(--transition-fast), color var(--transition-fast);
|
| 460 |
+
}
|
| 461 |
+
|
| 462 |
+
.card:hover .card__tag {
|
| 463 |
+
border-color: rgba(139, 92, 246, 0.25);
|
| 464 |
+
color: var(--accent-violet);
|
| 465 |
+
}
|
| 466 |
+
|
| 467 |
+
.card__tag::before {
|
| 468 |
+
content: '';
|
| 469 |
+
width: 4px;
|
| 470 |
+
height: 4px;
|
| 471 |
+
border-radius: 50%;
|
| 472 |
+
background: var(--accent-purple);
|
| 473 |
+
opacity: 0.5;
|
| 474 |
+
}
|
| 475 |
+
|
| 476 |
+
/* ---------- Lightbox ---------- */
|
| 477 |
+
.lightbox {
|
| 478 |
+
position: fixed;
|
| 479 |
+
inset: 0;
|
| 480 |
+
z-index: 10000;
|
| 481 |
+
display: flex;
|
| 482 |
+
align-items: center;
|
| 483 |
+
justify-content: center;
|
| 484 |
+
background: rgba(3, 3, 8, 0.88);
|
| 485 |
+
backdrop-filter: blur(30px) saturate(0.5);
|
| 486 |
+
opacity: 0;
|
| 487 |
+
visibility: hidden;
|
| 488 |
+
transition: opacity var(--transition-smooth), visibility var(--transition-smooth);
|
| 489 |
+
}
|
| 490 |
+
|
| 491 |
+
.lightbox.active {
|
| 492 |
+
opacity: 1;
|
| 493 |
+
visibility: visible;
|
| 494 |
+
}
|
| 495 |
+
|
| 496 |
+
.lightbox__inner {
|
| 497 |
+
position: relative;
|
| 498 |
+
max-width: 80vw;
|
| 499 |
+
max-height: 85vh;
|
| 500 |
+
transform: scale(0.92) translateY(20px);
|
| 501 |
+
transition: transform var(--transition-spring);
|
| 502 |
+
}
|
| 503 |
+
|
| 504 |
+
.lightbox.active .lightbox__inner {
|
| 505 |
+
transform: scale(1) translateY(0);
|
| 506 |
+
}
|
| 507 |
+
|
| 508 |
+
.lightbox__image {
|
| 509 |
+
max-width: 100%;
|
| 510 |
+
max-height: 78vh;
|
| 511 |
+
border-radius: var(--radius-xl);
|
| 512 |
+
box-shadow: var(--shadow-lightbox);
|
| 513 |
+
border: 1px solid rgba(139, 92, 246, 0.2);
|
| 514 |
+
}
|
| 515 |
+
|
| 516 |
+
.lightbox__caption {
|
| 517 |
+
text-align: center;
|
| 518 |
+
margin-top: 24px;
|
| 519 |
+
}
|
| 520 |
+
|
| 521 |
+
.lightbox__caption-title {
|
| 522 |
+
font-family: var(--font-sans);
|
| 523 |
+
font-size: 1.35rem;
|
| 524 |
+
font-weight: 600;
|
| 525 |
+
color: var(--text-primary);
|
| 526 |
+
margin-bottom: 6px;
|
| 527 |
+
letter-spacing: -0.01em;
|
| 528 |
+
}
|
| 529 |
+
|
| 530 |
+
.lightbox__caption-tagline {
|
| 531 |
+
font-family: var(--font-display);
|
| 532 |
+
font-style: italic;
|
| 533 |
+
font-size: 1rem;
|
| 534 |
+
color: var(--accent-violet);
|
| 535 |
+
opacity: 0.8;
|
| 536 |
+
}
|
| 537 |
+
|
| 538 |
+
.lightbox__close {
|
| 539 |
+
position: absolute;
|
| 540 |
+
top: -52px;
|
| 541 |
+
right: 0;
|
| 542 |
+
width: 42px;
|
| 543 |
+
height: 42px;
|
| 544 |
+
border: 1px solid rgba(139, 92, 246, 0.2);
|
| 545 |
+
background: rgba(139, 92, 246, 0.08);
|
| 546 |
+
backdrop-filter: blur(10px);
|
| 547 |
+
border-radius: 50%;
|
| 548 |
+
color: var(--text-primary);
|
| 549 |
+
font-size: 1.1rem;
|
| 550 |
+
cursor: pointer;
|
| 551 |
+
display: flex;
|
| 552 |
+
align-items: center;
|
| 553 |
+
justify-content: center;
|
| 554 |
+
transition: background var(--transition-fast), border-color var(--transition-fast), transform var(--transition-fast);
|
| 555 |
+
}
|
| 556 |
+
|
| 557 |
+
.lightbox__close:hover {
|
| 558 |
+
background: rgba(139, 92, 246, 0.2);
|
| 559 |
+
border-color: rgba(139, 92, 246, 0.4);
|
| 560 |
+
transform: rotate(90deg);
|
| 561 |
+
}
|
| 562 |
+
|
| 563 |
+
/* ---------- Footer ---------- */
|
| 564 |
+
.footer {
|
| 565 |
+
text-align: center;
|
| 566 |
+
padding: 48px 24px 72px;
|
| 567 |
+
position: relative;
|
| 568 |
+
}
|
| 569 |
+
|
| 570 |
+
.footer::before {
|
| 571 |
+
content: '';
|
| 572 |
+
position: absolute;
|
| 573 |
+
top: 0;
|
| 574 |
+
left: 10%;
|
| 575 |
+
right: 10%;
|
| 576 |
+
height: 1px;
|
| 577 |
+
background: linear-gradient(90deg, transparent, rgba(139, 92, 246, 0.15), transparent);
|
| 578 |
+
}
|
| 579 |
+
|
| 580 |
+
.footer__text {
|
| 581 |
+
font-family: var(--font-mono);
|
| 582 |
+
font-size: 0.75rem;
|
| 583 |
+
color: var(--text-muted);
|
| 584 |
+
line-height: 2;
|
| 585 |
+
letter-spacing: 0.02em;
|
| 586 |
+
}
|
| 587 |
+
|
| 588 |
+
.footer__text a {
|
| 589 |
+
color: var(--accent-violet);
|
| 590 |
+
text-decoration: none;
|
| 591 |
+
border-bottom: 1px solid rgba(139, 92, 246, 0.2);
|
| 592 |
+
padding-bottom: 1px;
|
| 593 |
+
transition: color var(--transition-fast), border-color var(--transition-fast);
|
| 594 |
+
}
|
| 595 |
+
|
| 596 |
+
.footer__text a:hover {
|
| 597 |
+
color: var(--accent-cyan);
|
| 598 |
+
border-color: rgba(34, 211, 238, 0.3);
|
| 599 |
+
}
|
| 600 |
+
|
| 601 |
+
/* ---------- Responsive ---------- */
|
| 602 |
+
@media (max-width: 1080px) {
|
| 603 |
+
.gallery {
|
| 604 |
+
grid-template-columns: repeat(2, 1fr);
|
| 605 |
+
gap: 20px;
|
| 606 |
+
}
|
| 607 |
+
}
|
| 608 |
+
|
| 609 |
+
@media (max-width: 640px) {
|
| 610 |
+
.gallery {
|
| 611 |
+
grid-template-columns: 1fr;
|
| 612 |
+
gap: 20px;
|
| 613 |
+
padding: 0 16px 80px;
|
| 614 |
+
}
|
| 615 |
+
.hero {
|
| 616 |
+
padding: 80px 16px 48px;
|
| 617 |
+
}
|
| 618 |
+
.card__body {
|
| 619 |
+
padding: 20px 20px 26px;
|
| 620 |
+
}
|
| 621 |
+
.card__title {
|
| 622 |
+
font-size: 1.1rem;
|
| 623 |
+
}
|
| 624 |
+
}
|
| 625 |
+
|
| 626 |
+
/* ---------- Stagger animation delays ---------- */
|
| 627 |
+
.card:nth-child(1) { transition-delay: 0.0s; }
|
| 628 |
+
.card:nth-child(2) { transition-delay: 0.08s; }
|
| 629 |
+
.card:nth-child(3) { transition-delay: 0.16s; }
|
| 630 |
+
.card:nth-child(4) { transition-delay: 0.24s; }
|
| 631 |
+
.card:nth-child(5) { transition-delay: 0.32s; }
|
| 632 |
+
.card:nth-child(6) { transition-delay: 0.40s; }
|
| 633 |
+
|
| 634 |
+
/* Clear delay once visible to avoid hover lag */
|
| 635 |
+
.card.visible {
|
| 636 |
+
transition-delay: 0s;
|
| 637 |
+
}
|
| 638 |
+
|
| 639 |
+
/* ---------- Selection ---------- */
|
| 640 |
+
::selection {
|
| 641 |
+
background: rgba(139, 92, 246, 0.3);
|
| 642 |
+
color: var(--text-primary);
|
| 643 |
+
}
|
| 644 |
+
|
| 645 |
+
/* ---------- Scrollbar ---------- */
|
| 646 |
+
::-webkit-scrollbar {
|
| 647 |
+
width: 6px;
|
| 648 |
+
}
|
| 649 |
+
|
| 650 |
+
::-webkit-scrollbar-track {
|
| 651 |
+
background: var(--bg-void);
|
| 652 |
+
}
|
| 653 |
+
|
| 654 |
+
::-webkit-scrollbar-thumb {
|
| 655 |
+
background: rgba(139, 92, 246, 0.2);
|
| 656 |
+
border-radius: 3px;
|
| 657 |
}
|
| 658 |
|
| 659 |
+
::-webkit-scrollbar-thumb:hover {
|
| 660 |
+
background: rgba(139, 92, 246, 0.35);
|
| 661 |
}
|
the-ribcage-plays-beethoven.webp
ADDED
|
Git LFS Details
|
thorax-civil-war.webp
ADDED
|
Git LFS Details
|
you-are-engraved-in-my-heart.webp
ADDED
|
Git LFS Details
|
you-are-my-heart-you-are-my-soul.webp
ADDED
|
Git LFS Details
|