Skip to content

Commit

Permalink
(Mostly) finished first draft of website
Browse files Browse the repository at this point in the history
  • Loading branch information
jarydo committed Sep 14, 2024
1 parent 645fc3e commit e6208b8
Show file tree
Hide file tree
Showing 15 changed files with 419 additions and 82 deletions.
Binary file added public/Jaryd_Diamond_Resume.pdf
Binary file not shown.
Binary file added public/fck.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions public/github.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions public/linkedin.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/resonant.webp
Binary file not shown.
17 changes: 17 additions & 0 deletions public/resume.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions public/x.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
133 changes: 62 additions & 71 deletions src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,28 +1,46 @@
import { useState, useEffect } from 'react';
import { Button } from "@/components/ui/button";
import { Label } from './components/ui/label';
import { Switch } from './components/ui/switch';
// import { Label } from './components/ui/label';
// import { Switch } from './components/ui/switch';
import Home from './components/sections/Home';
import Experience from './components/sections/Experience';
import Contact from './components/sections/Contact';
import Projects from './components/sections/Projects';

function App() {
const [index, setIndex] = useState(0);
const [title, setTitle] = useState('');
const fullTitle = 'Jaryd.';

const [activeTab, setActiveTab] = useState('Home');
const navItems = ['Home', 'Experience', 'Projects', 'Contact'];
const [activeTab, setActiveTab] = useState('home');
const navItems = [
{ id: 'home', label: 'Home' },
{ id: 'experience', label: 'Experience' },
{ id: 'projects', label: 'Projects' },
{ id: 'contact', label: 'Contact' },
]

const [recruiterMode, setRecruiterMode] = useState(true);
// const [recruiterMode, setRecruiterMode] = useState(true);

// TODO: Fix this reloading on navbar redirect
useEffect(() => {
if (index < fullTitle.length) {
const timeout = setTimeout(() => {
setTitle((prevTitle) => prevTitle + fullTitle[index])
setIndex((prevIndex) => prevIndex + 1)
}, 300) // Adjust this value to change the typing speed
const timeout = setTimeout(() => {
setTitle((prevTitle) => prevTitle + fullTitle[index])
setIndex((prevIndex) => prevIndex + 1)
}, 300) // Adjust this value to change the typing speed

return () => clearTimeout(timeout)
return () => clearTimeout(timeout)
}
}, [index])
}, [index])

const handleNavClick = (id: string) => {
setActiveTab(id)
const element = document.getElementById(id)
if (element) {
element.scrollIntoView({ behavior: 'smooth' })
}
}

const Background = ({ children } : { children: React.ReactNode }) => {
return (
Expand All @@ -49,72 +67,45 @@ function App() {
)
}

const Title = () => {
const NavBar = () => {
return (
<span className="font-bold text-slate-200">
{title}
<span className="animate-pulse">|</span>
</span>
<nav className="fixed top-10 left-52 right-52 z-100 bg-white bg-opacity-10 backdrop-filter backdrop-blur-lg rounded-full p-1 flex justify-between items-center">
{navItems.map((item) => (
<Button
key={item.id}
variant="ghost"
className={`text-lg px-6 py-6 rounded-full transition-colors duration-200 ${
activeTab === item.id
? 'text-blue-500 bg-white hover:text-blue-500'
: 'text-white hover:bg-white hover:bg-opacity-20 hover:text-white'
}`}
onClick={() => handleNavClick(item.id)}
>
{item.label}
</Button>
))}
{/* <div className="flex items-center space-x-2 mx-4">
<Switch
id="recruiter-mode"
checked={recruiterMode}
onCheckedChange={setRecruiterMode}
className="data-[state=checked]:bg-purple-600"
/>
<Label htmlFor="recruiter-mode" className="text-lg text-white">
Recruiter Mode
</Label>
</div> */}
</nav>
)
}

return (
<Background>
<nav className="bg-white bg-opacity-10 backdrop-filter backdrop-blur-lg rounded-full p-1 flex justify-between items-center">
{navItems.map((item) => (
<Button
key={item}
variant="ghost"
className={`text-sm px-4 py-2 rounded-full transition-colors duration-200 ${
activeTab === item
? 'text-blue-500 bg-white hover:text-blue-500'
: 'text-white hover:bg-white hover:bg-opacity-20 hover:text-white'
}`}
onClick={() => setActiveTab(item)}
>
{item}
</Button>
))}
{/* <Button
variant="secondary"
className="bg-white bg-opacity-20 text-white hover:bg-opacity-30 rounded-full px-4 py-2 text-sm"
>
Try a new style
</Button> */}
<div className="flex items-center space-x-2 mx-4">
<Switch
id="recruiter-mode"
checked={recruiterMode}
onCheckedChange={setRecruiterMode}
className="data-[state=checked]:bg-purple-600"
/>
<Label htmlFor="recruiter-mode" className="text-sm text-white">
{recruiterMode ? 'Recruiter Mode' : 'Fun Mode'}
</Label>
</div>
</nav>

<main className="text-center flex flex-col gap-4 text-white">
<h1 className="text-8xl font-bold">Introducing... <Title /></h1>
<h1 className="text-6xl font-bold">Your next intern.</h1>
<p className="text-2xl">Developer, community builder, filmmaker, amateur musician - you can guarantee his value is <b>not just code.</b></p>
</main>

<footer>
<div className="max-w-4xl mx-auto">
<div className="text-center mb-4">
<span className="text-white text-lg">★★★★★</span>
<p className="text-lg text-gray-300 mt-2">Trusted by the following companies:</p>
</div>
<div className="flex justify-center space-x-10 opacity-50">
<img src="/arctic_wolf.png" alt="Arctic Wolf" className="h-10" />
<img src="/99_ravens.png" alt="99 Ravens" className="h-10" />
<img src="/horizn.png" alt="Horizn" className="h-10" />
<img src="/arctic_ai.png" alt="Arctic AI" className="h-10" />
<img src="/mikobyte.webp" alt="Mikobyte Solutions" className="h-10" />
</div>
</div>
</footer>
<NavBar />
<Home title={title}/>
<Experience />
<Projects />
<Contact />
</Background>
)
}
Expand Down
25 changes: 25 additions & 0 deletions src/components/sections/Contact.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import * as resume from '../../resume.json';

const Contact = () => {
return (
<section id="contact" className="min-h-screen flex flex-col items-center justify-center">
<h2 className="text-6xl font-bold text-center text-white mb-20">Get in Touch</h2>
<div className="flex gap-10">
<a href={resume.contact.linkedin} target="_blank" rel="noopener noreferrer" className="flex items-center text-gray-600 hover:text-blue-500 transition-colors">
<img src="/linkedin.svg" alt="LinkedIn" className="w-20 h-20" />
</a>
<a href={resume.contact.github} target="_blank" rel="noopener noreferrer" className="flex items-center text-gray-600 hover:text-blue-500 transition-colors">
<img src="/github.svg" alt="Github" className="w-20 h-20" />
</a>
<a href={resume.contact.twitter} target="_blank" rel="noopener noreferrer" className="flex items-center text-gray-600 hover:text-blue-500 transition-colors">
<img src="/x.svg" alt="X" className="w-20 h-20" />
</a>
<a href="/Jaryd_Diamond_Resume.pdf" target="_blank" rel="noopener noreferrer" className="flex items-center text-gray-600 hover:text-blue-500 transition-colors">
<img src="/resume.svg" alt="Resume" className="w-20 h-20" />
</a>
</div>
</section>
)
}

export default Contact;
42 changes: 42 additions & 0 deletions src/components/sections/Experience.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import * as resume from '../../resume.json';
import { Card, CardContent } from '../ui/card';
import { Badge } from '../ui/badge';

// TODO: add skills to each position, generate latex resume from json
const Experience = () => {
return (
<section id="experience" className="min-h-screen flex flex-col items-center justify-center gap-4 pt-32">
<h2 className="text-6xl font-bold text-center text-white mb-8">Work Experience</h2>
{resume.experience.map((item) => {
return (
<Card key={item.company} className="overflow-hidden">
<div className="flex flex-col md:flex-row">
<div className="md:w-1/3 bg-blue-100 p-6">
<h3 className="text-2xl font-bold text-blue-800">{item.company}</h3>
<div className="text-lg font-semibold text-blue-600 mt-2">{item.title}</div>
<div className="text-sm text-blue-500 mt-2">
{item.startDate} - {item.endDate}
</div>
<div className="text-sm text-blue-500 mt-1">{item.location}</div>
<div className="flex gap-2 mt-2">
{item.technologies.map((tech, techIndex) => (
<Badge key={techIndex} variant="secondary">{tech}</Badge>
))}
</div>
</div>
<CardContent className="md:w-2/3 pt-6">
<ol className="list-disc pl-5 space-y-2">
{item.recruiter_description.map((desc, descIndex) => (
<li key={descIndex} className="text-gray-700">{desc}</li>
))}
</ol>
</CardContent>
</div>
</Card>
)
})}
</section>
)
}

export default Experience;
38 changes: 38 additions & 0 deletions src/components/sections/Home.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
const Home = ({ title }: { title: string}) => {
const Title = () => {
return (
<span className="font-bold text-slate-200">
{title}
<span className="animate-pulse">|</span>
</span>
)
}

return (
<section id="home" className="min-h-screen flex flex-col items-center justify-evenly mt-20">
<main className="text-center flex flex-col gap-4 text-white">
<h1 className="text-9xl font-bold">Introducing... <Title /></h1>
<h1 className="text-7xl font-bold">Your next hire.</h1>
<p className="text-2xl mt-10">Developer, community builder, filmmaker, amateur musician - you can guarantee his value is <b>not just code.</b></p>
</main>

<footer>
<div className="max-w-4xl mx-auto">
<div className="text-center mb-4">
<span className="text-white text-lg">★★★★★</span>
<p className="text-xl text-gray-300 mt-2">Trusted by the following companies:</p>
</div>
<div className="flex justify-center space-x-10">
<a href="https://arcticwolf.com/" target="_blank" className="opacity-50 hover:opacity-100"><img src="/arctic_wolf.png" alt="Arctic Wolf" className="h-10" /></a>
<a href="https://99ravens.ai/" target="_blank" className="opacity-50 hover:opacity-100"><img src="/99_ravens.png" alt="99 Ravens" className="h-10" /></a>
<a href="https://horizn.com/" target="_blank" className="opacity-50 hover:opacity-100"><img src="/horizn.png" alt="Horizn" className="h-10" /></a>
<a href="https://www.arcticai.co/" target="_blank" className="opacity-50 hover:opacity-100"><img src="/arctic_ai.png" alt="Arctic AI" className="h-10" /></a>
<a href="https://www.mikobyte.com/" target="_blank" className="opacity-50 hover:opacity-100"><img src="/mikobyte.webp" alt="Mikobyte Solutions" className="h-10" /></a>
</div>
</div>
</footer>
</section>
)
}

export default Home;
50 changes: 50 additions & 0 deletions src/components/sections/Projects.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { Card, CardHeader, CardContent, CardTitle, CardDescription, CardFooter } from '../ui/card';
import { Badge } from '../ui/badge';
import { Button } from '../ui/button';
import * as resume from '../../resume.json';

const Projects = () => {
return (
<section id="projects" className="min-h-screen flex items-center justify-center pt-32">
<div className="max-w-6xl mx-auto px-4">
<h2 className="text-6xl font-bold text-center text-white mb-8">Selected Projects</h2>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{resume.projects.map((project, index) => (
<Card key={index} className="flex flex-col">
<CardHeader>
<img src={project.image_url} alt={project.name} className="w-full h-48 object-cover rounded-t-lg" />
</CardHeader>
<CardContent className="flex-grow">
<CardTitle className="text-xl mb-2">{project.name}</CardTitle>
<CardDescription className="text-gray-600 mb-4">{project.description}</CardDescription>
<div className="flex flex-wrap gap-2 mb-4">
{project.technologies.map((tech, techIndex) => (
<Badge key={techIndex} variant="secondary">{tech}</Badge>
))}
</div>
</CardContent>
<CardFooter className="flex justify-between">
<Button variant="outline" size="sm" asChild>
<a href={project.github_url} target="_blank" rel="noopener noreferrer">
{/* <Github className="w-4 h-4 mr-2" /> */}
GitHub
</a>
</Button>
{project.live_url && (
<Button variant="outline" size="sm" asChild>
<a href={project.live_url} target="_blank" rel="noopener noreferrer">
{/* <ExternalLink className="w-4 h-4 mr-2" /> */}
Live Demo
</a>
</Button>
)}
</CardFooter>
</Card>
))}
</div>
</div>
</section>
)
}

export default Projects;
36 changes: 36 additions & 0 deletions src/components/ui/badge.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import * as React from "react"
import { cva, type VariantProps } from "class-variance-authority"

import { cn } from "@/lib/utils"

const badgeVariants = cva(
"inline-flex items-center rounded-full border border-neutral-200 px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-neutral-950 focus:ring-offset-2 dark:border-neutral-800 dark:focus:ring-neutral-300",
{
variants: {
variant: {
default:
"border-transparent bg-neutral-900 text-neutral-50 hover:bg-neutral-900/80 dark:bg-neutral-50 dark:text-neutral-900 dark:hover:bg-neutral-50/80",
secondary:
"border-transparent bg-neutral-100 text-neutral-900 hover:bg-neutral-100/80 dark:bg-neutral-800 dark:text-neutral-50 dark:hover:bg-neutral-800/80",
destructive:
"border-transparent bg-red-500 text-neutral-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-neutral-50 dark:hover:bg-red-900/80",
outline: "text-neutral-950 dark:text-neutral-50",
},
},
defaultVariants: {
variant: "default",
},
}
)

export interface BadgeProps
extends React.HTMLAttributes<HTMLDivElement>,
VariantProps<typeof badgeVariants> {}

function Badge({ className, variant, ...props }: BadgeProps) {
return (
<div className={cn(badgeVariants({ variant }), className)} {...props} />
)
}

export { Badge, badgeVariants }
Loading

0 comments on commit e6208b8

Please sign in to comment.