diff --git a/components/approach/lattice-fallback.tsx b/components/approach/lattice-fallback.tsx index 2b009a6..a180f37 100644 --- a/components/approach/lattice-fallback.tsx +++ b/components/approach/lattice-fallback.tsx @@ -69,8 +69,8 @@ export function LatticeFallback() { {pts.map((p, i) => ( { + const handleEscape = (e: KeyboardEvent) => { + if (e.key === "Escape") setOpen(false); + }; + if (open) document.addEventListener("keydown", handleEscape); + return () => document.removeEventListener("keydown", handleEscape); + }, [open]); + + return ( + <> + {/* Resume Trigger Button */} + + + {/* Modal Backdrop + Dialog */} + {open && ( +
setOpen(false)} + role="presentation" + > +
e.stopPropagation()} + role="dialog" + aria-labelledby="resume-dialog-title" + aria-modal="true" + > + {/* Close Button */} + + + {/* Title */} +

+ Download Resume +

+ + {/* Description */} +

+ Choose the resume that best fits the role you're applying + for. +

+ + {/* Download Options */} +
+ setOpen(false)} + className="inline-flex items-center justify-center gap-2 rounded bg-ink px-6 py-3 text-[0.9rem] font-medium text-paper transition-colors hover:bg-accent motion-reduce:transition-none" + > + + Software Developer + + + setOpen(false)} + className="inline-flex items-center justify-center gap-2 rounded border border-ink bg-paper px-6 py-3 text-[0.9rem] font-medium text-ink transition-colors hover:bg-ink-muted motion-reduce:transition-none" + > + + Cybersecurity / GRC + +
+ + {/* Close hint (optional) */} +

+ Press Esc or click outside to close +

+
+
+ )} + + ); +} diff --git a/components/sections/hero.tsx b/components/sections/hero.tsx index c67810b..e614730 100644 --- a/components/sections/hero.tsx +++ b/components/sections/hero.tsx @@ -1,5 +1,6 @@ import { profile } from "@/data/profile"; import { HeroReveal } from "./hero-reveal"; +import { ResumeModal } from "@/components/resume/resume-modal"; /** * The four figures a recruiter should retain after three seconds. Rendered as @@ -75,12 +76,7 @@ export function Hero() { > Email me - - Resume - + diff --git a/data/certificates.ts b/data/certificates.ts index 377d434..252f1f1 100644 --- a/data/certificates.ts +++ b/data/certificates.ts @@ -28,6 +28,13 @@ export const certificates = [ date: "2026-04-01", credentialUrl: null, }, + { + id: "cert-isea", + title: "Information Security Education and Awareness (ISEA)", + issuer: "CDAC / MeitY", + date: "2024-07-24", + credentialUrl: null, + }, ] satisfies Certificate[]; /** Newest first. */ diff --git a/data/tryhackme.ts b/data/tryhackme.ts index 61182df..133dcc7 100644 --- a/data/tryhackme.ts +++ b/data/tryhackme.ts @@ -10,14 +10,14 @@ export const tryHackMe = [ id: "thm-offensive-pentesting", title: "Offensive Pentesting", issuer: "TryHackMe", - date: "2025-08-01", + date: "2025-08-06", credentialUrl: null, }, { id: "thm-web-app-pentesting", title: "Web Application Pentesting", issuer: "TryHackMe", - date: "2025-09-01", + date: "2025-09-20", credentialUrl: null, }, { diff --git a/public/certificates/cert-aws-data-engineering.pdf b/public/certificates/cert-aws-data-engineering.pdf new file mode 100644 index 0000000..d2097c5 Binary files /dev/null and b/public/certificates/cert-aws-data-engineering.pdf differ diff --git a/public/certificates/cert-aws-ml-foundations.pdf b/public/certificates/cert-aws-ml-foundations.pdf new file mode 100644 index 0000000..864d000 Binary files /dev/null and b/public/certificates/cert-aws-ml-foundations.pdf differ diff --git a/public/certificates/cert-google-cybersecurity.pdf b/public/certificates/cert-google-cybersecurity.pdf new file mode 100644 index 0000000..13b3fef Binary files /dev/null and b/public/certificates/cert-google-cybersecurity.pdf differ diff --git a/public/certificates/cert-isea.pdf b/public/certificates/cert-isea.pdf new file mode 100644 index 0000000..fcedf0d Binary files /dev/null and b/public/certificates/cert-isea.pdf differ diff --git a/public/certificates/thm-cyber-security-101.jpg b/public/certificates/thm-cyber-security-101.jpg new file mode 100644 index 0000000..bd2718d Binary files /dev/null and b/public/certificates/thm-cyber-security-101.jpg differ diff --git a/public/certificates/thm-jr-pentester.jpg b/public/certificates/thm-jr-pentester.jpg new file mode 100644 index 0000000..45f74fa Binary files /dev/null and b/public/certificates/thm-jr-pentester.jpg differ diff --git a/public/certificates/thm-offensive-pentesting.pdf b/public/certificates/thm-offensive-pentesting.pdf new file mode 100644 index 0000000..f9c1aef Binary files /dev/null and b/public/certificates/thm-offensive-pentesting.pdf differ diff --git a/public/certificates/thm-pre-security.pdf b/public/certificates/thm-pre-security.pdf new file mode 100644 index 0000000..ad1092c Binary files /dev/null and b/public/certificates/thm-pre-security.pdf differ diff --git a/public/certificates/thm-web-app-pentesting.pdf b/public/certificates/thm-web-app-pentesting.pdf new file mode 100644 index 0000000..fca3c43 Binary files /dev/null and b/public/certificates/thm-web-app-pentesting.pdf differ diff --git a/public/certificates/thm-web-fundamentals.pdf b/public/certificates/thm-web-fundamentals.pdf new file mode 100644 index 0000000..dcdca1e Binary files /dev/null and b/public/certificates/thm-web-fundamentals.pdf differ diff --git a/public/resumes/resume-cybersecurity-grc.pdf b/public/resumes/resume-cybersecurity-grc.pdf new file mode 100644 index 0000000..bc41f50 Binary files /dev/null and b/public/resumes/resume-cybersecurity-grc.pdf differ diff --git a/public/resumes/resume-software-developer.pdf b/public/resumes/resume-software-developer.pdf new file mode 100644 index 0000000..2ad766a Binary files /dev/null and b/public/resumes/resume-software-developer.pdf differ