kumar-aditya commited on
Commit
bc82223
·
verified ·
1 Parent(s): 140d1e7

Update src/components/Projects.jsx

Browse files
Files changed (1) hide show
  1. src/components/Projects.jsx +166 -72
src/components/Projects.jsx CHANGED
@@ -1,72 +1,166 @@
1
- import React from 'react';
2
- import { TbExternalLink } from "react-icons/tb";
3
- import { motion } from 'framer-motion';
4
-
5
- const projects = [
6
- {
7
- id: 1,
8
- title: "Reels Downloader & Viewer App (In Progress)",
9
- description: "Cross-platform app to browse and download short-form video reels with background download, thumbnail previews, and automatic WhatsApp notifications using cloud functions. Built with Kotlin Multiplatform, Jetpack Compose, Supabase/Firebase, Spring Boot, and Docker.",
10
- image: "/assets/project1.png",
11
- link: "#"
12
- },
13
- {
14
- id: 2,
15
- title: "Kotlin Multiplatform Notes",
16
- description: "Lightweight notes app that syncs across Android and desktop using shared Kotlin modules with local persistence and remote sync. Developed using Kotlin Multiplatform, Compose Multiplatform, and Supabase/Firebase.",
17
- image: "/assets/project1.png",
18
- link: "#"
19
- },
20
- {
21
- id: 3,
22
- title: "CRUD Todo List App – Full MVVM Guide",
23
- description: "Beginner-friendly CRUD TODO list following MVVM architecture with local persistence, ViewModel + LiveData/StateFlow, and optional cloud sync. Built with Kotlin, Jetpack Compose, Coroutines, and Room/Supabase.",
24
- image: "/assets/project1.png",
25
- link: "#"
26
- }
27
- ];
28
-
29
- export default function Projects() {
30
- return (
31
- <div className="bg-black px-5 lg:px-28 py-8 my-8 lg:py-16 lg:my-16" id="projects">
32
- <h2 className="text-2xl lg:text-4xl text-center text-white">
33
- My <span className="font-extrabold">Projects</span>
34
- </h2>
35
-
36
- <div className="lg:mt-16 mt-8 lg:space-y-16 space-y-8 lg:pb-6 pb-3">
37
- {projects.map((project, index) => (
38
- <motion.div
39
- key={project.id}
40
- className={`flex justify-between items-center flex-col ${index % 2 === 0 ? "lg:flex-row" : "lg:flex-row-reverse"}`}
41
- initial={{ opacity: 0, y: 50 }}
42
- whileInView={{ opacity: 1, y: 0 }}
43
- transition={{ type: "spring", stiffness: 80, damping: 10, delay: index * 0.2 }}
44
- viewport={{ once: true }}
45
- >
46
- <div className="lg:w-[500px] w-full rounded-2xl overflow-hidden">
47
- <img
48
- className="w-full h-full hover:scale-105 transition-all duration-500 cursor-pointer object-cover"
49
- src={project.image}
50
- alt={project.title}
51
- />
52
- </div>
53
-
54
- <div className="lg:w-1/2 lg:space-y-6 space-y-4">
55
- <h2 className="font-extrabold text-white mt-5 lg:mt-0 text-3xl lg:text-5xl">
56
- {String(project.id).padStart(2, "0")}
57
- </h2>
58
- <p className="font-bold text-white text-xl lg:text-3xl">{project.title}</p>
59
-
60
- <p className="font-light text-sm/6 lg:text-base text-[#71717A]">
61
- {project.description}
62
- </p>
63
- <a href={project.link} className="text-white mt-3 block" target="_blank" rel="noopener noreferrer">
64
- <TbExternalLink size={23} />
65
- </a>
66
- </div>
67
- </motion.div>
68
- ))}
69
- </div>
70
- </div>
71
- );
72
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from "react";
2
+ import { TbExternalLink } from "react-icons/tb";
3
+ import { motion } from "framer-motion";
4
+
5
+ const projects = [
6
+ {
7
+ id: 1,
8
+ title: "Multi-Platform Document Intelligence App",
9
+ status: "In progress",
10
+ description: (
11
+ <>
12
+ Cross-platform client that uploads documents and returns{" "}
13
+ <span className="font-semibold">entity extraction</span>,{" "}
14
+ <span className="font-semibold">concise summaries</span>, and{" "}
15
+ <span className="font-semibold">semantic search</span> using an LLM-backed
16
+ extraction & embedding service. Design includes client-side indexing,
17
+ secure uploads, vector search, and cloud sync for offline-first usage.
18
+ </>
19
+ ),
20
+ tech: [
21
+ "Kotlin Multiplatform",
22
+ "Compose Multiplatform",
23
+ "Ktor",
24
+ "Supabase",
25
+ "Docker",
26
+ "Embeddings / LLM",
27
+ ],
28
+ image: "/assets/project-doc.png",
29
+ link: "#"
30
+ },
31
+ {
32
+ id: 2,
33
+ title: "End-to-End Media Processing Pipeline",
34
+ status: "Prototype",
35
+ description: (
36
+ <>
37
+ Asynchronous processing pipeline for uploaded media: resilient{" "}
38
+ <span className="font-semibold">transcoding</span>,{" "}
39
+ <span className="font-semibold">speech-to-text</span> (Whisper / ASR),
40
+ AI-powered <span className="font-semibold">moderation & summarization</span>,
41
+ and webhook/push notifications. Built for horizontal scale and fault
42
+ tolerance with signed artifact URLs for clients.
43
+ </>
44
+ ),
45
+ tech: [
46
+ "Ktor",
47
+ "FFmpeg",
48
+ "Whisper / ASR",
49
+ "Redis / RabbitMQ",
50
+ "S3 / Supabase",
51
+ "Docker workers",
52
+ ],
53
+ image: "/assets/project-media.png",
54
+ link: "#"
55
+ },
56
+ {
57
+ id: 3,
58
+ title: "Hermetic Reproducible ML Pipelines (MLOps PoC)",
59
+ status: "Prototype",
60
+ description: (
61
+ <>
62
+ Hermetic, reproducible training + serving setup: Dockerized training
63
+ environments, deterministic seeds, dataset versioning, experiment
64
+ tracking with <span className="font-semibold">MLflow</span>, and REST
65
+ inference endpoints for stable model deployment and CI-driven retraining.
66
+ </>
67
+ ),
68
+ tech: [
69
+ "Docker",
70
+ "Python",
71
+ "PyTorch / scikit-learn",
72
+ "MLflow",
73
+ "GitHub Actions",
74
+ "Ktor (inference)",
75
+ ],
76
+ image: "/assets/project-mlops.png",
77
+ link: "#"
78
+ }
79
+ ];
80
+
81
+ export default function Projects() {
82
+ return (
83
+ <section
84
+ id="projects"
85
+ className="bg-black px-5 lg:px-28 py-10 lg:py-16 text-white"
86
+ aria-label="Projects"
87
+ >
88
+ <h2 className="text-2xl lg:text-4xl text-center">
89
+ My <span className="font-extrabold">Projects</span>
90
+ </h2>
91
+
92
+ <div className="mt-10 lg:mt-16 space-y-12">
93
+ {projects.map((project, index) => (
94
+ <motion.article
95
+ key={project.id}
96
+ className={`flex flex-col items-center gap-8 lg:gap-12 ${
97
+ index % 2 === 0 ? "lg:flex-row" : "lg:flex-row-reverse"
98
+ }`}
99
+ initial={{ opacity: 0, y: 40 }}
100
+ whileInView={{ opacity: 1, y: 0 }}
101
+ transition={{ type: "spring", stiffness: 80, damping: 12, delay: index * 0.15 }}
102
+ viewport={{ once: true }}
103
+ >
104
+ {/* Image */}
105
+ <div className="lg:w-1/2 w-full rounded-2xl overflow-hidden shadow-lg">
106
+ <img
107
+ src={project.image}
108
+ alt={`${project.title} screenshot`}
109
+ className="w-full h-64 lg:h-80 object-cover transform hover:scale-105 transition-transform duration-500"
110
+ loading="lazy"
111
+ />
112
+ </div>
113
+
114
+ {/* Content */}
115
+ <div className="lg:w-1/2 w-full">
116
+ <div className="flex items-start justify-between">
117
+ <div>
118
+ <h3 className="text-3xl lg:text-4xl font-extrabold">
119
+ {String(project.id).padStart(2, "0")}
120
+ </h3>
121
+ <p className="mt-1 text-xl lg:text-2xl font-bold">{project.title}</p>
122
+ </div>
123
+
124
+ <div className="text-sm lg:text-base">
125
+ <span className="inline-block bg-white/10 px-3 py-1 rounded-full text-white/90 text-xs lg:text-sm">
126
+ {project.status}
127
+ </span>
128
+ </div>
129
+ </div>
130
+
131
+ <p className="mt-4 text-sm lg:text-base text-gray-300 leading-relaxed">
132
+ {project.description}
133
+ </p>
134
+
135
+ {/* Tech badges */}
136
+ <div className="mt-4 flex flex-wrap gap-2">
137
+ {project.tech.map((t) => (
138
+ <span
139
+ key={t}
140
+ className="text-xs lg:text-sm bg-white/6 border border-white/8 px-2 py-1 rounded-md text-gray-200"
141
+ >
142
+ {t}
143
+ </span>
144
+ ))}
145
+ </div>
146
+
147
+ {/* Links */}
148
+ <div className="mt-4 flex items-center gap-4">
149
+ <a
150
+ href={project.link}
151
+ className="inline-flex items-center gap-2 text-white hover:underline"
152
+ target="_blank"
153
+ rel="noopener noreferrer"
154
+ aria-label={`Open ${project.title} link`}
155
+ >
156
+ <TbExternalLink size={20} />
157
+ <span className="text-sm lg:text-base">View Repo / Demo</span>
158
+ </a>
159
+ </div>
160
+ </div>
161
+ </motion.article>
162
+ ))}
163
+ </div>
164
+ </section>
165
+ );
166
+ }