Chaitanya895 commited on
Commit
befb26b
·
verified ·
1 Parent(s): 96141c0

Upload 10 files

Browse files
.gitattributes CHANGED
@@ -33,3 +33,6 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ static/B[[:space:]]Chaitanya[[:space:]]Reddy[[:space:]]Resume.pdf filter=lfs diff=lfs merge=lfs -text
37
+ static/images/myphoto.jpg filter=lfs diff=lfs merge=lfs -text
38
+ static/images/Vexa[[:space:]]Chatbot.png filter=lfs diff=lfs merge=lfs -text
Dockerfile ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use the official Python slim image as the base image
2
+ FROM python:3.9-slim
3
+
4
+ # Set the working directory inside the container
5
+ WORKDIR /app
6
+
7
+ # Copy the requirements file (if you have one) or install dependencies directly
8
+ # Since your project has minimal dependencies, we'll install them directly
9
+ RUN pip install --no-cache-dir flask
10
+
11
+ # Copy the entire project directory into the container
12
+ COPY . .
13
+
14
+ # Expose port 7860 (Hugging Face Spaces default port, matches your app)
15
+ EXPOSE 7860
16
+
17
+ # Command to run the Flask app
18
+ CMD ["python", "main.py"]
main.py ADDED
@@ -0,0 +1,210 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, jsonify, request
2
+ import logging
3
+ import smtplib
4
+ from email.mime.text import MIMEText
5
+ from email.mime.multipart import MIMEMultipart
6
+
7
+ app = Flask(__name__)
8
+
9
+ # Configure logging
10
+ logging.basicConfig(level=logging.INFO)
11
+
12
+ # Email configuration (replace with your Gmail credentials)
13
+ EMAIL_ADDRESS = "chaituchaithanyareddy895@gmail.com" # Replace with your Gmail address
14
+ EMAIL_PASSWORD = "einf clqk oyds ucuj" # Replace with your Gmail App Password
15
+ RECIPIENT_EMAIL = "chaituchaithanyareddy895@gmail.com" # The email where you want to receive messages
16
+
17
+ # Data for API endpoints
18
+ skills_data = [
19
+ {"title": "Machine Learning", "icon": "brain", "skills": [
20
+ {"name": "Numpy", "proficiency": 85},
21
+ {"name": "Pandas", "proficiency": 90},
22
+ {"name": "NLP", "proficiency": 80}
23
+ ]},
24
+ {"title": "Backend Development", "icon": "server", "skills": [
25
+ {"name": "PHP", "proficiency": 70},
26
+ {"name": "Python", "proficiency": 95},
27
+ {"name": "Java", "proficiency": 75},
28
+ {"name": "Flask", "proficiency": 85}
29
+ ]},
30
+ {"title": "Database", "icon": "database", "skills": [
31
+ {"name": "MySQL", "proficiency": 80}
32
+ ]},
33
+ {"title": "Deep Learning", "icon": "network-wired", "skills": [
34
+ {"name": "TensorFlow", "proficiency": 75}
35
+ ]}
36
+ ]
37
+
38
+ achievements_data = [
39
+ {
40
+ "icon": "trophy",
41
+ "title": "Screen Smart Ideathon Winner",
42
+ "organization": "IEEE Student Branch, REVA University",
43
+ "description": "Proposed an innovative solution for reducing screen time among students, utilizing that time for upskilling."
44
+ },
45
+ {
46
+ "icon": "award",
47
+ "title": "Finalist in AI Hackathon",
48
+ "organization": "Entellika Sparc AI Hackathon",
49
+ "description": "Developed a Python Tkinter app for matching top 5 internships based on resume skills using binary classification and Naive Bayes."
50
+ },
51
+ {
52
+ "icon": "star",
53
+ "title": "Winner at UI/UX Design Challenge",
54
+ "organization": "IIT Jammu",
55
+ "description": "Designed an e-commerce platform showcasing Indian state-specific handicrafts, promoting cultural heritage."
56
+ }
57
+ ]
58
+
59
+ hobbies_data = [
60
+ {
61
+ "icon": "code",
62
+ "title": "Coding",
63
+ "description": "Building side projects and exploring new technologies to fuel my passion for software development."
64
+ },
65
+ {
66
+ "icon": "chalkboard-teacher",
67
+ "title": "Educating Others",
68
+ "description": "Sharing knowledge in Python and tech concepts, driven by a passion for teaching."
69
+ },
70
+ {
71
+ "icon": "book",
72
+ "title": "Reading",
73
+ "description": "Keeping up with tech trends through blogs and articles."
74
+ },
75
+ {
76
+ "icon": "palette",
77
+ "title": "Digital Art",
78
+ "description": "Creating digital artwork and experimenting with UI/UX design."
79
+ }
80
+ ]
81
+
82
+ projects_data = [
83
+ {
84
+ "title": "VEXA Chatbot",
85
+ "description": "An AI-powered chatbot for Sahayak Organization, assisting users with queries about underprivileged children's development.",
86
+ "image": "/static/images/Vexa Chatbot.png",
87
+ "technologies": ["Python", "Deep Learning", "PyTorch", "Flask", "HTML", "CSS"],
88
+ "githubLink": "https://github.com/BChaitanyaReddy895/vexa_chatbot",
89
+ "liveLink": "https://chaitanya895-sahayak.hf.space"
90
+ },
91
+ {
92
+ "title": "Bangla to English Translator",
93
+ "description": "A machine learning model translating Bangla text, images, PDFs, and websites to English using NLP and web crawling techniques.",
94
+ "image": "/static/images/translator.png",
95
+ "technologies": ["Python", "NLP", "HTML", "CSS", "JavaScript"],
96
+ "githubLink": "https://github.com/BChaitanyaReddy895/Bengali_English_translator",
97
+ "liveLink": "https://chaitanya895-bangla-translator.hf.space"
98
+ }
99
+ ]
100
+
101
+ education_data = [
102
+ {
103
+ "degree": "B.Tech in Computer Science and Engineering",
104
+ "institution": "REVA University",
105
+ "period": "2023-2027",
106
+ "description": "Specializing in Python, C, Java, Machine Learning, and NLP.",
107
+ "achievements": [
108
+ "Won IEEE Ideathon at REVA University",
109
+ "Developed Bangla to English translation model for industrial use",
110
+ "Participated in Entellika Sparc AI Hackathon and IIT Jammu UI/UX Challenge"
111
+ ]
112
+ }
113
+ ]
114
+
115
+ @app.route('/')
116
+ def serve_index():
117
+ try:
118
+ return app.send_static_file('index.html'), 200
119
+ except Exception as e:
120
+ logging.error(f"Error serving index.html: {str(e)}")
121
+ return jsonify({"error": "File not found"}), 404
122
+
123
+ @app.route('/static/<path:path>')
124
+ def serve_static(path):
125
+ logging.info(f"Serving static file: {path}")
126
+ try:
127
+ return app.send_static_file(path)
128
+ except Exception as e:
129
+ logging.error(f"Error serving static file {path}: {str(e)}")
130
+ return jsonify({"error": "File not found"}), 404
131
+
132
+ @app.route('/api/skills')
133
+ def get_skills():
134
+ try:
135
+ return jsonify(skills_data)
136
+ except Exception as e:
137
+ logging.error(f"Error in /api/skills: {str(e)}")
138
+ return jsonify({"error": "Internal server error"}), 500
139
+
140
+ @app.route('/api/achievements')
141
+ def get_achievements():
142
+ try:
143
+ return jsonify(achievements_data)
144
+ except Exception as e:
145
+ logging.error(f"Error in /api/achievements: {str(e)}")
146
+ return jsonify({"error": "Internal server error"}), 500
147
+
148
+ @app.route('/api/hobbies')
149
+ def get_hobbies():
150
+ try:
151
+ return jsonify(hobbies_data)
152
+ except Exception as e:
153
+ logging.error(f"Error in /api/hobbies: {str(e)}")
154
+ return jsonify({"error": "Internal server error"}), 500
155
+
156
+ @app.route('/api/projects')
157
+ def get_projects():
158
+ try:
159
+ return jsonify(projects_data)
160
+ except Exception as e:
161
+ logging.error(f"Error in /api/projects: {str(e)}")
162
+ return jsonify({"error": "Internal server error"}), 500
163
+
164
+ @app.route('/api/education')
165
+ def get_education():
166
+ try:
167
+ return jsonify(education_data)
168
+ except Exception as e:
169
+ logging.error(f"Error in /api/education: {str(e)}")
170
+ return jsonify({"error": "Internal server error"}), 500
171
+
172
+ @app.route('/api/contact', methods=['POST'])
173
+ def contact():
174
+ try:
175
+ data = request.get_json()
176
+ if not data or 'email' not in data or 'message' not in data:
177
+ return jsonify({"error": "Invalid request data"}), 400
178
+ email = data['email']
179
+ message = data['message']
180
+ logging.info(f"Contact form submission - Email: {email}, Message: {message}")
181
+
182
+ # Set up the email
183
+ msg = MIMEMultipart()
184
+ msg['From'] = EMAIL_ADDRESS
185
+ msg['To'] = RECIPIENT_EMAIL
186
+ msg['Subject'] = "New Contact Form Submission"
187
+
188
+ body = f"New message from your portfolio website:\n\nFrom: {email}\nMessage: {message}"
189
+ msg.attach(MIMEText(body, 'plain'))
190
+
191
+ # Connect to Gmail's SMTP server
192
+ with smtplib.SMTP('smtp.gmail.com', 587) as server:
193
+ server.starttls() # Enable TLS
194
+ server.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
195
+ server.sendmail(EMAIL_ADDRESS, RECIPIENT_EMAIL, msg.as_string())
196
+ logging.info(f"Email sent to {RECIPIENT_EMAIL}")
197
+
198
+ return jsonify({"message": "Message sent successfully!"})
199
+ except smtplib.SMTPAuthenticationError as e:
200
+ logging.error(f"SMTP Authentication Error: {str(e)}")
201
+ return jsonify({"error": "Failed to authenticate with email server. Please try again later."}), 500
202
+ except smtplib.SMTPException as e:
203
+ logging.error(f"SMTP Error: {str(e)}")
204
+ return jsonify({"error": "Failed to send email. Please try again later."}), 500
205
+ except Exception as e:
206
+ logging.error(f"Error in /api/contact: {str(e)}")
207
+ return jsonify({"error": "Internal server error"}), 500
208
+
209
+ if __name__ == '__main__':
210
+ app.run(host='0.0.0.0', port=7860)
static/B Chaitanya Reddy Resume.pdf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:52acf3f146578b59421f53843d13ba6b33ab0d289f64a2fd3f110ac95f4590bf
3
+ size 380137
static/images/Vexa Chatbot.png ADDED

Git LFS Details

  • SHA256: 3766ef5ba78cbc2decb5a7137d789f40b321a6fe76d1049cbc1fc29404db331f
  • Pointer size: 131 Bytes
  • Size of remote file: 272 kB
static/images/favicon.jpg ADDED
static/images/myphoto.jpg ADDED

Git LFS Details

  • SHA256: 8b888f51dc1a33082456dbce303aaf730794e0c393f873bdfef46d94ab25cede
  • Pointer size: 131 Bytes
  • Size of remote file: 282 kB
static/images/translator.png ADDED
static/script.js ADDED
@@ -0,0 +1,367 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Initialize immediately to reduce delay
2
+ console.log("Script.js started executing at:", new Date().toISOString());
3
+
4
+ // Initialize Particles.js
5
+ particlesJS('particles-js', {
6
+ particles: {
7
+ number: { value: 80, density: { enable: true, value_area: 800 } },
8
+ color: { value: ['#1E90FF'] },
9
+ shape: { type: 'circle' },
10
+ opacity: { value: 0.5, random: true },
11
+ size: { value: 3, random: true },
12
+ line_linked: { enable: true, distance: 150, color: '#1E90FF', opacity: 0.4, width: 1 },
13
+ move: { enable: true, speed: 2, direction: 'none', random: true, straight: false, out_mode: 'out', bounce: false }
14
+ },
15
+ interactivity: {
16
+ detect_on: 'canvas',
17
+ events: { onhover: { enable: true, mode: 'repulse' }, onclick: { enable: true, mode: 'push' }, resize: true },
18
+ modes: { repulse: { distance: 100, duration: 0.4 }, push: { particles_nb: 4 } }
19
+ },
20
+ retina_detect: true
21
+ });
22
+
23
+ // Glowing Cursor Trail
24
+ const canvas = document.getElementById('cursor-trail');
25
+ const ctx = canvas.getContext('2d');
26
+ canvas.width = window.innerWidth;
27
+ canvas.height = window.innerHeight;
28
+ const trails = [];
29
+ window.addEventListener('mousemove', (e) => {
30
+ trails.push({ x: e.clientX, y: e.clientY, life: 1 });
31
+ });
32
+ function animateTrail() {
33
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
34
+ trails.forEach((trail, index) => {
35
+ ctx.beginPath();
36
+ ctx.arc(trail.x, trail.y, 5 * trail.life, 0, Math.PI * 2);
37
+ ctx.fillStyle = `rgba(30, 144, 255, ${trail.life})`;
38
+ ctx.fill();
39
+ trail.life -= 0.02;
40
+ if (trail.life <= 0) trails.splice(index, 1);
41
+ });
42
+ requestAnimationFrame(animateTrail);
43
+ }
44
+ animateTrail();
45
+ window.addEventListener('resize', () => {
46
+ canvas.width = window.innerWidth;
47
+ canvas.height = window.innerHeight;
48
+ });
49
+
50
+ // GSAP Animations
51
+ gsap.registerPlugin(ScrollTrigger);
52
+
53
+ // Animate the static text "Hi, I'm B Chaitanya Reddy" and its siblings
54
+ gsap.fromTo('.animate-slide-in',
55
+ { y: 100, opacity: 0 },
56
+ { y: 0, opacity: 1, duration: 1.2, ease: 'power3.out', onComplete: () => {
57
+ document.querySelector('.animate-slide-in').style.opacity = '1'; // Ensure final state
58
+ }}
59
+ );
60
+
61
+ // Animate the image in the hero section
62
+ gsap.fromTo('.animate-fade-in',
63
+ { opacity: 0 },
64
+ { opacity: 1, duration: 1.5, ease: 'power3.out', onComplete: () => {
65
+ document.querySelector('.animate-fade-in').style.opacity = '1'; // Ensure final state
66
+ }}
67
+ );
68
+
69
+ // Animate stat cards on scroll
70
+ gsap.from('.stat-card', {
71
+ scrollTrigger: { trigger: '#about', start: 'top 80%' },
72
+ y: 50,
73
+ opacity: 0,
74
+ duration: 0.8,
75
+ stagger: 0.2,
76
+ ease: 'power3.out'
77
+ });
78
+
79
+ // Navigation Bar
80
+ const menuToggle = document.getElementById('menu-toggle');
81
+ const mobileMenu = document.getElementById('mobile-menu');
82
+ menuToggle.addEventListener('click', () => {
83
+ mobileMenu.classList.toggle('hidden');
84
+ menuToggle.querySelector('i').classList.toggle('fa-bars');
85
+ menuToggle.querySelector('i').classList.toggle('fa-times');
86
+ });
87
+
88
+ // Smooth Scrolling
89
+ document.querySelectorAll('.nav-link').forEach(link => {
90
+ link.addEventListener('click', (e) => {
91
+ e.preventDefault();
92
+ mobileMenu.classList.add('hidden');
93
+ menuToggle.querySelector('i').classList.add('fa-bars');
94
+ menuToggle.querySelector('i').classList.remove('fa-times');
95
+ document.querySelector(link.getAttribute('href')).scrollIntoView({ behavior: 'smooth' });
96
+ });
97
+ });
98
+
99
+ // Theme Toggle (Disabled since theme switching isn't implemented)
100
+ const themeToggle = document.getElementById('theme-toggle');
101
+ themeToggle.addEventListener('click', () => {
102
+ // Theme switching not implemented
103
+ });
104
+
105
+ // Back to Top Button
106
+ const backToTop = document.getElementById('back-to-top');
107
+ window.addEventListener('scroll', () => {
108
+ backToTop.classList.toggle('hidden', window.scrollY < 500);
109
+ });
110
+ backToTop.addEventListener('click', () => {
111
+ window.scrollTo({ top: 0, behavior: 'smooth' });
112
+ });
113
+
114
+ // Ripple Effect for Buttons
115
+ document.querySelectorAll('.ripple').forEach(btn => {
116
+ btn.addEventListener('click', (e) => {
117
+ const rect = btn.getBoundingClientRect();
118
+ const x = e.clientX - rect.left;
119
+ const y = e.clientY - rect.top;
120
+ const ripple = document.createElement('span');
121
+ ripple.style.left = `${x}px`;
122
+ ripple.style.top = `${y}px`;
123
+ ripple.classList.add('ripple-effect');
124
+ btn.appendChild(ripple);
125
+ setTimeout(() => ripple.remove(), 600);
126
+ });
127
+ });
128
+
129
+ // Fetch Data Helper
130
+ const fetchData = async (url, elementId, renderCallback) => {
131
+ try {
132
+ console.log(`Fetching data from ${url}`);
133
+ const response = await fetch(url);
134
+ if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
135
+ const data = await response.json();
136
+ console.log(`Fetched data from ${url}:`, data);
137
+ const container = document.getElementById(elementId);
138
+ if (!container) throw new Error(`Container with ID ${elementId} not found`);
139
+ renderCallback(data, container);
140
+ } catch (error) {
141
+ console.error(`Error fetching ${url}:`, error);
142
+ document.getElementById(elementId).innerHTML = '<p class="text-red-500">Error loading data. Please try again later.</p>';
143
+ }
144
+ };
145
+
146
+ // Render Skills with Circular Progress
147
+ fetchData('/api/skills', 'skills-grid', (data, container) => {
148
+ console.log('Rendering skills data:', data);
149
+ container.innerHTML = '';
150
+ data.forEach(category => {
151
+ const card = document.createElement('div');
152
+ card.className = 'skill-card rounded-xl hover:scale-105 transition-transform';
153
+ card.style.opacity = '1';
154
+ card.style.display = 'block';
155
+ card.innerHTML = `
156
+ <i class="fas fa-${category.icon} mb-2"></i>
157
+ <h3 class="mb-4">${category.title}</h3>
158
+ <div class="space-y-3">
159
+ ${category.skills.map(skill => `
160
+ <div class="skill-item">
161
+ <span>${skill.name}</span>
162
+ <div class="progress-circle-container">
163
+ <div class="progress-circle-bg"></div>
164
+ <svg class="progress-circle">
165
+ <circle cx="20" cy="20" r="18" stroke="#E5E5E5" stroke-width="4" fill="none" />
166
+ <circle class="progress-fill" cx="20" cy="20" r="18" stroke="#1E90FF" stroke-width="4" fill="none" stroke-dasharray="0 113" />
167
+ </svg>
168
+ <span class="progress-percentage">${skill.proficiency}%</span>
169
+ </div>
170
+ </div>
171
+ `).join('')}
172
+ </div>
173
+ `;
174
+ container.appendChild(card);
175
+ console.log(`Rendered skill card for ${category.title}`);
176
+ // Animate the circular progress
177
+ card.querySelectorAll('.progress-fill').forEach(circle => {
178
+ const proficiency = circle.parentElement.parentElement.querySelector('.progress-percentage').textContent.replace('%', '');
179
+ const circumference = 2 * Math.PI * 18; // Circumference of the circle (r=18)
180
+ const offset = circumference * (proficiency / 100);
181
+ gsap.to(circle, {
182
+ scrollTrigger: {
183
+ trigger: card,
184
+ start: 'left 80%',
185
+ end: 'right 20%',
186
+ scrub: true
187
+ },
188
+ strokeDasharray: `${offset} 113`,
189
+ duration: 1.5,
190
+ ease: 'power3.out'
191
+ });
192
+ });
193
+ });
194
+ });
195
+
196
+ // Render Achievements
197
+ fetchData('/api/achievements', 'achievements-grid', (data, container) => {
198
+ data.forEach(achievement => {
199
+ const card = document.createElement('div');
200
+ card.className = 'achievement-card glassmorphic p-6 rounded-xl hover:scale-105 transition-transform';
201
+ card.setAttribute('data-tilt', '');
202
+ card.setAttribute('data-tilt-max', '10');
203
+ card.innerHTML = `
204
+ <div class="flex items-start space-x-4">
205
+ <div class="icon-wrapper p-3 glassmorphic rounded-full">
206
+ <i class="fas fa-${achievement.icon} text-primary-blue glow"></i>
207
+ </div>
208
+ <div>
209
+ <h3 class="text-lg font-orbitron text-primary-blue glow">${achievement.title}</h3>
210
+ <p class="text-sm text-primary-blue">${achievement.organization}</p>
211
+ <p class="text-gray-300">${achievement.description}</p>
212
+ </div>
213
+ </div>
214
+ `;
215
+ container.appendChild(card);
216
+ VanillaTilt.init(card);
217
+ gsap.from(card, { scrollTrigger: { trigger: card, start: 'top 80%' }, y: 50, opacity: 0, duration: 1, ease: 'power3.out' });
218
+ });
219
+ });
220
+
221
+ // Render Hobbies
222
+ fetchData('/api/hobbies', 'hobbies-grid', (data, container) => {
223
+ data.forEach(hobby => {
224
+ const card = document.createElement('div');
225
+ card.className = 'hobby-card glassmorphic p-6 rounded-xl hover:scale-105 transition-transform';
226
+ card.setAttribute('data-tilt', '');
227
+ card.setAttribute('data-tilt-max', '10');
228
+ card.innerHTML = `
229
+ <div class="flex items-center space-x-4">
230
+ <div class="icon-wrapper p-3 glassmorphic rounded-full">
231
+ <i class="fas fa-${hobby.icon} text-primary-blue glow"></i>
232
+ </div>
233
+ <div>
234
+ <h3 class="text-lg font-orbitron text-primary-blue glow">${hobby.title}</h3>
235
+ <p class="text-gray-300">${hobby.description}</p>
236
+ </div>
237
+ </div>
238
+ `;
239
+ container.appendChild(card);
240
+ VanillaTilt.init(card);
241
+ gsap.from(card, { scrollTrigger: { trigger: card, start: 'top 80%' }, y: 50, opacity: 0, duration: 1, ease: 'power3.out' });
242
+ });
243
+ });
244
+
245
+ // Render Projects with Modal
246
+ const modal = document.getElementById('project-modal');
247
+ const modalClose = document.getElementById('modal-close');
248
+ fetchData('/api/projects', 'projects-grid', (data, container) => {
249
+ data.forEach(project => {
250
+ const card = document.createElement('div');
251
+ card.className = 'project-card glassmorphic rounded-xl overflow-hidden cursor-pointer hover:scale-105 transition-transform';
252
+ card.setAttribute('data-tilt', '');
253
+ card.setAttribute('data-tilt-max', '10');
254
+ card.innerHTML = `
255
+ <div class="relative">
256
+ <img src="${project.image}" alt="${project.title}" class="w-full h-48 object-cover glow">
257
+ <div class="project-overlay absolute inset-0 flex items-center justify-center opacity-0 hover:opacity-100">
258
+ <i class="fas fa-search text-white text-2xl glow"></i>
259
+ </div>
260
+ </div>
261
+ <div class="p-6">
262
+ <h3 class="text-lg font-orbitron text-primary-blue glow mb-2">${project.title}</h3>
263
+ <p class="text-gray-300 text-sm mb-4">${project.description.substring(0, 100)}...</p>
264
+ <div class="flex flex-wrap gap-2">
265
+ ${project.technologies.map(tech => `<span class="tech-tag glassmorphic text-xs px-2 py-1 rounded-full text-primary-blue glow">${tech}</span>`).join('')}
266
+ </div>
267
+ </div>
268
+ `;
269
+ card.addEventListener('click', () => {
270
+ document.getElementById('modal-image').src = project.image;
271
+ document.getElementById('modal-title').textContent = project.title;
272
+ document.getElementById('modal-description').textContent = project.description;
273
+ const techContainer = document.getElementById('modal-tech');
274
+ techContainer.innerHTML = project.technologies.map(tech => `<span class="tech-tag glassmorphic text-xs px-2 py-1 rounded-full text-primary-blue glow">${tech}</span>`).join('');
275
+ document.getElementById('modal-github').href = project.githubLink;
276
+ document.getElementById('modal-live').href = project.liveLink;
277
+ modal.classList.remove('hidden');
278
+ gsap.from(modal.querySelector('div'), { y: 100, opacity: 0, duration: 0.8, ease: 'power3.out' });
279
+ });
280
+ container.appendChild(card);
281
+ VanillaTilt.init(card);
282
+ gsap.from(card, { scrollTrigger: { trigger: card, start: 'top 80%' }, y: 50, opacity: 0, duration: 1, ease: 'power3.out' });
283
+ });
284
+ });
285
+ modalClose.addEventListener('click', () => {
286
+ modal.classList.add('hidden');
287
+ });
288
+ modal.addEventListener('click', (e) => {
289
+ if (e.target === modal) modal.classList.add('hidden');
290
+ });
291
+
292
+ // Render Education
293
+ fetchData('/api/education', 'education-grid', (data, container) => {
294
+ data.forEach(edu => {
295
+ const card = document.createElement('div');
296
+ card.className = 'education-card glassmorphic p-6 rounded-xl hover:scale-105 transition-transform';
297
+ card.setAttribute('data-tilt', '');
298
+ card.setAttribute('data-tilt-max', '10');
299
+ card.innerHTML = `
300
+ <div class="flex items-start space-x-4">
301
+ <div class="icon-wrapper p-3 glassmorphic rounded-full">
302
+ <i class="fas fa-graduation-cap text-primary-blue glow"></i>
303
+ </div>
304
+ <div class="flex-1">
305
+ <div class="flex items-center justify-between mb-2">
306
+ <h3 class="text-lg font-orbitron text-primary-blue glow">${edu.degree}</h3>
307
+ <div class="period flex items-center text-gray-400">
308
+ <i class="fas fa-calendar mr-1"></i>
309
+ <span>${edu.period}</span>
310
+ </div>
311
+ </div>
312
+ <h4 class="text-primary-blue glow mb-2">${edu.institution}</h4>
313
+ <p class="text-gray-300 mb-4">${edu.description}</p>
314
+ <h5 class="font-orbitron text-primary-blue glow">Key Achievements:</h5>
315
+ <ul class="list-disc pl-5 text-gray-300">
316
+ ${edu.achievements.map(achievement => `<li>${achievement}</li>`).join('')}
317
+ </ul>
318
+ </div>
319
+ </div>
320
+ `;
321
+ container.appendChild(card);
322
+ VanillaTilt.init(card);
323
+ gsap.from(card, { scrollTrigger: { trigger: card, start: 'top 80%' }, y: 50, opacity: 0, duration: 1, ease: 'power3.out' });
324
+ });
325
+ });
326
+
327
+ // Handle Contact Form Submission via Button Click
328
+ const contactSubmitButton = document.getElementById('contact-submit');
329
+ const emailInput = document.getElementById('email');
330
+ const messageInput = document.getElementById('message');
331
+
332
+ contactSubmitButton.addEventListener('click', async () => {
333
+ const email = emailInput.value.trim();
334
+ const message = messageInput.value.trim();
335
+
336
+ // Validate inputs
337
+ if (!email || !message) {
338
+ alert('Please fill in both email and message fields.');
339
+ return;
340
+ }
341
+
342
+ if (!/\S+@\S+\.\S+/.test(email)) {
343
+ alert('Please enter a valid email address.');
344
+ return;
345
+ }
346
+
347
+ try {
348
+ const response = await fetch('/api/contact', {
349
+ method: 'POST',
350
+ headers: { 'Content-Type': 'application/json' },
351
+ body: JSON.stringify({ email, message })
352
+ });
353
+
354
+ if (!response.ok) {
355
+ const errorData = await response.json();
356
+ throw new Error(errorData.error || `HTTP error! status: ${response.status}`);
357
+ }
358
+
359
+ const data = await response.json();
360
+ alert(data.message);
361
+ emailInput.value = '';
362
+ messageInput.value = '';
363
+ } catch (error) {
364
+ console.error('Error submitting contact form:', error);
365
+ alert('Error submitting form. If you\'re on Hugging Face Spaces, please use LinkedIn or GitHub to contact me.');
366
+ }
367
+ });
static/style.css ADDED
@@ -0,0 +1,361 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Custom Fonts */
2
+ .font-orbitron {
3
+ font-family: 'Orbitron', sans-serif;
4
+ }
5
+
6
+ .font-lexend {
7
+ font-family: 'Lexend', sans-serif;
8
+ }
9
+
10
+ /* Color Variables */
11
+ :root {
12
+ --primary-blue: #1E90FF; /* Accent color for progress rings */
13
+ --dark-bg: #1A0B2E;
14
+ --light-gray: #F5F5F5;
15
+ --text-gray: #666;
16
+ }
17
+
18
+ /* Glassmorphism Effect (Retained for other sections) */
19
+ .glassmorphic {
20
+ background: rgba(255, 255, 255, 0.1);
21
+ backdrop-filter: blur(12px);
22
+ border: 1px solid rgba(255, 255, 255, 0.15);
23
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
24
+ transition: all 0.3s ease;
25
+ }
26
+
27
+ /* Neumorphic Effect (Retained for other sections) */
28
+ .neumorphic {
29
+ background: #6B46C1;
30
+ box-shadow: 5px 5px 15px rgba(0, 0, 0, 0.3), -5px -5px 15px rgba(255, 255, 255, 0.1);
31
+ transition: all 0.3s ease;
32
+ }
33
+
34
+ .neumorphic:hover {
35
+ box-shadow: inset 5px 5px 15px rgba(0, 0, 0, 0.3), inset -5px -5px 15px rgba(255, 255, 255, 0.1);
36
+ }
37
+
38
+ /* Glow Effect (Retained for other sections) */
39
+ .glow {
40
+ text-shadow: 0 0 10px var(--primary-blue);
41
+ transition: text-shadow 0.3s ease;
42
+ }
43
+
44
+ .glow:hover {
45
+ text-shadow: 0 0 15px var(--primary-blue);
46
+ }
47
+
48
+ img.glow {
49
+ box-shadow: 0 0 15px var(--primary-blue);
50
+ }
51
+
52
+ /* Gradient wipe animation for #typing-text */
53
+ #typing-text {
54
+ display: block;
55
+ visibility: visible;
56
+ opacity: 1;
57
+ background: linear-gradient(to right, rgba(209, 213, 219, 0) 0%, rgba(209, 213, 219, 1) 50%, rgba(209, 213, 219, 1) 100%);
58
+ background-size: 200% 100%;
59
+ background-position: -100%;
60
+ -webkit-background-clip: text;
61
+ background-clip: text;
62
+ -webkit-text-fill-color: transparent;
63
+ color: transparent;
64
+ animation: gradientWipe 2s ease-out forwards 1s;
65
+ }
66
+
67
+ @keyframes gradientWipe {
68
+ 0% {
69
+ background-position: -100%;
70
+ -webkit-text-fill-color: transparent;
71
+ color: transparent;
72
+ }
73
+ 100% {
74
+ background-position: 100%;
75
+ -webkit-text-fill-color: rgb(209, 213, 219);
76
+ color: rgb(209, 213, 219);
77
+ opacity: 1;
78
+ visibility: visible;
79
+ }
80
+ }
81
+
82
+ /* Ensure hero section contents stay visible */
83
+ #home .animate-slide-in,
84
+ #home .animate-slide-in h1,
85
+ #home .animate-slide-in p,
86
+ #home .animate-slide-in .flex {
87
+ opacity: 1 !important;
88
+ visibility: visible !important;
89
+ }
90
+
91
+ /* Ensure the image stays visible */
92
+ #home .animate-fade-in {
93
+ opacity: 1 !important;
94
+ visibility: visible !important;
95
+ }
96
+
97
+ /* Underline Effect */
98
+ .underline {
99
+ width: 80px;
100
+ height: 4px;
101
+ background: var(--primary-blue);
102
+ margin: 0 auto;
103
+ border-radius: 2px;
104
+ }
105
+
106
+ /* Buttons */
107
+ .btn-primary {
108
+ background: var(--primary-blue);
109
+ color: #fff;
110
+ padding: 12px 24px;
111
+ border-radius: 50px;
112
+ transition: all 0.3s ease;
113
+ position: relative;
114
+ overflow: hidden;
115
+ }
116
+
117
+ .btn-primary:hover {
118
+ transform: translateY(-3px);
119
+ box-shadow: 0 0 20px var(--primary-blue);
120
+ }
121
+
122
+ .btn-secondary {
123
+ background: transparent;
124
+ border: 2px solid var(--primary-blue);
125
+ color: var(--primary-blue);
126
+ padding: 10px 20px;
127
+ border-radius: 50px;
128
+ transition: all 0.3s ease;
129
+ position: relative;
130
+ overflow: hidden;
131
+ }
132
+
133
+ .btn-secondary:hover {
134
+ background: var(--primary-blue);
135
+ color: #fff;
136
+ box-shadow: 0 0 20px var(--primary-blue);
137
+ }
138
+
139
+ /* Ripple Effect */
140
+ .ripple .ripple-effect {
141
+ content: '';
142
+ position: absolute;
143
+ width: 100px;
144
+ height: 100px;
145
+ background: rgba(255, 255, 255, 0.3);
146
+ border-radius: 50%;
147
+ transform: scale(0);
148
+ animation: ripple-effect 0.6s ease-out;
149
+ }
150
+
151
+ @keyframes ripple-effect {
152
+ to {
153
+ transform: scale(4);
154
+ opacity: 0;
155
+ }
156
+ }
157
+
158
+ /* Skills Section New Design */
159
+ #skills {
160
+ background: #fff; /* Clean white background */
161
+ position: relative;
162
+ overflow: hidden;
163
+ }
164
+
165
+ /* Style for skill cards in horizontal scroll */
166
+ #skills-grid {
167
+ display: flex; /* Ensure flexbox is applied */
168
+ overflow-x: auto;
169
+ scroll-behavior: smooth;
170
+ -webkit-overflow-scrolling: touch;
171
+ }
172
+
173
+ /* Modern Skill Card Design */
174
+ .skill-card {
175
+ flex: 0 0 200px; /* Compact width */
176
+ height: 300px; /* Taller to fit skills vertically */
177
+ display: flex;
178
+ flex-direction: column;
179
+ justify-content: space-between;
180
+ align-items: center;
181
+ text-align: center;
182
+ background: var(--light-gray);
183
+ border-radius: 15px;
184
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
185
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
186
+ padding: 1rem;
187
+ margin: 0 1rem; /* Increased horizontal margin for more spacing */
188
+ }
189
+
190
+ /* Hover Effect */
191
+ .skill-card:hover {
192
+ transform: translateY(-5px);
193
+ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.15);
194
+ }
195
+
196
+ /* Icon Styling */
197
+ .skill-card i {
198
+ font-size: 2rem;
199
+ color: var(--primary-blue);
200
+ margin-bottom: 0.5rem;
201
+ }
202
+
203
+ /* Category Title */
204
+ .skill-card h3 {
205
+ font-size: 1.1rem;
206
+ font-weight: 600;
207
+ color: #333;
208
+ margin-bottom: 1rem;
209
+ }
210
+
211
+ /* Adjust the skills list inside the card */
212
+ .skill-card .space-y-3 {
213
+ width: 100%;
214
+ overflow-y: auto;
215
+ }
216
+
217
+ /* Style the scrollbar for the skills list inside the card */
218
+ .skill-card .space-y-3::-webkit-scrollbar {
219
+ width: 4px;
220
+ }
221
+
222
+ .skill-card .space-y-3::-webkit-scrollbar-track {
223
+ background: #E5E5E5;
224
+ }
225
+
226
+ .skill-card .space-y-3::-webkit-scrollbar-thumb {
227
+ background: var(--primary-blue);
228
+ border-radius: 4px;
229
+ }
230
+
231
+ .skill-card .space-y-3::-webkit-scrollbar-thumb:hover {
232
+ background: #1E70D0;
233
+ }
234
+
235
+ /* Skill Item Layout */
236
+ .skill-item {
237
+ display: flex;
238
+ justify-content: space-between;
239
+ align-items: center;
240
+ gap: 0.5rem;
241
+ }
242
+
243
+ /* Skill Name */
244
+ .skill-item span:first-child {
245
+ flex: 1;
246
+ text-align: left;
247
+ font-size: 0.9rem;
248
+ color: var(--text-gray);
249
+ white-space: nowrap;
250
+ overflow: hidden;
251
+ text-overflow: ellipsis;
252
+ max-width: 80px;
253
+ }
254
+
255
+ /* Circular Progress Container */
256
+ .progress-circle-container {
257
+ position: relative;
258
+ width: 40px;
259
+ height: 40px;
260
+ }
261
+
262
+ /* Circular Progress Background */
263
+ .progress-circle-bg {
264
+ position: absolute;
265
+ width: 100%;
266
+ height: 100%;
267
+ border-radius: 50%;
268
+ background: #E5E5E5;
269
+ }
270
+
271
+ /* Circular Progress Fill (SVG) */
272
+ .progress-circle {
273
+ width: 100%;
274
+ height: 100%;
275
+ transform: rotate(-90deg); /* Start from the top */
276
+ }
277
+
278
+ /* Percentage Text Inside Circle */
279
+ .progress-percentage {
280
+ position: absolute;
281
+ top: 50%;
282
+ left: 50%;
283
+ transform: translate(-50%, -50%);
284
+ font-size: 0.7rem;
285
+ color: var(--text-gray);
286
+ }
287
+
288
+ /* Ensure skills section is visible */
289
+ #skills,
290
+ #skills-grid,
291
+ .skill-card,
292
+ .skill-item,
293
+ .progress-circle-container,
294
+ .progress-circle,
295
+ .progress-percentage {
296
+ display: block !important;
297
+ visibility: visible !important;
298
+ opacity: 1 !important;
299
+ }
300
+
301
+ /* Custom Scrollbar for the horizontal scroll */
302
+ #skills-grid::-webkit-scrollbar {
303
+ height: 8px;
304
+ }
305
+
306
+ #skills-grid::-webkit-scrollbar-track {
307
+ background: #E5E5E5;
308
+ }
309
+
310
+ #skills-grid::-webkit-scrollbar-thumb {
311
+ background: var(--primary-blue);
312
+ border-radius: 4px;
313
+ }
314
+
315
+ #skills-grid::-webkit-scrollbar-thumb:hover {
316
+ background: #1E70D0;
317
+ }
318
+
319
+ /* Project Overlay (Retained for other sections) */
320
+ .project-overlay {
321
+ background: var(--primary-blue);
322
+ transition: opacity 0.3s ease;
323
+ }
324
+
325
+ /* Global Scrollbar */
326
+ ::-webkit-scrollbar {
327
+ width: 8px;
328
+ }
329
+
330
+ ::-webkit-scrollbar-track {
331
+ background: #2D1B46;
332
+ }
333
+
334
+ ::-webkit-scrollbar-thumb {
335
+ background: var(--primary-blue);
336
+ border-radius: 4px;
337
+ }
338
+
339
+ ::-webkit-scrollbar-thumb:hover {
340
+ background: #1E70D0;
341
+ }
342
+
343
+ /* Animations */
344
+ @keyframes slideIn {
345
+ from { opacity: 0; transform: translateY(50px); }
346
+ to { opacity: 1; transform: translateY(0); }
347
+ }
348
+
349
+ @keyframes fadeIn {
350
+ from { opacity: 0; }
351
+ to { opacity: 1; }
352
+ }
353
+
354
+ /* Remove CSS animation since we're using GSAP */
355
+ .animate-slide-in {
356
+ /* No animation here; GSAP will handle it */
357
+ }
358
+
359
+ .animate-fade-in {
360
+ animation: fadeIn 1.5s ease-in-out;
361
+ }
templates/index.html ADDED
@@ -0,0 +1,263 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <meta name="description" content="Portfolio of B Chaitanya Reddy, a passionate Python developer and aspiring Machine Learning engineer.">
7
+ <meta name="keywords" content="portfolio, python developer, machine learning, web development">
8
+ <meta name="author" content="B Chaitanya Reddy">
9
+ <title>B Chaitanya Reddy - Portfolio</title>
10
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css">
11
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css">
12
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700&family=Lexend:wght@300;400;600&display=swap">
13
+ <link rel="stylesheet" href="/static/style.css">
14
+ <link rel="icon" type="image/jpg" href="/static/images/favicon.jpg">
15
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script>
16
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/ScrollTrigger.min.js"></script>
17
+ <script src="https://cdn.jsdelivr.net/npm/particles.js@2.0.0/particles.min.js"></script>
18
+ <script src="https://cdn.jsdelivr.net/npm/vanilla-tilt@1.8.1/dist/vanilla-tilt.min.js"></script>
19
+ <script defer src="/static/script.js"></script>
20
+ </head>
21
+ <body class="bg-gray-900 text-gray-100 font-lexend relative overflow-x-hidden">
22
+ <!-- Particle Background -->
23
+ <div id="particles-js" class="absolute inset-0 z-0"></div>
24
+
25
+ <!-- Glowing Cursor Trail -->
26
+ <canvas id="cursor-trail" class="fixed inset-0 pointer-events-none z-50"></canvas>
27
+
28
+ <!-- Navigation Bar -->
29
+ <nav id="navbar" class="fixed top-0 left-0 w-full glassmorphic z-50">
30
+ <div class="container mx-auto px-4 py-4 flex justify-between items-center">
31
+ <a href="#home" class="text-2xl font-orbitron text-primary-blue glow">BCR</a>
32
+ <div class="hidden md:flex space-x-6">
33
+ <a href="#home" class="nav-link text-primary-blue hover:text-primary-blue glow">Home</a>
34
+ <a href="#about" class="nav-link text-primary-blue hover:text-primary-blue glow">About</a>
35
+ <a href="#skills" class="nav-link text-primary-blue hover:text-primary-blue glow">Skills</a>
36
+ <a href="#achievements" class="nav-link text-primary-blue hover:text-primary-blue glow">Achievements</a>
37
+ <a href="#hobbies" class="nav-link text-primary-blue hover:text-primary-blue glow">Hobbies</a>
38
+ <a href="#projects" class="nav-link text-primary-blue hover:text-primary-blue glow">Projects</a>
39
+ <a href="#education" class="nav-link text-primary-blue hover:text-primary-blue glow">Education</a>
40
+ <a href="#resume" class="nav-link text-primary-blue hover:text-primary-blue glow">Resume</a>
41
+ <a href="#contact" class="nav-link text-primary-blue hover:text-primary-blue glow">Contact</a>
42
+ </div>
43
+ <div class="flex items-center space-x-4">
44
+ <button id="theme-toggle" class="text-primary-blue hover:text-primary-blue glow" aria-label="Toggle dark mode">
45
+ <i class="fas fa-moon"></i>
46
+ </button>
47
+ <button id="menu-toggle" class="md:hidden text-primary-blue" aria-label="Toggle menu">
48
+ <i class="fas fa-bars"></i>
49
+ </button>
50
+ </div>
51
+ </div>
52
+ <!-- Mobile Menu -->
53
+ <div id="mobile-menu" class="hidden md:hidden glassmorphic">
54
+ <div class="container mx-auto px-4 py-4 flex flex-col space-y-4">
55
+ <a href="#home" class="nav-link text-primary-blue hover:text-primary-blue glow">Home</a>
56
+ <a href="#about" class="nav-link text-primary-blue hover:text-primary-blue glow">About</a>
57
+ <a href="#skills" class="nav-link text-primary-blue hover:text-primary-blue glow">Skills</a>
58
+ <a href="#achievements" class="nav-link text-primary-blue hover:text-primary-blue glow">Achievements</a>
59
+ <a href="#hobbies" class="nav-link text-primary-blue hover:text-primary-blue glow">Hobbies</a>
60
+ <a href="#projects" class="nav-link text-primary-blue hover:text-primary-blue glow">Projects</a>
61
+ <a href="#education" class="nav-link text-primary-blue hover:text-primary-blue glow">Education</a>
62
+ <a href="#resume" class="nav-link text-primary-blue hover:text-primary-blue glow">Resume</a>
63
+ <a href="#contact" class="nav-link text-primary-blue hover:text-primary-blue glow">Contact</a>
64
+ </div>
65
+ </div>
66
+ </nav>
67
+
68
+ <!-- Hero Section -->
69
+ <section id="home" class="min-h-screen flex items-center relative z-10 pt-20">
70
+ <div class="container mx-auto px-4 flex flex-col md:flex-row items-center">
71
+ <div class="md:w-1/2 text-center md:text-left animate-slide-in">
72
+ <h1 class="text-4xl md:text-6xl font-orbitron text-primary-blue glow mb-4">Hi, I'm <span class="text-primary-blue">B Chaitanya Reddy</span></h1>
73
+ <p id="typing-text" class="text-xl md:text-2xl text-gray-300 mb-6">Python Developer | Machine Learning Enthusiast | AI Innovator</p>
74
+ <div class="flex justify-center md:justify-start space-x-4">
75
+ <a href="#projects" class="btn btn-primary ripple">View My Work <i class="fas fa-arrow-right ml-2"></i></a>
76
+ <a href="#contact" class="btn btn-secondary ripple">Contact Me</a>
77
+ </div>
78
+ </div>
79
+ <div class="md:w-1/2 mt-8 md:mt-0" data-tilt data-tilt-max="15" data-tilt-speed="400" data-tilt-perspective="1000">
80
+ <img src="/static/images/myPhoto.jpg" alt="B Chaitanya Reddy" class="rounded-full w-64 h-64 mx-auto object-cover glassmorphic glow animate-fade-in">
81
+ </div>
82
+ </div>
83
+ </section>
84
+
85
+ <!-- About Section -->
86
+ <section id="about" class="py-20 relative z-10">
87
+ <div class="container mx-auto px-4">
88
+ <div class="text-center mb-12">
89
+ <h2 class="text-3xl md:text-4xl font-orbitron text-primary-blue glow">About Me</h2>
90
+ <div class="underline"></div>
91
+ </div>
92
+ <div class="flex flex-col md:flex-row gap-12">
93
+ <div class="md:w-1/2 glassmorphic p-8 rounded-xl">
94
+ <p class="text-lg text-gray-300 leading-relaxed">I'm a passionate fresher pursuing Computer Science and Engineering at REVA University. With a strong foundation in Python, Machine Learning, and NLP, I'm eager to create impactful solutions and grow as a professional in AI and software development.</p>
95
+ <div class="mt-6 space-y-4">
96
+ <div class="flex items-center gap-3 text-primary-blue">
97
+ <i class="fas fa-user"></i>
98
+ <span>Computer Science Student</span>
99
+ </div>
100
+ <div class="flex items-center gap-3 text-primary-blue">
101
+ <i class="fas fa-map-pin"></i>
102
+ <span>Bangalore, India</span>
103
+ </div>
104
+ <div class="flex items-center gap-3 text-primary-blue">
105
+ <i class="fas fa-briefcase"></i>
106
+ <span>Open to Opportunities</span>
107
+ </div>
108
+ </div>
109
+ </div>
110
+ <div class="md:w-1/2 grid grid-cols-2 gap-4">
111
+ <div class="stat-card glassmorphic p-6 rounded-xl text-center hover:scale-105 transition-transform">
112
+ <h3 class="text-3xl font-orbitron text-primary-blue glow">3+</h3>
113
+ <p class="text-gray-300">Academic Projects</p>
114
+ </div>
115
+ <div class="stat-card glassmorphic p-6 rounded-xl text-center hover:scale-105 transition-transform">
116
+ <h3 class="text-3xl font-orbitron text-primary-blue glow">5+</h3>
117
+ <p class="text-gray-300">Certifications</p>
118
+ </div>
119
+ <div class="stat-card glassmorphic p-6 rounded-xl text-center hover:scale-105 transition-transform">
120
+ <h3 class="text-3xl font-orbitron text-primary-blue glow">5+</h3>
121
+ <p class="text-gray-300">Skills</p>
122
+ </div>
123
+ <div class="stat-card glassmorphic p-6 rounded-xl text-center hover:scale-105 transition-transform">
124
+ <h3 class="text-3xl font-orbitron text-primary-blue glow">2+</h3>
125
+ <p class="text-gray-300">Internships</p>
126
+ </div>
127
+ </div>
128
+ </div>
129
+ </div>
130
+ </section>
131
+
132
+ <!-- Skills Section -->
133
+ <section id="skills" class="py-20 relative z-10">
134
+ <div class="container mx-auto px-4">
135
+ <div class="text-center mb-12">
136
+ <h2 class="text-3xl md:text-4xl font-orbitron text-primary-blue glow">Technical Skills</h2>
137
+ <div class="underline"></div>
138
+ </div>
139
+ <div id="skills-grid" class="flex overflow-x-auto space-x-10 pb-4"></div>
140
+ </div>
141
+ </section>
142
+
143
+ <!-- Achievements Section -->
144
+ <section id="achievements" class="py-20 relative z-10">
145
+ <div class="container mx-auto px-4">
146
+ <div class="text-center mb-12">
147
+ <h2 class="text-3xl md:text-4xl font-orbitron text-primary-blue glow">Achievements</h2>
148
+ <div class="underline"></div>
149
+ </div>
150
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-8" id="achievements-grid"></div>
151
+ </div>
152
+ </section>
153
+
154
+ <!-- Hobbies Section -->
155
+ <section id="hobbies" class="py-20 relative z-10">
156
+ <div class="container mx-auto px-4">
157
+ <div class="text-center mb-12">
158
+ <h2 class="text-3xl md:text-4xl font-orbitron text-primary-blue glow">Hobbies & Interests</h2>
159
+ <div class="underline"></div>
160
+ </div>
161
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8" id="hobbies-grid"></div>
162
+ </div>
163
+ </section>
164
+
165
+ <!-- Projects Section -->
166
+ <section id="projects" class="py-20 relative z-10">
167
+ <div class="container mx-auto px-4">
168
+ <div class="text-center mb-12">
169
+ <h2 class="text-3xl md:text-4xl font-orbitron text-primary-blue glow">Featured Projects</h2>
170
+ <div class="underline"></div>
171
+ </div>
172
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8" id="projects-grid"></div>
173
+ </div>
174
+ </section>
175
+
176
+ <!-- Education Section -->
177
+ <section id="education" class="py-20 relative z-10">
178
+ <div class="container mx-auto px-4">
179
+ <div class="text-center mb-12">
180
+ <h2 class="text-3xl md:text-4xl font-orbitron text-primary-blue glow">Education</h2>
181
+ <div class="underline"></div>
182
+ </div>
183
+ <div class="flex flex-col gap-12" id="education-grid"></div>
184
+ </div>
185
+ </section>
186
+
187
+ <!-- Resume Section -->
188
+ <section id="resume" class="py-20 relative z-10">
189
+ <div class="container mx-auto px-4">
190
+ <div class="text-center mb-12">
191
+ <h2 class="text-3xl md:text-4xl font-orbitron text-primary-blue glow">Resume</h2>
192
+ <div class="underline"></div>
193
+ </div>
194
+ <div class="max-w-2xl mx-auto glassmorphic p-8 rounded-xl">
195
+ <h3 class="text-2xl font-orbitron text-primary-blue glow mb-4">Download My Resume</h3>
196
+ <p class="text-gray-300 mb-6">Get a detailed overview of my skills, education, and achievements.</p>
197
+ <div class="flex flex-col sm:flex-row gap-4 justify-center">
198
+ <a href="/static/B Chaitanya Reddy Resume.pdf" download class="btn btn-primary ripple">
199
+ <i class="fas fa-file-download mr-2"></i> Download PDF
200
+ </a>
201
+ <a href="/static/B Chaitanya Reddy Resume.pdf" target="_blank" rel="noopener noreferrer" class="btn btn-secondary ripple">
202
+ <i class="fas fa-eye mr-2"></i> View Online
203
+ </a>
204
+ </div>
205
+ <p class="mt-6 text-gray-400 text-sm">Last updated: <span id="last-updated-date">June 05, 2025</span></p>
206
+ </div>
207
+ </div>
208
+ </section>
209
+
210
+ <!-- Contact Section -->
211
+ <section id="contact" class="py-20 relative z-10">
212
+ <div class="container mx-auto px-4">
213
+ <div class="text-center mb-12">
214
+ <h2 class="text-3xl md:text-4xl font-orbitron text-primary-blue glow">Contact Me</h2>
215
+ <p class="text-gray-300 mt-4">Feel free to reach out for collaborations or just a friendly hello!</p>
216
+ </div>
217
+ <div id="contact-form" class="max-w-2xl mx-auto space-y-6 glassmorphic p-8 rounded-xl">
218
+ <input type="email" id="email" name="email" placeholder="Your email" required class="w-full p-3 rounded-md bg-transparent border border-gray-600 text-gray-100 focus:border-primary-blue focus:glow">
219
+ <textarea id="message" name="message" placeholder="Your message" required rows="6" class="w-full p-3 rounded-md bg-transparent border border-gray-600 text-gray-100 focus:border-primary-blue focus:glow"></textarea>
220
+ <button id="contact-submit" class="btn btn-primary w-full ripple">Send Message</button>
221
+ <p class="text-gray-400 text-sm mt-4">Note: Email submission may not work on Hugging Face Spaces due to sandbox restrictions. Please contact me via <a href="https://www.linkedin.com/in/b-chaitanya-reddy-63211728a/" target="_blank" class="text-primary-blue glow">LinkedIn</a> or <a href="https://github.com/BChaitanyaReddy895" target="_blank" class="text-primary-blue glow">GitHub</a>.</p>
222
+ </div>
223
+ </div>
224
+ </section>
225
+
226
+ <!-- Footer -->
227
+ <footer class="bg-gray-800 text-gray-300 py-8 relative z-10">
228
+ <div class="container mx-auto px-4 text-center">
229
+ <p>© 2025 B Chaitanya Reddy. All rights reserved.</p>
230
+ <div class="flex justify-center space-x-6 mt-4">
231
+ <a href="https://github.com/BChaitanyaReddy895" target="_blank" rel="noopener noreferrer" class="text-primary-blue hover:text-primary-blue glow">
232
+ <i class="fab fa-github text-2xl"></i>
233
+ </a>
234
+ <a href="https://www.linkedin.com/in/b-chaitanya-reddy-63211728a/" target="_blank" rel="noopener noreferrer" class="text-primary-blue hover:text-primary-blue glow">
235
+ <i class="fab fa-linkedin text-2xl"></i>
236
+ </a>
237
+ </div>
238
+ </div>
239
+ </footer>
240
+
241
+ <!-- Back to Top Button -->
242
+ <button id="back-to-top" class="fixed bottom-8 right-8 bg-primary-blue text-gray-900 p-3 rounded-full shadow-lg hidden neumorphic glow" aria-label="Back to top">
243
+ <i class="fas fa-arrow-up"></i>
244
+ </button>
245
+
246
+ <!-- Project Modal -->
247
+ <div id="project-modal" class="fixed inset-0 bg-black bg-opacity-75 flex items-center justify-center hidden z-50">
248
+ <div class="glassmorphic p-8 rounded-xl max-w-2xl w-full mx-4 relative">
249
+ <button id="modal-close" class="absolute top-4 right-4 text-primary-blue hover:text-primary-blue glow" aria-label="Close modal">
250
+ <i class="fas fa-times"></i>
251
+ </button>
252
+ <img id="modal-image" src="" alt="" class="w-full h-64 object-cover rounded-md mb-4 glow">
253
+ <h3 id="modal-title" class="text-2xl font-orbitron text-primary-blue glow mb-2"></h3>
254
+ <p id="modal-description" class="text-gray-300 mb-4"></p>
255
+ <div id="modal-tech" class="flex flex-wrap gap-2 mb-4"></div>
256
+ <div class="flex space-x-4">
257
+ <a id="modal-github" href="#" class="btn btn-primary ripple">View on GitHub</a>
258
+ <a id="modal-live" href="#" class="btn btn-secondary ripple">Live Demo</a>
259
+ </div>
260
+ </div>
261
+ </div>
262
+ </body>
263
+ </html>