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 {
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 ;
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
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 {
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