Initial: resume template via tAI

This commit is contained in:
Joe Wee
2026-05-21 12:27:28 +01:00
commit 62cfb66197
10 changed files with 502 additions and 0 deletions
+13
View File
@@ -0,0 +1,13 @@
{
"permissions": {
"allow": [
"Read",
"Write",
"Edit",
"Bash",
"Glob",
"Grep"
]
},
"model": "claude-sonnet-4-20250514"
}
+13
View File
@@ -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
+23
View File
@@ -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
+3
View File
@@ -0,0 +1,3 @@
# template-resume
Template: resume
+12
View File
@@ -0,0 +1,12 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Resume</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
+9
View File
@@ -0,0 +1,9 @@
export default function Footer() {
return (
<footer className="border-t py-8">
<div className="container text-center text-sm text-muted-foreground">
&copy; 2026 Jordan Lee. All rights reserved.
</div>
</footer>
);
}
+12
View File
@@ -0,0 +1,12 @@
import { Button } from "@/components/ui/button";
export default function Header() {
return (
<header className="sticky top-0 z-50 w-full border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60">
<div className="container flex h-16 items-center justify-between">
<span className="text-xl font-bold">Jordan Lee</span>
<Button>Get Started</Button>
</div>
</header>
);
}
+3
View File
@@ -0,0 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
+10
View File
@@ -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(
<React.StrictMode>
<App />
</React.StrictMode>
);
+404
View File
@@ -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 (
<div className="min-h-screen bg-background text-foreground antialiased">
{/* ── HEADER ── */}
<header
className={\`fixed top-0 inset-x-0 z-50 transition-all duration-300 \${
scrolled
? "bg-background/95 backdrop-blur-lg border-b shadow-sm"
: "bg-transparent"
}\`}
>
<div className="mx-auto max-w-5xl flex items-center justify-between px-6 py-4">
<a href="/" className="text-lg font-bold tracking-tight">
Taylor Morgan
</a>
<div className="hidden md:flex items-center gap-8">
<nav className="flex items-center gap-8">
{navLinks.map((l) => (
<a
key={l.href}
href={l.href}
className="text-sm text-muted-foreground hover:text-foreground transition-colors"
>
{l.label}
</a>
))}
</nav>
<ThemeToggle />
</div>
<Sheet open={mobileOpen} onOpenChange={setMobileOpen}>
<SheetTrigger asChild className="md:hidden">
<Button variant="ghost" size="icon"><Menu className="h-5 w-5" /></Button>
</SheetTrigger>
<SheetContent side="right" className="w-72">
<nav className="mt-8 flex flex-col gap-4">
{navLinks.map((l) => (
<a key={l.href} href={l.href} className="text-lg font-medium" onClick={() => setMobileOpen(false)}>
{l.label}
</a>
))}
<ThemeToggle />
</nav>
</SheetContent>
</Sheet>
</div>
</header>
{/* ── HERO ── */}
<section className="relative pt-32 pb-24 overflow-hidden">
<div className="absolute inset-0 pointer-events-none">
<div className="absolute top-1/4 right-1/4 w-80 h-80 rounded-full bg-primary/8 blur-[100px]" />
<div className="absolute bottom-0 left-1/3 w-64 h-64 rounded-full bg-violet-500/6 blur-[80px]" />
</div>
<div className="relative z-10 mx-auto max-w-5xl px-6">
<div className="flex flex-col sm:flex-row items-center sm:items-start gap-8 animate-fade-up">
<div className="relative w-32 h-32 shrink-0">
<div className="absolute inset-0 rounded-full bg-gradient-to-br from-primary via-violet-500 to-rose-500 shadow-xl ring-4 ring-primary/20 animate-pulse" />
<div className="absolute inset-0 rounded-full opacity-20" style={{ backgroundImage: "radial-gradient(circle, currentColor 1px, transparent 1px)", backgroundSize: "8px 8px" }} />
<div className="absolute bottom-2 right-2 w-4 h-4 rounded-full bg-emerald-500 ring-2 ring-background" />
<div className="absolute -bottom-1 -left-1 w-3 h-3 rounded-full bg-violet-400 border-2 border-background" />
</div>
<div className="text-center sm:text-left">
<h1 className="text-5xl md:text-7xl font-black tracking-tighter leading-[1.05]">
Taylor Morgan
</h1>
<p className="mt-3 text-xl text-muted-foreground leading-relaxed">Senior Full-Stack Engineer</p>
<p className="mt-4 text-muted-foreground leading-relaxed max-w-lg">
Passionate engineer with 8+ years building scalable web applications. I love clean architecture, great UX, and shipping products that make a difference.
</p>
<div className="mt-6 flex flex-wrap items-center justify-center sm:justify-start gap-3">
<Button variant="outline" size="icon" asChild className="hover:text-primary hover:scale-110 transition-all">
<a href="mailto:taylor@example.com"><Mail className="h-4 w-4" /></a>
</Button>
<Button variant="outline" size="icon" asChild className="hover:text-primary hover:scale-110 transition-all">
<a href="#"><Linkedin className="h-4 w-4" /></a>
</Button>
<Button variant="outline" size="icon" asChild className="hover:text-primary hover:scale-110 transition-all">
<a href="#"><Github className="h-4 w-4" /></a>
</Button>
<Button className="ml-2">
<Download className="mr-2 h-4 w-4" /> Download CV
</Button>
</div>
</div>
</div>
</div>
</section>
{/* ── EXPERIENCE ── */}
<section id="experience" className="py-24">
<div className="mx-auto max-w-5xl px-6">
<div className="flex items-center gap-3 mb-12 animate-fade-up">
<Briefcase className="h-6 w-6 text-primary" />
<h2 className="text-3xl sm:text-4xl font-bold tracking-tight">Experience</h2>
</div>
<div className="relative border-l-2 border-primary/20 ml-4">
{experience.map((job, i) => (
<div
key={i}
className={\`relative pl-8 pb-12 last:pb-0 rounded-lg hover:bg-muted/50 transition-colors \${i % 2 === 1 ? "bg-muted/30 -ml-4 pl-12 py-8 rounded-r-xl" : ""}\`}
>
<div className="absolute -left-[9px] top-1 w-4 h-4 rounded-full bg-primary ring-4 ring-primary/20 border-2 border-background" />
<div className="flex flex-wrap items-center gap-3 mb-2">
<h3 className="font-semibold text-lg">{job.company}</h3>
<Badge variant="outline" className="text-xs">{job.dates}</Badge>
</div>
<p className="text-primary font-medium text-sm mb-3">{job.role}</p>
<ul className="space-y-1.5 border-l-2 border-primary/10 pl-3">
{job.bullets.map((b, j) => (
<li key={j} className="text-sm text-muted-foreground flex items-start gap-2">
<span className="mt-1.5 w-1.5 h-1.5 rounded-full bg-primary/40 shrink-0" />
{b}
</li>
))}
</ul>
</div>
))}
</div>
</div>
</section>
{/* ── PROJECTS ── */}
<section className="py-24 bg-muted/30">
<div className="mx-auto max-w-5xl px-6">
<div className="flex items-center gap-3 mb-12 animate-fade-up">
<Layers className="h-6 w-6 text-primary" />
<h2 className="text-3xl sm:text-4xl font-bold tracking-tight">Featured Projects</h2>
</div>
<div className="grid md:grid-cols-3 gap-6 stagger">
{projects.map((p, i) => (
<Card key={i} className="group overflow-hidden hover-lift hover:shadow-lg transition-all duration-300 backdrop-blur-sm bg-card/80 border-border/50">
<div className={\`aspect-video bg-gradient-to-br \${p.gradient} rounded-t-xl flex items-center justify-center relative overflow-hidden\`}>
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-24 h-24 rounded-full bg-white/10 blur-2xl" />
<div className="w-12 h-12 rounded-xl bg-white/20 backdrop-blur group-hover:scale-110 transition-transform relative z-10" />
</div>
<CardHeader className="pb-2">
<CardTitle className="text-base">{p.title}</CardTitle>
</CardHeader>
<CardContent>
<CardDescription className="text-sm leading-relaxed mb-3">{p.desc}</CardDescription>
<div className="flex flex-wrap gap-1.5 mb-3">
{p.tags.map((tag, j) => (
<Badge key={j} variant="secondary" className="text-xs">{tag}</Badge>
))}
</div>
<a href="#" className="inline-flex items-center gap-1.5 text-sm font-medium text-primary hover:gap-3 transition-all">
View Project <ArrowRight className="h-3.5 w-3.5" />
</a>
</CardContent>
</Card>
))}
</div>
</div>
</section>
{/* ── EDUCATION ── */}
<section id="education" className="py-24">
<div className="mx-auto max-w-5xl px-6">
<div className="flex items-center gap-3 mb-12 animate-fade-up">
<GraduationCap className="h-6 w-6 text-primary" />
<h2 className="text-3xl sm:text-4xl font-bold tracking-tight">Education</h2>
</div>
<div className="grid sm:grid-cols-2 gap-6 mb-10">
<Card className="hover-lift hover:shadow-md transition-shadow backdrop-blur-sm bg-card/80">
<CardHeader>
<CardTitle className="text-base flex items-center gap-2">
<GraduationCap className="h-4 w-4 text-primary" /> Stanford University
</CardTitle>
<CardDescription className="text-muted-foreground leading-relaxed">M.S. Computer Science</CardDescription>
</CardHeader>
<CardContent className="flex flex-wrap items-center gap-2">
<Badge variant="outline" className="text-xs">2014 2016</Badge>
<Badge className="text-xs">With Distinction</Badge>
</CardContent>
</Card>
<Card className="hover-lift hover:shadow-md transition-shadow backdrop-blur-sm bg-card/80">
<CardHeader>
<CardTitle className="text-base flex items-center gap-2">
<GraduationCap className="h-4 w-4 text-primary" /> UC Berkeley
</CardTitle>
<CardDescription className="text-muted-foreground leading-relaxed">B.S. Computer Science</CardDescription>
</CardHeader>
<CardContent className="flex flex-wrap items-center gap-2">
<Badge variant="outline" className="text-xs">2010 2014</Badge>
<Badge className="text-xs">Magna Cum Laude</Badge>
</CardContent>
</Card>
</div>
<div>
<h3 className="font-semibold mb-3 flex items-center gap-2">
<Award className="h-5 w-5 text-primary" /> Certifications
</h3>
<div className="flex flex-wrap gap-2">
{["AWS Solutions Architect", "Google Cloud Professional", "PMP Certified"].map((cert, i) => (
<Badge key={i} variant="secondary" className="px-3 py-1">{cert}</Badge>
))}
</div>
</div>
</div>
</section>
{/* ── SKILLS ── */}
<section id="skills" className="py-24 bg-muted/30">
<div className="mx-auto max-w-5xl px-6">
<h2 className="text-3xl sm:text-4xl font-bold tracking-tight mb-12 animate-fade-up">Skills & Tools</h2>
<div className="grid lg:grid-cols-3 gap-12">
{/* Technical */}
<div className="lg:col-span-1">
<h3 className="font-semibold mb-6 flex items-center gap-2 text-sm uppercase tracking-wider text-muted-foreground">
<Terminal className="h-4 w-4 text-primary" /> Development
</h3>
<div className="space-y-5">
{technicalSkills.map((s, i) => (
<div key={i}>
<div className="flex justify-between mb-1.5">
<span className="text-sm font-medium">{s.name}</span>
<span className="text-xs text-muted-foreground tabular-nums">{s.value}%</span>
</div>
<div className="h-2 rounded-full bg-muted overflow-hidden">
<div className="h-full rounded-full bg-gradient-to-r from-primary via-violet-500 to-rose-500 transition-all duration-500" style={{ width: \`\${s.value}%\` }} />
</div>
</div>
))}
</div>
</div>
{/* Soft Skills + Tools */}
<div className="lg:col-span-2 space-y-10">
<div>
<h3 className="font-semibold mb-4 flex items-center gap-2 text-sm uppercase tracking-wider text-muted-foreground">
<Figma className="h-4 w-4 text-primary" /> Design & Soft Skills
</h3>
<div className="flex flex-wrap gap-2">
{["Leadership", "Communication", "Problem Solving", "Mentoring"].map((s, i) => (
<Badge key={i} variant="outline" className="px-4 py-1.5 text-sm">{s}</Badge>
))}
</div>
</div>
<div>
<h3 className="font-semibold mb-4 text-sm uppercase tracking-wider text-muted-foreground">Tools & Platforms</h3>
<div className="grid grid-cols-3 sm:grid-cols-6 gap-4 stagger">
{tools.map((t, i) => (
<div key={i} className="flex flex-col items-center gap-2 p-3 rounded-xl bg-background border hover:border-primary/40 hover:shadow-sm transition-all">
<t.icon className="h-5 w-5 text-muted-foreground" />
<span className="text-xs font-medium text-center">{t.label}</span>
</div>
))}
</div>
</div>
</div>
</div>
</div>
</section>
{/* ── CERTIFICATIONS ── */}
<section className="py-24">
<div className="mx-auto max-w-5xl px-6">
<div className="flex items-center gap-3 mb-12 animate-fade-up">
<Award className="h-6 w-6 text-primary" />
<h2 className="text-3xl sm:text-4xl font-bold tracking-tight">Certifications & Awards</h2>
</div>
<div className="grid sm:grid-cols-3 gap-6 stagger">
{certifications.map((c, i) => (
<Card key={i} className="hover-lift hover:shadow-lg hover:shadow-primary/5 transition-all backdrop-blur-sm bg-card/80 border-border/50">
<CardHeader className="flex flex-row items-start gap-4">
<div className="w-12 h-12 rounded-xl bg-gradient-to-br from-primary/20 to-violet-500/20 flex items-center justify-center shrink-0">
<Award className="h-6 w-6 text-primary" />
</div>
<div>
<CardTitle className="text-base flex items-center gap-1.5">
{c.name} <CheckCircle className="h-4 w-4 text-emerald-500" />
</CardTitle>
<CardDescription className="text-muted-foreground leading-relaxed">{c.issuer}</CardDescription>
</div>
</CardHeader>
<CardContent>
<Badge variant="outline" className="text-xs">{c.year}</Badge>
</CardContent>
</Card>
))}
</div>
</div>
</section>
{/* ── CONTACT ── */}
<section id="contact" className="py-24">
<div className="mx-auto max-w-xl px-6 text-center">
<h2 className="text-3xl sm:text-4xl font-bold tracking-tight mb-2 animate-fade-up">Let's Connect</h2>
<p className="text-muted-foreground leading-relaxed mb-2">Have a project in mind? Id love to hear from you.</p>
<a href="mailto:taylor@example.com" className="inline-flex items-center gap-2 text-primary font-medium hover:underline">
<Mail className="h-4 w-4 shadow-lg shadow-primary/10" /> taylor@example.com
</a>
<Card className="mt-8 backdrop-blur-sm bg-card/80 border-border/50">
<CardContent className="pt-6">
<form onSubmit={(e) => { e.preventDefault(); toast.success("Message sent! I'll get back to you within 24 hours."); e.currentTarget.reset(); }} className="text-left space-y-4">
<Input placeholder="Your Name" className="h-11" required />
<Input placeholder="Your Email" type="email" className="h-11" required />
<Textarea placeholder="Your message..." className="min-h-[120px] resize-none" required />
<Button type="submit" className="w-full h-11 active:scale-[0.97] transition-transform">
<Send className="mr-2 h-4 w-4" /> Send Message
</Button>
<p className="text-xs text-muted-foreground text-center">Typically responds within 24 hours</p>
</form>
</CardContent>
</Card>
</div>
</section>
{/* ── FOOTER ── */}
<footer className="py-12 border-t">
<div className="mx-auto max-w-5xl px-6 text-center">
<p className="text-muted-foreground mb-4">Let's build something great together.</p>
<div className="flex justify-center gap-2 mb-6">
{[Github, Linkedin, Twitter, Mail].map((Icon, i) => (
<Button key={i} variant="ghost" size="icon" className="h-9 w-9 text-muted-foreground hover:text-foreground">
<Icon className="h-4 w-4" />
</Button>
))}
</div>
<p className="text-sm text-muted-foreground">© 2026 Taylor Morgan. All rights reserved.</p>
</div>
</footer>
</div>
);
}