personal website
1interface Project {
2 title: string
3 description: string
4 tech: string[]
5 links?: {
6 live?: string
7 github?: string
8 }
9}
10
11interface WorkExperienceCardProps {
12 year: string
13 role: string
14 company: string
15 description: string
16 tech: string[]
17 projects?: Project[]
18}
19
20export function WorkExperienceCard({ year, role, company, description, tech, projects }: WorkExperienceCardProps) {
21 return (
22 <div className="group py-6 sm:py-8 border-b border-border/50 hover:border-border transition-colors duration-500">
23 <div className="grid lg:grid-cols-12 gap-4 sm:gap-8">
24 <div className="lg:col-span-2">
25 <div className="text-xl sm:text-2xl font-light text-[oklch(0.48_0.015_255)] dark:text-muted-foreground dark:group-hover:text-foreground transition-colors duration-500">
26 {year}
27 </div>
28 </div>
29
30 <div className="lg:col-span-10 space-y-3">
31 <div className="flex items-start justify-between gap-4">
32 <div>
33 <h3 className="text-lg sm:text-xl font-medium text-[oklch(0.2_0.02_255)] dark:text-foreground">{role}</h3>
34 <div className="text-[oklch(0.48_0.015_255)] dark:text-muted-foreground">
35 {company}
36 </div>
37 </div>
38 <div className="flex flex-wrap gap-2 justify-end items-start">
39 {tech.map((techItem) => (
40 <span
41 key={techItem}
42 className="px-2 py-1 text-xs rounded text-[oklch(0.48_0.015_255)] dark:text-muted-foreground transition-colors duration-500"
43 >
44 {techItem}
45 </span>
46 ))}
47 </div>
48 </div>
49 <p className="leading-relaxed text-[oklch(0.48_0.015_255)] dark:text-muted-foreground">
50 {description}
51 </p>
52 </div>
53 </div>
54
55 {projects && projects.length > 0 && (
56 <div className="mt-6 lg:ml-[calc((2/12)*100%+2rem)] space-y-4">
57 <div className="text-xs font-mono tracking-wider text-[oklch(0.48_0.015_255)] dark:text-muted-foreground">
58 PROJECTS
59 </div>
60 <div className="space-y-4">
61 {projects.map((project, index) => (
62 <div
63 key={index}
64 className="glass glass-hover p-4 rounded-lg transition-colors duration-300"
65 >
66 <div className="space-y-3">
67 <div className="flex items-start justify-between gap-4">
68 <h4 className="font-medium text-md text-[oklch(0.2_0.02_255)] dark:text-foreground">{project.title}</h4>
69 {project.links && (
70 <div className="flex gap-2">
71 {project.links.github && (
72 <a
73 href={project.links.github}
74 target="_blank"
75 rel="noopener noreferrer"
76 className="transition-colors text-[oklch(0.48_0.015_255)] dark:text-muted-foreground dark:hover:text-foreground"
77 aria-label="View on GitHub"
78 >
79 <svg className="w-4 h-4" fill="currentColor" viewBox="0 0 24 24">
80 <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" />
81 </svg>
82 </a>
83 )}
84 {project.links.live && (
85 <a
86 href={project.links.live}
87 target="_blank"
88 rel="noopener noreferrer"
89 className="transition-colors text-[oklch(0.48_0.015_255)] dark:text-muted-foreground dark:hover:text-foreground"
90 aria-label="View live site"
91 >
92 <svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" strokeWidth={2}>
93 <path strokeLinecap="round" strokeLinejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14" />
94 </svg>
95 </a>
96 )}
97 </div>
98 )}
99 </div>
100 <p className="text-md leading-relaxed text-[oklch(0.48_0.015_255)] dark:text-muted-foreground">
101 {project.description}
102 </p>
103 <div className="flex flex-wrap gap-2">
104 {project.tech.map((techItem) => (
105 <span
106 key={techItem}
107 className="glass glass-hover px-2 py-1 text-xs rounded text-[oklch(0.48_0.015_255)] dark:text-muted-foreground"
108 >
109 {techItem}
110 </span>
111 ))}
112 </div>
113 </div>
114 </div>
115 ))}
116 </div>
117 </div>
118 )}
119 </div>
120 )
121}