Skip to content

Commit 5fe06d9

Browse files
authored
Merge pull request #1 from dovvnloading/codex/enhance-image-expansion-functionality
Enhance landing page visuals and add expandable screenshot viewer
2 parents 47ea659 + 3d968cf commit 5fe06d9

1 file changed

Lines changed: 187 additions & 9 deletions

File tree

index.html

Lines changed: 187 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
font-family: 'Inter', sans-serif;
4747
line-height: 1.6;
4848
overflow-x: hidden;
49+
background-image: radial-gradient(circle at 20% -10%, rgba(113, 84, 230, 0.14), transparent 40%), radial-gradient(circle at 90% 10%, rgba(201, 86, 30, 0.12), transparent 35%);
4950
}
5051

5152
h1, h2, h3, h4 {
@@ -143,6 +144,15 @@
143144
text-align: center;
144145
position: relative;
145146
}
147+
.hero::before {
148+
content: "";
149+
position: absolute;
150+
inset: 80px 18% -5px;
151+
background: linear-gradient(140deg, rgba(113, 84, 230, 0.22), rgba(201, 86, 30, 0.1));
152+
filter: blur(90px);
153+
pointer-events: none;
154+
z-index: -1;
155+
}
146156

147157
.hero h1 {
148158
font-size: 4rem;
@@ -225,7 +235,19 @@
225235
gap: 20px;
226236
margin-top: 40px;
227237
}
228-
.media-item { flex: 1; border-radius: var(--radius-md); overflow: hidden; border: 1px solid var(--border-color); }
238+
.media-item {
239+
flex: 1;
240+
border-radius: var(--radius-md);
241+
overflow: hidden;
242+
border: 1px solid var(--border-color);
243+
background: linear-gradient(to bottom, rgba(255,255,255,0.02), transparent);
244+
transition: transform 0.35s ease, box-shadow 0.35s ease, border-color 0.35s ease;
245+
}
246+
.media-item:hover {
247+
transform: translateY(-5px);
248+
border-color: var(--accent-purple);
249+
box-shadow: var(--card-shadow);
250+
}
229251
.media-item img { width: 100%; display: block; }
230252
.media-caption { text-align: center; padding: 10px; background: var(--bg-secondary); font-weight: 600; }
231253

@@ -260,7 +282,102 @@
260282
border: 1px solid var(--border-color);
261283
transition: 0.4s;
262284
}
263-
.screenshot-grid img:hover { opacity: 0.8; }
285+
286+
.zoomable {
287+
position: relative;
288+
cursor: zoom-in;
289+
}
290+
.zoomable::after {
291+
content: "\f00e";
292+
font-family: "Font Awesome 6 Free";
293+
font-weight: 900;
294+
position: absolute;
295+
bottom: 14px;
296+
right: 14px;
297+
width: 34px;
298+
height: 34px;
299+
border-radius: 999px;
300+
display: grid;
301+
place-items: center;
302+
background: rgba(31, 31, 31, 0.85);
303+
color: white;
304+
border: 1px solid rgba(255,255,255,0.12);
305+
opacity: 0;
306+
transform: translateY(8px);
307+
transition: 0.25s ease;
308+
}
309+
310+
.zoomable:hover {
311+
transform: translateY(-3px);
312+
border-color: var(--accent-purple);
313+
box-shadow: 0 14px 34px rgba(0,0,0,0.4);
314+
}
315+
.zoomable:hover::after,
316+
.zoomable:focus-visible::after {
317+
opacity: 1;
318+
transform: translateY(0);
319+
}
320+
321+
.img-modal {
322+
position: fixed;
323+
inset: 0;
324+
display: grid;
325+
place-items: center;
326+
background: rgba(0,0,0,0.86);
327+
backdrop-filter: blur(6px);
328+
padding: 30px;
329+
z-index: 999;
330+
opacity: 0;
331+
pointer-events: none;
332+
transition: opacity 0.25s ease;
333+
}
334+
.img-modal.open {
335+
opacity: 1;
336+
pointer-events: all;
337+
}
338+
.img-modal figure {
339+
width: min(1200px, 95vw);
340+
margin: 0;
341+
}
342+
.img-modal img {
343+
width: 100%;
344+
max-height: 80vh;
345+
object-fit: contain;
346+
border-radius: var(--radius-md);
347+
border: 1px solid rgba(255,255,255,0.25);
348+
box-shadow: 0 30px 50px rgba(0,0,0,0.5);
349+
background: #181818;
350+
}
351+
.img-modal figcaption {
352+
margin-top: 14px;
353+
text-align: center;
354+
color: #e8e8e8;
355+
}
356+
.img-modal-close {
357+
position: absolute;
358+
top: 18px;
359+
right: 18px;
360+
width: 44px;
361+
height: 44px;
362+
border-radius: 999px;
363+
border: 1px solid rgba(255,255,255,0.24);
364+
background: rgba(255,255,255,0.08);
365+
color: white;
366+
font-size: 1.1rem;
367+
cursor: pointer;
368+
}
369+
370+
.section-title {
371+
text-align: center;
372+
margin-bottom: 30px;
373+
letter-spacing: 0.2px;
374+
}
375+
.section-title small {
376+
display: block;
377+
color: #9ea39b;
378+
font-weight: 500;
379+
margin-top: 8px;
380+
}
264381

265382
/* Footer */
266383
footer {
@@ -279,6 +396,7 @@
279396
.screenshot-grid { grid-template-columns: 1fr; }
280397
.arch-flow { flex-direction: column; }
281398
.arch-arrow { transform: rotate(90deg); margin: 10px 0; }
399+
.img-modal { padding: 14px; }
282400
}
283401
</style>
284402
</head>
@@ -329,15 +447,15 @@ <h1>Local Intelligence. <span class="gradient-text">Unleashed.</span></h1>
329447

330448
<!-- Theme Showcase -->
331449
<section class="container">
332-
<h2 style="text-align: center; margin-bottom: 30px;">Seamless in Light or Dark</h2>
450+
<h2 class="section-title">Seamless in Light or Dark<small>Click any image to inspect the UI in full detail.</small></h2>
333451
<div class="media-comparison">
334452
<div class="media-item">
335453
<div class="media-caption text-purple">Dark Mode</div>
336-
<img src="https://github.com/user-attachments/assets/96d509e9-d15b-4b41-ac0b-bd03459c6cc8" alt="Dark Mode Interface">
454+
<img class="zoomable" src="https://github.com/user-attachments/assets/96d509e9-d15b-4b41-ac0b-bd03459c6cc8" alt="Dark Mode Interface" loading="lazy">
337455
</div>
338456
<div class="media-item">
339457
<div class="media-caption text-orange">Light Mode</div>
340-
<img src="https://github.com/user-attachments/assets/1a3e25a4-aaa2-4bb0-b49f-9970d6697a8c" alt="Light Mode Interface">
458+
<img class="zoomable" src="https://github.com/user-attachments/assets/1a3e25a4-aaa2-4bb0-b49f-9970d6697a8c" alt="Light Mode Interface" loading="lazy">
341459
</div>
342460
</div>
343461
</section>
@@ -455,13 +573,23 @@ <h4><i class="fa-solid fa-server"></i> Data & Models</h4>
455573

456574
<!-- Screenshot Grid -->
457575
<div class="screenshot-grid">
458-
<img src="https://github.com/user-attachments/assets/d5817af5-db5d-4f4b-96c0-7a455e234b49" alt="Cortex Screenshot 1">
459-
<img src="https://github.com/user-attachments/assets/3321e3c7-7f11-4f10-a337-a7c487bbc0fc" alt="Cortex Screenshot 2">
460-
<img src="https://github.com/user-attachments/assets/2f311cc4-1c70-44bf-9a43-51ba0468c514" alt="Cortex Screenshot 3">
461-
<img src="https://github.com/user-attachments/assets/cdb0a1bd-70dd-49cf-bcea-103cdf66fdc2" alt="Cortex Screenshot 4">
576+
<img class="zoomable" src="https://github.com/user-attachments/assets/d5817af5-db5d-4f4b-96c0-7a455e234b49" alt="Cortex Screenshot 1" loading="lazy">
577+
<img class="zoomable" src="https://github.com/user-attachments/assets/3321e3c7-7f11-4f10-a337-a7c487bbc0fc" alt="Cortex Screenshot 2" loading="lazy">
578+
<img class="zoomable" src="https://github.com/user-attachments/assets/2f311cc4-1c70-44bf-9a43-51ba0468c514" alt="Cortex Screenshot 3" loading="lazy">
579+
<img class="zoomable" src="https://github.com/user-attachments/assets/cdb0a1bd-70dd-49cf-bcea-103cdf66fdc2" alt="Cortex Screenshot 4" loading="lazy">
462580
</div>
463581
</section>
464582

583+
<div class="img-modal" id="imgModal" aria-hidden="true" role="dialog" aria-label="Expanded screenshot viewer">
584+
<button class="img-modal-close" id="imgModalClose" aria-label="Close expanded image">
585+
<i class="fa-solid fa-xmark"></i>
586+
</button>
587+
<figure>
588+
<img id="imgModalPreview" src="" alt="">
589+
<figcaption id="imgModalCaption"></figcaption>
590+
</figure>
591+
</div>
592+
465593
<!-- Footer -->
466594
<footer>
467595
<div class="container">
@@ -474,5 +602,55 @@ <h4><i class="fa-solid fa-server"></i> Data & Models</h4>
474602
</div>
475603
</footer>
476604

605+
<script>
606+
const modal = document.getElementById('imgModal');
607+
const modalImage = document.getElementById('imgModalPreview');
608+
const modalCaption = document.getElementById('imgModalCaption');
609+
const modalClose = document.getElementById('imgModalClose');
610+
const zoomableImages = document.querySelectorAll('.zoomable');
611+
612+
const openModal = (image) => {
613+
modalImage.src = image.src;
614+
modalImage.alt = image.alt;
615+
modalCaption.textContent = image.alt;
616+
modal.classList.add('open');
617+
modal.setAttribute('aria-hidden', 'false');
618+
document.body.style.overflow = 'hidden';
619+
modalClose.focus();
620+
};
621+
622+
const closeModal = () => {
623+
modal.classList.remove('open');
624+
modal.setAttribute('aria-hidden', 'true');
625+
modalImage.src = '';
626+
document.body.style.overflow = '';
627+
};
628+
629+
zoomableImages.forEach((image) => {
630+
image.setAttribute('tabindex', '0');
631+
image.setAttribute('role', 'button');
632+
image.setAttribute('aria-label', `Expand image: ${image.alt}`);
633+
634+
image.addEventListener('click', () => openModal(image));
635+
image.addEventListener('keydown', (event) => {
636+
if (event.key === 'Enter' || event.key === ' ') {
637+
event.preventDefault();
638+
openModal(image);
639+
}
640+
});
641+
});
642+
643+
modalClose.addEventListener('click', closeModal);
644+
modal.addEventListener('click', (event) => {
645+
if (event.target === modal) closeModal();
646+
});
647+
648+
document.addEventListener('keydown', (event) => {
649+
if (event.key === 'Escape' && modal.classList.contains('open')) {
650+
closeModal();
651+
}
652+
});
653+
</script>
654+
477655
</body>
478656
</html>

0 commit comments

Comments
 (0)