Initial Commit

This commit is contained in:
Greg Kilmer
2026-07-04 07:42:24 -04:00
commit 71bffad507
77 changed files with 14437 additions and 0 deletions
+207
View File
@@ -0,0 +1,207 @@
---
/**
* professional/index.astro — Professional (Resume / Portfolio)
* ---------------------------------------------------------------------------
* The "polished wing". A single long-scroll page whose sections read as a
* narrative (Summary -> Experience -> Skills -> Projects -> Education ->
* Contact), per the spec. Uses surface="professional" for the dark slate tone.
*
* Experience comes from the `experience` collection; projects from the
* `projects` collection. Both are sorted by `order`. Education is a placeholder
* block (spec leaves it to Greg).
*/
import BaseLayout from '@layouts/BaseLayout.astro';
import Reveal from '@components/motion/Reveal.astro';
import Icon from '@components/Icon.astro';
import SectionHeader from '@components/layout/SectionHeader.astro';
import Placeholder from '@components/layout/Placeholder.astro';
import SectionNav from '@components/professional/SectionNav.astro';
import Timeline from '@components/professional/Timeline.astro';
import SkillGrid from '@components/professional/SkillGrid.astro';
import ProjectCard from '@components/professional/ProjectCard.astro';
import AlchemicalDivider from '@components/mystic/AlchemicalDivider.astro';
import Astrolabe from '@components/mystic/Astrolabe.astro';
import { getCollection } from 'astro:content';
const experience = (await getCollection('experience')).sort(
(a, b) => a.data.order - b.data.order,
);
const projects = (await getCollection('projects')).sort(
(a, b) => a.data.order - b.data.order,
);
---
<BaseLayout
surface="professional"
title="Professional"
description="Software developer and team lead: cloud and mobile development, SAP Business Technology Platform, AI/ML, full-stack work. Resume and portfolio for Greg Kilmer."
>
<!-- Page header -->
<section class="relative overflow-hidden pt-28 sm:pt-32">
{/* Slowly rotating astrolabe ornament behind the header. */}
<Astrolabe
class="pointer-events-none absolute -right-48 -top-24 h-[34rem] w-[34rem] animate-spin-slow"
style="color: var(--color-accent); opacity:.10;"
/>
<div class="container-prose relative flex flex-col gap-10">
<Reveal>
<SectionHeader
kicker="Professional"
icon="briefcase"
title="Resume &amp; portfolio"
subtitle="Clean, confident, skimmable. Browsable here, screenshot-able for a recruiter, printable if needed."
/>
</Reveal>
<Reveal delay={80}>
<SectionNav />
</Reveal>
</div>
</section>
<div class="container-prose flex flex-col gap-20 py-16 sm:gap-24 sm:py-20">
{/* ===== 1. Summary ===== */}
<section id="summary" class="scroll-mt-28 flex flex-col gap-6">
<Reveal>
<SectionHeader kicker="01" icon="format-list-text" title="Professional summary" />
</Reveal>
<Reveal delay={80}>
<blockquote
class="border-l-2 pl-5 text-lg leading-relaxed"
style="border-color: var(--color-accent); color: var(--color-text-muted);"
>
Software developer and team lead with deep experience in cloud and
mobile application development, currently focused on SAP-adjacent
solutions at Implico Inc. Expanding into SAP Business Technology
Platform (BTP) while maintaining a broad technical foundation across
AI/ML, full-stack development, and automation. Known for bridging
complex technical requirements with practical, maintainable solutions.
Strong communicator who thrives at the intersection of engineering and
business needs.
</blockquote>
</Reveal>
<Reveal delay={120}>
<figure
class="relative overflow-hidden rounded-2xl border"
style="border-color: color-mix(in srgb, var(--color-accent) 35%, transparent);"
>
<img
src="/images/pro-workspace.jpg"
alt="Cloud development workspace"
loading="lazy"
decoding="async"
class="aspect-[21/9] w-full object-cover"
/>
<figcaption
class="absolute bottom-0 left-0 m-3 rounded-md px-3 py-1 font-mono text-[0.65rem] uppercase tracking-[0.18em] backdrop-blur-sm"
style="background: color-mix(in srgb, var(--color-ink) 60%, transparent); color: var(--color-cream);"
>
Where the day-job work happens
</figcaption>
</figure>
</Reveal>
</section>
<Reveal>
<AlchemicalDivider class="mx-auto h-6 w-full max-w-sm" style="color: var(--color-accent);" />
</Reveal>
{/* ===== 2. Experience ===== */}
<section id="experience" class="scroll-mt-28 flex flex-col gap-6">
<Reveal>
<SectionHeader
kicker="02"
icon="timeline-text"
title="Experience"
subtitle="Where I've proven it. Expand any role for the detail."
/>
</Reveal>
<Timeline entries={experience} />
</section>
{/* ===== 3. Skills ===== */}
<section id="skills" class="scroll-mt-28 flex flex-col gap-6">
<Reveal>
<SectionHeader
kicker="03"
icon="chart-bar"
title="Skills &amp; technologies"
subtitle="What I bring to the table, organized into three tiers."
/>
</Reveal>
<SkillGrid />
</section>
{/* ===== 4. Projects ===== */}
<section id="projects" class="scroll-mt-28 flex flex-col gap-6">
<Reveal>
<SectionHeader
kicker="04"
icon="view-grid"
title="Projects"
subtitle="What I've built. Replace the placeholder with 3-6 of your own."
/>
</Reveal>
<div class="grid gap-5 sm:grid-cols-2">
{projects.map((project, i) => (
<Reveal delay={i * 80}>
<ProjectCard project={project} />
</Reveal>
))}
</div>
<Placeholder
label="Add 3-6 projects"
hint="Drop a new markdown file in src/content/projects/ for each notable project. See docs/CONTENT.md."
/>
</section>
{/* ===== 5. Education ===== */}
<section id="education" class="scroll-mt-28 flex flex-col gap-6">
<Reveal>
<SectionHeader
kicker="05"
icon="school"
title="Education &amp; certifications"
subtitle="My foundation."
/>
</Reveal>
<div class="grid gap-4 sm:grid-cols-2">
<Placeholder label="Education history" hint="Add degrees, institutions, and dates." />
<Placeholder label="Certifications" hint="SAP, cloud, or other relevant certifications." />
</div>
</section>
{/* ===== 6. Contact ===== */}
<section id="contact" class="scroll-mt-28 flex flex-col gap-6">
<Reveal>
<SectionHeader
kicker="06"
icon="email"
title="Let's talk"
subtitle="Open to opportunities in cloud development, SAP BTP, and technical leadership."
/>
</Reveal>
<Reveal delay={80}>
<div class="card flex flex-col gap-6">
<ul class="flex flex-col gap-4 sm:flex-row sm:flex-wrap sm:gap-8">
<li class="flex items-center gap-2">
<Icon name="email-outline" class="h-5 w-5" style="color: var(--color-accent);" />
<span class="font-mono text-xs uppercase tracking-[0.18em]" style="color: var(--color-accent);">Email: [Greg to fill]</span>
</li>
<li class="flex items-center gap-2">
<Icon name="linkedin" class="h-5 w-5" style="color: var(--color-accent);" />
<span class="font-mono text-xs uppercase tracking-[0.18em]" style="color: var(--color-accent);">LinkedIn: [Greg to fill]</span>
</li>
<li class="flex items-center gap-2">
<Icon name="github" class="h-5 w-5" style="color: var(--color-accent);" />
<span class="font-mono text-xs uppercase tracking-[0.18em]" style="color: var(--color-accent);">GitHub: [Greg to fill]</span>
</li>
</ul>
<a href="/contact" class="btn btn-primary self-start">
Full contact page
<Icon name="arrow-right" class="h-5 w-5" />
</a>
</div>
</Reveal>
</section>
</div>
</BaseLayout>