gradientguild commited on
Commit
4d83ec2
·
1 Parent(s): 8361df7

added artworks

Browse files
.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

  • SHA256: ec98b148187536cc735a9fa0450b9e6709594eef6863348842a5512d88ae8b9a
  • Pointer size: 130 Bytes
  • Size of remote file: 33.7 kB
README.md CHANGED
@@ -1,11 +1,14 @@
1
  ---
2
  title: CXART
3
- emoji:
4
- colorFrom: pink
5
- colorTo: gray
6
  sdk: static
7
  pinned: false
8
- license: apache-2.0
9
  ---
10
 
11
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
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
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 &middot; <span>1</span> DiT model &middot; <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

  • SHA256: 9701ab04d5c587d59ed29cf856582d9615cf8c06086d8bcd7cd2ca9f2f525103
  • Pointer size: 130 Bytes
  • Size of remote file: 27.6 kB
style.css CHANGED
@@ -1,28 +1,661 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  }
5
 
6
- h1 {
7
- font-size: 16px;
8
- margin-top: 0;
 
 
 
 
 
 
 
 
 
 
9
  }
10
 
11
- p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
16
  }
17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  }
25
 
26
- .card p:last-child {
27
- margin-bottom: 0;
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

  • SHA256: 18f665192a222390479beaec686f4fced84e32617c0e51a3842fead1cfb9c9f7
  • Pointer size: 130 Bytes
  • Size of remote file: 28.5 kB
thorax-civil-war.webp ADDED

Git LFS Details

  • SHA256: db6c0d4ad3be4b85fe5d5f24682e320b10dfb032b575909d83ff24188dabf579
  • Pointer size: 131 Bytes
  • Size of remote file: 127 kB
you-are-engraved-in-my-heart.webp ADDED

Git LFS Details

  • SHA256: 6fdd4ab5fc5f9c12c4ef7e3b0d92d4f80b4e552d594089917994e2b1d792897e
  • Pointer size: 131 Bytes
  • Size of remote file: 122 kB
you-are-my-heart-you-are-my-soul.webp ADDED

Git LFS Details

  • SHA256: 321a718828b0219dcd2b16f4fb1cb46ab89f6559f0817922ddab130c4dc200a7
  • Pointer size: 130 Bytes
  • Size of remote file: 29.4 kB