--- import BaseLayout from "../layouts/BaseLayout.astro"; import SectionHead from "../components/SectionHead.astro"; import ResumeIntro from "../components/ui/resume-intro"; import { SITE, authors } from "../lib/blog-data.js"; import resume from "../config/resume.json"; const author = authors[0]; const jsonLd = { "@context": "https://schema.org", "@type": "ProfilePage", mainEntity: { "@type": "Person", name: SITE.name, jobTitle: author.jobTitle, email: `mailto:${resume.contact.email}`, telephone: resume.contact.phone, description: resume.summary, knowsAbout: author.knowsAbout, alumniOf: resume.education.map((e) => ({ "@type": "Organization", name: e.org })), hasCredential: resume.certifications.map((c) => ({ "@type": "EducationalOccupationalCredential", name: c.title, })), }, }; --- {/* client:visible โ€” the block is the first thing on the page but the motion only matters once it is actually in view, and this keeps the JS off the critical path. */}
{ resume.experience.map((job, i) => (
{job.period} {job.current && ( Now )}

{job.role}

{job.org} ยท {job.sector}

{job.summary}

    {job.points.map((point) => (
  • {point}
  • ))}
)) }
{ resume.projects.map((project) => (

{project.name}

{project.kind} {project.period}

{project.summary}

    {project.points.map((point) => (
  • {point}
  • ))}
)) }
{ resume.skills.map((group) => (

{group.group}

    {group.items.map((item) => (
  • {item.name} {item.years && ( {item.years} yr{item.years === 1 ? "" : "s"} )}
  • ))}
)) }
    { resume.tools.map((tool) => (
  • {tool}
  • )) }

Education

{ resume.education.map((item) => (

{item.title}

{item.org}

{item.period}

)) }

Certifications

{ resume.certifications.map((item) => (

{item.title}

{item.period}

)) }

The full version, on paper.