Migrate Resume site to Astro.

Change-Id: I07e9b1d9c344a54694b5c54916154113aeaf8eb2
Reviewed-on: https://git.clicks.codes/c/Coded/thecoded.prof/+/672
Reviewed-by: Samuel Shuert <coded@clicks.codes>
Tested-by: Samuel Shuert <coded@clicks.codes>
diff --git a/sites/resume/src/components/Work.astro b/sites/resume/src/components/Work.astro
new file mode 100644
index 0000000..ad583f4
--- /dev/null
+++ b/sites/resume/src/components/Work.astro
@@ -0,0 +1,33 @@
+---
+interface Props {
+    jobTitle: string
+    projectName: string
+    dateFrom: string
+    dateTo: string
+    children: HTMLLIElement[]
+    obsolete: boolean
+    area: string
+}
+
+
+const { jobTitle, projectName, dateFrom, dateTo, obsolete, area } = Astro.props;
+---
+
+<div>
+	<div class="grid-cols-3 grid-rows-1 w-full text-base grid">
+	  <h1 class="text-left"><strong>{jobTitle}</strong></h1>
+	  <div class="flex justify-center text-center items-center gap-2">
+		  <h1 class="text-base">{projectName}</h1>
+		  <p class="w-fit bg-green-300 border border-green-700 text-xs rounded-lg px-1 text-center justify-center">{area}</p>
+		  {
+			  obsolete ?
+			  <div class="bg-red-300 border border-red-700 text-xs rounded-lg px-1">Obsolete</div>
+			  : null
+		  }
+	  </div>
+	  <h1 class="text-right">{dateFrom} - {dateTo}</h1>
+	</div>
+	<ul class="ml-8 mt-2 list-disc text-sm">
+	  <slot />
+	</ul>
+  </div>
\ No newline at end of file
diff --git a/sites/resume/src/env.d.ts b/sites/resume/src/env.d.ts
new file mode 100644
index 0000000..acef35f
--- /dev/null
+++ b/sites/resume/src/env.d.ts
@@ -0,0 +1,2 @@
+/// <reference path="../.astro/types.d.ts" />
+/// <reference types="astro/client" />
diff --git a/sites/resume/src/layouts/Layout.astro b/sites/resume/src/layouts/Layout.astro
new file mode 100644
index 0000000..c797514
--- /dev/null
+++ b/sites/resume/src/layouts/Layout.astro
@@ -0,0 +1,22 @@
+---
+interface Props {
+	title: string;
+}
+
+const { title } = Astro.props;
+---
+
+<!doctype html>
+<html lang="en">
+	<head>
+		<meta charset="UTF-8" />
+		<meta name="description" content="Samuel Shuert Resume" />
+		<meta name="viewport" content="width=device-width" />
+		<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
+		<meta name="generator" content={Astro.generator} />
+		<title>{title}</title>
+	</head>
+	<body class="flex justify-center my-4 w-full flex-col gap-2 lg:w-[1024px] m-auto">
+		<slot />
+	</body>
+</html>
\ No newline at end of file
diff --git a/sites/resume/src/pages/index.astro b/sites/resume/src/pages/index.astro
new file mode 100644
index 0000000..b7448ca
--- /dev/null
+++ b/sites/resume/src/pages/index.astro
@@ -0,0 +1,142 @@
+---
+import Layout from '../layouts/Layout.astro';
+import Work from '../components/Work.astro';
+---
+
+<Layout title="Samuel Shuert Resume">
+	<main class={`flex min-h-screen ${import.meta.env.PRODUCTION === "true" ? "w-full lg:w-1/2" : "w-full"} flex-col justify-center p-2 w-full`}>
+		<div id="info" class="grid grid-cols-3 grid-rows-1 h-fit gap-2 my-2 justify-between w-full">
+			<div class="flex flex-col text-sm">
+			  <h1 class="text-sm">Delaware, USA</h1>
+			  <a href="mailto:coded@clicks.codes"><p>coded@clicks.codes</p></a>
+			</div>
+			<h1 class="text-2xl">Samuel Shuert</h1>
+			<div class="flex flex-col text-sm text-right">
+			  <a href="https://linkedin.com/in/samuelshuert"><p class="underline">linkedin.com/in/samuelshuert</p></a>
+			  <a href="https://github.com/TheCodedProf"><p class="underline">github.com/TheCodedProf</p></a>
+			  <a href="https://git.clicks.codes/q/owner:coded"><p class="underline">git.clicks.codes/q/owner:coded</p></a>
+			  <a href="https://app.codecrafters.io/users/TheCodedProf"><p class="underline">app.codecrafters.io/users/TheCodedProf</p></a>
+			</div>
+		</div>
+
+		<h1 class="self-start text-xl">Summary</h1>
+		<hr class="w-full border-t border-t-black mb-2"/>
+		<p class="text-sm mb-8 pl-4 text-left w-full">
+			I'm a 21 year old developer who's been programming since I was 11. I started with Python and have since taken my skills to both NodeJS and Rust.
+			I'm eager to make your acquaintance and put my skills to use in a collaborative environment.
+		</p>
+
+		<div id="experience" class="flex flex-col h-fit gap-8 my-2 w-full mb-16">
+			<Work jobTitle={"Developer"} area={"Infrastructure"} projectName={"Clicks Nix"} dateFrom={"Aug 2022"} dateTo={"Current"} obsolete={false} >
+			  <li>
+				Nix configuration for Clicks servers.
+			  </li>
+			  <li>
+				Responsible for general mainenance and major updates, depends on current needs.
+			  </li>
+			  <li>
+				Written in Nix
+			  </li>
+			</Work>
+			<Work jobTitle={"Developer"} area={"Infrastructure"} projectName={"Clicks Server"} dateFrom="Mar 2022" dateTo={"Current"} obsolete={false} >
+			  <li>
+				Uptime management for Clicks servers.
+			  </li>
+			  <li>
+				Ensure Clicks projects and additionally hosted tools do not go offline.
+			  </li>
+			  <li>
+				Use of nix containers and docker for seperation of tasks.
+			  </li>
+			</Work>
+			<Work jobTitle={"Developer"} area={"Backend"} projectName={"Nucleus"} dateFrom={"Sep 2020"} dateTo={"Sep 2023"} obsolete={false}>
+			  <li>Nucleus (Feb 2023 - Sep 2023)</li>
+			  <ul class="ml-8 mt-2 list-disc text-sm mb-4">
+				<li>
+				  Discord moderation bot. Rewritten with TypeScript.
+				</li>
+				<li>
+				  I was responsible for database read/write and slash command registration.
+				</li>
+				<li>
+				  Used Node.JS (w/ TypeScript), discord.js and MongoDB
+				</li>
+			  </ul>
+			  <li>Remote Server Management (RSM) Version 2 (Jan 2021 - Jan 2022)</li>
+			  <ul class="ml-8 mt-2 list-disc text-sm mb-4">
+				<li>
+				  Discord moderation bot. Additional features including NSFW image detection and checking for malware.
+				</li>
+				<li>
+				  I was responsible for the guild settings flow, tesseract flow and clamav flow.
+				</li>
+				<li>
+				  Used Python, discord.py and JSON
+				</li>
+			  </ul>
+			  <li>Remote Server Management (RSM) Version 1 (Sep 2020 - Jan 2021)</li>
+			  <ul class="ml-8 mt-2 list-disc text-sm">
+				<li>
+				  Discord moderation bot. Featuring readable UI and extra moderation features Discord does not have like tempbans.
+				</li>
+				<li>
+				  I was responsible for the guild settings flow.
+				</li>
+				<li>
+				  Used Python, discord.py and JSON
+				</li>
+			  </ul>
+			</Work>
+			<Work jobTitle={"Developer"} area={"Backend"} projectName={"Innuendo"} dateFrom={"Jul 2020"} dateTo={"Current"} obsolete={false}>
+			  <li>Innuendo (Dec 2023 - Current)</li>
+			  <ul class="ml-8 mt-2 list-disc text-sm">
+				<li>
+				  Cardboard Against Humankind remade in Rust
+				</li>
+				<li>
+				  I&apos;m the main developer for this project, in charge of coordinating other people the main game loop code.
+				</li>
+				<li>
+				  Uses Rust, Serenity-rs + Poise, and Postgres
+				</li>
+			  </ul>
+			  <li>Cardboard Against Humankind (Jul 2020 - Sep 2021)</li>
+			  <ul class="ml-8 mt-2 list-disc text-sm">
+				<li>
+				  A Cards Against Humanity discord bot. Was invited to 2000+ servers and had ~400 congruent games at peak times.
+				</li>
+				<li>
+				  I was responsible for writing the game loop and discord interactions.
+				</li>
+				<li>
+				  Used Python, discord.py and JSON
+				</li>
+			  </ul>
+			</Work>
+			<Work jobTitle={"Lead Developer"} area={"Full Stack"} projectName={"Infinite Stories"} dateFrom={"Oct 2021"} dateTo={"Jun 2022"} obsolete={true} >
+			  <li>
+				Website that allowed writers to publish excerpts from their books online to get feedback
+			  </li>
+			  <li>
+				I was responsible for full website design, component creation, read/write to supabase, 
+			  </li>
+			  <li>
+				Used Next.JS for web development and Supabase for storage
+			  </li>
+			</Work>
+		</div>
+		<h1 class="self-start text-xl">Certifications</h1>
+		<hr class="w-full border-t border-t-black"/>
+
+		<div id="skills" class="flex flex-col h-fit gap-2 my-2 w-full mb-16">
+			<p class="text-sm"><strong>CodeCrafters: </strong>HTTP Server (Rust)</p>
+		</div>
+		<h1 class="self-start text-xl">Skills</h1>
+		<hr class="w-full border-t border-t-black"/>
+
+		<div id="skills" class="flex flex-col h-fit gap-2 my-2 w-full">
+			<p class="text-sm"><strong>Languages: </strong>TypeScript, JavaScript, Rust, Nix, Python</p>
+			<p class="text-sm"><strong>Tools: </strong>MongoDB, Postgres, Supabase, Next.JS, Vercel, Git, Gerrit, GitHub, Google Cloud, Cloudflare (DNS, Workers, Zero Trust, cloudflared), AWS, Nix</p>
+		</div>
+	</main>
+</Layout>
\ No newline at end of file