From 62cfb661979b6d2727818b88407897527b797f8e Mon Sep 17 00:00:00 2001 From: Joe Wee Date: Thu, 21 May 2026 12:27:28 +0100 Subject: [PATCH] Initial: resume template via tAI --- .claude/settings.json | 13 ++ .tai-manifest.tn | 13 ++ CLAUDE.md | 23 +++ README.md | 3 + index.html | 12 ++ src/components/Footer.tsx | 9 + src/components/Header.tsx | 12 ++ src/index.css | 3 + src/main.tsx | 10 + src/pages/Index.tsx | 404 ++++++++++++++++++++++++++++++++++++++ 10 files changed, 502 insertions(+) create mode 100644 .claude/settings.json create mode 100644 .tai-manifest.tn create mode 100644 CLAUDE.md create mode 100644 README.md create mode 100644 index.html create mode 100644 src/components/Footer.tsx create mode 100644 src/components/Header.tsx create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 src/pages/Index.tsx diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000..dba91da --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,13 @@ +{ + "permissions": { + "allow": [ + "Read", + "Write", + "Edit", + "Bash", + "Glob", + "Grep" + ] + }, + "model": "claude-sonnet-4-20250514" +} \ No newline at end of file diff --git a/.tai-manifest.tn b/.tai-manifest.tn new file mode 100644 index 0000000..0a7b5e7 --- /dev/null +++ b/.tai-manifest.tn @@ -0,0 +1,13 @@ +# .tai-manifest.tn — resume (vite-react) +# Auto-generated by tAI manifest generator +# tN (tAI Notation) — compact template encoding + +σ:template|resume|vite-react|8 files|23KB +σ:docs|CLAUDE.md|783B|imports:1 +σ:docs|README.md|35B +σ:entry|index.html|275B|title="Resume" +σ:component|src/components/Footer.tsx|248B +σ:component|src/components/Header.tsx|436B|imports:1|uses:[Button] +σ:style|src/index.css|59B +σ:bootstrap|src/main.tsx|236B|imports:3|uses:[React,App] +σ:page|src/pages/Index.tsx|21375B|imports:10 diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..a3357c1 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,23 @@ +# Jordan Lee +Personal resume/CV with experience, projects, education, skills, certifications +Stack: React 18 / TypeScript / Vite / Tailwind CSS / shadcn/ui +Pages: Index (single page) +Palette: clean minimal with primary accent + +## Files +- src/pages/Index.tsx (21KB) +- src/components/Header.tsx (0KB) +- src/components/Footer.tsx (0KB) + +## Imports +UI: @/components/ui/{button,card,badge,input,textarea,tabs,accordion,dialog,sheet} +Icons: lucide-react +Toast: import { toast } from "sonner" +Theme: ThemeToggle in headers (next-themes) +Router: react-router-dom BrowserRouter + +## Rules +- MODIFY existing files — never rebuild from scratch +- Pages import Header + Footer from @/components/ +- Tailwind only — no inline styles +- Use existing shadcn components — don't create custom ones diff --git a/README.md b/README.md new file mode 100644 index 0000000..341bdd6 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# template-resume + +Template: resume \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..250fa55 --- /dev/null +++ b/index.html @@ -0,0 +1,12 @@ + + + + + + Resume + + +
+ + + diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx new file mode 100644 index 0000000..29d9ca1 --- /dev/null +++ b/src/components/Footer.tsx @@ -0,0 +1,9 @@ +export default function Footer() { + return ( + + ); +} diff --git a/src/components/Header.tsx b/src/components/Header.tsx new file mode 100644 index 0000000..497bffd --- /dev/null +++ b/src/components/Header.tsx @@ -0,0 +1,12 @@ +import { Button } from "@/components/ui/button"; + +export default function Header() { + return ( +
+
+ Jordan Lee + +
+
+ ); +} diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/src/index.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..9b67590 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,10 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "./App"; +import "./index.css"; + +ReactDOM.createRoot(document.getElementById("root")!).render( + + + +); diff --git a/src/pages/Index.tsx b/src/pages/Index.tsx new file mode 100644 index 0000000..80307db --- /dev/null +++ b/src/pages/Index.tsx @@ -0,0 +1,404 @@ +import { useState, useEffect } from "react"; +import { toast } from "sonner"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; +import { Badge } from "@/components/ui/badge"; +import { Input } from "@/components/ui/input"; +import { Textarea } from "@/components/ui/textarea"; +import { Progress } from "@/components/ui/progress"; +import { Sheet, SheetContent, SheetTrigger } from "@/components/ui/sheet"; +import { + Menu, ArrowRight, Mail, Linkedin, Github, Twitter, Download, + ExternalLink, MapPin, Calendar, Briefcase, GraduationCap, Award, + Figma, Globe, Database, Terminal, Layers, Cpu, Send, CheckCircle +} from "lucide-react"; +import { ThemeToggle } from "@/components/ThemeToggle"; + +export default function ResumePage() { + const [mobileOpen, setMobileOpen] = useState(false); + const [scrolled, setScrolled] = useState(false); + useEffect(() => { + const onScroll = () => setScrolled(window.scrollY > 20); + window.addEventListener("scroll", onScroll); + return () => window.removeEventListener("scroll", onScroll); + }, []); + + const navLinks = [ + { label: "Experience", href: "#experience" }, + { label: "Education", href: "#education" }, + { label: "Skills", href: "#skills" }, + { label: "Contact", href: "#contact" }, + ]; + + const certifications = [ + { name: "AWS Solutions Architect", issuer: "Amazon Web Services", year: "2024" }, + { name: "Google Cloud Professional", issuer: "Google Cloud", year: "2023" }, + { name: "PMP Certified", issuer: "Project Management Institute", year: "2022" }, + ]; + + const experience = [ + { + company: "Stripe", role: "Senior Software Engineer", dates: "2022 – Present", + bullets: ["Led the redesign of the merchant dashboard serving 2M+ users, improving task completion by 35%.", "Architected a real-time analytics pipeline processing 500K events per second.", "Mentored a team of 6 engineers and established code review best practices."], + }, + { + company: "Vercel", role: "Software Engineer", dates: "2020 – 2022", + bullets: ["Built core deployment infrastructure handling 10M+ builds per month.", "Shipped the Edge Functions runtime adopted by 50K+ projects in first quarter."], + }, + { + company: "Airbnb", role: "Frontend Engineer", dates: "2018 – 2020", + bullets: ["Developed the new search experience increasing booking conversion by 18%.", "Created a shared component library used across 12 product teams."], + }, + { + company: "Freelance", role: "Web Developer", dates: "2016 – 2018", + bullets: ["Delivered 30+ client projects ranging from e-commerce to SaaS dashboards.", "Achieved a 100% on-time delivery rate with 5-star average client rating."], + }, + ]; + + const projects = [ + { title: "FinTrack Dashboard", desc: "Real-time financial analytics platform with interactive charts and alerts.", tags: ["React", "TypeScript", "D3.js"], gradient: "from-violet-500 to-indigo-600" }, + { title: "MedConnect", desc: "Telemedicine platform connecting patients with specialists worldwide.", tags: ["Next.js", "Prisma", "WebRTC"], gradient: "from-rose-500 to-orange-500" }, + { title: "EcoShop", desc: "Sustainable e-commerce marketplace with carbon-neutral shipping tracker.", tags: ["Remix", "Stripe", "PostgreSQL"], gradient: "from-emerald-500 to-teal-500" }, + ]; + + const technicalSkills = [ + { name: "React / Next.js", value: 95 }, + { name: "TypeScript", value: 90 }, + { name: "Node.js", value: 85 }, + { name: "Python", value: 88 }, + { name: "PostgreSQL", value: 80 }, + { name: "AWS / Cloud", value: 75 }, + ]; + + const tools = [ + { icon: Figma, label: "Figma" }, + { icon: Globe, label: "Vercel" }, + { icon: Database, label: "Supabase" }, + { icon: Terminal, label: "Docker" }, + { icon: Layers, label: "Terraform" }, + { icon: Cpu, label: "GitHub" }, + ]; + + return ( +
+ {/* ── HEADER ── */} +
+
+ + Taylor Morgan + +
+ + +
+ + + + + + + + +
+
+ + {/* ── HERO ── */} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ Taylor Morgan +

+

Senior Full-Stack Engineer

+

+ Passionate engineer with 8+ years building scalable web applications. I love clean architecture, great UX, and shipping products that make a difference. +

+
+ + + + +
+
+
+
+
+ + {/* ── EXPERIENCE ── */} +
+
+
+ +

Experience

+
+
+ {experience.map((job, i) => ( +
+
+
+

{job.company}

+ {job.dates} +
+

{job.role}

+
    + {job.bullets.map((b, j) => ( +
  • + + {b} +
  • + ))} +
+
+ ))} +
+
+
+ + {/* ── PROJECTS ── */} +
+
+
+ +

Featured Projects

+
+
+ {projects.map((p, i) => ( + +
+
+
+
+ + {p.title} + + + {p.desc} +
+ {p.tags.map((tag, j) => ( + {tag} + ))} +
+ + View Project + +
+ + ))} +
+
+
+ + {/* ── EDUCATION ── */} +
+
+
+ +

Education

+
+
+ + + + Stanford University + + M.S. Computer Science + + + 2014 – 2016 + With Distinction + + + + + + UC Berkeley + + B.S. Computer Science + + + 2010 – 2014 + Magna Cum Laude + + +
+
+

+ Certifications +

+
+ {["AWS Solutions Architect", "Google Cloud Professional", "PMP Certified"].map((cert, i) => ( + {cert} + ))} +
+
+
+
+ + {/* ── SKILLS ── */} +
+
+

Skills & Tools

+
+ {/* Technical */} +
+

+ Development +

+
+ {technicalSkills.map((s, i) => ( +
+
+ {s.name} + {s.value}% +
+
+
+
+
+ ))} +
+
+ {/* Soft Skills + Tools */} +
+
+

+ Design & Soft Skills +

+
+ {["Leadership", "Communication", "Problem Solving", "Mentoring"].map((s, i) => ( + {s} + ))} +
+
+
+

Tools & Platforms

+
+ {tools.map((t, i) => ( +
+ + {t.label} +
+ ))} +
+
+
+
+
+
+ + {/* ── CERTIFICATIONS ── */} +
+
+
+ +

Certifications & Awards

+
+
+ {certifications.map((c, i) => ( + + +
+ +
+
+ + {c.name} + + {c.issuer} +
+
+ + {c.year} + +
+ ))} +
+
+
+ + {/* ── CONTACT ── */} +
+
+

Let's Connect

+

Have a project in mind? I’d love to hear from you.

+ + taylor@example.com + + + +
{ e.preventDefault(); toast.success("Message sent! I'll get back to you within 24 hours."); e.currentTarget.reset(); }} className="text-left space-y-4"> + + +