Manyue-DataScientist commited on
Commit
8ae67aa
·
1 Parent(s): 16006b9
.gitignore CHANGED
@@ -40,3 +40,4 @@ Thumbs.db
40
  # Logs and temporary files
41
  *.log
42
  *.tmp
 
 
40
  # Logs and temporary files
41
  *.log
42
  *.tmp
43
+
app.py CHANGED
@@ -1,319 +1,1506 @@
1
  import gradio as gr
2
  import base64
 
 
3
 
4
  # --- Helper Functions ---
 
 
 
 
 
 
 
 
 
5
  def file_to_data_uri(filepath, mime_type="application/pdf"):
6
- with open(filepath, "rb") as f:
7
- data = f.read()
8
- b64 = base64.b64encode(data).decode("utf-8")
9
- return f"data:{mime_type};base64,{b64}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
 
11
  def toggle_resume(is_visible):
 
12
  new_state = not is_visible
13
  new_label = "Hide Resume" if new_state else "View Resume"
14
  return new_state, gr.update(visible=new_state), gr.update(value=new_label)
15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  # --- CSS ---
17
  portfolio_css = """
18
- /* Import Google font */
19
- @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;600;700&display=swap');
20
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  body {
22
  font-family: 'Poppins', sans-serif;
23
- background: linear-gradient(to bottom right, #141414, #000);
 
 
 
 
24
  margin: 0;
25
  padding: 0;
 
 
 
 
26
  }
27
- .gr-container {
28
- max-width: 1200px;
29
- margin: 0 auto;
30
- padding: 20px;
31
  }
32
-
33
- /* Landing Section */
34
- .landing-section {
35
- text-align: center;
36
- margin-bottom: 40px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  }
38
  .landing-section h1, .landing-section h2 {
39
- color: #ffffff !important;
40
  margin-top: 0;
41
  }
42
- .landing-section h1 {
43
- font-size: 2.8rem;
44
- font-weight: 700;
45
- margin-bottom: 0.5rem;
 
 
 
 
 
 
46
  }
47
- .landing-section h2 {
48
- font-size: 2rem;
49
- font-weight: 600;
50
- margin-bottom: 1rem;
51
  }
52
-
53
- /* Typewriter effect */
54
- .typing-animation {
55
- display: inline-block;
56
- overflow: hidden;
57
- white-space: nowrap;
58
- border-right: 2px solid #ffffff;
59
- font-size: 2.8rem;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  font-weight: 700;
61
- width: 29ch;
62
- animation: typing 4s steps(29, end) infinite alternate, blink-caret 0.75s step-end infinite;
63
  }
64
- @keyframes typing { from { width: 0ch; } to { width: 29ch; } }
65
- @keyframes blink-caret { 50% { border-color: transparent; } }
66
-
67
- /* Global text styling */
68
- p, li, span {
69
- color: #e8e8e8;
70
- font-size: 1.2rem;
71
  }
72
- strong {
73
- background-color: #ffffff;
74
- color: #000;
75
- padding: 0.2rem 0.3rem;
76
- border-radius: 3px;
77
- font-weight: bold;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  }
79
-
80
  /* Card styling */
 
 
 
 
 
 
81
  .card-container {
 
82
  margin-bottom: 20px;
83
- transition: transform 0.3s ease, box-shadow 0.3s ease;
84
- text-align: center;
85
  }
86
- .card-container:hover {
87
- transform: translateY(-8px);
88
- box-shadow: 0 8px 16px rgba(0,0,0,0.5);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  }
90
- .clickable-card { cursor: pointer; }
91
  .card-content {
92
- border-radius: 15px;
93
  padding: 30px;
94
- height: 150px;
95
  display: flex;
 
96
  align-items: center;
97
  justify-content: center;
98
- font-size: 24px;
99
- color: white;
100
- box-shadow: 0 4px 8px rgba(0,0,0,0.3);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  margin-bottom: 10px;
 
 
 
 
 
102
  font-weight: 600;
 
 
103
  }
104
- /* Card gradients */
105
- .card-da { background: linear-gradient(135deg, #6a11cb, #2575fc); }
106
- .card-ml { background: linear-gradient(135deg, #00c6ff, #0072ff); }
107
- .card-cv { background: linear-gradient(135deg, #f857a6, #ff5858); }
108
 
109
- /* Section headings */
110
- .da-section h1.section-heading { color: #6a11cb; }
111
- .ml-section h1.section-heading { color: #0072ff; }
112
- .cv-section h1.section-heading { color: #f857a6; }
 
 
 
 
 
 
 
 
 
113
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
  /* Back buttons */
115
  .back-button {
116
  border: none;
117
- border-radius: 20px;
118
- padding: 6px 16px;
119
- font-size: 0.85rem;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
  font-weight: 600;
121
  cursor: pointer;
122
- transition: transform 0.2s ease, box-shadow 0.2s ease;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
  margin-bottom: 20px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
  }
125
- .back-button:hover {
126
- transform: translateY(-3px);
127
- box-shadow: 0 4px 6px rgba(0,0,0,0.2);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128
  }
129
- .back-button-da { background-color: #2575fc; color: #fff; }
130
- .back-button-ml { background-color: #0072ff; color: #fff; }
131
- .back-button-cv { background-color: #ff5858; color: #fff; }
132
  """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
 
134
  # --- Portfolio Layout ---
135
- with gr.Blocks(title="Manyue's Portfolio", css=portfolio_css) as demo:
136
- # ----- Landing Page -----
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
137
  with gr.Row(visible=True, elem_classes="landing-section") as landing_section:
138
  with gr.Column():
139
- gr.HTML("""
140
- <div class="typing-animation">Welcome to Manyue's Portfolio</div><br>
141
- <h2>About Me</h2>
142
- <p>
143
- Hi, I'm Manyue Javvadi – a software engineer turned AI/ML practitioner with a strong foundation in <strong>Commerce</strong> and extensive experience in <strong>machine learning, computer vision, and data analytics</strong>.
144
- After gaining valuable industry experience at <strong>Cognizant Technology Solutions</strong>, I pursued formal education in <strong>Applied AI</strong> and <strong>Big Data Analytics</strong> in Canada.
145
- I excel at bridging <strong>business logic</strong> with <strong>innovative technical solutions</strong> to create systems that solve real-world challenges.
146
- </p>
147
- <h2>My Specializations</h2>
148
- """)
149
- with gr.Row():
 
 
 
 
 
150
  with gr.Column():
151
- da_card = gr.HTML("""
152
- <div class="card-container clickable-card" onclick="document.getElementById('da_hidden').click()">
153
- <div class="card-content card-da"><span>Data Analytics</span></div>
154
- <p style="font-weight: bold;">Data storytelling, business analysis, and visualization</p>
 
 
 
 
 
 
 
 
 
 
155
  </div>
156
- """)
157
- da_hidden = gr.Button("", visible=False, elem_id="da_hidden")
158
  with gr.Column():
159
- ml_card = gr.HTML("""
160
- <div class="card-container clickable-card" onclick="document.getElementById('ml_hidden').click()">
161
- <div class="card-content card-ml"><span>Machine Learning</span></div>
162
- <p style="font-weight: bold;">Applied ML for impactful decision-making and automation</p>
 
 
 
 
 
 
 
 
 
 
163
  </div>
164
- """)
165
- ml_hidden = gr.Button("", visible=False, elem_id="ml_hidden")
166
  with gr.Column():
167
- cv_card = gr.HTML("""
168
- <div class="card-container clickable-card" onclick="document.getElementById('cv_hidden').click()">
169
- <div class="card-content card-cv"><span>Computer Vision</span></div>
170
- <p style="font-weight: bold;">Real-time object detection and accessibility solutions</p>
 
 
 
 
 
 
 
 
 
171
  </div>
172
- """)
173
- cv_hidden = gr.Button("", visible=False, elem_id="cv_hidden")
174
-
175
- # ----- Data Analytics Section -----
176
- with gr.Column(visible=False, elem_classes="da-section") as da_section:
177
- gr.Markdown("<h1 class='section-heading' style='margin-bottom: 20px;'>Data Analytics</h1>")
178
- with gr.Tabs():
179
- with gr.TabItem("Resume"):
180
- gr.Markdown("### Professional Summary")
181
- gr.Markdown("""
182
- **Professional Summary**
183
- Detail-oriented Data Analyst with a strategic business mindset and robust technical skills in data manipulation, visualization, and predictive modeling. I transform raw data into clear insights that empower decision-makers.
184
- """)
185
- gr.Markdown("### Intro Video")
186
- gr.Video(value="data/DA_Intro.mp4", label="Data Analytics Intro Video", autoplay=False)
187
- gr.Markdown("### Resume Document Preview")
188
- da_resume_state = gr.State(value=False)
189
- with gr.Group(visible=False) as da_resume_container:
190
- da_pdf = file_to_data_uri("data/DA_Resume.pdf")
191
- gr.HTML(f"""<iframe src="{da_pdf}" width="100%" height="600px" style="border:none;"></iframe>""")
192
- da_toggle_btn = gr.Button("View Resume")
193
- da_toggle_btn.click(fn=toggle_resume, inputs=[da_resume_state], outputs=[da_resume_state, da_resume_container, da_toggle_btn])
194
- with gr.TabItem("Skills"):
195
- gr.Markdown("### Core Skills")
196
- gr.Markdown("""
197
- - **Data Wrangling & Analysis:** Expert in SQL and Python (Pandas, NumPy) for efficient data cleaning and transformation.
198
- - **Exploratory Data Analysis:** Skilled in using Tableau, Matplotlib, and Seaborn to extract and visualize insights.
199
- - **Predictive Modeling:** Proficient in statistical modeling and forecasting to drive informed decision-making.
200
- """)
201
- with gr.TabItem("Projects"):
202
- gr.Markdown("### Selected Projects")
203
- gr.Markdown("""
204
- **LoanTap: Loan Eligibility Prediction**
205
- Leveraged logistic regression and EDA to identify key factors influencing loan approvals.
206
-
207
- **Educational Data Insights**
208
- Conducted deep statistical analysis to reveal trends in student performance.
209
-
210
- **Upcoming Jamboree Admission Insights**
211
- An initiative to predict graduate admissions using advanced data techniques.
212
- """)
213
- back_da = gr.Button("← Home", elem_classes=["back-button", "back-button-da"])
214
-
215
- # ----- Machine Learning Section -----
216
- with gr.Column(visible=False, elem_classes="ml-section") as ml_section:
217
- gr.Markdown("<h1 class='section-heading' style='margin-bottom: 20px;'>Machine Learning</h1>")
218
- with gr.Tabs():
219
- with gr.TabItem("Resume"):
220
- gr.Markdown("### Professional Summary")
221
- gr.Markdown("""
222
- **Professional Summary**
223
- Passionate Machine Learning Engineer skilled in designing and deploying end-to-end ML solutions. I combine technical rigor with strategic insight to develop models that drive innovation and operational efficiency.
224
- """)
225
- gr.Markdown("### Intro Video")
226
- gr.Markdown("_Intro video is coming soon._")
227
- gr.Markdown("### Resume Document Preview")
228
- ml_resume_state = gr.State(value=False)
229
- with gr.Group(visible=False) as ml_resume_container:
230
- ml_pdf = file_to_data_uri("data/ML_CV_Resume.pdf")
231
- gr.HTML(f"""<iframe src="{ml_pdf}" width="100%" height="600px" style="border:none;"></iframe>""")
232
- ml_toggle_btn = gr.Button("View Resume")
233
- ml_toggle_btn.click(fn=toggle_resume, inputs=[ml_resume_state], outputs=[ml_resume_state, ml_resume_container, ml_toggle_btn])
234
- with gr.TabItem("Skills"):
235
- gr.Markdown("### Core Skills")
236
- gr.Markdown("""
237
- - **ML Algorithms:** Deep understanding of regression, classification, clustering, and neural networks.
238
- - **Frameworks & Libraries:** Proficient with scikit-learn, TensorFlow, and XGBoost.
239
- - **Model Deployment:** Experienced in deploying models with Gradio and Streamlit.
240
- - **Data Engineering:** Skilled in feature engineering and data preprocessing for optimal model performance.
241
- """)
242
- with gr.TabItem("Projects"):
243
- gr.Markdown("### Selected Projects")
244
- gr.Markdown("""
245
- **University Admission Predictor**
246
- Applied linear regression to forecast admission chances based on academic and test performance.
247
-
248
- [AI Chat Assistant](https://huggingface.co/spaces/Manyue-DataScientist/AI-Assistant)
249
- Built as a demonstration of a practical AI application, this assistant revolutionizes how recruiters and hiring managers interact with my
250
- portfolio. Unlike traditional chatbots, it’s designed with a unique optimization approach that prioritizes efficiency and accuracy.
251
-
252
- [Speaker Diarization Application](https://huggingface.co/spaces/Manyue-DataScientist/speaker-diarization-app-v2)
253
- Developed an advanced multi-speaker audio processing system that performs speaker diarization, transcription, and summarization to
254
- extract meaningful insights from multi-speaker conversations.
255
- """)
256
- back_ml = gr.Button("← Home", elem_classes=["back-button", "back-button-ml"])
257
-
258
- # ----- Computer Vision Section -----
259
- with gr.Column(visible=False, elem_classes="cv-section") as cv_section:
260
- gr.Markdown("<h1 class='section-heading' style='margin-bottom: 20px;'>Computer Vision</h1>")
261
- with gr.Tabs():
262
- with gr.TabItem("Resume"):
263
- gr.Markdown("### Professional Summary")
264
- gr.Markdown("""
265
- **Professional Summary**
266
- Innovative Computer Vision Engineer dedicated to crafting real-time, scalable vision solutions. I focus on building systems that improve accessibility and automate complex visual tasks.
267
- """)
268
- gr.Markdown("### Intro Video")
269
- gr.Markdown("_Intro video is coming soon._")
270
- gr.Markdown("### Resume Document Preview")
271
- cv_resume_state = gr.State(value=False)
272
- with gr.Group(visible=False) as cv_resume_container:
273
- cv_pdf = file_to_data_uri("data/ML_CV_Resume.pdf")
274
- gr.HTML(f"""<iframe src="{cv_pdf}" width="100%" height="600px" style="border:none;"></iframe>""")
275
- cv_toggle_btn = gr.Button("View Resume")
276
- cv_toggle_btn.click(fn=toggle_resume, inputs=[cv_resume_state], outputs=[cv_resume_state, cv_resume_container, cv_toggle_btn])
277
- with gr.TabItem("Skills"):
278
- gr.Markdown("### Core Skills")
279
- gr.Markdown("""
280
- - **Vision Algorithms:** Proficient in CNNs, YOLO, and segmentation for robust object detection.
281
- - **Technical Tools:** Expert in OpenCV, PyTorch, and TensorFlow for advanced image processing.
282
- - **Image Analysis:** Skilled in image enhancement, filtering, and OCR integration.
283
- - **Deep Learning:** Experienced with transfer learning and model fine-tuning for custom vision tasks.
284
- """)
285
- with gr.TabItem("Projects"):
286
- gr.Markdown("### Selected Projects")
287
- gr.Markdown("""
288
- **Smart Shopping Assistant**
289
- An accessibility tool combining real-time object detection and OCR to guide visually impaired users in retail settings.
290
-
291
- **Traffic Flow Counter (Upcoming)**
292
- An edge solution using Raspberry Pi to monitor and count vehicles at intersections.
293
-
294
- **Experimental Object Datasets**
295
- Initiatives focused on training custom YOLO models to improve detection in complex environments.
296
- """)
297
- back_cv = gr.Button("← Home", elem_classes=["back-button", "back-button-cv"])
298
-
299
- # ----- Navigation Callbacks -----
300
- def switch_to_da():
301
- return (gr.update(visible=False), gr.update(visible=True), gr.update(visible=False), gr.update(visible=False))
302
- def switch_to_ml():
303
- return (gr.update(visible=False), gr.update(visible=False), gr.update(visible=(True)), gr.update(visible=(False)))
304
- def switch_to_cv():
305
- return (gr.update(visible=False), gr.update(visible=False), gr.update(visible=(False)), gr.update(visible=(True)))
306
- def back_to_main():
307
- return (gr.update(visible=True), gr.update(visible=(False)), gr.update(visible=(False)), gr.update(visible=(False)))
308
-
309
- # Hidden card triggers for section switching
310
- da_hidden.click(fn=switch_to_da, outputs=[landing_section, da_section, ml_section, cv_section])
311
- ml_hidden.click(fn=switch_to_ml, outputs=[landing_section, da_section, ml_section, cv_section])
312
- cv_hidden.click(fn=switch_to_cv, outputs=[landing_section, da_section, ml_section, cv_section])
313
 
314
- # Back button bindings for each section
315
- back_da.click(fn=back_to_main, outputs=[landing_section, da_section, ml_section, cv_section])
316
- back_ml.click(fn=back_to_main, outputs=[landing_section, da_section, ml_section, cv_section])
317
- back_cv.click(fn=back_to_main, outputs=[landing_section, da_section, ml_section, cv_section])
 
 
 
318
 
319
- demo.launch()
 
 
 
 
 
 
 
1
  import gradio as gr
2
  import base64
3
+ import os
4
+ import json
5
 
6
  # --- Helper Functions ---
7
+ def load_json(filename):
8
+ """Load JSON data from content folder"""
9
+ try:
10
+ with open(f"content/{filename}.json", "r", encoding="utf-8") as f:
11
+ return json.load(f)
12
+ except Exception as e:
13
+ print(f"Error loading {filename}.json: {e}")
14
+ return {}
15
+
16
  def file_to_data_uri(filepath, mime_type="application/pdf"):
17
+ """Convert file to data URI"""
18
+ try:
19
+ with open(filepath, "rb") as f:
20
+ data = f.read()
21
+ b64 = base64.b64encode(data).decode("utf-8")
22
+ return f"data:{mime_type};base64,{b64}"
23
+ except Exception as e:
24
+ print(f"Error converting file to data URI: {e}")
25
+ return None
26
+
27
+ def image_to_data_uri(filepath, mime_type="image/jpeg"):
28
+ """Convert image to data URI"""
29
+ try:
30
+ with open(filepath, "rb") as f:
31
+ data = f.read()
32
+ b64 = base64.b64encode(data).decode("utf-8")
33
+ return f"data:{mime_type};base64,{b64}"
34
+ except Exception as e:
35
+ print(f"Error converting image to data URI: {e}")
36
+ return None
37
+
38
+ # --- Navigation Functions ---
39
+ def show_data_analytics():
40
+ return gr.update(visible=False), gr.update(visible=True), gr.update(visible=False), gr.update(visible=False)
41
+
42
+ def show_machine_learning():
43
+ return gr.update(visible=False), gr.update(visible=False), gr.update(visible=True), gr.update(visible=False)
44
+
45
+ def show_computer_vision():
46
+ return gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), gr.update(visible=True)
47
+
48
+ def go_home():
49
+ return gr.update(visible=True), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False)
50
 
51
  def toggle_resume(is_visible):
52
+ """Toggle the visibility of the resume section."""
53
  new_state = not is_visible
54
  new_label = "Hide Resume" if new_state else "View Resume"
55
  return new_state, gr.update(visible=new_state), gr.update(value=new_label)
56
 
57
+ # --- Icons (SVG) ---
58
+ data_analytics_icon = """<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path><path d="M8 10h.01"></path><path d="M12 10h.01"></path><path d="M16 10h.01"></path></svg>"""
59
+ machine_learning_icon = """<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"></polyline></svg>"""
60
+ computer_vision_icon = """<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"></path><circle cx="12" cy="13" r="4"></circle></svg>"""
61
+ home_icon = """<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><polyline points="9 22 9 12 15 12 15 22"></polyline></svg>"""
62
+ linkedin_icon = """<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z"></path><rect x="2" y="9" width="4" height="12"></rect><circle cx="4" cy="4" r="2"></circle></svg>"""
63
+ github_icon = """<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"></path></svg>"""
64
+ mail_icon = """<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"></path><polyline points="22,6 12,13 2,6"></polyline></svg>"""
65
+ link_icon = """<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg>"""
66
+ document_icon = """<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><line x1="10" y1="9" x2="8" y2="9"></line></svg>"""
67
+
68
+ # Dictionary for icon access
69
+ icons = {
70
+ "data_analytics_icon": data_analytics_icon,
71
+ "machine_learning_icon": machine_learning_icon,
72
+ "computer_vision_icon": computer_vision_icon,
73
+ "home_icon": home_icon,
74
+ "linkedin_icon": linkedin_icon,
75
+ "github_icon": github_icon,
76
+ "mail_icon": mail_icon,
77
+ "link_icon": link_icon,
78
+ "document_icon": document_icon
79
+ }
80
+
81
+ # --- Helper functions for generating HTML ---
82
+ def generate_profile_html():
83
+ """Generate HTML for the profile section"""
84
+ try:
85
+ profile_img_uri = image_to_data_uri(profile_data.get("photo", "data/My_photo.jpeg"))
86
+
87
+ # Skills HTML
88
+ skills_html = ""
89
+ for skill in profile_data.get("skills", []):
90
+ skills_html += f'<div class="skill-pill">{skill}</div>\n'
91
+
92
+ # Social links HTML
93
+ social_links_html = ""
94
+ for link in profile_data.get("social_links", []):
95
+ icon = icons.get(link.get("icon", ""), "")
96
+ id_attr = f' id="{link["id"]}"' if "id" in link else ""
97
+ social_links_html += f'''
98
+ <a href="{link["url"]}" target="_blank" class="social-button social-{link["name"].lower()}" aria-label="{link.get("aria_label", link["name"])}"{ id_attr }>
99
+ { icon }
100
+ </a>
101
+ '''
102
+
103
+ return f'''
104
+ <div class="profile-container">
105
+ <div class="profile-pic">
106
+ <img src="{profile_img_uri}" alt="{profile_data.get("name", "Profile")}" />
107
+ </div>
108
+ <div class="name-text">{profile_data.get("name", "")}</div>
109
+ </div>
110
+ <h2>{profile_data.get("title", "")}</h2>
111
+ <div class="about-text">
112
+ {profile_data.get("about", "")}
113
+ </div>
114
+
115
+ <div class="skills-container">
116
+ {skills_html}
117
+ </div>
118
+
119
+ <div class="social-links">
120
+ {social_links_html}
121
+ </div>
122
+ '''
123
+ except Exception as e:
124
+ # Fallback if error occurs
125
+ print(f"Error generating profile HTML: {e}")
126
+ return f'''
127
+ <div class="profile-container">
128
+ <div class="profile-pic">
129
+ <img src="/api/placeholder/400/400" alt="Profile" />
130
+ </div>
131
+ <div class="name-text">{profile_data.get("name", "Name")}</div>
132
+ </div>
133
+ <h2>{profile_data.get("title", "Title")}</h2>
134
+ <div class="about-text">
135
+ {profile_data.get("about", "About text")}</div>
136
+
137
+ <div class="skills-container">
138
+ {', '.join(profile_data.get("skills", ["Skills"]))}
139
+ </div>
140
+ '''
141
+
142
+ def generate_resume_html():
143
+ """Generate HTML for the collapsible resume section"""
144
+ return '''
145
+ <div class="resume-section glass-container">
146
+ <button class="resume-toggle-button" onclick="toggleResume()">View Resume</button>
147
+ <div id="resume-content" class="resume-content" style="display: none;">
148
+ <p>Download my resume or view it below:</p>
149
+ <a id="resume-download-link" class="resume-download-button" target="_blank">Download Resume</a>
150
+ <div class="resume-preview">
151
+ <iframe id="resume-iframe" frameborder="0" class="resume-iframe"></iframe>
152
+ </div>
153
+ </div>
154
+ </div>
155
+ <script>
156
+ function toggleResume() {
157
+ const resumeContent = document.getElementById('resume-content');
158
+ const isHidden = resumeContent.style.display === 'none';
159
+ resumeContent.style.display = isHidden ? 'block' : 'none';
160
+
161
+ if (isHidden) {
162
+ const resumeIframe = document.getElementById('resume-iframe');
163
+ const resumeDownloadLink = document.getElementById('resume-download-link');
164
+ fetch('/file/data/resume.pdf')
165
+ .then(response => response.blob())
166
+ .then(blob => {
167
+ const url = URL.createObjectURL(blob);
168
+ resumeIframe.src = url;
169
+ resumeDownloadLink.href = url;
170
+ })
171
+ .catch(err => console.error('Error loading resume:', err));
172
+ }
173
+ }
174
+ </script>
175
+ '''
176
+
177
+ def generate_cards_html():
178
+ """Generate HTML for the specialization cards"""
179
+ cards_html = ""
180
+ for card in sections_data.get("cards", []):
181
+ icon = icons.get(card.get("icon", ""), "")
182
+ cards_html += f'''
183
+ <div class="card-container {card.get("class", "")}">
184
+ <div class="card-inner">
185
+ <div class="card-content">
186
+ {icon}
187
+ <span>{card.get("title", "")}</span>
188
+ </div>
189
+ <div class="card-description">
190
+ {card.get("description", "")}
191
+ </div>
192
+ </div>
193
+ </div>
194
+ '''
195
+ return cards_html
196
+
197
+ def generate_contact_html():
198
+ """Generate HTML for the contact section"""
199
+ contact = profile_data.get("contact", {})
200
+ footer = profile_data.get("footer", {})
201
+
202
+ return f'''
203
+ <!-- Contact section -->
204
+ <div id="contact_section">
205
+ <h2>{contact.get("heading", "Contact Me")}</h2>
206
+ <div class="contact-container">
207
+ <p>{contact.get("text", "")}</p>
208
+ <a href="mailto:{contact.get("email", "")}" class="hire-me-button">{contact.get("button_text", "Contact")}</a>
209
+ </div>
210
+ </div>
211
+
212
+ <!-- Footer -->
213
+ <div class="footer">
214
+ <p>{footer.get("copyright", "")}</p>
215
+ <p>{footer.get("credits", "")}</p>
216
+ </div>
217
+ '''
218
+
219
+ def generate_skills_html(skills_data, section_class):
220
+ """Generate HTML for skills in a section"""
221
+ skills_html = ""
222
+ for skill_category in skills_data:
223
+ items_html = ""
224
+ for item in skill_category.get("items", []):
225
+ items_html += f"<li>{item}</li>\n"
226
+
227
+ skills_html += f'''
228
+ <div class="skill-category">
229
+ <h4>{skill_category.get("category", "")}</h4>
230
+ <ul>
231
+ {items_html}
232
+ </ul>
233
+ </div>
234
+ '''
235
+ return skills_html
236
+
237
+ def generate_projects_html(projects_data, section_class):
238
+ """Generate HTML for projects in a section"""
239
+ projects_html = ""
240
+ for project in projects_data:
241
+ projects_html += f'''
242
+ <div class="project-card">
243
+ <div class="project-title">
244
+ <span class="project-title-text">{project.get("title", "")}</span>
245
+ <a href="{project.get("url", "#")}" target="_blank" class="project-link">
246
+ {icons.get("link_icon", "")}
247
+ <span>View Project</span>
248
+ </a>
249
+ </div>
250
+ <div class="project-description">
251
+ {project.get("description", "")}
252
+ <span class="tech-stack"><strong>Tech Stack:</strong> {project.get("tech_stack", "")}</span>
253
+ </div>
254
+ </div>
255
+ '''
256
+ return projects_html
257
+
258
+ def generate_section_html(section_data, section_class):
259
+ """Generate HTML for a complete section"""
260
+ skills_html = generate_skills_html(section_data.get("skills", []), section_class)
261
+ projects_html = generate_projects_html(section_data.get("projects", []), section_class)
262
+
263
+ return f'''
264
+ <h1 class="section-heading">{section_data.get("heading", "")}</h1>
265
+ <div class="section-intro">
266
+ {section_data.get("intro", "")}
267
+ </div>
268
+
269
+ <h3 class="section-subheading {section_class}">Skills</h3>
270
+
271
+ <div class="skills-list">
272
+ {skills_html}
273
+ </div>
274
+
275
+ <h3 class="section-subheading {section_class}">Projects</h3>
276
+
277
+ {projects_html}
278
+ '''
279
+
280
  # --- CSS ---
281
  portfolio_css = """
282
+ @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&family=Montserrat:wght@700;800&display=swap');
283
+ :root {
284
+ --primary-da: #8a2be2;
285
+ --secondary-da: #2575fc;
286
+ --primary-ml: #00b4db;
287
+ --secondary-ml: #0083b0;
288
+ --primary-cv: #ff4d7e;
289
+ --secondary-cv: #fd3e58;
290
+ --dark-bg: #0f1118;
291
+ --card-bg: #1a1d29;
292
+ --text-primary: #ffffff;
293
+ --text-secondary: #e0e0e0;
294
+ --text-muted: #a0a0a0;
295
+ --shadow-sm: 0 4px 6px rgba(0, 0, 0, 0.1);
296
+ --shadow-md: 0 8px 16px rgba(0, 0, 0, 0.2);
297
+ --shadow-lg: 0 12px 24px rgba(0, 0, 0, 0.2);
298
+ --border-radius-sm: 8px;
299
+ --border-radius-md: 12px;
300
+ --border-radius-lg: 20px;
301
+ --transition-fast: 0.2s ease;
302
+ --transition-med: 0.3s ease;
303
+ --transition-slow: 0.5s ease;
304
+ }
305
  body {
306
  font-family: 'Poppins', sans-serif;
307
+ background: var(--dark-bg);
308
+ background-image:
309
+ radial-gradient(circle at 25% 25%, rgba(53, 53, 113, 0.05) 0%, transparent 50%),
310
+ radial-gradient(circle at 75% 75%, rgba(113, 53, 53, 0.05) 0%, transparent 50%);
311
+ color: var(--text-primary);
312
  margin: 0;
313
  padding: 0;
314
+ overflow-x: hidden;
315
+ line-height: 1.6;
316
+ letter-spacing: 0.5px;
317
+ font-weight: 400;
318
  }
319
+ .gr-container {
320
+ max-width: 1200px;
321
+ margin: 0 auto;
322
+ padding: 20px;
323
  }
324
+ /* Scrollbar styling */
325
+ ::-webkit-scrollbar {
326
+ width: 8px;
327
+ height: 8px;
328
+ }
329
+ ::-webkit-scrollbar-track {
330
+ background: rgba(255, 255, 255, 0.05);
331
+ border-radius: 4px;
332
+ }
333
+ ::-webkit-scrollbar-thumb {
334
+ background: rgba(255, 255, 255, 0.2);
335
+ border-radius: 4px;
336
+ }
337
+ ::-webkit-scrollbar-thumb:hover {
338
+ background: rgba(255, 255, 255, 0.3);
339
+ }
340
+ /* Landing section */
341
+ .landing-section {
342
+ text-align: center;
343
+ margin-bottom: 60px;
344
+ padding: 40px 20px;
345
+ position: relative;
346
+ }
347
+ .landing-section:before {
348
+ content: '';
349
+ position: absolute;
350
+ top: 0;
351
+ left: 0;
352
+ right: 0;
353
+ height: 500px;
354
+ background: linear-gradient(180deg, rgba(0,0,0,0.7) 0%, transparent 100%);
355
+ z-index: -1;
356
  }
357
  .landing-section h1, .landing-section h2 {
358
+ color: var(--text-primary) !important;
359
  margin-top: 0;
360
  }
361
+ .landing-section h1 {
362
+ font-family: 'Montserrat', sans-serif;
363
+ font-size: 3.2rem;
364
+ font-weight: 800;
365
+ margin-bottom: 0.5rem;
366
+ background: linear-gradient(90deg, var(--primary-da), var(--primary-ml), var(--primary-cv));
367
+ -webkit-background-clip: text;
368
+ background-clip: text;
369
+ color: transparent !important;
370
+ letter-spacing: -0.5px;
371
  }
372
+ .landing-section h2 {
373
+ font-size: 2rem;
374
+ font-weight: 600;
375
+ margin-bottom: 1.5rem;
376
  }
377
+ .profile-container {
378
+ margin: 30px auto;
379
+ display: flex;
380
+ align-items: center;
381
+ justify-content: center;
382
+ flex-direction: column;
383
+ }
384
+ .profile-pic {
385
+ width: 180px;
386
+ height: 180px;
387
+ border-radius: 50%;
388
+ object-fit: cover;
389
+ border: 4px solid rgba(255, 255, 255, 0.2);
390
+ box-shadow: var(--shadow-md);
391
+ margin-bottom: 20px;
392
+ position: relative;
393
+ background: linear-gradient(45deg, var(--primary-da), var(--primary-ml), var(--primary-cv));
394
+ padding: 4px;
395
+ }
396
+ .profile-pic img {
397
+ border-radius: 50%;
398
+ width: 100%;
399
+ height: 100%;
400
+ object-fit: cover;
401
+ }
402
+ .name-text {
403
+ font-size: 2.6rem;
404
  font-weight: 700;
405
+ margin-top: 10px;
406
+ margin-bottom: 10px;
407
  }
408
+ @keyframes float {
409
+ 0% { transform: translateY(0px) }
410
+ 50% { transform: translateY(-10px) }
411
+ 100% { transform: translateY(0px) }
 
 
 
412
  }
413
+ @keyframes pulse {
414
+ 0% { transform: scale(1); }
415
+ 50% { transform: scale(1.05); }
416
+ 100% { transform: scale(1); }
417
+ }
418
+ .about-text {
419
+ max-width: 800px;
420
+ margin: 0 auto 40px;
421
+ font-size: 1.25rem;
422
+ line-height: 1.6;
423
+ color: var(--text-secondary);
424
+ }
425
+ .skills-container {
426
+ margin-top: 20px;
427
+ display: flex;
428
+ flex-wrap: wrap;
429
+ justify-content: center;
430
+ gap: 10px;
431
+ margin-bottom: 40px;
432
+ }
433
+ .skill-pill {
434
+ background: rgba(255, 255, 255, 0.1);
435
+ padding: 8px 16px;
436
+ border-radius: 30px;
437
+ font-size: 0.9rem;
438
+ font-weight: 500;
439
+ color: var(--text-secondary);
440
+ }
441
+ .social-links {
442
+ display: flex;
443
+ justify-content: center;
444
+ gap: 20px;
445
+ margin: 30px 0;
446
+ }
447
+ .social-button {
448
+ background: rgba(255, 255, 255, 0.1);
449
+ border: none;
450
+ border-radius: 50%;
451
+ width: 50px;
452
+ height: 50px;
453
+ display: flex;
454
+ align-items: center;
455
+ justify-content: center;
456
+ transition: all var(--transition-med);
457
+ color: var(--text-primary);
458
+ font-size: 1.2rem;
459
+ box-shadow: var(--shadow-sm);
460
+ }
461
+ .social-button:hover {
462
+ transform: translateY(-5px);
463
+ background: rgba(255, 255, 255, 0.2);
464
+ box-shadow: var(--shadow-md);
465
+ }
466
+ .social-linkedin:hover { background: #0077b5; }
467
+ .social-github:hover { background: #333; }
468
+ .social-email:hover { background: #ea4335; }
469
+ .social-button svg {
470
+ width: 24px;
471
+ height: 24px;
472
  }
 
473
  /* Card styling */
474
+ .cards-grid {
475
+ display: grid;
476
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
477
+ gap: 30px;
478
+ margin: 40px 0;
479
+ }
480
  .card-container {
481
+ position: relative; /* Important for button positioning */
482
  margin-bottom: 20px;
483
+ height: 100%;
484
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
485
  }
486
+ .card-container.da:before {
487
+ content: '';
488
+ position: absolute;
489
+ top: 0;
490
+ left: 0;
491
+ right: 0;
492
+ height: 6px;
493
+ background: linear-gradient(90deg, var(--primary-da), var(--secondary-da));
494
+ z-index: 5;
495
+ border-radius: var(--border-radius-md) var(--border-radius-md) 0 0;
496
+ }
497
+ .card-container.ml:before {
498
+ content: '';
499
+ position: absolute;
500
+ top: 0;
501
+ left: 0;
502
+ right: 0;
503
+ height: 6px;
504
+ background: linear-gradient(90deg, var(--primary-ml), var(--secondary-ml));
505
+ z-index: 5;
506
+ transition: all var(--transition-med);
507
+ border-radius: var(--border-radius-md) var(--border-radius-md) 0 0;
508
+ }
509
+ .card-container.cv:before {
510
+ content: '';
511
+ position: absolute;
512
+ top: 0;
513
+ left: 0;
514
+ right: 0;
515
+ height: 6px;
516
+ background: linear-gradient(90deg, var(--primary-cv), var(--secondary-cv));
517
+ z-index: 5;
518
+ border-radius: var(--border-radius-md) var(--border-radius-md) 0 0;
519
  }
 
520
  .card-content {
 
521
  padding: 30px;
522
+ min-height: 200px;
523
  display: flex;
524
+ flex-direction: column;
525
  align-items: center;
526
  justify-content: center;
527
+ font-size: 26px;
528
+ font-weight: 700;
529
+ position: relative;
530
+ z-index: 2;
531
+ transition: all var(--transition-med);
532
+ }
533
+ .card-content svg {
534
+ width: 60px;
535
+ height: 60px;
536
+ margin-bottom: 20px;
537
+ opacity: 0.9;
538
+ transition: all var(--transition-med);
539
+ }
540
+ .card-inner {
541
+ transition: transform var(--transition-med), box-shadow var(--transition-med), background-color var(--transition-med);
542
+ text-align: center;
543
+ border-radius: var(--border-radius-md);
544
+ background: var(--card-bg);
545
+ overflow: hidden;
546
+ box-shadow: var(--shadow-md);
547
+ height: 100%;
548
+ cursor: pointer; /* Indicates the card is clickable */
549
+ position: relative; /* Ensure child elements are positioned relative to the card */
550
+ }
551
+ .card-inner:hover {
552
+ transform: translateY(-10px) scale(1.05); /* Adds a slight zoom effect */
553
+ box-shadow: var(--shadow-lg); /* Increases shadow for emphasis */
554
+ background: rgba(255, 255, 255, 0.1); /* Subtle background change */
555
+ border: 2px solid var(--primary-da); /* Optional: Add a border to emphasize hover */
556
+ }
557
+ .card-inner:hover .card-content svg {
558
+ transform: scale(1.1); /* Slightly enlarges the icon */
559
+ opacity: 1;
560
+ }
561
+ .card-inner:hover .card-description {
562
+ color: var(--text-primary); /* Optional: changes text color for emphasis */
563
+ }
564
+ /* Add a subtle glow effect */
565
+ .card-inner:hover:before {
566
+ content: '';
567
+ position: absolute;
568
+ top: 0;
569
+ left: 0;
570
+ right: 0;
571
+ bottom: 0;
572
+ border-radius: var(--border-radius-md);
573
+ box-shadow: 0 0 15px rgba(255, 255, 255, 0.3);
574
+ z-index: -1;
575
+ }
576
+ .card-description {
577
+ padding: 0 20px 20px;
578
+ color: var(--text-secondary);
579
+ font-size: 1.1rem;
580
+ line-height: 1.5;
581
+ }
582
+ /* Card button styling - crucial for making cards clickable */
583
+ .card-button {
584
+ position: absolute !important;
585
+ top: 0 !important;
586
+ left: 0 !important;
587
+ width: 100% !important;
588
+ height: 100% !important;
589
+ opacity: 0 !important;
590
+ z-index: 10 !important;
591
+ cursor: pointer !important;
592
+ margin: 0 !important;
593
+ padding: 0 !important;
594
+ border: none !important;
595
+ transform: scale(1.05) !important;
596
+ transition: transform 0.2s ease !important;
597
+ background: none !important;
598
+ }
599
+
600
+ .click-to-view {
601
+ margin-top: 15px;
602
+ padding: 8px 15px;
603
+ border-radius: 20px;
604
+ display: inline-block;
605
+ font-weight: 600;
606
+ font-size: 0.9rem;
607
+ transition: all var(--transition-med);
608
+ background: rgba(255, 255, 255, 0.1);
609
+ box-shadow: var(--shadow-sm);
610
+ margin-left: auto;
611
+ margin-right: auto;
612
+ color: var(--text-primary);
613
+ text-align: center;
614
+ }
615
+
616
+ /* Add glow effect */
617
+ .click-to-view:hover {
618
+ transform: translateY(-2px);
619
+ box-shadow: 0 0 15px rgba(255, 255, 255, 0.5), var(--shadow-md);
620
+ background: rgba(255, 255, 255, 0.2);
621
+ color: var(--text-primary);
622
+ filter: brightness(1.2);
623
+ }
624
+
625
+ /* Add animation for subtle pulsing effect */
626
+ @keyframes glow-pulse {
627
+ 0% {
628
+ box-shadow: 0 0 5px rgba(255, 255, 255, 0.2);
629
+ }
630
+ 50% {
631
+ box-shadow: 0 0 15px rgba(255, 255, 255, 0.4);
632
+ }
633
+ 100% {
634
+ box-shadow: 0 0 5px rgba(255, 255, 255, 0.2);
635
+ }
636
+ }
637
+
638
+ .click-to-view {
639
+ animation: glow-pulse 3s infinite;
640
+ }
641
+
642
+ .card-description p {
643
+ margin-bottom: 15px;
644
+ margin-top: 0;
645
+ }
646
+
647
+ .card-description {
648
+ display: flex;
649
+ flex-direction: column;
650
+ align-items: center;
651
+ justify-content: space-between;
652
+ height: 100%;
653
+ padding: 0 20px 20px;
654
+ color: var(--text-secondary);
655
+ font-size: 1.1rem;
656
+ line-height: 1.5;
657
+ }
658
+
659
+ /* Different colors for each card type */
660
+ .da-click {
661
+ color: var(--primary-da);
662
+ border: 1px solid var(--primary-da);
663
+ }
664
+
665
+ .ml-click {
666
+ color: var(--primary-ml);
667
+ border: 1px solid var(--primary-ml);
668
+ }
669
+
670
+ .cv-click {
671
+ color: var(--primary-cv);
672
+ border: 1px solid var(--primary-cv);
673
+ }
674
+
675
+ /* Hover effects */
676
+ .click-to-view:hover {
677
+ transform: translateY(-2px);
678
+ box-shadow: var(--shadow-md);
679
+ background: rgba(255, 255, 255, 0.15);
680
+ }
681
+
682
+ .card-inner:hover .click-to-view {
683
+ transform: translateY(-2px);
684
+ box-shadow: var(--shadow-md);
685
+ }
686
+
687
+ .card-inner:hover .da-click {
688
+ background-color: rgba(138, 43, 226, 0.1);
689
+ }
690
+
691
+ .card-inner:hover .ml-click {
692
+ background-color: rgba(0, 180, 219, 0.1);
693
+ }
694
+
695
+ .card-inner:hover .cv-click {
696
+ background-color: rgba(255, 77, 126, 0.1);
697
+ }
698
+
699
+ .experience-timeline {
700
+ margin: 80px 0 60px;
701
+ padding: 20px;
702
+ position: relative;
703
+ }
704
+
705
+ .experience-timeline h2 {
706
+ text-align: center;
707
+ margin-bottom: 60px;
708
+ position: relative;
709
+ display: inline-block;
710
+ left: 50%;
711
+ transform: translateX(-50%);
712
+ font-family: 'Montserrat', sans-serif;
713
+ font-size: 2.5rem;
714
+ font-weight: 700;
715
+ background: linear-gradient(90deg, var(--primary-da), var(--primary-ml), var(--primary-cv));
716
+ -webkit-background-clip: text;
717
+ background-clip: text;
718
+ color: transparent;
719
+ }
720
+
721
+ .experience-timeline h2:after {
722
+ content: '';
723
+ position: absolute;
724
+ bottom: -10px;
725
+ left: 0;
726
+ width: 100%;
727
+ height: 3px;
728
+ border-radius: 3px;
729
+ background: linear-gradient(90deg, var(--primary-da), var(--primary-ml), var(--primary-cv));
730
+ }
731
+
732
+ /* Horizontal Timeline Styling */
733
+ .timeline-container {
734
+ display: flex;
735
+ justify-content: space-between;
736
+ align-items: flex-start;
737
+ position: relative;
738
+ margin: 40px auto;
739
+ max-width: 100%;
740
+ overflow-x: auto;
741
+ padding: 20px 0;
742
+ }
743
+
744
+ .timeline-track {
745
+ position: absolute;
746
+ top: 50%;
747
+ left: 0;
748
+ right: 0;
749
+ height: 4px;
750
+ background: linear-gradient(to right, var(--primary-da), var(--primary-ml), var(--primary-cv));
751
+ border-radius: 2px;
752
+ z-index: 1;
753
+ }
754
+
755
+ .timeline-node {
756
+ position: relative;
757
+ display: flex;
758
+ flex-direction: column;
759
+ align-items: center;
760
+ width: 150px;
761
+ margin: 0 20px;
762
+ z-index: 2;
763
+ }
764
+
765
+ .timeline-dot {
766
+ width: 20px;
767
+ height: 20px;
768
+ background: var(--primary-da);
769
+ border-radius: 50%;
770
+ box-shadow: 0 0 10px rgba(255, 255, 255, 0.5);
771
  margin-bottom: 10px;
772
+ transition: transform 0.3s ease;
773
+ }
774
+
775
+ .timeline-year {
776
+ font-size: 1rem;
777
  font-weight: 600;
778
+ margin-bottom: 10px;
779
+ color: var(--text-primary);
780
  }
 
 
 
 
781
 
782
+ .timeline-content {
783
+ background: var(--card-bg);
784
+ border-radius: var(--border-radius-md);
785
+ box-shadow: var(--shadow-sm);
786
+ padding: 15px;
787
+ text-align: center;
788
+ width: 100%;
789
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
790
+ }
791
+
792
+ .timeline-node:hover .timeline-dot {
793
+ transform: scale(1.3);
794
+ }
795
 
796
+ .timeline-node:hover .timeline-content {
797
+ transform: translateY(-10px);
798
+ box-shadow: var(--shadow-md);
799
+ }
800
+
801
+ /* Responsive adjustments for smaller screens */
802
+ @media (max-width: 768px) {
803
+ .timeline-container {
804
+ flex-direction: column;
805
+ align-items: center;
806
+ }
807
+
808
+ .timeline-track {
809
+ display: none;
810
+ }
811
+
812
+ .timeline-node {
813
+ margin: 20px 0;
814
+ }
815
+ }
816
+
817
+ /* Section styling */
818
+ .section-container {
819
+ padding: 60px 20px;
820
+ position: relative;
821
+ }
822
+ .section-container:before {
823
+ content: '';
824
+ position: absolute;
825
+ top: 0;
826
+ left: 0;
827
+ width: 100%;
828
+ height: 300px;
829
+ background: radial-gradient(ellipse at top, rgba(255,255,255,0.05) 0%, transparent 70%);
830
+ z-index: 0;
831
+ }
832
+ .da-section h1.section-heading {
833
+ color: var(--primary-da);
834
+ position: relative;
835
+ display: inline-block;
836
+ }
837
+ .ml-section h1.section-heading {
838
+ color: var(--primary-ml);
839
+ position: relative;
840
+ display: inline-block;
841
+ }
842
+ .cv-section h1.section-heading {
843
+ color: var(--primary-cv);
844
+ position: relative;
845
+ display: inline-block;
846
+ }
847
+ .section-heading:after {
848
+ content: '';
849
+ position: absolute;
850
+ bottom: -10px;
851
+ left: 0;
852
+ width: 100%;
853
+ height: 3px;
854
+ border-radius: 3px;
855
+ }
856
+ .da-section .section-heading:after { background: var(--primary-da); }
857
+ .ml-section .section-heading:after { background: var(--primary-ml); }
858
+ .cv-section .section-heading:after { background: var(--primary-cv); }
859
+ /* Subheadings color-coded */
860
+ .section-subheading.da { color: var(--primary-da); }
861
+ .section-subheading.ml { color: var(--primary-ml); }
862
+ .section-subheading.cv { color: var(--primary-cv); }
863
  /* Back buttons */
864
  .back-button {
865
  border: none;
866
+ border-radius: var(--border-radius-lg);
867
+ padding: 10px 20px;
868
+ font-size: 0.95rem;
869
+ font-weight: 600;
870
+ cursor: pointer;
871
+ transition: transform var(--transition-fast), box-shadow var(--transition-fast);
872
+ margin-bottom: 30px;
873
+ display: flex;
874
+ align-items: center;
875
+ gap: 8px;
876
+ }
877
+ .back-button:hover {
878
+ transform: translateY(-3px);
879
+ box-shadow: var(--shadow-md);
880
+ }
881
+ .back-button-da {
882
+ background: linear-gradient(45deg, var(--primary-da), var(--secondary-da));
883
+ color: #fff;
884
+ }
885
+ .back-button-ml {
886
+ background: linear-gradient(45deg, var(--primary-ml), var(--secondary-ml));
887
+ color: #fff;
888
+ }
889
+ .back-button-cv {
890
+ background: linear-gradient(45deg, var(--primary-cv), var(--secondary-cv));
891
+ color: #fff;
892
+ }
893
+ .back-button svg {
894
+ width: 20px;
895
+ height: 20px;
896
+ }
897
+ /* Contact form */
898
+ .contact-container {
899
+ background: var(--card-bg);
900
+ border-radius: var(--border-radius-md);
901
+ padding: 30px;
902
+ max-width: 600px;
903
+ margin: 0 auto;
904
+ box-shadow: var(--shadow-md);
905
+ }
906
+ .hire-me-button {
907
+ background: linear-gradient(45deg, var(--primary-da), var(--primary-cv));
908
+ color: white;
909
+ border: none;
910
+ border-radius: var(--border-radius-lg);
911
+ padding: 12px 25px;
912
+ font-size: 1rem;
913
  font-weight: 600;
914
  cursor: pointer;
915
+ transition: all var(--transition-med);
916
+ margin-top: 20px;
917
+ box-shadow: var(--shadow-sm);
918
+ display: inline-block;
919
+ text-decoration: none;
920
+ }
921
+ .hire-me-button:hover {
922
+ transform: translateY(-3px);
923
+ box-shadow: var(--shadow-md);
924
+ filter: brightness(1.1);
925
+ }
926
+ /* Project cards */
927
+ .project-card {
928
+ background: var(--card-bg);
929
+ border-radius: var(--border-radius-md);
930
+ padding: 25px;
931
  margin-bottom: 20px;
932
+ box-shadow: var(--shadow-sm);
933
+ transition: all var(--transition-med);
934
+ border-left: 4px solid transparent;
935
+ }
936
+ .da-section .project-card { border-left-color: var(--primary-da); }
937
+ .ml-section .project-card { border-left-color: var(--primary-ml); }
938
+ .cv-section .project-card { border-left-color: var(--primary-cv); }
939
+ .project-card:hover {
940
+ transform: translateX(5px);
941
+ box-shadow: var(--shadow-md);
942
+ }
943
+ .project-title {
944
+ font-size: 1.3rem;
945
+ font-weight: 600;
946
+ margin-bottom: 10px;
947
+ display: flex;
948
+ align-items: center;
949
+ justify-content: space-between;
950
+ }
951
+ .project-title-text {
952
+ flex: 1;
953
+ }
954
+ .project-link {
955
+ color: var(--text-secondary);
956
+ transition: all var(--transition-med);
957
+ text-decoration: none;
958
+ display: inline-flex;
959
+ align-items: center;
960
+ margin-left: 10px;
961
+ }
962
+ .project-link svg {
963
+ width: 16px;
964
+ height: 16px;
965
+ margin-right: 5px;
966
+ }
967
+ .da-section .project-title-text { color: var(--primary-da); }
968
+ .ml-section .project-title-text { color: var(--primary-ml); }
969
+ .cv-section .project-title-text { color: var(--primary-cv); }
970
+ .da-section .project-link:hover { color: var(--primary-da); }
971
+ .ml-section .project-link:hover { color: var(--primary-ml); }
972
+ .cv-section .project-link:hover { color: var(--primary-cv); }
973
+ .project-description {
974
+ color: var(--text-secondary);
975
+ line-height: 1.5;
976
+ }
977
+ .tech-stack {
978
+ display: block;
979
+ margin-top: 10px;
980
+ font-style: italic;
981
+ color: var(--text-muted);
982
+ }
983
+ /* Skills list */
984
+ .skills-list {
985
+ display: grid;
986
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
987
+ gap: 15px;
988
+ margin-top: 20px;
989
+ margin-bottom: 40px; /* Added margin to create space between skills and projects */
990
+ }
991
+ .skill-category {
992
+ background: rgba(255, 255, 255, 0.05);
993
+ border-radius: var(--border-radius-sm);
994
+ padding: 15px;
995
+ transition: all var(--transition-med);
996
+ }
997
+ .skill-category:hover {
998
+ background: rgba(255, 255, 255, 0.08);
999
+ transform: translateY(-3px);
1000
+ }
1001
+ .skill-category h4 {
1002
+ margin-top: 0;
1003
+ margin-bottom: 10px;
1004
+ font-size: 1.1rem;
1005
+ }
1006
+ .da-section .skill-category h4 { color: var(--primary-da); }
1007
+ .ml-section .skill-category h4 { color: var(--primary-ml); }
1008
+ .cv-section .skill-category h4 { color: var(--primary-cv); }
1009
+ .skill-category ul {
1010
+ margin: 0;
1011
+ padding-left: 20px;
1012
+ color: var(--text-secondary);
1013
+ }
1014
+ .skill-category li {
1015
+ margin-bottom: 5px;
1016
+ }
1017
+ /* Section intro text */
1018
+ .section-intro {
1019
+ max-width: 800px;
1020
+ margin-bottom: 30px;
1021
+ line-height: 1.6;
1022
+ color: var(--text-secondary);
1023
+ font-size: 1.1rem;
1024
+ }
1025
+ /* Footer */
1026
+ .footer {
1027
+ text-align: center;
1028
+ padding: 40px 20px;
1029
+ margin-top: 60px;
1030
+ color: var(--text-muted);
1031
+ font-size: 0.9rem;
1032
+ }
1033
+ /* Animations for scroll */
1034
+ .animate-on-scroll {
1035
+ opacity: 0;
1036
+ transform: translateY(20px);
1037
+ transition: opacity 0.6s ease, transform 0.6s ease;
1038
+ }
1039
+
1040
+ .animate-on-scroll.show {
1041
+ animation: fadeInUp 0.6s ease forwards;
1042
+ }
1043
+
1044
+ @keyframes fadeInUp {
1045
+ 0% {
1046
+ opacity: 0;
1047
+ transform: translateY(20px);
1048
+ }
1049
+ 100% {
1050
+ opacity: 1;
1051
+ transform: translateY(0);
1052
+ }
1053
+ }
1054
+
1055
+ /* Loading states */
1056
+ .loading-spinner {
1057
+ border: 4px solid rgba(255, 255, 255, 0.2);
1058
+ border-top: 4px solid var(--primary-da);
1059
+ border-radius: 50%;
1060
+ width: 40px;
1061
+ height: 40px;
1062
+ animation: spin 1s linear infinite;
1063
+ }
1064
+
1065
+ @keyframes spin {
1066
+ 0% {
1067
+ transform: rotate(0deg);
1068
+ }
1069
+ 100% {
1070
+ transform: rotate(360deg);
1071
+ }
1072
+ }
1073
+
1074
+ /* Glassmorphism effects */
1075
+ .glass-container {
1076
+ background: rgba(255, 255, 255, 0.1);
1077
+ backdrop-filter: blur(10px);
1078
+ border: 1px solid rgba(255, 255, 255, 0.2);
1079
+ border-radius: var(--border-radius-md);
1080
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
1081
+ }
1082
+
1083
+ /* Subtle background patterns */
1084
+ body {
1085
+ background-image: url('https://www.transparenttextures.com/patterns/noise.png');
1086
+ }
1087
+
1088
+ /* Gradient refinements */
1089
+ button {
1090
+ background: linear-gradient(45deg, var(--primary-da), var(--primary-ml));
1091
+ }
1092
+
1093
+ /* Shadow depth variations */
1094
+ .card-container:hover {
1095
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
1096
+ }
1097
+
1098
+ /* ARIA attributes */
1099
+ button {
1100
+ aria-label: "Interactive button";
1101
+ }
1102
+
1103
+ /* Keyboard navigation */
1104
+ button:focus {
1105
+ outline: 2px solid var(--primary-da);
1106
+ outline-offset: 2px;
1107
+ }
1108
+
1109
+ /* Mobile-first refinements */
1110
+ @media (max-width: 768px) {
1111
+ .cards-grid {
1112
+ grid-template-columns: 1fr;
1113
+ }
1114
+ }
1115
+
1116
+ /* Touch-friendly targets */
1117
+ button {
1118
+ padding: 12px 20px;
1119
+ }
1120
+
1121
+ /* Responsive typography */
1122
+ h1 {
1123
+ font-size: calc(2rem + 1vw);
1124
+ }
1125
+
1126
+ /* Parallax scrolling effects */
1127
+ .section-container:before {
1128
+ content: '';
1129
+ position: absolute;
1130
+ top: 0;
1131
+ left: 0;
1132
+ width: 100%;
1133
+ height: 300px;
1134
+ background: linear-gradient(180deg, rgba(0, 0, 0, 0.5), transparent);
1135
+ transform: translateY(-50%);
1136
+ will-change: transform;
1137
+ transition: transform 0.3s ease;
1138
+ }
1139
+
1140
+ body.onscroll .section-container:before {
1141
+ transform: translateY(0);
1142
+ }
1143
+
1144
+ /* Mouse-follow glow effect */
1145
+ .interactive:hover {
1146
+ box-shadow: 0 0 15px rgba(255, 255, 255, 0.5);
1147
+ }
1148
+
1149
+ /* Staggered animation sequences */
1150
+ @keyframes staggeredFadeIn {
1151
+ 0% {
1152
+ opacity: 0;
1153
+ transform: translateY(20px);
1154
+ }
1155
+ 100% {
1156
+ opacity: 1;
1157
+ transform: translateY(0);
1158
+ }
1159
+ }
1160
+
1161
+ .list-item {
1162
+ opacity: 0;
1163
+ animation: staggeredFadeIn 0.6s ease forwards;
1164
+ }
1165
+
1166
+ .list-item:nth-child(1) {
1167
+ animation-delay: 0.2s;
1168
+ }
1169
+
1170
+ .list-item:nth-child(2) {
1171
+ animation-delay: 0.4s;
1172
+ }
1173
+
1174
+ .list-item:nth-child(3) {
1175
+ animation-delay: 0.6s;
1176
+ }
1177
+
1178
+ /* Interactive particles background */
1179
+ .particles-bg {
1180
+ position: absolute;
1181
+ top: 0;
1182
+ left: 0;
1183
+ width: 100%;
1184
+ height: 100%;
1185
+ background: url('https://www.transparenttextures.com/patterns/cubes.png');
1186
+ opacity: 0.1;
1187
+ }
1188
+
1189
+ /* Smooth page section transitions */
1190
+ html {
1191
+ scroll-behavior: smooth;
1192
+ }
1193
+
1194
+ /* Custom cursor styles */
1195
+ body {
1196
+ cursor: url('https://example.com/custom-cursor.png'), auto;
1197
+ }
1198
+
1199
+ button:hover {
1200
+ cursor: pointer;
1201
+ }
1202
+
1203
+ /* Resume Section */
1204
+ .resume-section {
1205
+ margin: 40px auto;
1206
+ padding: 20px;
1207
+ text-align: center;
1208
+ max-width: 800px;
1209
+ box-shadow: var(--shadow-md);
1210
+ }
1211
+
1212
+ .resume-toggle-button {
1213
+ background: linear-gradient(45deg, var(--primary-da), var(--primary-cv));
1214
+ color: white;
1215
+ border: none;
1216
+ border-radius: var(--border-radius-lg);
1217
+ padding: 10px 20px;
1218
+ font-size: 1rem;
1219
+ font-weight: 600;
1220
+ cursor: pointer;
1221
+ transition: all var(--transition-med);
1222
+ box-shadow: var(--shadow-sm);
1223
+ width: auto; /* Adjust width to fit the text */
1224
+ min-width: 150px; /* Optional: Set a minimum width for consistency */
1225
+ }
1226
+
1227
+ .resume-toggle-button:hover {
1228
+ transform: translateY(-3px);
1229
+ box-shadow: var(--shadow-md);
1230
+ filter: brightness(1.1);
1231
  }
1232
+
1233
+ .resume-content {
1234
+ margin-top: 20px;
1235
+ text-align: center;
1236
+ }
1237
+
1238
+ .resume-download-button {
1239
+ display: inline-block;
1240
+ margin: 20px 0;
1241
+ padding: 10px 20px;
1242
+ font-size: 1rem;
1243
+ font-weight: 600;
1244
+ color: white;
1245
+ background: linear-gradient(45deg, var(--primary-da), var(--primary-cv));
1246
+ border: none;
1247
+ border-radius: var(--border-radius-lg);
1248
+ text-decoration: none;
1249
+ transition: all var(--transition-med);
1250
+ box-shadow: var(--shadow-sm);
1251
+ }
1252
+
1253
+ .resume-download-button:hover {
1254
+ transform: translateY(-3px);
1255
+ box-shadow: var(--shadow-md);
1256
+ filter: brightness(1.1);
1257
+ }
1258
+
1259
+ .resume-preview {
1260
+ margin-top: 20px;
1261
+ border: 1px solid rgba(255, 255, 255, 0.2);
1262
+ border-radius: var(--border-radius-md);
1263
+ overflow: hidden;
1264
+ box-shadow: var(--shadow-sm);
1265
+ }
1266
+
1267
+ .resume-iframe {
1268
+ width: 100%;
1269
+ height: 500px;
1270
+ border: none;
1271
+ }
1272
+
1273
+ /* Performance optimizations */
1274
+ img {
1275
+ loading: lazy;
1276
+ }
1277
+
1278
+ /* Micro-interactions */
1279
+ button:hover {
1280
+ transform: translateY(-3px);
1281
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
1282
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
1283
+ }
1284
+
1285
+ button:active {
1286
+ transform: scale(0.95);
1287
+ transition: transform 0.1s ease;
1288
  }
 
 
 
1289
  """
1290
+ # Load all content from JSON files
1291
+ try:
1292
+ profile_data = load_json("profile")
1293
+ sections_data = load_json("sections")
1294
+ data_analytics_data = load_json("data_analytics")
1295
+ machine_learning_data = load_json("machine_learning")
1296
+ computer_vision_data = load_json("computer_vision")
1297
+ except Exception as e:
1298
+ print(f"Error loading content: {e}")
1299
+ # Default values in case of error
1300
+ profile_data = {}
1301
+ sections_data = {"cards": []}
1302
+ data_analytics_data = {}
1303
+ machine_learning_data = {}
1304
+ computer_vision_data = {}
1305
 
1306
  # --- Portfolio Layout ---
1307
+ with gr.Blocks(title=f"{profile_data.get('name', 'Portfolio')}", css=portfolio_css) as demo:
1308
+ # Create sections
1309
+ # Data Analytics Section (initially hidden)
1310
+ with gr.Row(visible=False, elem_classes="section-container da-section") as da_section:
1311
+ with gr.Column():
1312
+ # Back button
1313
+ back_from_da = gr.Button("← Back to Home", elem_classes="back-button back-button-da")
1314
+ gr.HTML(generate_section_html(data_analytics_data, "da"))
1315
+
1316
+ # Machine Learning Section (initially hidden)
1317
+ with gr.Row(visible=False, elem_classes="section-container ml-section") as ml_section:
1318
+ with gr.Column():
1319
+ # Back button
1320
+ back_from_ml = gr.Button("← Back to Home", elem_classes="back-button back-button-ml")
1321
+ gr.HTML(generate_section_html(machine_learning_data, "ml"))
1322
+
1323
+ # Computer Vision Section (initially hidden)
1324
+ with gr.Row(visible=False, elem_classes="section-container cv-section") as cv_section:
1325
+ with gr.Column():
1326
+ # Back button
1327
+ back_from_cv = gr.Button("← Back to Home", elem_classes="back-button back-button-cv")
1328
+ gr.HTML(generate_section_html(computer_vision_data, "cv"))
1329
+
1330
  with gr.Row(visible=True, elem_classes="landing-section") as landing_section:
1331
  with gr.Column():
1332
+ # Profile section with picture
1333
+ gr.HTML(generate_profile_html())
1334
+
1335
+ # Resume Section (moved above "My Specializations")
1336
+ resume_state = gr.State(value=False)
1337
+ with gr.Group(visible=False) as resume_container:
1338
+ resume_pdf = file_to_data_uri("data/resume.pdf")
1339
+ gr.HTML(f"""<iframe src="{resume_pdf}" width="100%" height="600px" style="border:none;"></iframe>""")
1340
+ resume_toggle_btn = gr.Button("View Resume")
1341
+ resume_toggle_btn.click(fn=toggle_resume, inputs=[resume_state], outputs=[resume_state, resume_container, resume_toggle_btn])
1342
+
1343
+ # Specializations heading
1344
+ gr.HTML("<h2>My Specializations</h2>")
1345
+
1346
+ # Cards Grid with proper structure
1347
+ with gr.Row(elem_classes="cards-grid"):
1348
  with gr.Column():
1349
+ # Data Analytics Card
1350
+ gr.HTML('<div class="card-container da">')
1351
+ da_button = gr.Button("Data Analytics", elem_classes="card-button")
1352
+ gr.HTML(f'''
1353
+ <div class="card-inner">
1354
+ <div class="card-content">
1355
+ {icons.get(sections_data.get("cards", [])[0].get("icon", ""), "")}
1356
+ <span>{sections_data.get("cards", [])[0].get("title", "Data Analytics")}</span>
1357
+ </div>
1358
+ <div class="card-description">
1359
+ {sections_data.get("cards", [])[0].get("description", "")}
1360
+ <div class="click-to-view da-click">Click to view</div>
1361
+ </div>
1362
+ </div>
1363
  </div>
1364
+ ''')
1365
+
1366
  with gr.Column():
1367
+ # Machine Learning Card
1368
+ gr.HTML('<div class="card-container ml">')
1369
+ ml_button = gr.Button("Machine Learning", elem_classes="card-button")
1370
+ gr.HTML(f'''
1371
+ <div class="card-inner">
1372
+ <div class="card-content">
1373
+ {icons.get(sections_data.get("cards", [])[1].get("icon", ""), "")}
1374
+ <span>{sections_data.get("cards", [])[1].get("title", "Machine Learning")}</span>
1375
+ </div>
1376
+ <div class="card-description">
1377
+ {sections_data.get("cards", [])[1].get("description", "")}
1378
+ <div class="click-to-view ml-click">Click to view</div>
1379
+ </div>
1380
+ </div>
1381
  </div>
1382
+ ''')
1383
+
1384
  with gr.Column():
1385
+ # Computer Vision Card
1386
+ gr.HTML('<div class="card-container cv">')
1387
+ cv_button = gr.Button("Computer Vision", elem_classes="card-button")
1388
+ gr.HTML(f'''
1389
+ <div class="card-inner">
1390
+ <div class="card-content">
1391
+ {icons.get(sections_data.get("cards", [])[2].get("icon", ""), "")}
1392
+ <span>{sections_data.get("cards", [])[2].get("title", "Computer Vision")}</span>
1393
+ </div>
1394
+ <div class="card-description">
1395
+ {sections_data.get("cards", [])[2].get("description", "")}
1396
+ <div class="click-to-view cv-click">Click to view</div>
1397
+ </div>
1398
  </div>
1399
+ </div>
1400
+ ''')
1401
+
1402
+ gr.HTML(f'''
1403
+ <div class="experience-timeline">
1404
+ <h2>My Journey</h2>
1405
+
1406
+ <div class="timeline-container">
1407
+ <div class="timeline-track"></div>
1408
+
1409
+ <div class="timeline-node">
1410
+ <div class="timeline-dot"></div>
1411
+ <div class="timeline-year">2018-2021</div>
1412
+ <div class="timeline-content">
1413
+ <div class="timeline-title">Bachelor's in Commerce (89%)</div>
1414
+ <div class="timeline-details">
1415
+ <p class="timeline-location">University Name</p>
1416
+ <p>Graduated with honors focusing on business analytics.</p>
1417
+ </div>
1418
+ </div>
1419
+ </div>
1420
+
1421
+ <div class="timeline-node">
1422
+ <div class="timeline-dot"></div>
1423
+ <div class="timeline-year">2021-2023</div>
1424
+ <div class="timeline-content">
1425
+ <div class="timeline-title">Junior Software Engineer at Cognizant</div>
1426
+ <div class="timeline-details">
1427
+ <p class="timeline-location">Cognizant</p>
1428
+ <p>Developed web applications and data visualization systems.</p>
1429
+ </div>
1430
+ </div>
1431
+ </div>
1432
+
1433
+ <div class="timeline-node">
1434
+ <div class="timeline-dot"></div>
1435
+ <div class="timeline-year">2023-2024</div>
1436
+ <div class="timeline-content">
1437
+ <div class="timeline-title">Post-Graduation in AI/ML (97%)</div>
1438
+ <div class="timeline-details">
1439
+ <p class="timeline-location">University Name, Canada</p>
1440
+ <p>Advanced studies in machine learning and data science.</p>
1441
+ </div>
1442
+ </div>
1443
+ </div>
1444
+
1445
+ <div class="timeline-node">
1446
+ <div class="timeline-dot"></div>
1447
+ <div class="timeline-year">2025</div>
1448
+ <div class="timeline-content">
1449
+ <div class="timeline-title">Seeking ML Engineer/Data Scientist Role</div>
1450
+ <div class="timeline-details">
1451
+ <p>Ready for opportunities in ML and Data Science in Canada.</p>
1452
+ </div>
1453
+ </div>
1454
+ </div>
1455
+ </div>
1456
+ </div>
1457
+ ''')
1458
+
1459
+ gr.HTML("""
1460
+ <script>
1461
+ document.addEventListener('DOMContentLoaded', function() {
1462
+ // Get all timeline nodes
1463
+ const timelineNodes = document.querySelectorAll('.timeline-node');
1464
+
1465
+ // Add click event listener to each node
1466
+ timelineNodes.forEach(node => {
1467
+ node.addEventListener('click', function() {
1468
+ // Check if this node is already active
1469
+ const isActive = this.classList.contains('active');
1470
+
1471
+ // Remove active class from all nodes
1472
+ timelineNodes.forEach(n => n.classList.remove('active'));
1473
+
1474
+ // If node wasn't active before, make it active
1475
+ if (!isActive) {
1476
+ this.classList.add('active');
1477
+ }
1478
+ });
1479
+ });
1480
+
1481
+ // Make the first node active by default
1482
+ if (timelineNodes.length > 0) {
1483
+ timelineNodes[0].classList.add('active');
1484
+ }
1485
+ });
1486
+ </script>
1487
+ """)
1488
+
1489
+ # Contact section
1490
+ gr.HTML(generate_contact_html())
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1491
 
1492
+ # Add a Gradio File component to serve the resume file
1493
+ gr.File(value="data/resume.pdf", label="Resume", interactive=False, visible=False)
1494
+
1495
+ # Set up click events for navigation
1496
+ da_button.click(show_data_analytics, inputs=None, outputs=[landing_section, da_section, ml_section, cv_section])
1497
+ ml_button.click(show_machine_learning, inputs=None, outputs=[landing_section, da_section, ml_section, cv_section])
1498
+ cv_button.click(show_computer_vision, inputs=None, outputs=[landing_section, da_section, ml_section, cv_section])
1499
 
1500
+ back_from_da.click(go_home, inputs=None, outputs=[landing_section, da_section, ml_section, cv_section])
1501
+ back_from_ml.click(go_home, inputs=None, outputs=[landing_section, da_section, ml_section, cv_section])
1502
+ back_from_cv.click(go_home, inputs=None, outputs=[landing_section, da_section, ml_section, cv_section])
1503
+
1504
+ # Launch the app
1505
+ if __name__ == "__main__":
1506
+ demo.launch()
content/computer_vision.json ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "heading": "Computer Vision",
3
+ "intro": "I'm passionate about developing computer vision systems that can perceive and understand visual information in ways that benefit humans. My experience spans from implementing state-of-the-art algorithms to deploying them in real-world scenarios. I've worked on projects that enable machines to \"see\" and interpret their environment through image processing, object detection, and image classification. I focus particularly on applications that improve accessibility and solve tangible problems, creating CV solutions that operate efficiently even with hardware constraints.",
4
+ "skills": [
5
+ {
6
+ "category": "CV Techniques",
7
+ "items": ["Object Detection", "Image Segmentation", "Feature Extraction", "Image Classification"]
8
+ },
9
+ {
10
+ "category": "CV Libraries",
11
+ "items": ["OpenCV", "PIL/Pillow", "TorchVision", "TF Computer Vision"]
12
+ },
13
+ {
14
+ "category": "Deep Learning for CV",
15
+ "items": ["CNNs", "YOLO frameworks", "Transfer Learning", "Object Recognition"]
16
+ },
17
+ {
18
+ "category": "Applications",
19
+ "items": ["Accessibility Solutions", "OCR/Document Analysis", "Motion Tracking", "Edge Deployment"]
20
+ }
21
+ ],
22
+ "projects": [
23
+ {
24
+ "title": "Smart Shopping Assistant for the Blind",
25
+ "url": "https://github.com/Manyue-datascientist/smart_glove_project",
26
+ "description": "Designed a system using object detection and OCR to help visually impaired individuals find products and navigate shopping aisles. Developed with real-time feedback on Raspberry Pi and OAK-D camera, this project demonstrates my commitment to creating technology that solves real accessibility challenges.",
27
+ "tech_stack": "YOLOv8, OpenCV, Raspberry Pi"
28
+ },
29
+ {
30
+ "title": "Traffic Flow Counter (Upcoming)",
31
+ "url": "#",
32
+ "description": "An edge solution using Raspberry Pi to monitor and count vehicles at intersections, providing real-time traffic flow analytics. This project demonstrates efficient deployment of CV models on resource-constrained devices.",
33
+ "tech_stack": "YOLOv5, Raspberry Pi, OpenCV"
34
+ }
35
+ ]
36
+ }
content/data_analytics.json ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "heading": "Data Analytics",
3
+ "intro": "I specialize in transforming raw data into actionable business insights that drive strategic decision-making. With a strong background in both data analytics and commerce, I bridge the gap between business needs and technical solutions. My approach combines statistical analysis with compelling data visualization to tell stories that solve real-world problems. I've developed expertise in designing dashboards that make complex data accessible and creating end-to-end analysis workflows that uncover hidden patterns and trends.",
4
+ "skills": [
5
+ {
6
+ "category": "Data Visualization",
7
+ "items": ["Power BI", "Tableau", "Matplotlib/Seaborn", "Plotly/Dash"]
8
+ },
9
+ {
10
+ "category": "Data Manipulation",
11
+ "items": ["SQL", "Pandas", "NumPy", "ETL Pipelines"]
12
+ },
13
+ {
14
+ "category": "Analysis Techniques",
15
+ "items": ["Statistical Analysis", "A/B Testing", "Time Series Analysis", "Customer Segmentation"]
16
+ },
17
+ {
18
+ "category": "Business Intelligence",
19
+ "items": ["KPI Development", "Executive Reporting", "Data Storytelling", "Process Optimization"]
20
+ }
21
+ ],
22
+ "projects": [
23
+ {
24
+ "title": "Northwind Sales Insight Dashboard",
25
+ "url": "https://github.com/Manyue-datascientist/northwind-retail-analysis",
26
+ "description": "A business-driven case study where I performed in-depth EDA on the classic Northwind dataset. I uncovered key trends in sales, customer behavior, and product performance, and built a professional dashboard for storytelling using Power BI and SQL.",
27
+ "tech_stack": "SQL, Power BI, Pandas"
28
+ },
29
+ {
30
+ "title": "Loan Default Risk Analysis",
31
+ "url": "#",
32
+ "description": "A feature-driven analytics project where I identified critical drivers of loan defaults. I applied statistical analysis and visual storytelling to assist in better loan disbursement strategies.",
33
+ "tech_stack": "Python, Matplotlib, Pandas"
34
+ }
35
+ ]
36
+ }
content/machine_learning.json ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "heading": "Machine Learning",
3
+ "intro": "My machine learning expertise spans from traditional algorithms to deep learning systems that solve real business challenges. I've built end-to-end ML pipelines that deliver measurable impact, combining the right models with appropriate feature engineering techniques. I focus on creating solutions that are not only technically sound but also deployable, maintainable, and integrated with business workflows. With a solid foundation in Python-based ML frameworks and cloud deployment platforms, I develop models that generate actionable predictions and insights.",
4
+ "skills": [
5
+ {
6
+ "category": "Frameworks & Libraries",
7
+ "items": ["TensorFlow/Keras", "PyTorch", "Scikit-Learn", "XGBoost/LightGBM"]
8
+ },
9
+ {
10
+ "category": "ML Techniques",
11
+ "items": ["Supervised Learning", "Unsupervised Learning", "Deep Learning", "Natural Language Processing"]
12
+ },
13
+ {
14
+ "category": "MLOps",
15
+ "items": ["ML Pipelines", "Model Monitoring", "Deployment Strategies", "Version Control (DVC)"]
16
+ },
17
+ {
18
+ "category": "Cloud ML Services",
19
+ "items": ["AWS SageMaker", "Google AI Platform", "Azure ML", "MLflow"]
20
+ }
21
+ ],
22
+ "projects": [
23
+ {
24
+ "title": "University Admission Predictor",
25
+ "url": "#",
26
+ "description": "Built a regression model to predict the chances of a student getting admitted to top universities based on academic profiles. The project includes feature importance analysis, model tuning, and a live demo deployed with Streamlit.",
27
+ "tech_stack": "Scikit-learn, Streamlit, NumPy"
28
+ },
29
+ {
30
+ "title": "AI Chat Assistant for Recruiters",
31
+ "url": "https://huggingface.co/spaces/Manyue-DataScientist/AI-Assistant",
32
+ "description": "A custom-trained assistant that answers queries about my resume and portfolio using NLP and retrieval techniques. Built to simulate real-time interactions with hiring teams, this project showcases my ability to work with large language models and create practical AI applications.",
33
+ "tech_stack": "LangChain, OpenAI, Gradio"
34
+ },
35
+ {
36
+ "title": "Speaker Diarization Application",
37
+ "url": "https://huggingface.co/spaces/Manyue-DataScientist/speaker-diarization-app-v2",
38
+ "description": "Developed an advanced multi-speaker audio processing system that performs speaker diarization, transcription, and summarization to extract meaningful insights from multi-speaker conversations.",
39
+ "tech_stack": "PyTorch, Hugging Face Transformers, Gradio"
40
+ }
41
+ ]
42
+ }
content/profile.json ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "Manyue Javvadi",
3
+ "title": "AI/ML Engineer & Data Scientist",
4
+ "about": "I'm a software engineer turned AI/ML practitioner with a strong foundation in Commerce and experience in ML, computer vision, and data analytics. I blend business understanding with data-driven thinking to create real-world solutions. Currently open to roles in Data Science, Machine Learning Engineering, and Computer Vision.",
5
+ "photo": "data/My_photo.jpeg",
6
+ "skills": [
7
+ "Python",
8
+ "Machine Learning",
9
+ "TensorFlow",
10
+ "PyTorch",
11
+ "Computer Vision",
12
+ "Data Analytics",
13
+ "SQL",
14
+ "Power BI"
15
+ ],
16
+ "social_links": [
17
+ {
18
+ "name": "LinkedIn",
19
+ "url": "https://www.linkedin.com/in/manyue-javvadi-datascientist/",
20
+ "icon": "linkedin_icon",
21
+ "aria_label": "LinkedIn"
22
+ },
23
+ {
24
+ "name": "GitHub",
25
+ "url": "https://github.com/Manyue-datascientist",
26
+ "icon": "github_icon",
27
+ "aria_label": "GitHub"
28
+ },
29
+ {
30
+ "name": "Email",
31
+ "url": "mailto:[email protected]",
32
+ "icon": "mail_icon",
33
+ "aria_label": "Contact Me",
34
+ "id": "contact_btn"
35
+ }
36
+ ],
37
+ "contact": {
38
+ "heading": "Contact Me",
39
+ "text": "Looking for a data scientist or ML engineer for your team?",
40
+ "button_text": "Hire Me",
41
+ "email": "[email protected]"
42
+ },
43
+ "footer": {
44
+ "copyright": "© 2025 Manyue Javvadi. All rights reserved.",
45
+ "credits": "Made with Gradio"
46
+ }
47
+ }
content/sections.json ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cards": [
3
+ {
4
+ "id": "data_analytics",
5
+ "title": "Data Analytics",
6
+ "icon": "data_analytics_icon",
7
+ "description": "Data storytelling, insights extraction, interactive dashboards & business problem-solving",
8
+ "class": "da"
9
+ },
10
+ {
11
+ "id": "machine_learning",
12
+ "title": "Machine Learning",
13
+ "icon": "machine_learning_icon",
14
+ "description": "Feature engineering, model training, deployment & automation pipelines",
15
+ "class": "ml"
16
+ },
17
+ {
18
+ "id": "computer_vision",
19
+ "title": "Computer Vision",
20
+ "icon": "computer_vision_icon",
21
+ "description": "Object detection, image recognition, edge AI & accessibility applications",
22
+ "class": "cv"
23
+ }
24
+ ]
25
+ }
data/My_photo.jpeg ADDED
data/admission_predictor_model.pkl DELETED
Binary file (1.72 kB)
 
data/knowledge_base.json DELETED
@@ -1,295 +0,0 @@
1
- {
2
- "personal_details": {
3
- "full_name": "Manyue Javvadi",
4
- "current_location": "Canada",
5
- "nationality": "Indian",
6
- "professional_summary": "I'm Manyue Javvadi, a Machine Learning enthusiast passionate about creating projects that push the limits of innovation. Guided by the belief that 'Imagination is more powerful than knowledge,' as Albert Einstein once said, I strive to develop solutions that enhance human potential, not replace it. Explore the ideas and creations that aren't just part of the present—they're shaping a future where technology and humanity thrive together.",
7
- "online_presence": {
8
- "personal_website": "https://manyuejavvadi.netlify.app/",
9
- "linkedin": "https://www.linkedin.com/in/manyue-javvadi-datascientist/",
10
- "portfolio": "https://manyue-datascientist-portfolio.streamlit.app/",
11
- "blog_posts": [
12
- {
13
- "title": "The Questions That Kept Me Up All Night: My Sleepless Struggle to Understand NLP",
14
- "focus": "Deep dive into Natural Language Processing challenges and insights"
15
- },
16
- {
17
- "title": "Are We Headed Toward the Next Threat, Bigger Than a Nuclear Bomb?",
18
- "focus": "Analysis of AI safety and ethical considerations"
19
- },
20
- {
21
- "title": "How KNN Works: A Simple Explanation of Nearest Neighbors",
22
- "link":"https://knn-algorithm-explained-by-manyue-javvadi.hashnode.dev/how-knn-works-a-simple-explanation-of-nearest-neighbors",
23
- "focus": "Educational content breaking down ML algorithms"
24
- }
25
- ]
26
- },
27
- "career_transition": {
28
- "key_decision": "Transitioned from Java development at Cognizant to pursue ML/AI dream in Canada",
29
- "motivation": "Combining technical expertise with innovation and commerce skills in ML/AI field",
30
- "current_focus": "Building practical ML solutions while advancing education in Canada"
31
- }
32
- },
33
- "education": {
34
- "postgraduate": [
35
- {
36
- "course_name": "Big Data Analytics",
37
- "institution": "Georgian College",
38
- "graduation_year": "2024",
39
- "gpa": "8.3/10",
40
- "achievements": ["Dean's List Honoree"],
41
- "key_courses": [
42
- "Advanced Machine Learning",
43
- "Big Data Processing",
44
- "Statistical Analysis",
45
- "Data Visualization"
46
- ]
47
- },
48
- {
49
- "course_name": "Applied AI Solutions Development Program",
50
- "institution": "George Brown College",
51
- "graduation_year": "2025",
52
- "gpa": "3.8/4.0",
53
- "key_courses": [
54
- "Deep Learning Applications",
55
- "Natural Language Processing",
56
- "Computer Vision",
57
- "MLOps and Deployment"
58
- ]
59
- }
60
- ],
61
- "undergraduate": {
62
- "course_name": "Bachelor of Commerce",
63
- "institution": "SRM University Chennai",
64
- "graduation_year": "2021",
65
- "grade": "89%",
66
- "relevance": "Strong foundation in business analytics and decision-making"
67
- },
68
- "ongoing_learning": {
69
- "certifications_in_progress": ["MLOps Specialization"],
70
- "areas_of_focus": [
71
- "Model Deployment",
72
- "CI/CD for ML",
73
- "ML System Design"
74
- ]
75
- }
76
- },
77
- "skills": {
78
- "technical_skills": {
79
- "machine_learning": {
80
- "core": ["Supervised Learning", "Unsupervised Learning", "Neural Networks"],
81
- "frameworks": ["scikit-learn", "TensorFlow", "PyTorch"],
82
- "focus_areas": ["NLP", "Computer Vision", "Recommendation Systems"]
83
- },
84
- "programming": {
85
- "primary": ["Python", "Java"],
86
- "libraries": ["NumPy", "Pandas", "Matplotlib", "Seaborn"],
87
- "tools": ["Git", "Docker"]
88
- },
89
- "data": {
90
- "databases": ["SQL", "MongoDB"],
91
- "visualization": ["Tableau", "PowerBI"],
92
- "processing": ["PySpark", "Hadoop"]
93
- },
94
- "deployment": {
95
- "web": ["Streamlit", "Flask"],
96
- "mlops": ["MLflow", "DVC"],
97
- "version_control": ["Git", "GitHub"]
98
- }
99
- },
100
- "soft_skills": [
101
- {
102
- "skill": "Problem-solving",
103
- "context": "Developed innovative solutions in ML projects"
104
- },
105
- {
106
- "skill": "Communication",
107
- "context": "Technical blog writing and project documentation"
108
- },
109
- {
110
- "skill": "Adaptability",
111
- "context": "Successfully transitioned from commerce to tech"
112
- },
113
- {
114
- "skill": "Leadership",
115
- "context": "Led project teams and initiatives"
116
- }
117
- ]
118
- },
119
- "professional_experience": {
120
- "work_experience": [
121
- {
122
- "position": "Junior Software Engineer",
123
- "company": "Cognizant",
124
- "duration": "June 2021 – September 2023",
125
- "location": "Chennai, India",
126
- "achievements": [
127
- "Developed and maintained Java applications in insurance domain",
128
- "Led migration from SVN to GitHub for improved development workflow",
129
- "Collaborated with cross-functional teams for requirement analysis",
130
- "Resolved version conflicts during application upgrades"
131
- ],
132
- "technologies_used": [
133
- "Java",
134
- "Spring Framework",
135
- "SQL",
136
- "Git"
137
- ],
138
- "impact": "Improved documentation process and streamlined backend storage"
139
- }
140
- ]
141
- },
142
- "projects": {
143
-
144
- "major_projects": [
145
- {
146
- "name": "AI-Powered POS System",
147
- "description": "An innovative Point-of-Sale system that integrates cutting-edge AI technologies to revolutionize restaurant operations. The project involves proprietary algorithms and novel approaches that are currently under IP discussion with my institution.",
148
- "impact": "Aims to transform how restaurants handle operations, inventory, and customer service using AI",
149
- "skills_used": ["Python", "MLOps", "Deep Learning", "Computer Vision"],
150
- "status": "Under active development - MVP phase",
151
- "confidentiality_note": "Full details under IP review"
152
- },
153
- {
154
- "name": "Innovative E-commerce Enhancement",
155
- "description": "Developing a transformative feature for Shopify stores that leverages advanced NLP and ML techniques to significantly improve customer engagement and conversion rates.",
156
- "impact": "Early testing shows promising results in customer interaction metrics",
157
- "skills_used": ["Python", "Neural Networks", "NLP", "Deep Learning"],
158
- "status": "In development - proprietary solution",
159
- "confidentiality_note": "Details limited due to potential commercial application"
160
- },
161
- {
162
- "name": "Smart Nutrition Recommendation System",
163
- "description": "An innovative system that scans product barcodes and analyzes nutrition labels to provide personalized healthy alternatives based on user preferences and dietary requirements.",
164
- "key_features": [
165
- "Barcode scanning integration",
166
- "Nutrition analysis engine",
167
- "Personalized recommendation algorithm",
168
- "Alternative product matching"
169
- ],
170
- "technical_details": {
171
- "data_processing": "Real-time nutrition label analysis",
172
- "ml_models": "Custom recommendation engine using collaborative and content-based filtering",
173
- "user_profiling": "Dynamic preference learning system"
174
- },
175
- "skills_used": ["Python", "Computer Vision", "Machine Learning", "Recommendation Systems"],
176
- "status": "Prototype development",
177
- "target_impact": "Making healthy food choices more accessible and personalized"
178
- },
179
- {
180
- "name": "AI Portfolio Assistant",
181
- "description": "A sophisticated chatbot leveraging LLM technology to provide dynamic, context-aware responses about my professional journey and projects.",
182
- "key_features": [
183
- "Natural language understanding",
184
- "Context-aware responses",
185
- "Dynamic job description analysis"
186
- ],
187
- "skills_used": ["Python", "LLMs", "Streamlit", "NLP"],
188
- "status": "Deployed and actively enhanced"
189
- }
190
- ],
191
- "algorithm_practice_projects": [
192
- {
193
- "name": "University Admission Predictor",
194
- "type": "Linear Regression Implementation",
195
- "description": "Built from scratch to understand core regression concepts, helping Jamboree predict admission chances for international students.",
196
- "technical_focus": "Custom implementation of linear regression without using sklearn",
197
- "skills_developed": ["Statistical Analysis", "Algorithm Implementation", "Feature Engineering"],
198
- "accuracy": "81% on test data",
199
- "status": "Completed"
200
- },
201
- {
202
- "name": "LoanTap Credit Assessment",
203
- "type": "Logistic Regression Implementation",
204
- "description": "Custom-built logistic regression model for credit worthiness prediction",
205
- "technical_focus": "Implementation of logistic regression from scratch",
206
- "skills_developed": ["Credit Risk Modeling", "Binary Classification", "Model Evaluation"],
207
- "status": "Completed"
208
- },
209
- {
210
- "name": "OLA Driver Retention Analysis",
211
- "type": "Ensemble Learning",
212
- "description": "Predictive modeling for driver churn using various ensemble techniques",
213
- "technical_focus": "Implementation of multiple base models and ensemble methods",
214
- "skills_developed": ["Ensemble Methods", "Feature Selection", "Model Comparison"],
215
- "status": "Completed"
216
- },
217
- {
218
- "name": "AdEase View Prediction",
219
- "type": "Time Series Analysis",
220
- "description": "Forecasting Wikipedia page views for optimal ad placement",
221
- "technical_focus": "Implementation of time series models and forecasting techniques",
222
- "skills_developed": ["Time Series Analysis", "Forecasting", "Data Preprocessing"],
223
- "status": "Completed"
224
- }
225
- ]
226
- },
227
-
228
- "personal_journey": {
229
- "dietary_changes": "I transitioned to a vegetarian diet in 2021 but resumed eating non-veg in 2023 to address nutritional deficiencies.",
230
- "life_changes": [
231
- {
232
- "date": "December 2023",
233
- "event": "I relocated to Canada for advanced education."
234
- }
235
- ],
236
- "mindset": "I am resilient, adaptable, and innovation-driven. I thrive on challenges and use setbacks as opportunities for growth.",
237
- "motto_or_vision": "To leverage AI/ML to create solutions that enhance user experiences while retaining the human touch."
238
- },
239
- "goals_and_aspirations": {
240
- "short_term": [
241
- "I want to master advanced machine learning techniques.",
242
- "I aim to expand my portfolio with impactful projects.",
243
- "I seek to secure a role as an ML engineer in Canada."
244
- ],
245
- "long_term": [
246
- "I plan to develop AI solutions that redefine retail and hospitality experiences.",
247
- "I aspire to establish a successful AI startup.",
248
- "I want to mentor aspiring AI professionals."
249
- ]
250
- },
251
- "frequently_asked_questions": [
252
- {
253
- "question": "Why did you transition from commerce to AI/ML?",
254
- "answer": "The transition from commerce to AI/ML was a result of an unexpected turn in my career journey. After completing my bachelor's degree in commerce, I was fortunate to land a job at Cognizant Technology Solutions as a Programmer Trainee. Despite having no prior experience in coding or programming, coming from a core commerce background, my eagerness to learn and quick adaptability caught the attention of my trainers. CTS gave me an opportunity, and during the initial 45-day training period and assessment, I performed exceptionally well in Java, which helped me secure a position in the development team. This was a remarkable achievement, as many computer science graduates typically end up in support roles. However, after working for a year, I realized that while I had developed a passion for programming, I still felt disconnected from my original interest in business and commerce. I knew I had to find a way to combine both my love for programming and my interest in business. That's when I discovered data science and machine learning, which seemed like the perfect intersection. With this newfound clarity, I embarked on a journey to master AI/ML, and now, I am truly enjoying the blend of technology and business that this field offers."
255
- },
256
- {
257
- "question": "What unique qualities do you bring to the table?",
258
- "answer": "I combine technical expertise with a fresh perspective, thanks to my diverse background. My adaptability and ability to think beyond conventional approaches are my biggest strengths."
259
- },
260
- {
261
- "question": "What is your most innovative project?",
262
- "answer": "The most innovative project is an AI-powered Point-of-Sale (POS) system designed to Reduce order time and order errors. I'm currently working with my college to secure intellectual property rights, so I can't disclose the full extent of its capabilities at this time. However, I'm confident that this project has the potential to significantly impact the restaurant industry."
263
- }
264
- ],
265
- "career_development": {
266
- "short_term": [
267
- "I aim to continue mastering ML concepts through projects and coursework.",
268
- "I want to build a portfolio that highlights my ability to solve real-world problems.",
269
- "I plan to secure an ML engineer role in retail or hospitality AI."
270
- ],
271
- "long_term": [
272
- "I intend to build AI tools that make a global impact in the retail sector.",
273
- "I aspire to launch my own AI startup focused on innovative NLP applications.",
274
- "I want to contribute to the AI/ML community by mentoring and sharing knowledge."
275
- ],
276
- "perspectives": {
277
- "market_outlook": {
278
- "job_market": "I believe market conditions are less about timing and more about preparation. While the market may have its ups and downs, I focus on building strong skills and creating impactful projects. Quality efforts and continuous learning will always find opportunities.",
279
- "value_proposition": "My unique combination of commerce background and technical skills allows me to understand both business needs and technical implementation, making me a valuable asset regardless of market conditions.",
280
- "strategy": "I'm using this time to enhance my skills, build innovative projects, and stay ahead of industry trends. It's about creating value, not just seeking opportunities."
281
- },
282
- "learning_philosophy": "I believe in learning through practical implementation. Rather than just studying algorithms, I build projects from scratch to truly understand the concepts.",
283
- "work_approach": "I focus on creating solutions that enhance human capabilities rather than replacing them. Every project I undertake aims to solve real-world problems.",
284
- "career_perspective": "Success in tech isn't just about coding skills—it's about understanding business problems and creating meaningful solutions."
285
- },
286
- "common_queries": {
287
- "weather": "I'm focused on ML/AI and career discussions. For weather information, I'd recommend checking local weather services.",
288
- "market_conditions": "Rather than focusing on market conditions, I believe in creating value through continuous learning and practical projects. Would you like to know about my approach to standing out in any market?",
289
- "general": "I'm Manyue's portfolio assistant, focused on discussing my professional journey, projects, and ML/AI expertise. For general queries, I'd encourage exploring more relevant resources."
290
- }
291
- }
292
-
293
- }
294
-
295
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
data/resume.pdf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d466a6b984032b748901a5f129d7ad1d1b91308d848fb102b16e9a1b9c30eb7d
3
+ size 101343
utils.py ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import base64
3
+ import os
4
+
5
+ def load_json(filename, folder="content"):
6
+ """Load JSON data from specified folder"""
7
+ try:
8
+ with open(f"{folder}/{filename}.json", "r", encoding="utf-8") as f:
9
+ return json.load(f)
10
+ except Exception as e:
11
+ print(f"Error loading {filename}.json: {e}")
12
+ return {}
13
+
14
+ def save_json(data, filename, folder="content"):
15
+ """Save JSON data to specified folder"""
16
+ try:
17
+ # Create folder if it doesn't exist
18
+ if not os.path.exists(folder):
19
+ os.makedirs(folder)
20
+
21
+ with open(f"{folder}/{filename}.json", "w", encoding="utf-8") as f:
22
+ json.dump(data, f, indent=2)
23
+ return True
24
+ except Exception as e:
25
+ print(f"Error saving {filename}.json: {e}")
26
+ return False
27
+
28
+ def file_to_data_uri(filepath, mime_type="application/pdf"):
29
+ """Convert file to data URI"""
30
+ try:
31
+ with open(filepath, "rb") as f:
32
+ data = f.read()
33
+ b64 = base64.b64encode(data).decode("utf-8")
34
+ return f"data:{mime_type};base64,{b64}"
35
+ except Exception as e:
36
+ print(f"Error converting file to data URI: {e}")
37
+ return None
38
+
39
+ def image_to_data_uri(filepath, mime_type="image/jpeg"):
40
+ """Convert image to data URI"""
41
+ try:
42
+ with open(filepath, "rb") as f:
43
+ data = f.read()
44
+ b64 = base64.b64encode(data).decode("utf-8")
45
+ return f"data:{mime_type};base64,{b64}"
46
+ except Exception as e:
47
+ print(f"Error converting image to data URI: {e}")
48
+ return None
49
+
50
+ def add_project(section, project_data):
51
+ """Add a new project to a specific section"""
52
+ try:
53
+ # Load the current data
54
+ section_data = load_json(section)
55
+
56
+ # Add the new project
57
+ if "projects" not in section_data:
58
+ section_data["projects"] = []
59
+
60
+ section_data["projects"].append(project_data)
61
+
62
+ # Save the updated data
63
+ return save_json(section_data, section)
64
+ except Exception as e:
65
+ print(f"Error adding project to {section}: {e}")
66
+ return False
67
+
68
+ def update_project(section, project_index, project_data):
69
+ """Update an existing project in a specific section"""
70
+ try:
71
+ # Load the current data
72
+ section_data = load_json(section)
73
+
74
+ # Check if the index is valid
75
+ if "projects" not in section_data or project_index >= len(section_data["projects"]):
76
+ print(f"Invalid project index: {project_index}")
77
+ return False
78
+
79
+ # Update the project
80
+ section_data["projects"][project_index] = project_data
81
+
82
+ # Save the updated data
83
+ return save_json(section_data, section)
84
+ except Exception as e:
85
+ print(f"Error updating project in {section}: {e}")
86
+ return False
87
+
88
+ def delete_project(section, project_index):
89
+ """Delete a project from a specific section"""
90
+ try:
91
+ # Load the current data
92
+ section_data = load_json(section)
93
+
94
+ # Check if the index is valid
95
+ if "projects" not in section_data or project_index >= len(section_data["projects"]):
96
+ print(f"Invalid project index: {project_index}")
97
+ return False
98
+
99
+ # Delete the project
100
+ del section_data["projects"][project_index]
101
+
102
+ # Save the updated data
103
+ return save_json(section_data, section)
104
+ except Exception as e:
105
+ print(f"Error deleting project from {section}: {e}")
106
+ return False
107
+
108
+ def update_profile(profile_data):
109
+ """Update the profile information"""
110
+ try:
111
+ return save_json(profile_data, "profile")
112
+ except Exception as e:
113
+ print(f"Error updating profile: {e}")
114
+ return False
115
+
116
+ def add_skill(section, category_index, skill):
117
+ """Add a new skill to a specific category in a section"""
118
+ try:
119
+ # Load the current data
120
+ section_data = load_json(section)
121
+
122
+ # Check if the category index is valid
123
+ if "skills" not in section_data or category_index >= len(section_data["skills"]):
124
+ print(f"Invalid category index: {category_index}")
125
+ return False
126
+
127
+ # Add the skill
128
+ section_data["skills"][category_index]["items"].append(skill)
129
+
130
+ # Save the updated data
131
+ return save_json(section_data, section)
132
+ except Exception as e:
133
+ print(f"Error adding skill to {section}: {e}")
134
+ return False
135
+
136
+ def update_section_intro(section, intro_text):
137
+ """Update the introduction text of a section"""
138
+ try:
139
+ # Load the current data
140
+ section_data = load_json(section)
141
+
142
+ # Update the intro
143
+ section_data["intro"] = intro_text
144
+
145
+ # Save the updated data
146
+ return save_json(section_data, section)
147
+ except Exception as e:
148
+ print(f"Error updating intro for {section}: {e}")
149
+ return False