7575
7676 section { min-height : 100vh ; padding : 140px 6% 80px ; display : flex; flex-direction : column; justify-content : center; position : relative; }
7777 .container { width : 100% ; max-width : 1100px ; margin : 0 auto; }
78- .grid { display : grid; grid-template-columns : repeat (auto-fit, minmax (280px , 1fr )); gap : 24px ; }
78+
79+ .project-grid { display : grid; grid-template-columns : repeat (2 , 1fr ); gap : 24px ; }
7980
8081 .glass-card { background : var (--glass ); border : 1px solid var (--glass-border ); padding : 50px 40px ; border-radius : var (--radius ); backdrop-filter : blur (10px ); }
8182 .tab-item h4 { color : var (--terminal ); font-size : 1.2rem ; margin-bottom : 12px ; font-family : 'Space Grotesk' ; }
8283 .tab-item p { color : var (--text-sub ); line-height : 1.7 ; font-size : 0.95rem ; }
8384
84- .tech-grid { display : grid; grid-template-columns : repeat (auto-fit, minmax (140px , 1fr )); gap : 24px ; }
85+ .scope-grid { display : grid; grid-template-columns : repeat (4 , 1fr ); gap : 24px ; }
86+
87+ .tech-grid { display : grid; grid-template-columns : repeat (3 , 1fr ); gap : 24px ; }
88+
8589 .tech-item {
8690 background : var (--glass ); border : 1px solid var (--glass-border );
8791 padding : 45px 25px ; border-radius : 28px ; text-align : center;
110114
111115 footer { padding : 80px 0 ; text-align : center; color : var (--text-sub ); font-size : 0.65rem ; letter-spacing : 6px ; text-transform : uppercase; }
112116
117+ @media (max-width : 1024px ) {
118+ .scope-grid { grid-template-columns : repeat (2 , 1fr ); }
119+ .tech-grid { grid-template-columns : repeat (3 , 1fr ); }
120+ .project-grid { grid-template-columns : repeat (2 , 1fr ); }
121+ }
122+
113123 @media (max-width : 768px ) {
114124 .nav-container { padding : 0 4% ; }
115125 .nav-item { font-size : 0.6rem ; gap : 10px ; }
116126 .nav-item : nth-child (4 ) { display : none; }
117127 .glass-card { padding : 30px 20px ; }
128+ .scope-grid { grid-template-columns : 1fr ; }
129+ .tech-grid { grid-template-columns : repeat (2 , 1fr ); }
130+ .project-grid { grid-template-columns : 1fr ; }
118131 }
119132 </ style >
120133</ head >
@@ -158,7 +171,7 @@ <h1 class="fade-in">QA ANALYST</h1>
158171 < div class ="container fade-in ">
159172 < div class ="glass-card ">
160173 < h2 > CORE SCOPE</ h2 >
161- < div class ="grid ">
174+ < div class ="scope- grid ">
162175 < div class ="tab-item ">
163176 < h4 > App Testing</ h4 >
164177 < p > Identifying critical logic vulnerabilities and edge-case failures before production. Ensuring bulletproof application stability.</ p >
@@ -171,6 +184,10 @@ <h4>Documentation</h4>
171184 < h4 > Logic Audit</ h4 >
172185 < p > Systematic review of UX interaction patterns and backend behavioral consistency to eliminate system errors.</ p >
173186 </ div >
187+ < div class ="tab-item ">
188+ < h4 > Icon Designing</ h4 >
189+ < p > Focused on crafting simple and minimal icon designs that enhance user experience through clarity and precision.</ p >
190+ </ div >
174191 </ div >
175192 </ div >
176193 </ div >
@@ -185,14 +202,15 @@ <h2 style="font-size: 2rem; margin-bottom: 20px;">LAB STACK</h2>
185202 < div class ="tech-item "> < i class ="devicon-git-plain "> </ i > < span > Git</ span > </ div >
186203 < div class ="tech-item "> < i class ="devicon-vscode-plain "> </ i > < span > VS Code</ span > </ div >
187204 < div class ="tech-item "> < i class ="devicon-html5-plain "> </ i > < span > HTML5</ span > </ div >
205+ < div class ="tech-item "> < i class ="devicon-figma-plain "> </ i > < span > Figma</ span > </ div >
188206 </ div >
189207 </ div >
190208 </ section >
191209
192210 < section id ="work ">
193211 < div class ="container ">
194212 < h2 class ="fade-in "> LAB OUTPUT</ h2 >
195- < div class ="grid ">
213+ < div class ="project- grid ">
196214 < a href ="https://github.com/Earendel-lab/Currency " target ="_blank " class ="project-card fade-in reactive ">
197215 < div > < h3 > Currency</ h3 > < p style ="color:var(--text-sub); margin-top:10px; "> Minimalist Nothing-OS aesthetic converter.</ p > </ div >
198216 < div style ="color:var(--accent); font-weight:800; font-size:0.7rem; margin-top:20px; "> VISIT LAB →</ div >
@@ -204,7 +222,7 @@ <h2 class="fade-in">LAB OUTPUT</h2>
204222 < a href ="https://github.com/Earendel-lab/Flow " target ="_blank " class ="project-card fade-in reactive ">
205223 < div > < h3 > Flow</ h3 > < p style ="color:var(--text-sub); margin-top:10px; "> Countdown timer for deep work flow.</ p > </ div >
206224 < div style ="color:var(--accent); font-weight:800; font-size:0.7rem; margin-top:20px; "> VISIT LAB →</ div >
207- </ a >
225+ </ a >
208226 < a href ="https://github.com/Earendel-lab/Compass " target ="_blank " class ="project-card fade-in reactive ">
209227 < div > < h3 > Compass</ h3 > < p style ="color:var(--text-sub); margin-top:10px; "> Simple and beautiful compass app.</ p > </ div >
210228 < div style ="color:var(--accent); font-weight:800; font-size:0.7rem; margin-top:20px; "> VISIT LAB →</ div >
@@ -229,7 +247,7 @@ <h2 class="fade-in">PROJECT STARSHOT</h2>
229247 < div class ="action-box fade-in ">
230248 < h2 style ="background: linear-gradient(135deg, #000 0%, #444 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; "> INITIATE AUDIT</ h2 >
231249 < div style ="display:flex; gap:15px; justify-content:center; margin-top:30px; flex-wrap: wrap; ">
232- < button class ="btn btn-black reactive " onclick ="copyMail () "> Copy Email</ button >
250+ < button class ="btn btn-black reactive " onclick ="handleEmail () "> Email Me </ button >
233251 < a href ="https://github.com/Earendel-lab " target ="_blank " class ="btn btn-black reactive "> GitHub</ a >
234252 < a href ="https://discord.com/users/1393491217299275778 " target ="_blank " class ="btn btn-discord reactive "> Discord</ a >
235253 </ div >
@@ -288,11 +306,8 @@ <h2 style="background: linear-gradient(135deg, #000 0%, #444 100%); -webkit-back
288306 }
289307 type ( ) ;
290308
291- /* --- FIXED PERSPECTIVE FLOW ENGINE --- */
292309 const scene = new THREE . Scene ( ) ;
293310 const camera = new THREE . PerspectiveCamera ( 75 , window . innerWidth / window . innerHeight , 0.1 , 1000 ) ;
294-
295- // Locked Camera Base
296311 const BASE_Y = 25 ;
297312 const BASE_Z = 60 ;
298313 camera . position . set ( 0 , BASE_Y , BASE_Z ) ;
@@ -304,7 +319,7 @@ <h2 style="background: linear-gradient(135deg, #000 0%, #444 100%); -webkit-back
304319 const geometry = new THREE . PlaneGeometry ( 280 , 280 , 110 , 110 ) ;
305320 const material = new THREE . MeshBasicMaterial ( { color : 0x1e3a8a , transparent : true , opacity : 0.38 } ) ;
306321 const waveMesh = new THREE . Mesh ( geometry , material ) ;
307- waveMesh . rotation . x = - Math . PI / 2 ; // Perfectly Flat Plane
322+ waveMesh . rotation . x = - Math . PI / 2 ;
308323 scene . add ( waveMesh ) ;
309324
310325 const starGeo = new THREE . BufferGeometry ( ) ;
@@ -336,47 +351,39 @@ <h2 style="background: linear-gradient(135deg, #000 0%, #444 100%); -webkit-back
336351 currentSpeed += ( targetSpeed - currentSpeed ) * 0.01 ;
337352 time += 0.007 * currentSpeed ;
338353 requestAnimationFrame ( animate ) ;
339-
340354 const pos = geometry . attributes . position ;
341355 for ( let i = 0 ; i < pos . count ; i ++ ) {
342356 const x = pos . getX ( i ) ;
343357 const y = pos . getY ( i ) ;
344-
345- // Stable Waves
346358 const w1 = Math . sin ( x * 0.05 + time * 1.0 ) * 4.5 ;
347359 const w2 = Math . cos ( y * 0.08 + time * 0.8 ) * 4.5 ;
348360 pos . setZ ( i , w1 + w2 ) ;
349361 }
350362 pos . needsUpdate = true ;
351-
352- // NEW: FIXED PERSPECTIVE LOGIC
353- // Side-wise movement (mouseX) and Up-down slide (mouseY)
354- // We never change camera rotation, only position, to keep the view wide.
355363 const driftX = Math . sin ( time * 0.3 ) * 15 ;
356364 const driftY = Math . cos ( time * 0.25 ) * 5 ;
357-
358365 camera . position . x += ( mouseX + driftX - camera . position . x ) * 0.05 ;
359366 camera . position . y += ( BASE_Y - mouseY + driftY - camera . position . y ) * 0.05 ;
360-
361- // Look slightly ahead to maintain the "wide" ocean feel
362367 camera . lookAt ( 0 , - 10 , - 20 ) ;
363-
364368 stars . rotation . y += 0.0004 * currentSpeed ;
365369 renderer . render ( scene , camera ) ;
366370 }
367371 animate ( ) ;
368372
369- function copyMail ( ) {
370- navigator . clipboard . writeText ( 'zwebuse@gmail.com' ) ;
373+ function handleEmail ( ) {
374+ const mail = 'zwebuse@gmail.com' ;
375+ navigator . clipboard . writeText ( mail ) ;
371376 const p = document . getElementById ( 'popup' ) ;
372377 p . classList . add ( 'show' ) ;
373- setTimeout ( ( ) => p . classList . remove ( 'show' ) , 2000 ) ;
378+ setTimeout ( ( ) => {
379+ p . classList . remove ( 'show' ) ;
380+ window . location . href = `mailto:${ mail } ` ;
381+ } , 1000 ) ;
374382 }
375383
376384 const reveal = new IntersectionObserver ( ( entries ) => {
377385 entries . forEach ( e => { if ( e . isIntersecting ) e . target . classList . add ( 'visible' ) ; } ) ;
378386 } , { threshold : 0.1 } ) ;
379-
380387 document . querySelectorAll ( '.fade-in' ) . forEach ( el => reveal . observe ( el ) ) ;
381388
382389 window . addEventListener ( 'resize' , ( ) => {
@@ -387,6 +394,3 @@ <h2 style="background: linear-gradient(135deg, #000 0%, #444 100%); -webkit-back
387394 </ script >
388395</ body >
389396</ html >
390-
391-
392-
0 commit comments