Skip to content

Commit cda23ef

Browse files
committed
Add responsive Navbar and restructure CV data for technical skills
1 parent c476641 commit cda23ef

2 files changed

Lines changed: 110 additions & 46 deletions

File tree

src/App.tsx

Lines changed: 74 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,34 @@ import { BlogSection } from './components/BlogSection';
66
import { WebGLBackground } from './components/WebGLBackground';
77
import cvData from './data/cv';
88

9+
// Simple responsive navbar
10+
function Navbar() {
11+
const navItems = [
12+
{ label: 'Education', href: '#education' },
13+
{ label: 'Skills', href: '#skills' },
14+
{ label: 'Experience', href: '#experience' },
15+
{ label: 'Projects', href: '#projects' },
16+
{ label: 'Certifications', href: '#certifications' },
17+
{ label: 'Clubs', href: '#clubs' },
18+
{ label: 'Contact', href: '#contact' },
19+
];
20+
return (
21+
<nav className="fixed top-0 left-0 w-full z-50 bg-black/70 backdrop-blur border-b border-white/10">
22+
<div className="container mx-auto px-4 flex justify-between items-center h-16">
23+
<span className="font-bold text-lg text-white tracking-wide">My Portfolio</span>
24+
<ul className="flex gap-4">
25+
{navItems.map((item) => (
26+
<li key={item.href}>
27+
<a href={item.href} className="text-gray-200 hover:text-blue-400 transition-colors px-2 py-1 rounded focus:outline-none focus:ring-2 focus:ring-blue-400">
28+
{item.label}
29+
</a>
30+
</li>
31+
))}
32+
</ul>
33+
</div>
34+
</nav>
35+
);
36+
}
937

1038
// Utility components for rendering sections
1139
function SectionTitle({ children }: { children: React.ReactNode }) {
@@ -14,11 +42,11 @@ function SectionTitle({ children }: { children: React.ReactNode }) {
1442

1543
function EducationSection() {
1644
return (
17-
<section className="min-h-screen py-20 snap-start">
45+
<section id="education" className="min-h-screen py-20 snap-start">
1846
<div className="container mx-auto px-4">
1947
<SectionTitle>Education</SectionTitle>
2048
<div className="space-y-8 max-w-3xl mx-auto">
21-
{cvData.education.map((edu, i) => (
49+
{[...cvData.education].reverse().map((edu, i) => (
2250
<div key={i} className="bg-white/5 rounded-xl p-6">
2351
<div className="flex flex-col md:flex-row md:justify-between md:items-center mb-2">
2452
<div>
@@ -45,28 +73,38 @@ function EducationSection() {
4573
);
4674
}
4775

76+
import type { TechnicalSkills } from './data/cv';
77+
4878
function SkillsSection() {
79+
const skills = cvData.skills;
80+
const skillCategories: { key: keyof TechnicalSkills; label: string; color: string }[] = [
81+
{ key: 'programmingLanguages', label: 'Programming Languages', color: 'bg-blue-500/20 text-blue-300' },
82+
{ key: 'frameworksLibraries', label: 'Frameworks & Libraries', color: 'bg-green-500/20 text-green-300' },
83+
{ key: 'dataScienceAnalytics', label: 'Data Science & Analytics', color: 'bg-cyan-500/20 text-cyan-300' },
84+
{ key: 'cloudDevOps', label: 'Cloud & DevOps', color: 'bg-purple-500/20 text-purple-300' },
85+
{ key: 'cybersecurity', label: 'Cybersecurity', color: 'bg-red-500/20 text-red-300' },
86+
{ key: 'databases', label: 'Databases', color: 'bg-pink-500/20 text-pink-300' },
87+
{ key: 'blockchainWeb3', label: 'Blockchain & Web3', color: 'bg-yellow-500/20 text-yellow-700' },
88+
{ key: 'roboticsIoT', label: 'Robotics & IoT', color: 'bg-teal-500/20 text-teal-300' },
89+
{ key: 'aiGenerativeAI', label: 'AI & Generative AI', color: 'bg-indigo-500/20 text-indigo-300' },
90+
];
4991
return (
50-
<section className="min-h-screen py-20 snap-start">
92+
<section id="skills" className="min-h-screen py-20 snap-start">
5193
<div className="container mx-auto px-4">
52-
<SectionTitle>Core Skills</SectionTitle>
94+
<SectionTitle>Technical Skills</SectionTitle>
5395
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 max-w-4xl mx-auto">
54-
<div className="bg-white/5 rounded-xl p-6">
55-
<h3 className="text-xl font-semibold mb-2">Hard Skills</h3>
56-
<ul className="flex flex-wrap gap-2">
57-
{cvData.skills.hard.map((skill, i) => (
58-
<li key={i} className="px-3 py-1 rounded-full bg-blue-500/20 text-blue-300 text-sm">{skill}</li>
59-
))}
60-
</ul>
61-
</div>
62-
<div className="bg-white/5 rounded-xl p-6">
63-
<h3 className="text-xl font-semibold mb-2">Soft Skills</h3>
64-
<ul className="flex flex-wrap gap-2">
65-
{cvData.skills.soft.map((skill, i) => (
66-
<li key={i} className="px-3 py-1 rounded-full bg-teal-500/20 text-teal-300 text-sm">{skill}</li>
67-
))}
68-
</ul>
69-
</div>
96+
{skillCategories.map(({ key, label, color }) => (
97+
skills[key] && skills[key].length > 0 && (
98+
<div key={key} className="bg-white/5 rounded-xl p-6">
99+
<h3 className="text-xl font-semibold mb-2">{label}</h3>
100+
<ul className="flex flex-wrap gap-2">
101+
{skills[key].map((skill, i) => (
102+
<li key={i} className={`px-3 py-1 rounded-full ${color} text-sm`}>{skill}</li>
103+
))}
104+
</ul>
105+
</div>
106+
)
107+
))}
70108
</div>
71109
</div>
72110
</section>
@@ -75,11 +113,11 @@ function SkillsSection() {
75113

76114
function ExperienceSection() {
77115
return (
78-
<section className="min-h-screen py-20 snap-start">
116+
<section id="experience" className="min-h-screen py-20 snap-start">
79117
<div className="container mx-auto px-4">
80118
<SectionTitle>Experience</SectionTitle>
81119
<div className="space-y-8 max-w-3xl mx-auto">
82-
{cvData.experience.map((exp, i) => (
120+
{[...cvData.experience].reverse().map((exp, i) => (
83121
<div key={i} className="bg-white/5 rounded-xl p-6">
84122
<div className="flex flex-col md:flex-row md:justify-between md:items-center mb-2">
85123
<div>
@@ -103,11 +141,11 @@ function ExperienceSection() {
103141

104142
function ProjectsSection() {
105143
return (
106-
<section className="min-h-screen py-20 snap-start">
144+
<section id="projects" className="min-h-screen py-20 snap-start">
107145
<div className="container mx-auto px-4">
108146
<SectionTitle>Projects</SectionTitle>
109147
<div className="space-y-8 max-w-3xl mx-auto">
110-
{cvData.projects.map((proj, i) => (
148+
{[...cvData.projects].reverse().map((proj, i) => (
111149
<div key={i} className="bg-white/5 rounded-xl p-6">
112150
<h3 className="text-lg font-semibold mb-2">{proj.title}</h3>
113151
<ul className="text-gray-300 text-sm mb-2 list-disc ml-5">
@@ -132,11 +170,11 @@ function ProjectsSection() {
132170

133171
function CertificationsSection() {
134172
return (
135-
<section className="py-20 snap-start">
173+
<section id="certifications" className="py-20 snap-start">
136174
<div className="container mx-auto px-4">
137175
<SectionTitle>Certifications, Courses & Workshops</SectionTitle>
138176
<ul className="flex flex-wrap gap-2 max-w-4xl mx-auto justify-center">
139-
{cvData.certifications.map((cert, i) => (
177+
{[...cvData.certifications].reverse().map((cert, i) => (
140178
<li key={i} className="px-3 py-1 rounded-full bg-purple-500/20 text-purple-300 text-sm mb-2">{cert.name}</li>
141179
))}
142180
</ul>
@@ -147,11 +185,11 @@ function CertificationsSection() {
147185

148186
function ClubsSection() {
149187
return (
150-
<section className="py-20 snap-start">
188+
<section id="clubs" className="py-20 snap-start">
151189
<div className="container mx-auto px-4">
152190
<SectionTitle>Clubs & Leadership</SectionTitle>
153191
<div className="flex flex-wrap gap-4 justify-center">
154-
{cvData.clubs.map((club, i) => (
192+
{[...cvData.clubs].reverse().map((club, i) => (
155193
<div key={i} className="bg-white/5 rounded-xl p-4 min-w-[220px]">
156194
<h4 className="font-semibold text-lg mb-1">{club.name}</h4>
157195
<div className="text-gray-300 text-sm mb-1">{club.role}</div>
@@ -176,9 +214,10 @@ function App() {
176214
<h1 className="text-5xl md:text-7xl font-bold mb-6 bg-clip-text text-transparent bg-gradient-to-r from-blue-400 to-teal-400 animate-fade-in">
177215
Akhil Devarasetty
178216
</h1>
179-
<p className="text-xl md:text-2xl text-gray-300 mb-8 animate-fade-in animate-delay-200">
180-
Computer Science and Engineering Student
181-
</p>
217+
<p className="text-xl md:text-2xl text-gray-300 mb-8 animate-fade-in animate-delay-200">
218+
Computer Science and Engineering Student
219+
</p>
220+
<Navbar />
182221
<div className="flex justify-center gap-6 animate-fade-in animate-delay-300">
183222
<a href="https://github.com/DDH2004" className="text-gray-300 hover:text-white transition-colors hover:scale-110 transform duration-200">
184223
<Github size={24} />
@@ -212,10 +251,10 @@ function App() {
212251
{/* Clubs Section */}
213252
<ClubsSection />
214253

215-
{/* Blog Section */}
216-
<div className="snap-start">
217-
<BlogSection />
218-
</div>
254+
{/* Blog Section */}
255+
<div className="snap-start">
256+
<BlogSection />
257+
</div>
219258

220259
{/* Contact Section */}
221260
<section className="min-h-screen py-20 snap-start">

src/data/cv.ts

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,16 @@ export interface EducationEntry {
1010
relevantCourses?: string[];
1111
}
1212

13-
export interface SkillSection {
14-
hard: string[];
15-
soft: string[];
13+
export interface TechnicalSkills {
14+
programmingLanguages: string[];
15+
frameworksLibraries: string[];
16+
dataScienceAnalytics: string[];
17+
cloudDevOps: string[];
18+
cybersecurity: string[];
19+
databases: string[];
20+
blockchainWeb3: string[];
21+
roboticsIoT: string[];
22+
aiGenerativeAI: string[];
1623
}
1724

1825
export interface ExperienceEntry {
@@ -41,7 +48,7 @@ export interface ClubEntry {
4148

4249
export interface CVData {
4350
education: EducationEntry[];
44-
skills: SkillSection;
51+
skills: TechnicalSkills;
4552
experience: ExperienceEntry[];
4653
projects: ProjectEntry[];
4754
certifications: CertificationEntry[];
@@ -63,14 +70,32 @@ const cvData: CVData = {
6370
}
6471
],
6572
skills: {
66-
hard: [
67-
"C++", "Python", "R", "Matlab",
68-
"Tensorflow", "Numba", "Numpy", "Pandas", "Seaborn", "Matplotlib", "Quarto",
69-
"HPC", "3D printers", "Machining Equipment",
70-
"Gephi", "Microsoft Power BI", "Office 365", "Google Suite", "ArcGIS"
73+
programmingLanguages: [
74+
"C++", "Python", "R", "Matlab", "PHP", "JavaScript (Node.js, React, TypeScript)", "SQL"
7175
],
72-
soft: [
73-
"Collaboration", "Decision Making", "Insights"
76+
frameworksLibraries: [
77+
"TensorFlow", "OpenCV", "Numpy", "Pandas", "Seaborn", "Matplotlib", "Scipy", "Numba", "Flask", "Django", "Node.js", "React", "Tailwind CSS", "Material UI", "Quarto", "Roboflow", "LangChain", "FAISS", "Gradio"
78+
],
79+
dataScienceAnalytics: [
80+
"Data Cleaning & Pipelines", "Statistical Analysis (Correlation, Clustering, Optimization)", "Business Intelligence (Power BI, Excel)", "Graph Analytics (Gephi, Neo4j)", "Visualization (Matplotlib, Seaborn, Plotly.js, Quarto, R)"
81+
],
82+
cloudDevOps: [
83+
"AWS (Elastic Beanstalk)", "Google Cloud (GenAI, BI, Project Management)", "Kubernetes (K8s)", "GitHub Actions", "Google Colab", "MCP Servers"
84+
],
85+
cybersecurity: [
86+
"Wireshark", "Network Monitoring (Traceroute, Ping, Log Monitoring)", "Smart Contract Auditing (CertiK, Hacken, Rekt)", "PHPStan (Static Code Analysis)", "Hashcat", "Codepath Cybersecurity"
87+
],
88+
databases: [
89+
"MongoDB", "SQL (Database Implementation & Optimization)", "Neo4j (Graph Database)"
90+
],
91+
blockchainWeb3: [
92+
"Smart Contract Security", "Solana Blockchain", "Web3 Security Analysis", "Token Reward Systems"
93+
],
94+
roboticsIoT: [
95+
"IoT Sensor Systems", "KINOVA Cortex Robotic Arm Programming", "Agricultural Automation", "Communication Technologies", "3D Printers", "Machining Equipment"
96+
],
97+
aiGenerativeAI: [
98+
"LangChain", "Gemini", "Retrieval-Augmented Generation (RAG)", "Gradio", "Agent Development", "Astroquery API", "REST APIs"
7499
]
75100
},
76101
experience: [

0 commit comments

Comments
 (0)