Manyue-DataScientist commited on
Commit
e4d89ca
·
1 Parent(s): b1337d4

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +1178 -319
app.py CHANGED
@@ -1,319 +1,1178 @@
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
+
5
+ # --- Helper Functions ---
6
+ def file_to_data_uri(filepath, mime_type="application/pdf"):
7
+ with open(filepath, "rb") as f:
8
+ data = f.read()
9
+ b64 = base64.b64encode(data).decode("utf-8")
10
+ return f"data:{mime_type};base64,{b64}"
11
+
12
+
13
+ # --- Navigation Functions ---
14
+ def show_data_analytics():
15
+ return gr.update(visible=False), gr.update(visible=True), gr.update(visible=False), gr.update(visible=False)
16
+
17
+ def show_machine_learning():
18
+ return gr.update(visible=False), gr.update(visible=False), gr.update(visible=True), gr.update(visible=False)
19
+
20
+ def show_computer_vision():
21
+ return gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), gr.update(visible=True)
22
+
23
+ def go_home():
24
+ return gr.update(visible=True), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False)
25
+
26
+ # --- Icons (SVG) ---
27
+ 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>"""
28
+ 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>"""
29
+ 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>"""
30
+ 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>"""
31
+ 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>"""
32
+ 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>"""
33
+ 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>"""
34
+ 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>"""
35
+ 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>"""
36
+
37
+ # --- Function to encode image ---
38
+ def image_to_data_uri(filepath, mime_type="image/jpeg"):
39
+ with open(filepath, "rb") as f:
40
+ data = f.read()
41
+ b64 = base64.b64encode(data).decode("utf-8")
42
+ return f"data:{mime_type};base64,{b64}"
43
+
44
+ # --- CSS ---
45
+ portfolio_css = """
46
+ @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&family=Montserrat:wght@700;800&display=swap');
47
+
48
+ :root {
49
+ --primary-da: #8a2be2;
50
+ --secondary-da: #2575fc;
51
+ --primary-ml: #00b4db;
52
+ --secondary-ml: #0083b0;
53
+ --primary-cv: #ff4d7e;
54
+ --secondary-cv: #fd3e58;
55
+ --dark-bg: #0f1118;
56
+ --card-bg: #1a1d29;
57
+ --text-primary: #ffffff;
58
+ --text-secondary: #e0e0e0;
59
+ --text-muted: #a0a0a0;
60
+ --shadow-sm: 0 4px 6px rgba(0, 0, 0, 0.1);
61
+ --shadow-md: 0 8px 16px rgba(0, 0, 0, 0.2);
62
+ --shadow-lg: 0 12px 24px rgba(0, 0, 0, 0.2);
63
+ --border-radius-sm: 8px;
64
+ --border-radius-md: 12px;
65
+ --border-radius-lg: 20px;
66
+ --transition-fast: 0.2s ease;
67
+ --transition-med: 0.3s ease;
68
+ --transition-slow: 0.5s ease;
69
+ }
70
+
71
+ body {
72
+ font-family: 'Poppins', sans-serif;
73
+ background: var(--dark-bg);
74
+ background-image:
75
+ radial-gradient(circle at 25% 25%, rgba(53, 53, 113, 0.05) 0%, transparent 50%),
76
+ radial-gradient(circle at 75% 75%, rgba(113, 53, 53, 0.05) 0%, transparent 50%);
77
+ color: var(--text-primary);
78
+ margin: 0;
79
+ padding: 0;
80
+ overflow-x: hidden;
81
+ }
82
+
83
+ .gr-container {
84
+ max-width: 1200px;
85
+ margin: 0 auto;
86
+ padding: 20px;
87
+ }
88
+
89
+ /* Scrollbar styling */
90
+ ::-webkit-scrollbar {
91
+ width: 8px;
92
+ height: 8px;
93
+ }
94
+
95
+ ::-webkit-scrollbar-track {
96
+ background: rgba(255, 255, 255, 0.05);
97
+ border-radius: 4px;
98
+ }
99
+
100
+ ::-webkit-scrollbar-thumb {
101
+ background: rgba(255, 255, 255, 0.2);
102
+ border-radius: 4px;
103
+ }
104
+
105
+ ::-webkit-scrollbar-thumb:hover {
106
+ background: rgba(255, 255, 255, 0.3);
107
+ }
108
+
109
+ /* Landing section */
110
+ .landing-section {
111
+ text-align: center;
112
+ margin-bottom: 60px;
113
+ padding: 40px 20px;
114
+ position: relative;
115
+ }
116
+
117
+ .landing-section:before {
118
+ content: '';
119
+ position: absolute;
120
+ top: 0;
121
+ left: 0;
122
+ right: 0;
123
+ height: 500px;
124
+ background: linear-gradient(180deg, rgba(0,0,0,0.7) 0%, transparent 100%);
125
+ z-index: -1;
126
+ }
127
+
128
+ .landing-section h1, .landing-section h2 {
129
+ color: var(--text-primary) !important;
130
+ margin-top: 0;
131
+ }
132
+
133
+ .landing-section h1 {
134
+ font-family: 'Montserrat', sans-serif;
135
+ font-size: 3.2rem;
136
+ font-weight: 800;
137
+ margin-bottom: 0.5rem;
138
+ background: linear-gradient(90deg, var(--primary-da), var(--primary-ml), var(--primary-cv));
139
+ -webkit-background-clip: text;
140
+ background-clip: text;
141
+ color: transparent !important;
142
+ letter-spacing: -0.5px;
143
+ }
144
+
145
+ .landing-section h2 {
146
+ font-size: 2rem;
147
+ font-weight: 600;
148
+ margin-bottom: 1.5rem;
149
+ }
150
+
151
+ .profile-container {
152
+ margin: 30px auto;
153
+ display: flex;
154
+ align-items: center;
155
+ justify-content: center;
156
+ flex-direction: column;
157
+ }
158
+
159
+ .profile-pic {
160
+ width: 180px;
161
+ height: 180px;
162
+ border-radius: 50%;
163
+ object-fit: cover;
164
+ border: 4px solid rgba(255, 255, 255, 0.2);
165
+ box-shadow: var(--shadow-md);
166
+ margin-bottom: 20px;
167
+ position: relative;
168
+ background: linear-gradient(45deg, var(--primary-da), var(--primary-ml), var(--primary-cv));
169
+ padding: 4px;
170
+ }
171
+
172
+ .profile-pic img {
173
+ border-radius: 50%;
174
+ width: 100%;
175
+ height: 100%;
176
+ object-fit: cover;
177
+ }
178
+
179
+ .name-text {
180
+ font-size: 2.6rem;
181
+ font-weight: 700;
182
+ margin-top: 10px;
183
+ margin-bottom: 10px;
184
+ }
185
+
186
+ @keyframes float {
187
+ 0% { transform: translateY(0px) }
188
+ 50% { transform: translateY(-10px) }
189
+ 100% { transform: translateY(0px) }
190
+ }
191
+
192
+ @keyframes pulse {
193
+ 0% { transform: scale(1); }
194
+ 50% { transform: scale(1.05); }
195
+ 100% { transform: scale(1); }
196
+ }
197
+
198
+ .about-text {
199
+ max-width: 800px;
200
+ margin: 0 auto 40px;
201
+ font-size: 1.25rem;
202
+ line-height: 1.6;
203
+ color: var(--text-secondary);
204
+ }
205
+
206
+ .skills-container {
207
+ margin-top: 20px;
208
+ display: flex;
209
+ flex-wrap: wrap;
210
+ justify-content: center;
211
+ gap: 10px;
212
+ margin-bottom: 40px;
213
+ }
214
+
215
+ .skill-pill {
216
+ background: rgba(255, 255, 255, 0.1);
217
+ padding: 8px 16px;
218
+ border-radius: 30px;
219
+ font-size: 0.9rem;
220
+ font-weight: 500;
221
+ color: var(--text-secondary);
222
+ }
223
+
224
+ .social-links {
225
+ display: flex;
226
+ justify-content: center;
227
+ gap: 20px;
228
+ margin: 30px 0;
229
+ }
230
+
231
+ .social-button {
232
+ background: rgba(255, 255, 255, 0.1);
233
+ border: none;
234
+ border-radius: 50%;
235
+ width: 50px;
236
+ height: 50px;
237
+ display: flex;
238
+ align-items: center;
239
+ justify-content: center;
240
+ transition: all var(--transition-med);
241
+ color: var(--text-primary);
242
+ font-size: 1.2rem;
243
+ box-shadow: var(--shadow-sm);
244
+ }
245
+
246
+ .social-button:hover {
247
+ transform: translateY(-5px);
248
+ background: rgba(255, 255, 255, 0.2);
249
+ box-shadow: var(--shadow-md);
250
+ }
251
+
252
+ .social-linkedin:hover { background: #0077b5; }
253
+ .social-github:hover { background: #333; }
254
+ .social-email:hover { background: #ea4335; }
255
+
256
+ .social-button svg {
257
+ width: 24px;
258
+ height: 24px;
259
+ }
260
+
261
+ /* Card styling */
262
+ .cards-grid {
263
+ display: grid;
264
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
265
+ gap: 30px;
266
+ margin: 40px 0;
267
+ }
268
+
269
+ .card-container {
270
+ position: relative; /* Important for button positioning */
271
+ margin-bottom: 20px;
272
+ height: 100%;
273
+ }
274
+
275
+ .card-container.da:before {
276
+ content: '';
277
+ position: absolute;
278
+ top: 0;
279
+ left: 0;
280
+ right: 0;
281
+ height: 6px;
282
+ background: linear-gradient(90deg, var(--primary-da), var(--secondary-da));
283
+ z-index: 5;
284
+ border-radius: var(--border-radius-md) var(--border-radius-md) 0 0;
285
+ }
286
+
287
+ .card-container.ml:before {
288
+ content: '';
289
+ position: absolute;
290
+ top: 0;
291
+ left: 0;
292
+ right: 0;
293
+ height: 6px;
294
+ background: linear-gradient(90deg, var(--primary-ml), var(--secondary-ml));
295
+ z-index: 5;
296
+ transition: all var(--transition-med);
297
+ border-radius: var(--border-radius-md) var(--border-radius-md) 0 0;
298
+ }
299
+
300
+ .card-container.cv:before {
301
+ content: '';
302
+ position: absolute;
303
+ top: 0;
304
+ left: 0;
305
+ right: 0;
306
+ height: 6px;
307
+ background: linear-gradient(90deg, var(--primary-cv), var(--secondary-cv));
308
+ z-index: 5;
309
+ border-radius: var(--border-radius-md) var(--border-radius-md) 0 0;
310
+ }
311
+
312
+ .card-content {
313
+ padding: 30px;
314
+ min-height: 200px;
315
+ display: flex;
316
+ flex-direction: column;
317
+ align-items: center;
318
+ justify-content: center;
319
+ font-size: 26px;
320
+ font-weight: 700;
321
+ position: relative;
322
+ z-index: 2;
323
+ transition: all var(--transition-med);
324
+ }
325
+
326
+ .card-content svg {
327
+ width: 60px;
328
+ height: 60px;
329
+ margin-bottom: 20px;
330
+ opacity: 0.9;
331
+ transition: all var(--transition-med);
332
+ }
333
+
334
+ .card-inner {
335
+ transition: transform var(--transition-med), box-shadow var(--transition-med), background-color var(--transition-med);
336
+ text-align: center;
337
+ border-radius: var(--border-radius-md);
338
+ background: var(--card-bg);
339
+ overflow: hidden;
340
+ box-shadow: var(--shadow-md);
341
+ height: 100%;
342
+ cursor: pointer; /* Indicates the card is clickable */
343
+ position: relative; /* Ensure child elements are positioned relative to the card */
344
+ }
345
+
346
+ .card-inner:hover {
347
+ transform: translateY(-10px) scale(1.05); /* Adds a slight zoom effect */
348
+ box-shadow: var(--shadow-lg); /* Increases shadow for emphasis */
349
+ background: rgba(255, 255, 255, 0.1); /* Subtle background change */
350
+ border: 2px solid var(--primary-da); /* Optional: Add a border to emphasize hover */
351
+ }
352
+
353
+ .card-inner:hover .card-content svg {
354
+ transform: scale(1.1); /* Slightly enlarges the icon */
355
+ opacity: 1;
356
+ }
357
+
358
+ .card-inner:hover .card-description {
359
+ color: var(--text-primary); /* Optional: changes text color for emphasis */
360
+ }
361
+
362
+ /* Add a subtle glow effect */
363
+ .card-inner:hover:before {
364
+ content: '';
365
+ position: absolute;
366
+ top: 0;
367
+ left: 0;
368
+ right: 0;
369
+ bottom: 0;
370
+ border-radius: var(--border-radius-md);
371
+ box-shadow: 0 0 15px rgba(255, 255, 255, 0.3);
372
+ z-index: -1;
373
+ }
374
+
375
+ .card-description {
376
+ padding: 0 20px 20px;
377
+ color: var(--text-secondary);
378
+ font-size: 1.1rem;
379
+ line-height: 1.5;
380
+ }
381
+
382
+ /* Card button styling - crucial for making cards clickable */
383
+ .card-button {
384
+ position: absolute !important;
385
+ top: 0 !important;
386
+ left: 0 !important;
387
+ width: 100% !important;
388
+ height: 100% !important;
389
+ opacity: 0 !important;
390
+ z-index: 10 !important;
391
+ cursor: pointer !important;
392
+ margin: 0 !important;
393
+ padding: 0 !important;
394
+ border: none !important;
395
+ transform: scale(1.05) !important;
396
+ transition: transform 0.2s ease !important;
397
+ background: none !important;
398
+ }
399
+
400
+ /* Section styling */
401
+ .section-container {
402
+ padding: 40px 20px;
403
+ position: relative;
404
+ }
405
+
406
+ .section-container:before {
407
+ content: '';
408
+ position: absolute;
409
+ top: 0;
410
+ left: 0;
411
+ width: 100%;
412
+ height: 300px;
413
+ background: radial-gradient(ellipse at top, rgba(255,255,255,0.05) 0%, transparent 70%);
414
+ z-index: 0;
415
+ }
416
+
417
+ .da-section h1.section-heading {
418
+ color: var(--primary-da);
419
+ position: relative;
420
+ display: inline-block;
421
+ }
422
+
423
+ .ml-section h1.section-heading {
424
+ color: var(--primary-ml);
425
+ position: relative;
426
+ display: inline-block;
427
+ }
428
+
429
+ .cv-section h1.section-heading {
430
+ color: var(--primary-cv);
431
+ position: relative;
432
+ display: inline-block;
433
+ }
434
+
435
+ .section-heading:after {
436
+ content: '';
437
+ position: absolute;
438
+ bottom: -10px;
439
+ left: 0;
440
+ width: 100%;
441
+ height: 3px;
442
+ border-radius: 3px;
443
+ }
444
+
445
+ .da-section .section-heading:after { background: var(--primary-da); }
446
+ .ml-section .section-heading:after { background: var(--primary-ml); }
447
+ .cv-section .section-heading:after { background: var(--primary-cv); }
448
+
449
+ /* Subheadings color-coded */
450
+ .section-subheading.da { color: var(--primary-da); }
451
+ .section-subheading.ml { color: var(--primary-ml); }
452
+ .section-subheading.cv { color: var(--primary-cv); }
453
+
454
+ /* Back buttons */
455
+ .back-button {
456
+ border: none;
457
+ border-radius: var(--border-radius-lg);
458
+ padding: 10px 20px;
459
+ font-size: 0.95rem;
460
+ font-weight: 600;
461
+ cursor: pointer;
462
+ transition: transform var(--transition-fast), box-shadow var(--transition-fast);
463
+ margin-bottom: 30px;
464
+ display: flex;
465
+ align-items: center;
466
+ gap: 8px;
467
+ }
468
+
469
+ .back-button:hover {
470
+ transform: translateY(-3px);
471
+ box-shadow: var(--shadow-md);
472
+ }
473
+
474
+ .back-button-da {
475
+ background: linear-gradient(45deg, var(--primary-da), var(--secondary-da));
476
+ color: #fff;
477
+ }
478
+
479
+ .back-button-ml {
480
+ background: linear-gradient(45deg, var(--primary-ml), var(--secondary-ml));
481
+ color: #fff;
482
+ }
483
+
484
+ .back-button-cv {
485
+ background: linear-gradient(45deg, var(--primary-cv), var(--secondary-cv));
486
+ color: #fff;
487
+ }
488
+
489
+ .back-button svg {
490
+ width: 20px;
491
+ height: 20px;
492
+ }
493
+
494
+ /* Contact form */
495
+ .contact-container {
496
+ background: var(--card-bg);
497
+ border-radius: var(--border-radius-md);
498
+ padding: 30px;
499
+ max-width: 600px;
500
+ margin: 0 auto;
501
+ box-shadow: var(--shadow-md);
502
+ }
503
+
504
+ .hire-me-button {
505
+ background: linear-gradient(45deg, var(--primary-da), var(--primary-cv));
506
+ color: white;
507
+ border: none;
508
+ border-radius: var(--border-radius-lg);
509
+ padding: 12px 25px;
510
+ font-size: 1rem;
511
+ font-weight: 600;
512
+ cursor: pointer;
513
+ transition: all var(--transition-med);
514
+ margin-top: 20px;
515
+ box-shadow: var(--shadow-sm);
516
+ display: inline-block;
517
+ text-decoration: none;
518
+ }
519
+
520
+ .hire-me-button:hover {
521
+ transform: translateY(-3px);
522
+ box-shadow: var(--shadow-md);
523
+ filter: brightness(1.1);
524
+ }
525
+
526
+ /* Project cards */
527
+ .project-card {
528
+ background: var(--card-bg);
529
+ border-radius: var(--border-radius-md);
530
+ padding: 25px;
531
+ margin-bottom: 20px;
532
+ box-shadow: var(--shadow-sm);
533
+ transition: all var(--transition-med);
534
+ border-left: 4px solid transparent;
535
+ }
536
+
537
+ .da-section .project-card { border-left-color: var(--primary-da); }
538
+ .ml-section .project-card { border-left-color: var(--primary-ml); }
539
+ .cv-section .project-card { border-left-color: var(--primary-cv); }
540
+
541
+ .project-card:hover {
542
+ transform: translateX(5px);
543
+ box-shadow: var(--shadow-md);
544
+ }
545
+
546
+ .project-title {
547
+ font-size: 1.3rem;
548
+ font-weight: 600;
549
+ margin-bottom: 10px;
550
+ display: flex;
551
+ align-items: center;
552
+ justify-content: space-between;
553
+ }
554
+
555
+ .project-title-text {
556
+ flex: 1;
557
+ }
558
+
559
+ .project-link {
560
+ color: var(--text-secondary);
561
+ transition: all var(--transition-med);
562
+ text-decoration: none;
563
+ display: inline-flex;
564
+ align-items: center;
565
+ margin-left: 10px;
566
+ }
567
+
568
+ .project-link svg {
569
+ width: 16px;
570
+ height: 16px;
571
+ margin-right: 5px;
572
+ }
573
+
574
+ .da-section .project-title-text { color: var(--primary-da); }
575
+ .ml-section .project-title-text { color: var(--primary-ml); }
576
+ .cv-section .project-title-text { color: var(--primary-cv); }
577
+
578
+ .da-section .project-link:hover { color: var(--primary-da); }
579
+ .ml-section .project-link:hover { color: var(--primary-ml); }
580
+ .cv-section .project-link:hover { color: var(--primary-cv); }
581
+
582
+ .project-description {
583
+ color: var(--text-secondary);
584
+ line-height: 1.5;
585
+ }
586
+
587
+ .tech-stack {
588
+ display: block;
589
+ margin-top: 10px;
590
+ font-style: italic;
591
+ color: var(--text-muted);
592
+ }
593
+
594
+ /* Skills list */
595
+ .skills-list {
596
+ display: grid;
597
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
598
+ gap: 15px;
599
+ margin-top: 20px;
600
+ margin-bottom: 40px; /* Added margin to create space between skills and projects */
601
+ }
602
+
603
+ .skill-category {
604
+ background: rgba(255, 255, 255, 0.05);
605
+ border-radius: var(--border-radius-sm);
606
+ padding: 15px;
607
+ transition: all var(--transition-med);
608
+ }
609
+
610
+ .skill-category:hover {
611
+ background: rgba(255, 255, 255, 0.08);
612
+ transform: translateY(-3px);
613
+ }
614
+
615
+ .skill-category h4 {
616
+ margin-top: 0;
617
+ margin-bottom: 10px;
618
+ font-size: 1.1rem;
619
+ }
620
+
621
+ .da-section .skill-category h4 { color: var(--primary-da); }
622
+ .ml-section .skill-category h4 { color: var(--primary-ml); }
623
+ .cv-section .skill-category h4 { color: var(--primary-cv); }
624
+
625
+ .skill-category ul {
626
+ margin: 0;
627
+ padding-left: 20px;
628
+ color: var(--text-secondary);
629
+ }
630
+
631
+ .skill-category li {
632
+ margin-bottom: 5px;
633
+ }
634
+
635
+ /* Section intro text */
636
+ .section-intro {
637
+ max-width: 800px;
638
+ margin-bottom: 30px;
639
+ line-height: 1.6;
640
+ color: var(--text-secondary);
641
+ font-size: 1.1rem;
642
+ }
643
+
644
+ /* Footer */
645
+ .footer {
646
+ text-align: center;
647
+ padding: 40px 20px;
648
+ margin-top: 60px;
649
+ color: var(--text-muted);
650
+ font-size: 0.9rem;
651
+ }
652
+
653
+ /* Animations for scroll */
654
+ .animate-on-scroll {
655
+ opacity: 0;
656
+ transform: translateY(20px);
657
+ transition: opacity 0.6s ease, transform 0.6s ease;
658
+ }
659
+
660
+ .animate-on-scroll.show {
661
+ opacity: 1;
662
+ transform: translateY(0);
663
+ }
664
+
665
+ /* Responsive design */
666
+ @media (max-width: 768px) {
667
+ .landing-section h1 {
668
+ font-size: 2.5rem;
669
+ }
670
+
671
+ .landing-section h2 {
672
+ font-size: 1.5rem;
673
+ }
674
+
675
+ .about-text {
676
+ font-size: 1.1rem;
677
+ }
678
+
679
+ .cards-grid {
680
+ grid-template-columns: 1fr;
681
+ }
682
+
683
+ .skills-list {
684
+ grid-template-columns: 1fr;
685
+ }
686
+
687
+ .profile-pic {
688
+ width: 150px;
689
+ height: 150px;
690
+ }
691
+ }
692
+
693
+ @media (max-width: 480px) {
694
+ .landing-section h1 {
695
+ font-size: 2rem;
696
+ }
697
+
698
+ .landing-section h2 {
699
+ font-size: 1.2rem;
700
+ }
701
+
702
+ .card-content {
703
+ min-height: 150px;
704
+ font-size: 22px;
705
+ }
706
+
707
+ .social-links {
708
+ gap: 15px;
709
+ }
710
+
711
+ .social-button {
712
+ width: 40px;
713
+ height: 40px;
714
+ font-size: 1rem;
715
+ }
716
+ }
717
+ """
718
+
719
+ # --- Portfolio Layout ---
720
+ with gr.Blocks(title="Manyue's Portfolio", css=portfolio_css) as demo:
721
+ # Create sections
722
+ # Data Analytics Section (initially hidden)
723
+ with gr.Row(visible=False, elem_classes="section-container da-section") as da_section:
724
+ with gr.Column():
725
+ # Back button
726
+ back_from_da = gr.Button("← Back to Home", elem_classes="back-button back-button-da")
727
+ gr.HTML("""
728
+ <h1 class="section-heading">Data Analytics</h1>
729
+ <div class="section-intro">
730
+ I specialize in transforming raw data into actionable business insights that drive strategic decision-making.
731
+ With a strong background in both data analytics and commerce, I bridge the gap between business needs and technical solutions.
732
+ My approach combines statistical analysis with compelling data visualization to tell stories that solve real-world problems.
733
+ I've developed expertise in designing dashboards that make complex data accessible and creating end-to-end analysis
734
+ workflows that uncover hidden patterns and trends.
735
+ </div>
736
+ """)
737
+
738
+ gr.HTML("""
739
+ <h3 class="section-subheading da">Skills</h3>
740
+
741
+ <div class="skills-list">
742
+ <div class="skill-category">
743
+ <h4>Data Visualization</h4>
744
+ <ul>
745
+ <li>Power BI</li>
746
+ <li>Tableau</li>
747
+ <li>Matplotlib/Seaborn</li>
748
+ <li>Plotly/Dash</li>
749
+ </ul>
750
+ </div>
751
+
752
+ <div class="skill-category">
753
+ <h4>Data Manipulation</h4>
754
+ <ul>
755
+ <li>SQL</li>
756
+ <li>Pandas</li>
757
+ <li>NumPy</li>
758
+ <li>ETL Pipelines</li>
759
+ </ul>
760
+ </div>
761
+
762
+ <div class="skill-category">
763
+ <h4>Analysis Techniques</h4>
764
+ <ul>
765
+ <li>Statistical Analysis</li>
766
+ <li>A/B Testing</li>
767
+ <li>Time Series Analysis</li>
768
+ <li>Customer Segmentation</li>
769
+ </ul>
770
+ </div>
771
+
772
+ <div class="skill-category">
773
+ <h4>Business Intelligence</h4>
774
+ <ul>
775
+ <li>KPI Development</li>
776
+ <li>Executive Reporting</li>
777
+ <li>Data Storytelling</li>
778
+ <li>Process Optimization</li>
779
+ </ul>
780
+ </div>
781
+ </div>
782
+
783
+ <h3 class="section-subheading da">Projects</h3>
784
+
785
+ <div class="project-card">
786
+ <div class="project-title">
787
+ <span class="project-title-text">Northwind Sales Insight Dashboard</span>
788
+ <a href="https://github.com/Manyue-datascientist/northwind-retail-analysis" target="_blank" class="project-link">
789
+ """ + link_icon + """
790
+ <span>View Project</span>
791
+ </a>
792
+ </div>
793
+ <div class="project-description">
794
+ 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.
795
+ <span class="tech-stack"><strong>Tech Stack:</strong> SQL, Power BI, Pandas</span>
796
+ </div>
797
+ </div>
798
+
799
+ <div class="project-card">
800
+ <div class="project-title">
801
+ <span class="project-title-text">Loan Default Risk Analysis</span>
802
+ <a href="#" target="_blank" class="project-link">
803
+ """ + link_icon + """
804
+ <span>View Project</span>
805
+ </a>
806
+ </div>
807
+ <div class="project-description">
808
+ 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.
809
+ <span class="tech-stack"><strong>Tech Stack:</strong> Python, Matplotlib, Pandas</span>
810
+ </div>
811
+ </div>
812
+ """)
813
+
814
+ # Machine Learning Section (initially hidden)
815
+ with gr.Row(visible=False, elem_classes="section-container ml-section") as ml_section:
816
+ with gr.Column():
817
+ # Back button
818
+ back_from_ml = gr.Button("← Back to Home", elem_classes="back-button back-button-ml")
819
+ gr.HTML("""
820
+ <h1 class="section-heading">Machine Learning</h1>
821
+ <div class="section-intro">
822
+ My machine learning expertise spans from traditional algorithms to deep learning systems that solve real business challenges.
823
+ I've built end-to-end ML pipelines that deliver measurable impact, combining the right models with appropriate feature engineering
824
+ techniques. I focus on creating solutions that are not only technically sound but also deployable, maintainable,
825
+ and integrated with business workflows. With a solid foundation in Python-based ML frameworks and cloud
826
+ deployment platforms, I develop models that generate actionable predictions and insights.
827
+ </div>
828
+ """)
829
+
830
+ gr.HTML("""
831
+ <h3 class="section-subheading ml">Skills</h3>
832
+
833
+ <div class="skills-list">
834
+ <div class="skill-category">
835
+ <h4>Frameworks & Libraries</h4>
836
+ <ul>
837
+ <li>TensorFlow/Keras</li>
838
+ <li>PyTorch</li>
839
+ <li>Scikit-Learn</li>
840
+ <li>XGBoost/LightGBM</li>
841
+ </ul>
842
+ </div>
843
+
844
+ <div class="skill-category">
845
+ <h4>ML Techniques</h4>
846
+ <ul>
847
+ <li>Supervised Learning</li>
848
+ <li>Unsupervised Learning</li>
849
+ <li>Deep Learning</li>
850
+ <li>Natural Language Processing</li>
851
+ </ul>
852
+ </div>
853
+
854
+ <div class="skill-category">
855
+ <h4>MLOps</h4>
856
+ <ul>
857
+ <li>ML Pipelines</li>
858
+ <li>Model Monitoring</li>
859
+ <li>Deployment Strategies</li>
860
+ <li>Version Control (DVC)</li>
861
+ </ul>
862
+ </div>
863
+
864
+ <div class="skill-category">
865
+ <h4>Cloud ML Services</h4>
866
+ <ul>
867
+ <li>AWS SageMaker</li>
868
+ <li>Google AI Platform</li>
869
+ <li>Azure ML</li>
870
+ <li>MLflow</li>
871
+ </ul>
872
+ </div>
873
+ </div>
874
+
875
+ <h3 class="section-subheading ml">Projects</h3>
876
+
877
+ <div class="project-card">
878
+ <div class="project-title">
879
+ <span class="project-title-text">University Admission Predictor</span>
880
+ <a href="#" target="_blank" class="project-link">
881
+ """ + link_icon + """
882
+ <span>Try the Predictor</span>
883
+ </a>
884
+ </div>
885
+ <div class="project-description">
886
+ 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.
887
+ <span class="tech-stack"><strong>Tech Stack:</strong> Scikit-learn, Streamlit, NumPy</span>
888
+ </div>
889
+ </div>
890
+
891
+ <div class="project-card">
892
+ <div class="project-title">
893
+ <span class="project-title-text">AI Chat Assistant for Recruiters</span>
894
+ <a href="https://huggingface.co/spaces/Manyue-DataScientist/AI-Assistant" target="_blank" class="project-link">
895
+ """ + link_icon + """
896
+ <span>Chat with Assistant</span>
897
+ </a>
898
+ </div>
899
+ <div class="project-description">
900
+ 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.
901
+ <span class="tech-stack"><strong>Tech Stack:</strong> LangChain, OpenAI, Gradio</span>
902
+ </div>
903
+ </div>
904
+
905
+ <div class="project-card">
906
+ <div class="project-title">
907
+ <span class="project-title-text">Speaker Diarization Application</span>
908
+ <a href="https://huggingface.co/spaces/Manyue-DataScientist/speaker-diarization-app-v2" target="_blank" class="project-link">
909
+ """ + link_icon + """
910
+ <span>Try the Application</span>
911
+ </a>
912
+ </div>
913
+ <div class="project-description">
914
+ Developed an advanced multi-speaker audio processing system that performs speaker diarization, transcription, and summarization to extract meaningful insights from multi-speaker conversations.
915
+ <span class="tech-stack"><strong>Tech Stack:</strong> PyTorch, Hugging Face Transformers, Gradio</span>
916
+ </div>
917
+ </div>
918
+ """)
919
+
920
+ # Computer Vision Section (initially hidden)
921
+ with gr.Row(visible=False, elem_classes="section-container cv-section") as cv_section:
922
+ with gr.Column():
923
+ # Back button
924
+ back_from_cv = gr.Button("← Back to Home", elem_classes="back-button back-button-cv")
925
+ gr.HTML("""
926
+ <h1 class="section-heading">Computer Vision</h1>
927
+ <div class="section-intro">
928
+ I'm passionate about developing computer vision systems that can perceive and understand visual information in ways that benefit humans.
929
+ My experience spans from implementing state-of-the-art algorithms to deploying them in real-world scenarios. I've worked on projects
930
+ that enable machines to "see" and interpret their environment through image processing, object detection, and image classification.
931
+ I focus particularly on applications that improve accessibility and solve tangible problems, creating CV solutions
932
+ that operate efficiently even with hardware constraints.
933
+ </div>
934
+ """)
935
+
936
+ gr.HTML("""
937
+ <h3 class="section-subheading cv">Skills</h3>
938
+
939
+ <div class="skills-list">
940
+ <div class="skill-category">
941
+ <h4>CV Techniques</h4>
942
+ <ul>
943
+ <li>Object Detection</li>
944
+ <li>Image Segmentation</li>
945
+ <li>Feature Extraction</li>
946
+ <li>Image Classification</li>
947
+ </ul>
948
+ </div>
949
+
950
+ <div class="skill-category">
951
+ <h4>CV Libraries</h4>
952
+ <ul>
953
+ <li>OpenCV</li>
954
+ <li>PIL/Pillow</li>
955
+ <li>TorchVision</li>
956
+ <li>TF Computer Vision</li>
957
+ </ul>
958
+ </div>
959
+
960
+ <div class="skill-category">
961
+ <h4>Deep Learning for CV</h4>
962
+ <ul>
963
+ <li>CNNs</li>
964
+ <li>YOLO frameworks</li>
965
+ <li>Transfer Learning</li>
966
+ <li>Object Recognition</li>
967
+ </ul>
968
+ </div>
969
+
970
+ <div class="skill-category">
971
+ <h4>Applications</h4>
972
+ <ul>
973
+ <li>Accessibility Solutions</li>
974
+ <li>OCR/Document Analysis</li>
975
+ <li>Motion Tracking</li>
976
+ <li>Edge Deployment</li>
977
+ </ul>
978
+ </div>
979
+ </div>
980
+
981
+ <h3 class="section-subheading cv">Projects</h3>
982
+
983
+ <div class="project-card">
984
+ <div class="project-title">
985
+ <span class="project-title-text">Smart Shopping Assistant for the Blind</span>
986
+ <a href="https://github.com/Manyue-datascientist/smart_glove_project" target="_blank" class="project-link">
987
+ """ + link_icon + """
988
+ <span>View Project</span>
989
+ </a>
990
+ </div>
991
+ <div class="project-description">
992
+ 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.
993
+ <span class="tech-stack"><strong>Tech Stack:</strong> YOLOv8, OpenCV, Raspberry Pi</span>
994
+ </div>
995
+ </div>
996
+
997
+ <div class="project-card">
998
+ <div class="project-title">
999
+ <span class="project-title-text">Traffic Flow Counter (Upcoming)</span>
1000
+ <a href="#" target="_blank" class="project-link">
1001
+ """ + link_icon + """
1002
+ <span>Coming Soon</span>
1003
+ </a>
1004
+ </div>
1005
+ <div class="project-description">
1006
+ 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.
1007
+ <span class="tech-stack"><strong>Tech Stack:</strong> YOLOv5, Raspberry Pi, OpenCV</span>
1008
+ </div>
1009
+ </div>
1010
+ """)
1011
+
1012
+ with gr.Row(visible=True, elem_classes="landing-section") as landing_section:
1013
+ with gr.Column():
1014
+ # Profile section with picture - using the actual image from data folder
1015
+ try:
1016
+ # Get the image as data URI
1017
+ profile_img_uri = image_to_data_uri("data/My_photo.jpeg")
1018
+ gr.HTML(f"""
1019
+ <div class="profile-container">
1020
+ <div class="profile-pic">
1021
+ <img src="{profile_img_uri}" alt="Manyue Javvadi" />
1022
+ </div>
1023
+ <div class="name-text">Manyue Javvadi</div>
1024
+ </div>
1025
+ <h2>AI/ML Engineer & Data Scientist</h2>
1026
+ <div class="about-text">
1027
+ I'm a software engineer turned AI/ML practitioner with a strong foundation in Commerce and experience in ML, computer vision, and data analytics.
1028
+ 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.
1029
+ </div>
1030
+
1031
+ <div class="skills-container">
1032
+ <div class="skill-pill">Python</div>
1033
+ <div class="skill-pill">Machine Learning</div>
1034
+ <div class="skill-pill">TensorFlow</div>
1035
+ <div class="skill-pill">PyTorch</div>
1036
+ <div class="skill-pill">Computer Vision</div>
1037
+ <div class="skill-pill">Data Analytics</div>
1038
+ <div class="skill-pill">SQL</div>
1039
+ <div class="skill-pill">Power BI</div>
1040
+ </div>
1041
+
1042
+ <div class="social-links">
1043
+ <a href="https://www.linkedin.com/in/manyue-javvadi-datascientist/" target="_blank" class="social-button social-linkedin" aria-label="LinkedIn">
1044
+ """ + linkedin_icon + """
1045
+ </a>
1046
+ <a href="https://github.com/Manyue-datascientist" target="_blank" class="social-button social-github" aria-label="GitHub">
1047
+ """ + github_icon + """
1048
+ </a>
1049
+ <a href="mailto:[email protected]" class="social-button social-email" aria-label="Contact Me" id="contact_btn">
1050
+ """ + mail_icon + """
1051
+ </a>
1052
+ </div>
1053
+
1054
+ <h2>My Specializations</h2>
1055
+ """)
1056
+ except Exception as e:
1057
+ # Fallback if image cannot be loaded
1058
+ gr.HTML("""
1059
+ <div class="profile-container">
1060
+ <div class="profile-pic">
1061
+ <img src="/api/placeholder/400/400" alt="Manyue Javvadi" />
1062
+ </div>
1063
+ <div class="name-text">Manyue Javvadi</div>
1064
+ </div>
1065
+ <h2>AI/ML Engineer & Data Scientist</h2>
1066
+ <div class="about-text">
1067
+ I'm a software engineer turned AI/ML practitioner with a strong foundation in Commerce and experience in ML, computer vision, and data analytics.
1068
+ 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.
1069
+ </div>
1070
+
1071
+ <div class="skills-container">
1072
+ <div class="skill-pill">Python</div>
1073
+ <div class="skill-pill">Machine Learning</div>
1074
+ <div class="skill-pill">TensorFlow</div>
1075
+ <div class="skill-pill">PyTorch</div>
1076
+ <div class="skill-pill">Computer Vision</div>
1077
+ <div class="skill-pill">Data Analytics</div>
1078
+ <div class="skill-pill">SQL</div>
1079
+ <div class="skill-pill">Power BI</div>
1080
+ </div>
1081
+
1082
+ <div class="social-links">
1083
+ <a href="https://www.linkedin.com/in/manyue-javvadi-datascientist/" target="_blank" class="social-button social-linkedin" aria-label="LinkedIn">
1084
+ """ + linkedin_icon + """
1085
+ </a>
1086
+ <a href="https://github.com/Manyue-datascientist" target="_blank" class="social-button social-github" aria-label="GitHub">
1087
+ """ + github_icon + """
1088
+ </a>
1089
+ <a href="mailto:[email protected]" class="social-button social-email" aria-label="Contact Me" id="contact_btn">
1090
+ """ + mail_icon + """
1091
+ </a>
1092
+ </div>
1093
+
1094
+ <h2>My Specializations</h2>
1095
+ """)
1096
+
1097
+ # Cards Grid with proper structure
1098
+ with gr.Row(elem_classes="cards-grid"):
1099
+ with gr.Column():
1100
+ # Data Analytics Card
1101
+ gr.HTML('<div class="card-container da">')
1102
+ da_button = gr.Button("Data Analytics", elem_classes="card-button")
1103
+ gr.HTML("""
1104
+ <div class="card-inner">
1105
+ <div class="card-content">
1106
+ """ + data_analytics_icon + """
1107
+ <span>Data Analytics</span>
1108
+ </div>
1109
+ <div class="card-description">
1110
+ Data storytelling, insights extraction, interactive dashboards & business problem-solving
1111
+ </div>
1112
+ </div>
1113
+ </div>
1114
+ """)
1115
+
1116
+ with gr.Column():
1117
+ # Machine Learning Card
1118
+ gr.HTML('<div class="card-container ml">')
1119
+ ml_button = gr.Button("Machine Learning", elem_classes="card-button")
1120
+ gr.HTML("""
1121
+ <div class="card-inner">
1122
+ <div class="card-content">
1123
+ """ + machine_learning_icon + """
1124
+ <span>Machine Learning</span>
1125
+ </div>
1126
+ <div class="card-description">
1127
+ Feature engineering, model training, deployment & automation pipelines
1128
+ </div>
1129
+ </div>
1130
+ </div>
1131
+ """)
1132
+
1133
+ with gr.Column():
1134
+ # Computer Vision Card
1135
+ gr.HTML('<div class="card-container cv">')
1136
+ cv_button = gr.Button("Computer Vision", elem_classes="card-button")
1137
+ gr.HTML("""
1138
+ <div class="card-inner">
1139
+ <div class="card-content">
1140
+ """ + computer_vision_icon + """
1141
+ <span>Computer Vision</span>
1142
+ </div>
1143
+ <div class="card-description">
1144
+ Object detection, image recognition, edge AI & accessibility applications
1145
+ </div>
1146
+ </div>
1147
+ </div>
1148
+ """)
1149
+
1150
+ # Contact section - Updated to "Hire Me" with email link
1151
+ gr.HTML("""
1152
+ <!-- Contact section -->
1153
+ <div id="contact_section">
1154
+ <h2>Contact Me</h2>
1155
+ <div class="contact-container">
1156
+ <p>Looking for a data scientist or ML engineer for your team?</p>
1157
+ <a href="mailto:[email protected]" class="hire-me-button">Hire Me</a>
1158
+ </div>
1159
+ </div>
1160
+
1161
+ <!-- Footer -->
1162
+ <div class="footer">
1163
+ <p>© 2025 Manyue Javvadi. All rights reserved.</p>
1164
+ <p>Made with Gradio</p>
1165
+ </div>
1166
+ """)
1167
+
1168
+ # Set up click events for navigation
1169
+ da_button.click(show_data_analytics, inputs=None, outputs=[landing_section, da_section, ml_section, cv_section])
1170
+ ml_button.click(show_machine_learning, inputs=None, outputs=[landing_section, da_section, ml_section, cv_section])
1171
+ cv_button.click(show_computer_vision, inputs=None, outputs=[landing_section, da_section, ml_section, cv_section])
1172
+
1173
+ back_from_da.click(go_home, inputs=None, outputs=[landing_section, da_section, ml_section, cv_section])
1174
+ back_from_ml.click(go_home, inputs=None, outputs=[landing_section, da_section, ml_section, cv_section])
1175
+ back_from_cv.click(go_home, inputs=None, outputs=[landing_section, da_section, ml_section, cv_section])
1176
+
1177
+ # Launch the app
1178
+ demo.launch()