Initial portfolio site: Astro + Tailwind MVP

Outcome-led hero, about, grouped skills, experience summary, featured
projects + /projects index, static contact, SEO/OG, dark/light theme.
Dockerfile + nginx config + build script for homelab deploy.
This commit is contained in:
2026-06-17 16:22:53 +10:00
commit 2d4b6ea097
38 changed files with 8232 additions and 0 deletions
+55
View File
@@ -0,0 +1,55 @@
---
import Layout from "../layouts/Layout.astro";
import Hero from "../components/Hero.astro";
import Section from "../components/Section.astro";
import About from "../components/About.astro";
import SkillGroup from "../components/SkillGroup.astro";
import ProjectCard from "../components/ProjectCard.astro";
import Contact from "../components/Contact.astro";
import { skills } from "../data/skills";
import { featuredProjects } from "../data/projects";
---
<Layout path="/">
<Hero />
<Section id="about" eyebrow="About" index="01" title="Reliability you can reason about.">
<About />
</Section>
<Section id="skills" eyebrow="Capabilities" index="02" title="What I work with, grouped by what it's for.">
<div class="grid grid--skills">
{skills.map((group) => <SkillGroup group={group} />)}
</div>
</Section>
<Section id="projects" eyebrow="Selected work" index="03" title="Platforms built to keep working unattended.">
<div class="grid grid--projects">
{featuredProjects.map((project) => <ProjectCard project={project} />)}
</div>
<p class="projects__more" data-reveal>
<a class="btn" href="/projects">All projects →</a>
</p>
</Section>
<Section id="contact" eyebrow="Get in touch" index="04" title="Let's talk infrastructure.">
<Contact />
</Section>
</Layout>
<style>
.grid {
display: grid;
gap: var(--space-5);
}
.grid--skills {
grid-template-columns: repeat(auto-fit, minmax(min(100%, 17rem), 1fr));
}
.grid--projects {
grid-template-columns: repeat(auto-fit, minmax(min(100%, 19rem), 1fr));
}
.projects__more {
margin-top: var(--space-6);
text-align: center;
}
</style>