Skip to content

Commit d24539a

Browse files
committed
add CV download link and enhance navigation styling
1 parent cea877b commit d24539a

4 files changed

Lines changed: 137 additions & 32 deletions

File tree

assets/CV-Shafi.pdf

170 KB
Binary file not shown.

index.html

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -69,17 +69,32 @@
6969
<div class="bg-shape shape-2" aria-hidden="true"></div>
7070

7171
<header class="site-header">
72-
<a href="#home" class="brand">FRS</a>
73-
<nav class="nav" aria-label="Primary Navigation">
74-
<a href="#about">About</a>
75-
<a href="#education">Education</a>
76-
<a href="#publications">Publications</a>
77-
<a href="#experience">Experience</a>
78-
<a href="#skills">Skills</a>
79-
<a href="#contact">Contact</a>
80-
<a href="https://scholar.google.com/scholar?q=Fozle+Rabbi+Shafi" target="_blank" rel="noopener noreferrer">Scholar</a>
81-
<a href="https://www.linkedin.com/in/fozle-rabbi-shafi-07841511a" target="_blank" rel="noopener noreferrer">LinkedIn</a>
82-
</nav>
72+
<div class="header-inner">
73+
<a href="#home" class="brand">FRS</a>
74+
<nav class="nav" aria-label="Primary Navigation">
75+
<div class="nav-links">
76+
<a class="nav-link" href="#about">About</a>
77+
<a class="nav-link" href="#education">Education</a>
78+
<a class="nav-link" href="#publications">Publications</a>
79+
<a class="nav-link" href="#experience">Experience</a>
80+
<a class="nav-link" href="#skills">Skills</a>
81+
<a class="nav-link" href="#contact">Contact</a>
82+
</div>
83+
<a class="nav-download" href="assets/CV-Shafi.pdf" download="Fozle-Rabbi-Shafi-CV.pdf">Download CV</a>
84+
<div class="nav-socials" aria-label="Social Links">
85+
<a href="https://scholar.google.com/scholar?q=Fozle+Rabbi+Shafi" target="_blank" rel="noopener noreferrer" aria-label="Google Scholar">
86+
<svg viewBox="0 0 24 24" aria-hidden="true">
87+
<path d="M12 3 2 8l10 5 8-4v6h2V8L12 3Zm-6 9v4.5c0 1.8 2.7 3.5 6 3.5s6-1.7 6-3.5V12l-6 3-6-3Z"/>
88+
</svg>
89+
</a>
90+
<a href="https://www.linkedin.com/in/fozle-rabbi-shafi-07841511a" target="_blank" rel="noopener noreferrer" aria-label="LinkedIn">
91+
<svg viewBox="0 0 24 24" aria-hidden="true">
92+
<path d="M6.94 8.5a1.78 1.78 0 1 1 0-3.56 1.78 1.78 0 0 1 0 3.56ZM5.4 9.9h3.1V19H5.4V9.9Zm5 0h2.97v1.24h.04c.41-.78 1.42-1.6 2.92-1.6 3.12 0 3.7 2.06 3.7 4.74V19h-3.1v-4.13c0-.98-.02-2.25-1.37-2.25-1.37 0-1.58 1.07-1.58 2.18V19h-3.1V9.9Z"/>
93+
</svg>
94+
</a>
95+
</div>
96+
</nav>
97+
</div>
8398
</header>
8499

85100
<main>
@@ -221,7 +236,7 @@ <h3>Full-Stack Engineer</h3>
221236
<h2>Teaching Experience</h2>
222237
<div class="grid cards">
223238
<article class="card">
224-
<h3>Head Teaching Assistant, CISC 498</h3>
239+
<h3>Teaching Assistant, CISC 498</h3>
225240
<p class="meta">Queen's University | Sep 2025 - Present</p>
226241
<p>Mentored project teams, provided implementation guidance, and supported evaluation of deliverables and presentations.</p>
227242
</article>
@@ -288,7 +303,7 @@ <h2>Contact</h2>
288303
<p>Open to collaborations in AI research, LLM applications, and software engineering opportunities.</p>
289304
<p class="privacy-note">Privacy-first form with lightweight bot protection. No analytics or ad trackers are loaded.</p>
290305

291-
<form id="contact-form" class="contact-form" novalidate>
306+
<form id="contact-form" class="contact-form" action="https://formsubmit.co/f.shafi@queensu.ca" method="POST" novalidate>
292307
<div class="form-grid">
293308
<label>
294309
Name
@@ -312,12 +327,13 @@ <h2>Contact</h2>
312327

313328
<label id="human-check-label" data-answer="">
314329
<span id="human-check-question">Human check</span>
315-
<input type="number" id="human-check-input" inputmode="numeric" required>
330+
<input type="number" id="human-check-input" name="human_check" inputmode="numeric" required>
316331
</label>
317332

318333
<input type="text" name="_honey" class="hp-field" tabindex="-1" autocomplete="off" aria-hidden="true">
319334
<input type="hidden" name="_subject" value="Portfolio Contact Form Submission">
320335
<input type="hidden" name="_captcha" value="false">
336+
<input type="hidden" name="_next" value="https://devshafi.github.io/#contact">
321337
<input type="hidden" id="form-started-at" value="">
322338

323339
<button class="btn btn-primary" type="submit">Send Message</button>
@@ -337,6 +353,6 @@ <h2>Contact</h2>
337353
<p>© <span id="year"></span> Fozle Rabbi Shafi</p>
338354
</footer>
339355

340-
<script src="script.js"></script>
356+
<script src="script.js?v=20260331"></script>
341357
</body>
342358
</html>

script.js

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const reveals = document.querySelectorAll('.reveal');
2-
const navLinks = document.querySelectorAll('.nav a');
2+
const navLinks = document.querySelectorAll('.nav-link');
33
const sections = [...document.querySelectorAll('main section[id]')];
44

55
const revealObserver = new IntersectionObserver(
@@ -78,7 +78,7 @@ if (contactForm && formStatus && humanCheckLabel && humanCheckQuestion && humanC
7878
}
7979

8080
const formData = new FormData(contactForm);
81-
const endpoint = 'https://formsubmit.co/ajax/f.shafi@queensu.ca';
81+
const endpoint = `https://formsubmit.co/ajax/${encodeURIComponent('f.shafi@queensu.ca')}`;
8282

8383
try {
8484
const response = await fetch(endpoint, {
@@ -88,15 +88,25 @@ if (contactForm && formStatus && humanCheckLabel && humanCheckQuestion && humanC
8888
});
8989

9090
if (!response.ok) {
91-
throw new Error('Request failed');
91+
let detail = 'Request failed';
92+
try {
93+
const payload = await response.json();
94+
if (payload?.message) {
95+
detail = payload.message;
96+
}
97+
} catch {
98+
// Ignore JSON parse failures and keep default detail
99+
}
100+
throw new Error(detail);
92101
}
93102

94103
formStatus.textContent = 'Thanks! Your message has been sent.';
95104
contactForm.reset();
96105
createHumanCheck();
97106
formStartedAt.value = String(Date.now());
98107
} catch {
99-
formStatus.textContent = 'Could not send right now. Please email me directly at f.shafi@queensu.ca.';
108+
formStatus.textContent = 'Direct submit fallback started. If this is your first use, confirm the FormSubmit verification email once.';
109+
contactForm.submit();
100110
}
101111
});
102112
}

styles.css

Lines changed: 92 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -67,46 +67,114 @@ ul {
6767
left: 0;
6868
z-index: 10;
6969
width: 100%;
70-
padding: 0.75rem 1rem;
70+
padding: 0.7rem 1rem;
7171
border-radius: 0;
7272
background: #ffffff;
7373
border-bottom: 1px solid var(--stroke);
74+
box-shadow: 0 8px 20px rgba(15, 40, 75, 0.08);
75+
}
76+
77+
.header-inner {
78+
width: min(1180px, 100%);
79+
margin: 0 auto;
7480
display: flex;
7581
justify-content: space-between;
7682
align-items: center;
83+
gap: 1rem;
7784
}
7885

7986
.brand {
8087
text-decoration: none;
8188
font-family: "Space Grotesk", sans-serif;
8289
font-weight: 700;
8390
letter-spacing: 0.1em;
91+
color: #0d1b2c;
92+
background: linear-gradient(120deg, rgba(255, 122, 24, 0.14), rgba(12, 157, 138, 0.14));
93+
border: 1px solid var(--stroke);
94+
padding: 0.36rem 0.62rem;
95+
border-radius: 10px;
8496
}
8597

8698
.nav {
8799
display: flex;
88-
gap: 0.9rem;
100+
gap: 0.6rem;
101+
flex-wrap: wrap;
102+
align-items: center;
103+
justify-content: flex-end;
104+
}
105+
106+
.nav-links {
107+
display: flex;
89108
flex-wrap: wrap;
109+
gap: 0.35rem;
90110
}
91111

92-
.nav a {
112+
.nav-link {
93113
text-decoration: none;
94-
font-size: 0.9rem;
114+
font-size: 0.88rem;
95115
color: var(--muted);
96-
padding: 0.25rem 0.45rem;
97-
border-radius: 8px;
116+
padding: 0.35rem 0.55rem;
117+
border-radius: 9px;
98118
transition: color 180ms ease, background-color 180ms ease;
99119
}
100120

101-
.nav a:hover,
102-
.nav a.active {
121+
.nav-link:hover,
122+
.nav-link.active {
103123
color: #0e1726;
104124
background-color: rgba(255, 122, 24, 0.2);
105125
}
106126

127+
.nav-download {
128+
text-decoration: none;
129+
padding: 0.42rem 0.78rem;
130+
border-radius: 10px;
131+
background: linear-gradient(120deg, var(--accent), #ffb12f);
132+
color: #1a1f26;
133+
font-weight: 700;
134+
font-size: 0.84rem;
135+
box-shadow: 0 8px 18px rgba(255, 122, 24, 0.26);
136+
transition: transform 180ms ease, box-shadow 180ms ease;
137+
}
138+
139+
.nav-download:hover {
140+
transform: translateY(-1px);
141+
box-shadow: 0 10px 20px rgba(255, 122, 24, 0.34);
142+
}
143+
144+
.nav-socials {
145+
display: flex;
146+
align-items: center;
147+
gap: 0.35rem;
148+
}
149+
150+
.nav-socials a {
151+
width: 34px;
152+
height: 34px;
153+
display: inline-flex;
154+
align-items: center;
155+
justify-content: center;
156+
border-radius: 9px;
157+
border: 1px solid var(--stroke);
158+
color: #223348;
159+
background: #f8fbff;
160+
transition: transform 180ms ease, border-color 180ms ease, background-color 180ms ease;
161+
}
162+
163+
.nav-socials a:hover {
164+
transform: translateY(-1px);
165+
border-color: rgba(12, 157, 138, 0.5);
166+
background-color: #f1f8ff;
167+
}
168+
169+
.nav-socials svg {
170+
width: 18px;
171+
height: 18px;
172+
fill: currentColor;
173+
}
174+
107175
main {
108176
width: min(1120px, calc(100% - 2rem));
109-
margin: 5.8rem auto 3rem;
177+
margin: 6.4rem auto 3rem;
110178
}
111179

112180
.section {
@@ -444,15 +512,26 @@ article.card {
444512
}
445513

446514
.nav {
447-
gap: 0.3rem;
515+
gap: 0.45rem;
516+
}
517+
518+
.nav-link {
519+
font-size: 0.8rem;
520+
padding: 0.28rem 0.45rem;
521+
}
522+
523+
.nav-download {
524+
font-size: 0.78rem;
525+
padding: 0.38rem 0.62rem;
448526
}
449527

450-
.nav a {
451-
font-size: 0.82rem;
528+
.nav-socials a {
529+
width: 30px;
530+
height: 30px;
452531
}
453532

454533
main {
455-
margin-top: 6.3rem;
534+
margin-top: 8.2rem;
456535
}
457536

458537
.hero-layout {

0 commit comments

Comments
 (0)