praneeth232 commited on
Commit
9201528
·
verified ·
1 Parent(s): ce927b5

Upload 7 files

Browse files
Files changed (8) hide show
  1. .gitattributes +1 -0
  2. app.py +36 -0
  3. index.html +248 -0
  4. requirements.txt +1 -3
  5. resume/Praneeth-Kumar-Resume.pdf +3 -0
  6. resume/README.txt +3 -0
  7. script.js +89 -0
  8. styles.css +140 -0
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ resume/Praneeth-Kumar-Resume.pdf filter=lfs diff=lfs merge=lfs -text
app.py ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from pathlib import Path
3
+
4
+ st.set_page_config(
5
+ page_title="Pinni Praneeth Kumar | Portfolio",
6
+ page_icon="🌐",
7
+ layout="wide",
8
+ )
9
+
10
+ base_dir = Path(__file__).parent
11
+ html_path = base_dir / "index.html"
12
+ css_path = base_dir / "styles.css"
13
+ js_path = base_dir / "script.js"
14
+
15
+ # Read assets
16
+ html = html_path.read_text(encoding="utf-8") if html_path.exists() else "<h1>index.html not found</h1>"
17
+ css = css_path.read_text(encoding="utf-8") if css_path.exists() else ""
18
+ js = js_path.read_text(encoding="utf-8") if js_path.exists() else ""
19
+
20
+ # Inline CSS and JS by replacing the link/script tags in index.html
21
+ html_inlined = html
22
+ if css:
23
+ html_inlined = html_inlined.replace(
24
+ '<link rel="stylesheet" href="./styles.css" />', f"<style>{css}</style>"
25
+ )
26
+ if js:
27
+ html_inlined = html_inlined.replace(
28
+ '<script src="./script.js"></script>', f"<script>{js}</script>"
29
+ )
30
+
31
+ # Render full HTML document inside Streamlit
32
+ # Use components to allow JS execution and custom styles
33
+ st.components.v1.html(html_inlined, height=900, scrolling=True)
34
+
35
+ # Optional footer in Streamlit (outside the embedded app)
36
+ st.caption("Hosted with Streamlit on Hugging Face Spaces")
index.html ADDED
@@ -0,0 +1,248 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en" data-theme="light">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <meta name="description" content="Pinni Praneeth Kumar – Data/ML Engineer Portfolio and Resume" />
7
+ <title>Pinni Praneeth Kumar | Portfolio</title>
8
+ <link rel="preconnect" href="https://fonts.googleapis.com">
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
11
+ <link rel="stylesheet" href="./styles.css" />
12
+ </head>
13
+ <body>
14
+ <header class="site-header" data-reveal>
15
+ <div class="container header-inner">
16
+ <a href="#home" class="brand">Pinni Praneeth Kumar</a>
17
+ <nav class="nav" id="primary-nav">
18
+ <button class="nav-toggle" id="nav-toggle" aria-label="Open menu" aria-expanded="false">☰</button>
19
+ <ul class="nav-list" id="nav-list">
20
+ <li><a href="#about">About</a></li>
21
+ <li><a href="#skills">Skills</a></li>
22
+ <li><a href="#projects">Projects</a></li>
23
+ <li><a href="#experience">Experience</a></li>
24
+ <li><a href="#education">Education</a></li>
25
+ <li><a href="#contact">Contact</a></li>
26
+ </ul>
27
+ </nav>
28
+ <button id="theme-toggle" class="btn btn-ghost" aria-label="Toggle dark mode" title="Toggle theme">🌙</button>
29
+ </div>
30
+ </header>
31
+
32
+ <main id="home">
33
+ <section class="hero" data-reveal>
34
+ <div class="container hero-inner">
35
+ <div class="hero-copy">
36
+ <h1>Hi, I'm <span class="accent">Pinni Praneeth Kumar</span>.</h1>
37
+ <p class="lead">Senior Data Engineer building ML pipelines and GenAI solutions.</p>
38
+ <div class="cta-group">
39
+ <a href="#projects" class="btn btn-primary">View Projects</a>
40
+ <a href="#contact" class="btn">Contact Me</a>
41
+ </div>
42
+ <div class="meta">
43
+ <span>Based in India • Open to roles</span>
44
+ </div>
45
+ </div>
46
+ <div class="hero-photo" aria-hidden="true">
47
+ <div class="avatar">PP</div>
48
+ </div>
49
+ </div>
50
+ </section>
51
+
52
+ <section id="about" class="section" data-reveal>
53
+ <div class="container">
54
+ <h2>About</h2>
55
+ <p>
56
+ Senior Data Engineer with 3.10+ years of experience architecting and deploying scalable ML pipelines on AWS and Azure,
57
+ accelerating the ML lifecycle from data ingestion to production deployment. Skilled in automating end-to-end ML pipelines.
58
+ Proficient in Python, SQL, CI/CD, Docker, and model deployment at scale. Experienced in GenAI, LLMs, and prompt engineering
59
+ to drive intelligent automation.
60
+ </p>
61
+ <ul class="highlights">
62
+ <li>Proficient: Python, SQL, CI/CD, Docker, model deployment</li>
63
+ <li>Experienced: Generative AI, LLMs, RAG, Prompt Engineering</li>
64
+ <li>Cloud: AWS and Azure for scalable data/ML systems</li>
65
+ </ul>
66
+ </div>
67
+ </section>
68
+
69
+ <section id="skills" class="section" data-reveal>
70
+ <div class="container">
71
+ <h2>Skills</h2>
72
+ <div class="skills-scroll">
73
+ <button class="scroll-arrow" id="skills-left" aria-label="Scroll left">←</button>
74
+ <div class="scroll-container" id="skills-container">
75
+ <div class="skills-groups">
76
+ <div class="skill-group">
77
+ <h3>Programming Languages</h3>
78
+ <div class="chips">
79
+ <span class="chip">SQL</span>
80
+ <span class="chip">Python</span>
81
+ </div>
82
+ </div>
83
+ <div class="skill-group">
84
+ <h3>Tools</h3>
85
+ <div class="chips">
86
+ <span class="chip">MySQL</span>
87
+ <span class="chip">Oracle SQL Developer</span>
88
+ <span class="chip">MongoDB</span>
89
+ <span class="chip">Cloud (AWS, Azure)</span>
90
+ <span class="chip">Tableau</span>
91
+ <span class="chip">GitHub</span>
92
+ <span class="chip">MLFlow (Model Tracking)</span>
93
+ <span class="chip">SageMaker</span>
94
+ <span class="chip">Azure ML Studio</span>
95
+ <span class="chip">Vertex AI</span>
96
+ </div>
97
+ </div>
98
+ <div class="skill-group">
99
+ <h3>Others</h3>
100
+ <div class="chips">
101
+ <span class="chip">MLOps</span>
102
+ <span class="chip">CICD</span>
103
+ <span class="chip">Model Monitoring</span>
104
+ <span class="chip">Deep Learning</span>
105
+ <span class="chip">Generative AI</span>
106
+ <span class="chip">LLMs</span>
107
+ <span class="chip">RAG</span>
108
+ <span class="chip">Agents</span>
109
+ <span class="chip">Prompt Engineering</span>
110
+ <span class="chip">Big Data</span>
111
+ <span class="chip">Data Analytics</span>
112
+ </div>
113
+ </div>
114
+ </div>
115
+ </div>
116
+ <button class="scroll-arrow" id="skills-right" aria-label="Scroll right">→</button>
117
+ </div>
118
+ </div>
119
+ </section>
120
+
121
+ <section id="projects" class="section" data-reveal>
122
+ <div class="container">
123
+ <h2>Projects</h2>
124
+ <div class="grid projects-grid">
125
+ <article class="card">
126
+ <div class="card-body">
127
+ <h3>Streamlining Auto Vehicle Pricing through MLOps <span class="muted">(June 2024 – September 2024)</span></h3>
128
+ <details>
129
+ <summary class="btn btn-sm">Know more</summary>
130
+ <ul>
131
+ <li><strong>Built and deployed</strong> an end-to-end MLOps pipeline on Azure ML using GitHub Actions and Python, automating data processing, model training, evaluation, and CI/CD — <strong>reducing model deployment time by 60%</strong> and enabling <strong>weekly retraining cycles</strong> for dynamic vehicle pricing.</li>
132
+ <li><strong>Developed a scalable pricing model</strong> by integrating <strong>over 1 million records</strong> from multiple data sources using SQL, enabling <strong>real-time pricing updates</strong> that reflected evolving market trends.</li>
133
+ <li><strong>Improved pricing accuracy by 25%</strong> and cut manual processing time by <strong>70%</strong> through workflow automation, significantly enhancing operational decision-making speed.</li>
134
+ <li><strong>Implemented a unified MLOps-driven system</strong> with scalable endpoint deployment, supporting <strong>24/7 availability</strong> and handling <strong>1000+ pricing requests per day</strong> with <strong><200ms inference latency</strong>.</li>
135
+ <li><strong>Delivered a production-ready pricing solution</strong> that increased dealership revenue by <strong>4.8%</strong>, improved customer trust scores by <strong>15%</strong>, and strengthened cross-functional team collaboration.</li>
136
+ </ul>
137
+ </details>
138
+ <ul class="tags">
139
+ <li>Azure ML</li><li>GitHub Actions</li><li>Python</li><li>SQL</li><li>MLOps</li>
140
+ </ul>
141
+ </div>
142
+ </article>
143
+ <article class="card">
144
+ <div class="card-body">
145
+ <h3>Intelligent Reporting on Azure <span class="muted">(January 2023 – March 2023)</span></h3>
146
+ <details>
147
+ <summary class="btn btn-sm">Know more</summary>
148
+ <ul>
149
+ <li>Developed an automated analytical pipeline using <strong>Python, SQL, and Azure ML</strong> to preprocess trip data, ensuring data consistency and accuracy for further analysis.</li>
150
+ <li>Created <strong>interactive dashboards</strong> with Streamlit, hosted on Hugging Face Spaces, to visualize key business metrics like total revenue and trip categories, improving data accessibility and decision-making.</li>
151
+ <li>Implemented an <strong>email alert system</strong> using automation scripts, enabling real-time notifications with summaries of insights and dashboard links, enhancing stakeholder communication and decision-making efficiency.</li>
152
+ <li>Streamlined data workflows by <strong>integrating Azure ML</strong> for data storage, preprocessing, and pipeline management, improving collaboration, scalability, and operational efficiency.</li>
153
+ </ul>
154
+ </details>
155
+ <ul class="tags">
156
+ <li>Azure ML</li><li>Python</li><li>SQL</li><li>Streamlit</li><li>Hugging Face Spaces</li>
157
+ </ul>
158
+ </div>
159
+ </article>
160
+ </div>
161
+ </div>
162
+ </section>
163
+
164
+ <section id="experience" class="section" data-reveal>
165
+ <div class="container">
166
+ <h2>Experience</h2>
167
+ <div class="timeline">
168
+ <div class="timeline-item">
169
+ <div class="timeline-dot"></div>
170
+ <div class="timeline-content">
171
+ <h3>Senior Data Engineer • Great Learning <span class="muted">Bangalore Urban</span></h3>
172
+ <span class="muted">Jan 2022 — Present</span>
173
+ <details>
174
+ <summary class="btn btn-sm">Know more</summary>
175
+ <ul>
176
+ <li>Led end-to-end development of scalable machine learning solutions, driving business impact by transforming raw data into actionable insights across product, marketing, and operations teams.</li>
177
+ <li>Designed and deployed advanced predictive models and statistical frameworks using Python, SQL, and cloud platforms (AWS/Azure/GCP), resulting in measurable improvements in customer retention, conversion, or efficiency.</li>
178
+ <li>Mentored junior data scientists and analysts, fostering a culture of experimentation, code quality, and reproducible research through peer reviews, knowledge sharing, and hands-on guidance.</li>
179
+ <li>Led the design and delivery of 5 successful AI/ML-powered products, driving innovation across data science, machine learning, and automation use cases—contributing to a <strong>5% increase</strong> in overall company revenue and operational growth.</li>
180
+ </ul>
181
+ </details>
182
+ </div>
183
+ </div>
184
+ <div class="timeline-item">
185
+ <div class="timeline-dot"></div>
186
+ <div class="timeline-content">
187
+ <h3>Data Analyst • FSP Solutions Pvt Ltd <span class="muted">Noida, Delhi</span></h3>
188
+ <span class="muted">Jun 2021 — Oct 2021</span>
189
+ <details>
190
+ <summary class="btn btn-sm">Know more</summary>
191
+ <ul>
192
+ <li>Partnered with development teams to deliver groundbreaking solutions, providing expert consultation and driving execution to achieve tangible impact.</li>
193
+ <li>Transformed existing information architectures through in-depth analysis and innovative design, developing optimized solutions that elevate data management.</li>
194
+ </ul>
195
+ </details>
196
+ </div>
197
+ </div>
198
+ </div>
199
+ </div>
200
+ </section>
201
+
202
+ <section id="education" class="section" data-reveal>
203
+ <div class="container">
204
+ <h2>Education</h2>
205
+ <ul class="edu-list">
206
+ <li>
207
+ <h3>Grandhi Varalakshmi Venkatarama Institute of Technology • 81.4%</h3>
208
+ <span class="muted">B.Tech in Mechanical Engineering • Bhimavaram, AP • 2020</span>
209
+ <div class="muted">Honors: Academic Merit Award • Projects: Go‑Kart (Open type wheel car)</div>
210
+ </li>
211
+ <li>
212
+ <h3>Grandhi Varalakshmi Venkatarama Institute of Technology • 82.07%</h3>
213
+ <span class="muted">Diploma in Mechanical Engineering • Bhimavaram, AP • 2017</span>
214
+ <div class="muted">Projects: Dual Tone Multi Frequency Robot</div>
215
+ </li>
216
+ </ul>
217
+ </div>
218
+ </section>
219
+
220
+ <section id="contact" class="section" data-reveal>
221
+ <div class="container">
222
+ <h2>Contact</h2>
223
+ <p>
224
+ Feel free to reach out for roles, collaborations, or just to say hi.
225
+ </p>
226
+ <div class="cta-group">
227
+ <a class="btn btn-primary" href="mailto:praneethsanthosh555@gmail.com">Email Me</a>
228
+ <a class="btn" href="./resume/Praneeth-Kumar-Resume.pdf" download>Download Resume</a>
229
+ <a class="btn btn-ghost" href="https://www.linkedin.com/in/praneeth88/" target="_blank" rel="noopener">LinkedIn</a>
230
+ <a class="btn btn-ghost" href="https://github.com/praneeth300" target="_blank" rel="noopener">GitHub</a>
231
+ <span class="muted">Ph: 8309116050</span>
232
+ </div>
233
+ </div>
234
+ </section>
235
+ </main>
236
+
237
+ <a href="#contact" class="fab" aria-label="Contact">✉️</a>
238
+ <button id="back-to-top" class="back-to-top" aria-label="Back to top">↑</button>
239
+
240
+ <footer class="site-footer">
241
+ <div class="container">
242
+ <span>© <span id="year"></span> Pinni Praneeth Kumar. All rights reserved.</span>
243
+ </div>
244
+ </footer>
245
+
246
+ <script src="./script.js"></script>
247
+ </body>
248
+ </html>
requirements.txt CHANGED
@@ -1,3 +1 @@
1
- altair
2
- pandas
3
- streamlit
 
1
+ streamlit==1.36.0
 
 
resume/Praneeth-Kumar-Resume.pdf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:aeef4f2bc908ed0464415dd069916b8147adbeaf40a0cc6ca917b412263de285
3
+ size 123877
resume/README.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ Place your resume PDF here as `Praneeth_Resume.pdf`.
2
+
3
+ Example: C:\Users\Praneeth\Desktop\Gen AI\2- Developement\resume\Praneeth_Resume.pdf
script.js ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function () {
2
+ var root = document.documentElement;
3
+ var themeToggle = document.getElementById('theme-toggle');
4
+ var navToggle = document.getElementById('nav-toggle');
5
+ var navList = document.getElementById('nav-list');
6
+ var year = document.getElementById('year');
7
+
8
+ try {
9
+ var saved = localStorage.getItem('theme');
10
+ if (saved) {
11
+ root.setAttribute('data-theme', saved);
12
+ if (saved === 'dark') themeToggle.textContent = '☀️';
13
+ } else {
14
+ var prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
15
+ root.setAttribute('data-theme', prefersDark ? 'dark' : 'light');
16
+ themeToggle.textContent = prefersDark ? '☀️' : '🌙';
17
+ }
18
+ } catch (e) {}
19
+
20
+ if (themeToggle) {
21
+ themeToggle.addEventListener('click', function () {
22
+ var current = root.getAttribute('data-theme') === 'dark' ? 'dark' : 'light';
23
+ var next = current === 'dark' ? 'light' : 'dark';
24
+ root.setAttribute('data-theme', next);
25
+ themeToggle.textContent = next === 'dark' ? '☀️' : '🌙';
26
+ try { localStorage.setItem('theme', next); } catch (e) {}
27
+ });
28
+ }
29
+
30
+ if (navToggle && navList) {
31
+ navToggle.addEventListener('click', function () {
32
+ var isOpen = navList.classList.contains('open');
33
+ navList.classList.toggle('open');
34
+ navToggle.setAttribute('aria-expanded', String(!isOpen));
35
+ });
36
+ navList.querySelectorAll('a').forEach(function (a) {
37
+ a.addEventListener('click', function () { navList.classList.remove('open'); navToggle.setAttribute('aria-expanded', 'false'); });
38
+ });
39
+ }
40
+
41
+ if (year) {
42
+ year.textContent = String(new Date().getFullYear());
43
+ }
44
+
45
+ // Smooth scroll for in-page anchors
46
+ document.querySelectorAll('a[href^="#"]').forEach(function (a) {
47
+ a.addEventListener('click', function (e) {
48
+ var id = a.getAttribute('href');
49
+ if (id.length > 1) {
50
+ var el = document.querySelector(id);
51
+ if (el) {
52
+ e.preventDefault();
53
+ el.scrollIntoView({ behavior: 'smooth' });
54
+ }
55
+ }
56
+ });
57
+ });
58
+
59
+ // Reveal-on-scroll
60
+ var observer = new IntersectionObserver(function (entries) {
61
+ entries.forEach(function (entry) {
62
+ if (entry.isIntersecting) {
63
+ entry.target.classList.add('visible');
64
+ observer.unobserve(entry.target);
65
+ }
66
+ });
67
+ }, { threshold: 0.1 });
68
+ document.querySelectorAll('[data-reveal]').forEach(function (el) { observer.observe(el); });
69
+
70
+ // Skills horizontal scroll with arrows
71
+ var skillsContainer = document.getElementById('skills-container');
72
+ var left = document.getElementById('skills-left');
73
+ var right = document.getElementById('skills-right');
74
+ function scrollByAmount(amount) {
75
+ if (!skillsContainer) return;
76
+ skillsContainer.scrollBy({ left: amount, behavior: 'smooth' });
77
+ }
78
+ if (left) left.addEventListener('click', function () { scrollByAmount(-300); });
79
+ if (right) right.addEventListener('click', function () { scrollByAmount(300); });
80
+
81
+ // Back to top button
82
+ var backToTop = document.getElementById('back-to-top');
83
+ if (backToTop) {
84
+ window.addEventListener('scroll', function () {
85
+ if (window.scrollY > 600) backToTop.classList.add('show'); else backToTop.classList.remove('show');
86
+ });
87
+ backToTop.addEventListener('click', function () { window.scrollTo({ top: 0, behavior: 'smooth' }); });
88
+ }
89
+ })();
styles.css ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ --bg: #ffffff;
3
+ --fg: #0f172a;
4
+ --muted: #64748b;
5
+ --accent: #2563eb;
6
+ --card: #f8fafc;
7
+ --border: #e2e8f0;
8
+ --chip: #eef2ff;
9
+ }
10
+
11
+ html[data-theme="dark"] {
12
+ --bg: #0b1220;
13
+ --fg: #e5e7eb;
14
+ --muted: #9aa3b2;
15
+ --accent: #60a5fa;
16
+ --card: #111827;
17
+ --border: #1f2937;
18
+ --chip: #111827;
19
+ }
20
+
21
+ * { box-sizing: border-box; }
22
+
23
+ html, body { height: 100%; }
24
+
25
+ body {
26
+ margin: 0;
27
+ font-family: Inter, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji";
28
+ color: var(--fg);
29
+ background: var(--bg);
30
+ line-height: 1.6;
31
+ }
32
+
33
+ img { max-width: 100%; display: block; }
34
+
35
+ .container {
36
+ width: 100%;
37
+ max-width: 1100px;
38
+ margin: 0 auto;
39
+ padding: 0 16px;
40
+ }
41
+
42
+ .site-header {
43
+ position: sticky;
44
+ top: 0;
45
+ z-index: 50;
46
+ background: var(--bg);
47
+ border-bottom: 1px solid var(--border);
48
+ }
49
+ .header-inner {
50
+ display: flex;
51
+ align-items: center;
52
+ justify-content: space-between;
53
+ height: 64px;
54
+ }
55
+ .brand { font-weight: 700; font-size: 20px; color: var(--fg); text-decoration: none; }
56
+
57
+ .nav-toggle { display: none; }
58
+ .nav-list { display: flex; list-style: none; gap: 20px; margin: 0; padding: 0; }
59
+ .nav-list a { color: var(--fg); text-decoration: none; opacity: 0.9; }
60
+ .nav-list a:hover { color: var(--accent); }
61
+
62
+ .btn { border: 1px solid var(--border); background: transparent; color: var(--fg); padding: 10px 14px; border-radius: 10px; text-decoration: none; display: inline-flex; align-items: center; gap: 8px; }
63
+ .btn:hover { border-color: var(--accent); }
64
+ .btn-primary { background: var(--accent); color: white; border-color: var(--accent); }
65
+ .btn-ghost { background: transparent; border-color: transparent; }
66
+ .btn-sm { padding: 6px 10px; border-radius: 8px; font-size: 14px; }
67
+
68
+ .hero { padding: 64px 0; }
69
+ .hero-inner { display: grid; grid-template-columns: 1.5fr 1fr; gap: 32px; align-items: center; }
70
+ .hero h1 { font-size: 42px; margin: 0 0 12px; }
71
+ .lead { font-size: 18px; opacity: 0.9; }
72
+ .accent { color: var(--accent); }
73
+ .meta { margin-top: 10px; color: var(--muted); font-size: 14px; }
74
+
75
+ .avatar { height: 140px; width: 140px; border-radius: 50%; background: linear-gradient(135deg, var(--accent), #9333ea); color: white; display: grid; place-items: center; font-weight: 700; font-size: 40px; margin: 0 0 0 auto; }
76
+
77
+ .section { padding: 56px 0; border-top: 1px solid var(--border); }
78
+ .section h2 { margin: 0 0 16px; font-size: 28px; }
79
+
80
+ .highlights { margin: 10px 0 0; padding-left: 20px; }
81
+
82
+ .chips { display: flex; flex-wrap: wrap; gap: 10px; }
83
+ .chip { background: var(--chip); border: 1px solid var(--border); color: var(--fg); padding: 8px 10px; border-radius: 999px; font-size: 14px; }
84
+
85
+ .grid { display: grid; gap: 16px; }
86
+ .projects-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
87
+
88
+ .card { background: var(--card); border: 1px solid var(--border); border-radius: 14px; overflow: hidden; }
89
+ .card-body { padding: 16px; display: grid; gap: 8px; }
90
+ .tags { display: flex; flex-wrap: wrap; gap: 8px; padding: 0; margin: 0; list-style: none; }
91
+ .tags li { background: var(--chip); border: 1px solid var(--border); padding: 4px 8px; border-radius: 999px; font-size: 12px; }
92
+ .card-actions { display: flex; gap: 8px; margin-top: 4px; }
93
+
94
+ .timeline { display: grid; gap: 16px; border-left: none; padding-left: 0; }
95
+ .timeline-item { position: relative; background: var(--card); border: 1px solid var(--border); border-radius: 12px; padding: 12px; }
96
+ .timeline-dot { display: none; }
97
+ .timeline-content h3 { margin: 0 0 6px; font-size: 16px; display: flex; flex-wrap: wrap; gap: 8px; align-items: baseline; }
98
+ .timeline-content .muted { display: block; margin-bottom: 8px; }
99
+ .card summary.btn { background: transparent; border-color: var(--border); color: var(--fg); }
100
+ .card summary.btn:hover { background: transparent; border-color: var(--accent); }
101
+
102
+ .edu-list { list-style: none; padding: 0; margin: 0; display: grid; gap: 10px; }
103
+
104
+ .site-footer { padding: 24px 0 40px; border-top: 1px solid var(--border); color: var(--muted); font-size: 14px; }
105
+
106
+ .cta-group { display: flex; gap: 12px; flex-wrap: wrap; }
107
+
108
+ .skills-groups { display: grid; gap: 20px; }
109
+ .skill-group h3 { margin: 0 0 8px; font-size: 16px; color: var(--muted); }
110
+
111
+ .scroll-container { overflow-x: auto; scroll-behavior: smooth; }
112
+ .skills-scroll { display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 8px; }
113
+ .scroll-arrow { border: 1px solid var(--border); background: var(--card); color: var(--fg); height: 36px; width: 36px; border-radius: 8px; }
114
+ .scroll-arrow:hover { border-color: var(--accent); }
115
+
116
+ .card details { margin-top: 6px; }
117
+ .card details[open] summary { color: var(--accent); }
118
+ .card summary { cursor: pointer; list-style: none; }
119
+ .card summary::-webkit-details-marker { display: none; }
120
+
121
+ [data-reveal] { opacity: 0; transform: translateY(12px); transition: opacity .5s ease, transform .5s ease; }
122
+ [data-reveal].visible { opacity: 1; transform: translateY(0); }
123
+
124
+ .fab { position: fixed; right: 18px; bottom: 18px; height: 52px; width: 52px; display: grid; place-items: center; border-radius: 999px; background: var(--accent); color: #fff; text-decoration: none; box-shadow: 0 6px 20px rgba(0,0,0,.2); z-index: 60; }
125
+
126
+ .back-to-top { position: fixed; right: 18px; bottom: 80px; height: 40px; width: 40px; border-radius: 10px; background: var(--card); color: var(--fg); border: 1px solid var(--border); display: none; z-index: 60; }
127
+ .back-to-top.show { display: inline-grid; place-items: center; }
128
+
129
+ @media (max-width: 900px) {
130
+ .hero-inner { grid-template-columns: 1fr; }
131
+ .avatar { margin: 0; }
132
+ .projects-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
133
+ }
134
+
135
+ @media (max-width: 640px) {
136
+ .nav-toggle { display: inline-flex; align-items: center; justify-content: center; height: 38px; width: 38px; border: 1px solid var(--border); background: transparent; border-radius: 10px; }
137
+ .nav-list { display: none; position: absolute; right: 16px; top: 64px; background: var(--bg); border: 1px solid var(--border); border-radius: 12px; padding: 10px; flex-direction: column; gap: 10px; }
138
+ .nav-list.open { display: flex; }
139
+ .projects-grid { grid-template-columns: 1fr; }
140
+ }