├── CNAME
├── README.md
├── script.js
├── index.html
└── styles.css
/CNAME:
--------------------------------------------------------------------------------
1 | ashutoshsingh.me
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Ashutosh Singh - Software Engineer Portfolio
2 |
3 | A modern, secure and high-performance portfolio website showcasing professional experience, education, projects, and GitHub contributions.
4 |
5 | ## Features
6 |
7 | ### Content Features
8 | - Responsive design that works on desktop, tablet, and mobile devices
9 | - Professional education section with institution logos
10 | - GitHub statistics with real-time data
11 | - Dynamic news ticker for latest achievements
12 | - Internship & experience showcase
13 | - Education timeline with institutional branding
14 | - Project portfolio with interactive previews
15 | - Tech stack and skills visualization
16 | - Coding profiles integration (GitHub, LeetCode, CodeForces)
17 |
18 | ### Technical Features
19 | - **Security & Privacy**
20 | - Strong Content Security Policy (CSP)
21 | - Protection against XSS attacks and clickjacking
22 | - Subresource Integrity (SRI) for external resources
23 | - Advanced sanitization of dynamic content
24 | - Secure external links (rel="noopener noreferrer")
25 | - Permissions Policy limiting access to sensitive browser features
26 |
27 | - **Performance Optimizations**
28 | - Smart caching strategy with automatic version management
29 | - Critical CSS inlining for faster initial rendering
30 | - Resource preloading for key assets
31 | - Progressive image loading with fallbacks
32 | - Service Worker for offline capability
33 | - Lazy loading of non-critical resources
34 |
35 | - **User Experience**
36 | - Enhanced mobile menu animations
37 | - Improved scrolling behavior
38 | - Streamlined navigation
39 | - Smart error handling with graceful fallbacks
40 | - Animation performance optimizations
41 |
42 | - **Developer Experience**
43 | - Modular JavaScript architecture
44 | - Centralized version management
45 | - Automated cache invalidation
46 | - Clean, semantic HTML structure
47 |
48 | ## Technologies Used
49 |
50 | - **Core Technologies**
51 | - HTML5 with semantic markup
52 | - CSS3 with modern features (Grid, Flexbox, Variables)
53 | - Vanilla JavaScript with ES6+ features
54 |
55 | - **Performance & Security**
56 | - Service Workers for offline capabilities
57 | - Intersection Observer API for efficient animations
58 | - Content Security Policy (CSP)
59 | - LocalStorage/SessionStorage for state management
60 | - Cache API for resource management
61 |
62 | - **External Integrations**
63 | - GitHub REST API for profile data
64 | - Font Awesome for iconography
65 | - Custom GitHub stats widgets
66 |
67 | ## Project Structure
68 |
69 | ```
70 | portfolio-site/
71 | │
72 | ├── index.html # Main HTML file with structured content and security headers
73 | ├── styles.css # CSS styles with optimized loading
74 | ├── script.js # Modern JavaScript with modular architecture
75 | ├── sw.js # Service Worker with advanced caching strategies
76 | └── README.md # Comprehensive project documentation
77 | ```
78 |
79 | ## Security Features
80 |
81 | ### Content Security Policy (CSP)
82 | A strict CSP that allows content only from trusted sources:
83 | - Scripts only from same origin and cdnjs.cloudflare.com
84 | - Styles from same origin and cdnjs.cloudflare.com
85 | - Images from specific trusted domains
86 | - No inline scripts allowed (except those with nonces)
87 | - No dangerous eval() or Function constructors
88 |
89 | ### Protection Headers
90 | - **X-Frame-Options**: Prevents clickjacking attacks
91 | - **X-Content-Type-Options**: Prevents MIME type sniffing
92 | - **Referrer-Policy**: Limits information leakage
93 | - **Permissions-Policy**: Restricts access to sensitive browser features
94 | - **Strict-Transport-Security**: Enforces HTTPS connections
95 |
96 | ### Link Protection
97 | - All external links use rel="noopener noreferrer"
98 | - Protection against tabnabbing attacks
99 |
100 | ### Content Sanitization
101 | - HTML content is sanitized before rendering
102 | - Allowlist-based approach for HTML tags and attributes
103 | - Safe DOM manipulation helpers prevent XSS vulnerabilities
104 |
105 | ## Performance Optimizations
106 |
107 | ### Resource Loading
108 | - CSS preloading for critical resources
109 | - Efficient font loading strategy
110 | - Optimized image loading with width/height attributes
111 | - Preconnect hints for external domains
112 |
113 | ### Caching Strategy
114 | - Multiple cache levels for different resource types:
115 | - Network-first for HTML/CSS/JS (always fresh)
116 | - Cache-first for static assets (images, icons)
117 | - Stale-while-revalidate for fonts and API data
118 |
119 | ### Version Management
120 | - Centralized version control for resources
121 | - Automatic cache invalidation on deployments
122 | - Clean version transition without page reloads
123 |
124 | ## Getting Started
125 |
126 | 1. Clone the repository
127 | ```
128 | git clone https://github.com/ashutosh-engineer/Portfolio-Software-Engineer.git
129 | ```
130 |
131 | 2. Open `index.html` in your browser or use a local development server
132 |
133 | ## Deployment
134 |
135 | This website can be deployed on any web hosting service or platforms like:
136 |
137 | - GitHub Pages
138 | - Netlify
139 | - Vercel
140 | - Any traditional web hosting
141 |
142 | ## Browser Support
143 |
144 | This portfolio website is compatible with all modern browsers including:
145 |
146 | - Chrome
147 | - Firefox
148 | - Safari
149 | - Edge
150 |
151 | ## Contact
152 |
153 | Ashutosh Singh - [LinkedIn](https://www.linkedin.com/in/ashutosh-singh-7945812b2/)
154 | GitHub: [https://github.com/ashutosh-engineer](https://github.com/ashutosh-engineer)
--------------------------------------------------------------------------------
/script.js:
--------------------------------------------------------------------------------
1 | // Global version for cache management
2 | const APP_VERSION = '1.0.0';
3 |
4 | // DOM manipulation helpers
5 | const DOM = {
6 | // Create elements
7 | createElement(tag, attributes = {}, text = '') {
8 | const element = document.createElement(tag);
9 |
10 | // Set attributes
11 | Object.keys(attributes).forEach(attr => {
12 | element.setAttribute(attr, attributes[attr]);
13 | });
14 |
15 | // Set text content
16 | if (text) {
17 | element.textContent = text;
18 | }
19 |
20 | return element;
21 | },
22 |
23 | // Append multiple child elements
24 | appendChildren(parent, children) {
25 | if (!parent || !children) return;
26 |
27 | children.forEach(child => {
28 | if (child) parent.appendChild(child);
29 | });
30 |
31 | return parent;
32 | }
33 | };
34 |
35 | // Wait for the DOM to be fully loaded
36 | document.addEventListener('DOMContentLoaded', () => {
37 | // Mobile Menu Toggle with improved functionality
38 | initMobileMenu();
39 |
40 | // Add tooltip data attributes from alt text for certification logos
41 | addCertTooltips();
42 |
43 | // Project carousel functionality
44 | initProjectCarousel();
45 |
46 | // Smooth scrolling for navigation
47 | initSmoothScrolling();
48 |
49 | // Fixed header effects
50 | initFixedHeader();
51 |
52 | // Initialize animations for elements
53 | initAnimations();
54 |
55 | // Duplicate news ticker items
56 | initNewsTicker();
57 |
58 | // Initialize events modal
59 | initEventsModal();
60 |
61 | // Fetch GitHub avatar
62 | fetchGitHubData();
63 | });
64 |
65 | // Function to reload CSS files
66 | function reloadCSS() {
67 | const timestamp = new Date().getTime();
68 | const styleSheets = document.querySelectorAll('link[rel="stylesheet"]');
69 |
70 | styleSheets.forEach(linkElement => {
71 | // Only update local CSS files, not external CDN resources
72 | if (linkElement.href.includes(window.location.origin)) {
73 | const originalHref = linkElement.href.split('?')[0];
74 | linkElement.href = `${originalHref}?v=${timestamp}`;
75 | }
76 | });
77 | }
78 |
79 | // Function to initialize mobile menu
80 | function initMobileMenu() {
81 | const menuToggle = document.querySelector('.menu-toggle');
82 | const navLinks = document.querySelector('.nav-links');
83 |
84 | if (menuToggle && navLinks) {
85 | menuToggle.addEventListener('click', () => {
86 | navLinks.classList.toggle('active');
87 | menuToggle.classList.toggle('active');
88 |
89 | // Toggle body scroll when menu is open
90 | if (navLinks.classList.contains('active')) {
91 | document.body.style.overflow = 'hidden';
92 | } else {
93 | document.body.style.overflow = '';
94 | }
95 | });
96 |
97 | // Close menu when clicking outside
98 | document.addEventListener('click', (e) => {
99 | if (navLinks.classList.contains('active') &&
100 | !navLinks.contains(e.target) &&
101 | !menuToggle.contains(e.target)) {
102 | navLinks.classList.remove('active');
103 | menuToggle.classList.remove('active');
104 | document.body.style.overflow = '';
105 | }
106 | });
107 | }
108 | }
109 |
110 | // Function to add tooltips to certification logos
111 | function addCertTooltips() {
112 | document.querySelectorAll('.cert-item img').forEach(img => {
113 | const altText = img.getAttribute('alt');
114 | if (altText) {
115 | img.parentElement.setAttribute('data-tooltip', altText);
116 | }
117 | });
118 | }
119 |
120 | // Function to initialize project carousel
121 | function initProjectCarousel() {
122 | const projectCards = document.querySelectorAll('.project-card');
123 | const prevBtn = document.querySelector('.prev-btn');
124 | const nextBtn = document.querySelector('.next-btn');
125 | const dots = document.querySelectorAll('.dot');
126 | let currentIndex = 0;
127 |
128 | // Project expansion functionality
129 | document.querySelectorAll('.project-preview').forEach(preview => {
130 | preview.addEventListener('click', function() {
131 | const projectCard = this.closest('.project-card');
132 | const details = projectCard.querySelector('.project-details');
133 |
134 | if (details.style.display === 'block') {
135 | details.style.display = 'none';
136 | this.classList.remove('expanded');
137 | } else {
138 | details.style.display = 'block';
139 | this.classList.add('expanded');
140 | }
141 | });
142 | });
143 |
144 | document.querySelectorAll('.expand-btn').forEach(btn => {
145 | btn.addEventListener('click', function(e) {
146 | e.stopPropagation();
147 | const projectCard = this.closest('.project-card');
148 | const details = projectCard.querySelector('.project-details');
149 | const preview = projectCard.querySelector('.project-preview');
150 |
151 | details.style.display = 'block';
152 | preview.classList.add('expanded');
153 | });
154 | });
155 |
156 | document.querySelectorAll('.collapse-btn').forEach(btn => {
157 | btn.addEventListener('click', function() {
158 | const projectCard = this.closest('.project-card');
159 | const details = projectCard.querySelector('.project-details');
160 | const preview = projectCard.querySelector('.project-preview');
161 |
162 | details.style.display = 'none';
163 | preview.classList.remove('expanded');
164 | });
165 | });
166 |
167 | // Carousel navigation functionality
168 | function showProject(index) {
169 | projectCards.forEach((card, i) => {
170 | card.style.display = i === index ? 'block' : 'none';
171 | });
172 |
173 | dots.forEach((dot, i) => {
174 | dot.classList.toggle('active', i === index);
175 | });
176 |
177 | currentIndex = index;
178 | }
179 |
180 | if (prevBtn && nextBtn) {
181 | prevBtn.addEventListener('click', () => {
182 | currentIndex = (currentIndex - 1 + projectCards.length) % projectCards.length;
183 | showProject(currentIndex);
184 | });
185 |
186 | nextBtn.addEventListener('click', () => {
187 | currentIndex = (currentIndex + 1) % projectCards.length;
188 | showProject(currentIndex);
189 | });
190 | }
191 |
192 | dots.forEach((dot, i) => {
193 | dot.addEventListener('click', () => {
194 | showProject(i);
195 | });
196 | });
197 | }
198 |
199 | // Function to initialize smooth scrolling
200 | function initSmoothScrolling() {
201 | document.querySelectorAll('a[href^="#"]').forEach(anchor => {
202 | anchor.addEventListener('click', function(e) {
203 | e.preventDefault();
204 |
205 | const targetId = this.getAttribute('href');
206 | const targetElement = document.querySelector(targetId);
207 |
208 | if (targetElement) {
209 | const headerHeight = 65; // Height of the fixed header
210 | const elementPosition = targetElement.getBoundingClientRect().top;
211 | const offsetPosition = elementPosition + window.pageYOffset - headerHeight;
212 |
213 | window.scrollTo({
214 | top: offsetPosition,
215 | behavior: 'smooth'
216 | });
217 |
218 | // Close mobile menu after clicking a link
219 | const navLinks = document.querySelector('.nav-links');
220 | const menuToggle = document.querySelector('.menu-toggle');
221 |
222 | if (navLinks && navLinks.classList.contains('active')) {
223 | navLinks.classList.remove('active');
224 | if (menuToggle) menuToggle.classList.remove('active');
225 | document.body.style.overflow = '';
226 | }
227 | }
228 | });
229 | });
230 | }
231 |
232 | // Function to initialize fixed header effects
233 | function initFixedHeader() {
234 | window.addEventListener('scroll', function() {
235 | const header = document.querySelector('header');
236 | if (header) {
237 | if (window.scrollY > 50) {
238 | header.style.boxShadow = '0 5px 15px rgba(0, 0, 0, 0.5)';
239 | header.style.backgroundColor = 'rgba(17, 17, 17, 0.98)';
240 | } else {
241 | header.style.boxShadow = '0 2px 10px rgba(0, 0, 0, 0.4)';
242 | header.style.backgroundColor = 'rgba(17, 17, 17, 0.9)';
243 | }
244 | }
245 | });
246 | }
247 |
248 | // Function to initialize animations
249 | function initAnimations() {
250 | const observedElements = document.querySelectorAll('.project-card, .profile-link, .tech-tag, .featured-project-card, .github-stat-card');
251 |
252 | if ('IntersectionObserver' in window) {
253 | const observer = new IntersectionObserver((entries) => {
254 | entries.forEach(entry => {
255 | if (entry.isIntersecting) {
256 | entry.target.style.opacity = 1;
257 | entry.target.style.transform = entry.target.classList.contains('tech-tag') ?
258 | 'translateY(0)' : 'translateY(0)';
259 | // Stop observing after animation
260 | observer.unobserve(entry.target);
261 | }
262 | });
263 | }, { threshold: 0.1 });
264 |
265 | observedElements.forEach(element => {
266 | element.style.opacity = 0;
267 | element.style.transform = element.classList.contains('tech-tag') ?
268 | 'translateY(10px)' : 'translateY(20px)';
269 | element.style.transition = 'opacity 0.5s ease, transform 0.5s ease';
270 | observer.observe(element);
271 | });
272 | } else {
273 | // Fallback for browsers without IntersectionObserver
274 | observedElements.forEach(element => {
275 | element.style.opacity = 1;
276 | element.style.transform = 'translateY(0)';
277 | });
278 | }
279 | }
280 |
281 | // Function to initialize news ticker
282 | function initNewsTicker() {
283 | const tickerContent = document.querySelector('.news-ticker-content');
284 | if (!tickerContent) return;
285 |
286 | // Clone items for continuous scrolling
287 | const originalItems = Array.from(tickerContent.children);
288 | originalItems.forEach(item => {
289 | const clone = item.cloneNode(true);
290 | tickerContent.appendChild(clone);
291 | });
292 |
293 | // Set animation speed based on screen width and content length
294 | const totalWidth = tickerContent.scrollWidth;
295 | const isMobile = window.innerWidth <= 768;
296 |
297 | // Slower animation for mobile to ensure all items are visible
298 | const animationDuration = isMobile
299 | ? Math.max(25, totalWidth / 60) // Slower on mobile
300 | : Math.max(15, totalWidth / 120); // Faster on desktop
301 |
302 | tickerContent.style.animationDuration = `${animationDuration}s`;
303 |
304 | // Ensure ticker content has proper width and spacing
305 | if (isMobile) {
306 | // Add extra spacing on mobile between items
307 | const tickerItems = tickerContent.querySelectorAll('.ticker-item');
308 | tickerItems.forEach(item => {
309 | item.style.marginRight = '200px'; // More spacing on mobile
310 | item.style.paddingLeft = '15px';
311 | item.style.paddingRight = '15px';
312 | });
313 | }
314 |
315 | // Handle window resize events to adjust animation speed
316 | window.addEventListener('resize', () => {
317 | const newIsMobile = window.innerWidth <= 768;
318 | const newDuration = newIsMobile
319 | ? Math.max(25, tickerContent.scrollWidth / 60)
320 | : Math.max(15, tickerContent.scrollWidth / 120);
321 |
322 | tickerContent.style.animationDuration = `${newDuration}s`;
323 |
324 | // Update spacing on resize
325 | const tickerItems = tickerContent.querySelectorAll('.ticker-item');
326 | tickerItems.forEach(item => {
327 | item.style.marginRight = newIsMobile ? '200px' : '120px';
328 | item.style.paddingLeft = newIsMobile ? '15px' : '';
329 | item.style.paddingRight = newIsMobile ? '15px' : '';
330 | });
331 | });
332 |
333 | // --- ENHANCED INTERACTIVITY ---
334 | // Pause/resume on hover or focus
335 | function pauseTicker() {
336 | tickerContent.style.animationPlayState = 'paused';
337 | }
338 | function resumeTicker() {
339 | tickerContent.style.animationPlayState = 'running';
340 | }
341 | tickerContent.addEventListener('mouseenter', pauseTicker);
342 | tickerContent.addEventListener('mouseleave', resumeTicker);
343 | tickerContent.addEventListener('focusin', pauseTicker);
344 | tickerContent.addEventListener('focusout', resumeTicker);
345 |
346 | // Add tooltips to ticker items for clarity
347 | document.querySelectorAll('.ticker-item').forEach(item => {
348 | if (!item.title) {
349 | item.title = item.textContent.trim();
350 | }
351 | });
352 | }
353 |
354 | // Function to initialize events modal
355 | function initEventsModal() {
356 | const modal = document.getElementById('events-modal');
357 | const whatsNewLabel = document.getElementById('whats-new-label');
358 | const closeModal = document.querySelector('.close-modal');
359 |
360 | if (!modal || !whatsNewLabel || !closeModal) return;
361 |
362 | // Add data-label attributes to table cells for mobile view
363 | const tableCells = document.querySelectorAll('.events-table tbody td');
364 | const headerTexts = Array.from(document.querySelectorAll('.events-table th')).map(th => th.textContent);
365 |
366 | tableCells.forEach((cell, index) => {
367 | const headerIndex = index % headerTexts.length;
368 | cell.setAttribute('data-label', headerTexts[headerIndex]);
369 | });
370 |
371 | // Helper function to open modal
372 | const openModalFunction = (e) => {
373 | e.preventDefault();
374 | e.stopPropagation();
375 | modal.classList.add('show');
376 | document.body.style.overflow = 'hidden'; // Prevent scrolling
377 | console.log('Modal opened');
378 | };
379 |
380 | // Improved mobile touch handling
381 | let touchStarted = false;
382 |
383 | // Handle touch events for mobile
384 | whatsNewLabel.addEventListener('touchstart', (e) => {
385 | touchStarted = true;
386 | e.preventDefault();
387 | e.stopPropagation();
388 | }, {passive: false});
389 |
390 | whatsNewLabel.addEventListener('touchend', (e) => {
391 | if (touchStarted) {
392 | e.preventDefault();
393 | e.stopPropagation();
394 | openModalFunction(e);
395 | touchStarted = false;
396 | }
397 | }, {passive: false});
398 |
399 | // Handle click events for desktop (only if not a touch device or touch didn't occur)
400 | whatsNewLabel.addEventListener('click', (e) => {
401 | if (!touchStarted) {
402 | openModalFunction(e);
403 | }
404 | });
405 |
406 | // Make sure the entire label area is clickable - apply same logic to span
407 | const labelSpan = whatsNewLabel.querySelector('span');
408 | if (labelSpan) {
409 | labelSpan.addEventListener('touchstart', (e) => {
410 | touchStarted = true;
411 | e.preventDefault();
412 | e.stopPropagation();
413 | }, {passive: false});
414 |
415 | labelSpan.addEventListener('touchend', (e) => {
416 | if (touchStarted) {
417 | e.preventDefault();
418 | e.stopPropagation();
419 | openModalFunction(e);
420 | touchStarted = false;
421 | }
422 | }, {passive: false});
423 |
424 | labelSpan.addEventListener('click', (e) => {
425 | if (!touchStarted) {
426 | openModalFunction(e);
427 | }
428 | });
429 | }
430 |
431 | // Close modal when clicking on X button
432 | closeModal.addEventListener('click', () => {
433 | modal.classList.remove('show');
434 | document.body.style.overflow = ''; // Restore scrolling
435 | console.log('Modal closed via X button');
436 | });
437 | // Keyboard accessibility for close button
438 | closeModal.addEventListener('keydown', (e) => {
439 | if (e.key === 'Enter' || e.key === ' ') {
440 | modal.classList.remove('show');
441 | document.body.style.overflow = '';
442 | e.preventDefault();
443 | }
444 | });
445 |
446 | // Close modal when clicking outside the modal content
447 | modal.addEventListener('click', (e) => {
448 | if (e.target === modal) {
449 | modal.classList.remove('show');
450 | document.body.style.overflow = ''; // Restore scrolling
451 | console.log('Modal closed via outside click');
452 | }
453 | });
454 |
455 | // Close modal on Escape key
456 | document.addEventListener('keydown', (e) => {
457 | if (e.key === 'Escape' && modal.classList.contains('show')) {
458 | modal.classList.remove('show');
459 | document.body.style.overflow = ''; // Restore scrolling
460 | console.log('Modal closed via Escape key');
461 | }
462 | });
463 | }
464 |
465 |
466 | // Format a date string
467 | function formatDate(dateString) {
468 | const date = new Date(dateString);
469 | return date.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });
470 | }
471 |
472 | // Handle user input
473 | function sanitizeInput(input) {
474 | return input.trim();
475 | }
476 |
477 | // Simple HTML sanitizing function
478 | function sanitizeHTML(html) {
479 | return html;
480 | }
481 |
482 | // Function to fetch GitHub data (avatar only)
483 | async function fetchGitHubData() {
484 | const username = 'ashutosh-engineer';
485 |
486 | try {
487 | // Fetch user profile information
488 | const profileResponse = await fetch(`https://api.github.com/users/${username}`);
489 |
490 | if (!profileResponse.ok) {
491 | throw new Error(`HTTP error! Status: ${profileResponse.status}`);
492 | }
493 |
494 | const profileData = await profileResponse.json();
495 |
496 | // Update hero image with GitHub avatar
497 | const profileImgPlaceholder = document.querySelector('.profile-img-placeholder');
498 | if (profileImgPlaceholder && profileData.avatar_url) {
499 | // Create image element
500 | const img = document.createElement('img');
501 | img.src = profileData.avatar_url;
502 | img.alt = 'Ashutosh Singh Profile Image';
503 | img.className = 'profile-img';
504 |
505 | // Add error handler for image loading failures
506 | img.onerror = function() {
507 | this.onerror = null;
508 | this.src = 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"%3E%3Ccircle cx="12" cy="12" r="12" fill="%23333"/%3E%3Cpath d="M7 15v2h10v-2H7zm2-8h6v2H9V7z" fill="%23FFF"/%3E%3C/svg%3E';
509 | };
510 |
511 | // Clear placeholder and add image
512 | profileImgPlaceholder.innerHTML = '';
513 | profileImgPlaceholder.appendChild(img);
514 | }
515 | } catch (error) {
516 | console.error('Error fetching GitHub data:', error);
517 |
518 | // Provide fallback for profile image on error
519 | const profileImgPlaceholder = document.querySelector('.profile-img-placeholder');
520 | if (profileImgPlaceholder) {
521 | profileImgPlaceholder.innerHTML = ' ';
522 | }
523 | }
524 | }
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Ashutosh Singh | Software Engineer
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
65 |
66 |
67 |
70 |
71 |
72 |
88 |
89 |
90 |
91 |
92 |
93 |
Ashutosh Singh
94 |
95 |
98 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
Hello, I'm Ashutosh Singh
115 |
Aspiring Software Engineer
116 |
Java DSA • MERN Stack • AI • B.Tech @ Parul University
117 |
118 |
122 |
123 |
128 |
129 |
134 |
135 |
136 |
137 |
138 |
139 | What's New
140 |
141 |
142 |
143 |
144 |
145 |
146 | Ranked #13634 in Codeforces Round 1042 (Div. 3): View Contest History
147 | Aug 2025
148 |
149 |
150 |
151 |
152 | Ranked Top 500 Globally in LeetCode Biweekly Contest 161: View Profile
153 | Aug 2024
154 |
155 |
156 |
157 |
158 | Solved #506 (Gap Analysis & Matching Optimization) in OWASP OpenCRE: PR #617
159 | Jul 24, 2024
160 |
161 |
162 |
163 |
164 | Solved #585 (Automatic Mapping of Standards to CREs) in OWASP OpenCRE: PR #618
165 | Jul 24, 2024
166 |
167 |
168 |
169 |
170 | Solved #614 in OWASP OpenCRE: View Pull Request
171 | Jul 23, 2024
172 |
173 |
174 |
175 |
176 |
177 |
178 |
247 |
248 |
249 | About Me
250 |
251 |
252 |
Aspiring Software Engineer with a strong foundation in Data Structures & Algorithms (Java) and full-stack development (MERN). Currently on a focused 2-year roadmap targeting scalable system design, AI integration, and development excellence.
253 |
254 |
Previously contributed at NMS Software and Innovation India Pvt Ltd, where I worked on AI-driven, high-performance solutions involving scalable architecture and modern system design strategies.
255 |
256 |
Collaborated with iNeuron.ai on a climate change analysis project leveraging ML/DL techniques for actionable insights. Pursuing a Diploma in Information Technology at Parul University with active interests in backend engineering (Node.js), containerization (Docker), and zero-to-one product building.
257 |
258 |
Actively preparing for high-impact engineering roles with a strong focus on open-source contribution, Google Summer of Code (GSoC), and startup-driven innovation. My long-term vision includes solving large-scale problems at companies like Google, Meta, and other product-first tech giants, through a blend of algorithmic depth, system design expertise, and end-to-end ownership.
259 |
260 |
My technical skills include:
261 |
262 | Java
263 | DSA
264 | JavaScript
265 | React
266 | Node.js
267 | MongoDB
268 | Express
269 | ML
270 | Docker
271 | System Design
272 |
273 |
274 |
275 |
276 |
277 |
278 | Education
279 |
280 |
281 |
282 |
283 |
284 |
285 |
289 |
290 |
Parul University
291 |
292 |
Computer Science and Engineering
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
306 |
307 |
Parul University
308 |
309 |
310 | CGPA
311 | 9.6
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 | Course Work
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
366 |
367 |
368 |
369 | Hackathons and Acheivements
370 |
371 |
372 |
373 |
374 |
Signify – Empowering the Deaf
375 |
🏆 PUCode Hackathon Winner
376 |
377 |
378 |
379 |
Signify – Empowering the Deaf: Bridging Communication Gaps through Innovation
380 |
🏆 PUCode Hackathon Winner @ Parul University
381 |
382 | A sign language translator using AI that converts text to sign grammar visuals, making communication simpler for the deaf community. Built entirely from scratch, our project integrates hand gestures, facial expressions, and context for a seamless experience.
383 |
384 |
385 | AI
386 | Machine Learning
387 | Computer Vision
388 | Accessibility
389 |
390 |
393 |
394 |
395 |
396 |
397 |
398 |
399 |
400 |
Agrivistar
401 |
🥇 Vadodara Hackathon 5.0 by Parul University
402 |
403 |
404 |
405 |
Agrivistar: Mobile App for Farmers
406 |
🥇 Vadodara Hackathon 5.0 by Parul University
407 |
408 | Developed a SaaS-level mobile application for farmers to facilitate buying and selling agricultural products. Contributed to the Python backend implementation, creating APIs and database models to support the marketplace functionality and user management system.
409 |
410 |
411 | Python
412 | Backend
413 | SaaS
414 | API Development
415 | MongoDB
416 |
417 |
420 |
421 |
422 |
423 |
424 |
425 |
426 |
427 |
428 |
429 |
430 |
431 |
432 |
433 |
434 |
435 |
436 |
437 |
438 | Internships & Contributions
439 |
440 |
441 |
442 |
443 |
444 |
445 |
446 |
Open Source Contributor Open Source Contribution
447 |
GirlScript Summer of Code
448 |
449 | Participated in India's largest beginner-friendly open source program. Contributed to multiple open source projects, collaborated with developers worldwide, and enhanced coding skills through real-world project contributions. GSSoC is a 3-month long program that helps beginners get started with Open Source Development.
450 |
451 |
452 | Open Source
453 | Git
454 | GitHub
455 | Collaboration
456 | Code Review
457 | Documentation
458 |
459 |
462 |
463 |
464 |
465 |
466 |
467 |
468 |
469 |
470 |
471 |
Software Engineer Internship
472 |
NMS Softwares and Innovation India Pvt Ltd
473 |
474 | Contributed to ML-driven, high-performance solutions involving scalable architecture and modern system design strategies. Worked with cutting-edge technologies to develop robust and efficient software solutions.
475 |
476 |
477 | Java
478 | ML
479 | MERN Stack
480 | System Design
481 | Scalable Architecture
482 |
483 |
487 |
488 |
489 |
490 |
491 |
492 |
493 |
494 |
495 |
496 |
Machine Learning Engineer Project-based Internship
497 |
iNeuron.ai
498 |
499 | Project: Analysis and Prediction of Climate Change in the United States of America. Implemented machine learning and deep learning techniques to analyze climate data patterns and develop predictive models for temperature trends and climate change impacts.
500 |
501 |
502 | Python
503 | Machine Learning
504 | Deep Learning
505 | Data Analysis
506 | Time Series
507 |
508 |
511 |
512 |
513 |
514 |
515 |
516 |
517 | GitHub Stats
518 |
519 |
520 |
521 |
522 |
523 |
524 |
525 |
526 |
527 | Coding Profiles
528 |
542 |
543 |
544 |
545 |
546 |
--------------------------------------------------------------------------------
/styles.css:
--------------------------------------------------------------------------------
1 | /* Global Styles */
2 | * {
3 | margin: 0;
4 | padding: 0;
5 | box-sizing: border-box;
6 | }
7 |
8 | :root {
9 | /* Dark theme variables (now default) */
10 | --primary-color: #6d8eff;
11 | --secondary-color: #3d4b75;
12 | --accent-color: #ff7a7a;
13 | --bg-color: #121212;
14 | --card-bg: #1e1e1e;
15 | --text-color: #ffffff;
16 | --text-secondary: #b0b0b0;
17 | --light-gray: #333;
18 | --dark-gray: #999;
19 | --border-color: #444;
20 | --shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
21 |
22 | /* Progress bar colors */
23 | --easy-color: #43a047;
24 | --medium-color: #fb8c00;
25 | --hard-color: #e91e63;
26 | }
27 |
28 | html {
29 | scroll-behavior: smooth;
30 | }
31 |
32 | body {
33 | font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
34 | line-height: 1.6;
35 | color: var(--text-color);
36 | background-color: var(--bg-color);
37 | }
38 |
39 | a {
40 | text-decoration: none;
41 | color: var(--primary-color);
42 | transition: color 0.3s ease;
43 | }
44 |
45 | .btn {
46 | display: inline-block;
47 | padding: 0.8rem 1.5rem;
48 | background-color: var(--primary-color);
49 | color: white;
50 | border-radius: 4px;
51 | transition: all 0.3s ease;
52 | border: none;
53 | cursor: pointer;
54 | font-size: 1rem;
55 | text-align: center;
56 | font-weight: 500;
57 | letter-spacing: 0.5px;
58 | }
59 |
60 | .btn:hover {
61 | background-color: var(--secondary-color);
62 | transform: translateY(-2px);
63 | box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
64 | }
65 |
66 | .btn-outline {
67 | background-color: transparent;
68 | border: 2px solid var(--primary-color);
69 | color: var(--primary-color);
70 | }
71 |
72 | .btn-outline:hover {
73 | background-color: var(--primary-color);
74 | color: white;
75 | }
76 |
77 | .section-title {
78 | text-align: center;
79 | font-size: 2.5rem;
80 | margin-bottom: 0.5rem;
81 | position: relative;
82 | color: var(--text-color);
83 | }
84 |
85 | .section-title::after {
86 | content: '';
87 | position: absolute;
88 | bottom: -10px;
89 | left: 50%;
90 | transform: translateX(-50%);
91 | width: 80px;
92 | height: 4px;
93 | background-color: var(--accent-color);
94 | }
95 |
96 | .section-description {
97 | text-align: center;
98 | color: var(--text-secondary);
99 | margin-bottom: 2rem;
100 | max-width: 800px;
101 | margin-left: auto;
102 | margin-right: auto;
103 | padding: 0 1rem;
104 | }
105 |
106 | /* Header & Navigation */
107 | header {
108 | background-color: rgba(17, 17, 17, 0.9);
109 | box-shadow: 0 2px 10px rgba(0, 0, 0, 0.4);
110 | position: fixed;
111 | width: 100%;
112 | top: 0;
113 | z-index: 100;
114 | transition: all 0.3s ease;
115 | }
116 |
117 | nav {
118 | display: flex;
119 | justify-content: space-between;
120 | align-items: center;
121 | padding: 0.7rem 4%;
122 | max-width: 1600px;
123 | margin: 0 auto;
124 | height: 65px;
125 | }
126 |
127 | .logo h1 {
128 | font-size: 1.5rem;
129 | color: var(--primary-color);
130 | font-weight: 600;
131 | letter-spacing: 0.5px;
132 | }
133 |
134 | .menu-toggle {
135 | display: none;
136 | font-size: 1.5rem;
137 | cursor: pointer;
138 | color: var(--text-color);
139 | width: 40px;
140 | height: 40px;
141 | border-radius: 50%;
142 | display: none;
143 | align-items: center;
144 | justify-content: center;
145 | transition: all 0.3s ease;
146 | z-index: 110;
147 | }
148 |
149 | .menu-toggle:hover {
150 | background-color: rgba(255, 255, 255, 0.1);
151 | color: var(--primary-color);
152 | }
153 |
154 | .nav-links {
155 | display: flex;
156 | list-style: none;
157 | }
158 |
159 | .nav-links li {
160 | margin-left: 2rem;
161 | }
162 |
163 | .nav-links a {
164 | color: var(--text-color);
165 | font-weight: 500;
166 | font-size: 0.95rem;
167 | transition: color 0.3s ease;
168 | position: relative;
169 | }
170 |
171 | .nav-links a:after {
172 | content: '';
173 | position: absolute;
174 | width: 0;
175 | height: 2px;
176 | bottom: -5px;
177 | left: 0;
178 | background-color: var(--primary-color);
179 | transition: width 0.3s ease;
180 | }
181 |
182 | .nav-links a:hover {
183 | color: var(--primary-color);
184 | }
185 |
186 | .nav-links a:hover:after {
187 | width: 100%;
188 | }
189 |
190 | /* Add a down arrow indicating to scroll down at the bottom of the hero section */
191 | .scroll-indicator {
192 | position: absolute;
193 | bottom: 30px;
194 | left: 50%;
195 | transform: translateX(-50%);
196 | text-align: center;
197 | animation: bounce 2s infinite;
198 | cursor: pointer;
199 | }
200 |
201 | .scroll-indicator i {
202 | font-size: 1.8rem;
203 | color: var(--text-color);
204 | }
205 |
206 | @keyframes bounce {
207 | 0%, 20%, 50%, 80%, 100% {
208 | transform: translateY(0) translateX(-50%);
209 | }
210 | 40% {
211 | transform: translateY(-15px) translateX(-50%);
212 | }
213 | 60% {
214 | transform: translateY(-7px) translateX(-50%);
215 | }
216 | }
217 |
218 | /* Hero Section */
219 | .hero {
220 | min-height: 100vh;
221 | width: 100%;
222 | display: flex;
223 | align-items: center;
224 | justify-content: center;
225 | padding: 0;
226 | margin-top: 0;
227 | background: linear-gradient(rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7)), url('https://images.unsplash.com/photo-1549692520-acc6669e2f0c?q=80&w=1974&auto=format&fit=crop') no-repeat center center/cover;
228 | color: white;
229 | position: relative;
230 | }
231 |
232 | .hero-content {
233 | max-width: 1400px;
234 | width: 100%;
235 | display: grid;
236 | grid-template-columns: 3fr 2fr;
237 | gap: 3rem;
238 | align-items: center;
239 | padding: 0 4%;
240 | margin-top: 65px; /* Adjust for fixed header */
241 | }
242 |
243 | .hero-text {
244 | text-align: left;
245 | }
246 |
247 | .hero h1 {
248 | font-size: 3.8rem;
249 | margin-bottom: 1rem;
250 | line-height: 1.2;
251 | }
252 |
253 | .hero h2 {
254 | font-size: 2.2rem;
255 | margin-bottom: 1.5rem;
256 | font-weight: 400;
257 | }
258 |
259 | .hero p {
260 | font-size: 1.3rem;
261 | margin-bottom: 2rem;
262 | }
263 |
264 | /* News Ticker */
265 | .news-ticker-container {
266 | width: 100%;
267 | background-color: rgba(25, 25, 35, 0.95);
268 | display: flex;
269 | position: relative;
270 | border-top: 1px solid rgba(255, 255, 255, 0.05);
271 | border-bottom: 1px solid rgba(255, 255, 255, 0.05);
272 | z-index: 10;
273 | box-shadow: 0 5px 20px rgba(0, 0, 0, 0.2);
274 | overflow: hidden;
275 | }
276 |
277 | .news-ticker-label {
278 | min-width: 140px;
279 | padding: 12px 20px;
280 | background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
281 | display: flex;
282 | align-items: center;
283 | justify-content: center;
284 | font-weight: 600;
285 | font-size: 0.9rem;
286 | text-transform: uppercase;
287 | letter-spacing: 1px;
288 | color: white;
289 | position: relative;
290 | box-shadow: 5px 0 15px rgba(0, 0, 0, 0.2);
291 | z-index: 2;
292 | cursor: pointer;
293 | transition: all 0.3s ease;
294 | }
295 |
296 | .news-ticker-label:hover {
297 | background: linear-gradient(135deg, var(--secondary-color), var(--primary-color));
298 | transform: translateY(-2px);
299 | }
300 |
301 | .news-ticker-label::after {
302 | content: '';
303 | position: absolute;
304 | right: -15px;
305 | top: 0;
306 | border-top: 20px solid transparent;
307 | border-bottom: 20px solid transparent;
308 | border-left: 15px solid var(--secondary-color);
309 | z-index: 2;
310 | }
311 |
312 | .news-ticker {
313 | flex: 1;
314 | overflow: hidden;
315 | padding: 12px 0;
316 | position: relative;
317 | }
318 |
319 | .news-ticker::before {
320 | content: '';
321 | position: absolute;
322 | top: 0;
323 | left: 0;
324 | width: 50px;
325 | height: 100%;
326 | background: linear-gradient(to right, rgba(25, 25, 35, 0.95), transparent);
327 | z-index: 1;
328 | }
329 |
330 | .news-ticker::after {
331 | content: '';
332 | position: absolute;
333 | top: 0;
334 | right: 0;
335 | width: 50px;
336 | height: 100%;
337 | background: linear-gradient(to left, rgba(25, 25, 35, 0.95), transparent);
338 | z-index: 1;
339 | }
340 |
341 | .news-ticker-content {
342 | display: flex;
343 | animation: marquee 20s linear infinite;
344 | white-space: nowrap;
345 | padding-right: 50px;
346 | }
347 |
348 | .ticker-item {
349 | display: inline-flex;
350 | align-items: center;
351 | margin-right: 120px;
352 | color: var(--text-color);
353 | font-size: 1rem;
354 | padding: 0 10px;
355 | }
356 |
357 | .ticker-item i {
358 | margin-right: 10px;
359 | color: var(--accent-color);
360 | }
361 |
362 | .ticker-item a {
363 | color: var(--primary-color);
364 | text-decoration: none;
365 | transition: color 0.2s ease, text-decoration 0.2s ease;
366 | margin: 0 5px;
367 | }
368 |
369 | .ticker-item a:hover {
370 | color: var(--accent-color);
371 | text-decoration: underline;
372 | }
373 |
374 | .ticker-date {
375 | display: inline-block;
376 | margin-left: 10px;
377 | font-size: 0.8rem;
378 | background-color: rgba(255, 255, 255, 0.05);
379 | padding: 2px 8px;
380 | border-radius: 10px;
381 | color: var(--text-secondary);
382 | font-weight: 500;
383 | }
384 |
385 | @keyframes marquee {
386 | 0% {
387 | transform: translateX(100%);
388 | }
389 | 100% {
390 | transform: translateX(-100%);
391 | }
392 | }
393 |
394 | .news-ticker:hover .news-ticker-content {
395 | animation-play-state: paused;
396 | }
397 |
398 | @media (max-width: 768px) {
399 | .news-ticker-label {
400 | min-width: 120px;
401 | font-size: 0.8rem;
402 | padding: 12px 15px;
403 | }
404 |
405 | .ticker-item {
406 | font-size: 0.9rem;
407 | }
408 | }
409 |
410 | @media (max-width: 480px) {
411 | .news-ticker-container {
412 | flex-direction: column;
413 | height: auto;
414 | overflow: visible;
415 | }
416 |
417 | .news-ticker-label {
418 | width: 100%;
419 | padding: 12px 15px;
420 | position: relative;
421 | z-index: 20;
422 | border-radius: 0;
423 | display: flex;
424 | background: linear-gradient(135deg, var(--accent-color), var(--primary-color));
425 | box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
426 | font-weight: bold;
427 | }
428 |
429 | .news-ticker-label::after {
430 | display: none;
431 | }
432 |
433 | /* Add an explicit tap/click indicator for mobile */
434 | .news-ticker-label::before {
435 | content: '\f0a9'; /* Font Awesome arrow icon */
436 | font-family: 'Font Awesome 5 Free';
437 | font-weight: 900;
438 | margin-right: 8px;
439 | font-size: 0.9rem;
440 | }
441 |
442 | .news-ticker-label span {
443 | display: flex;
444 | align-items: center;
445 | justify-content: center;
446 | width: 100%;
447 | }
448 |
449 | .news-ticker {
450 | padding: 8px 10px;
451 | width: 100%;
452 | height: auto;
453 | max-height: 100px;
454 | overflow: hidden;
455 | }
456 |
457 | .news-ticker-content {
458 | animation: marquee-mobile-compact 25s linear infinite;
459 | padding-right: 20px;
460 | white-space: nowrap;
461 | }
462 |
463 | @keyframes marquee-mobile-compact {
464 | 0% {
465 | transform: translateX(100%);
466 | }
467 | 100% {
468 | transform: translateX(-200%);
469 | }
470 | }
471 |
472 | .ticker-item {
473 | font-size: 0.8rem;
474 | margin-right: 40px;
475 | white-space: nowrap;
476 | display: inline-flex;
477 | align-items: center;
478 | line-height: 1.3;
479 | flex-shrink: 0;
480 | max-width: none;
481 | }
482 |
483 | /* Compact mobile news layout */
484 | .ticker-item .news-logo {
485 | width: 16px;
486 | height: 16px;
487 | margin-right: 6px;
488 | }
489 |
490 | .ticker-item i:not(.fa-bell) {
491 | font-size: 0.8rem;
492 | margin-right: 6px;
493 | }
494 |
495 | .ticker-date {
496 | font-size: 0.7rem;
497 | padding: 1px 6px;
498 | margin-left: 6px;
499 | }
500 | }
501 |
502 | @media (max-width: 992px) {
503 | .hero-content {
504 | grid-template-columns: 1fr;
505 | text-align: center;
506 | }
507 |
508 | .hero-text {
509 | text-align: center;
510 | }
511 |
512 | .hero-buttons {
513 | justify-content: center;
514 | }
515 | }
516 |
517 | .hero-buttons {
518 | display: flex;
519 | gap: 1rem;
520 | }
521 |
522 | .highlight {
523 | color: var(--accent-color);
524 | }
525 |
526 | .hero-image {
527 | display: flex;
528 | justify-content: center;
529 | align-items: center;
530 | }
531 |
532 | .profile-img-placeholder {
533 | width: 280px;
534 | height: 280px;
535 | border-radius: 50%;
536 | background-color: rgba(255, 255, 255, 0.1);
537 | display: flex;
538 | align-items: center;
539 | justify-content: center;
540 | border: 4px solid var(--accent-color);
541 | box-shadow: 0 0 20px rgba(0, 0, 0, 0.3);
542 | overflow: hidden;
543 | }
544 |
545 | .profile-img-placeholder i {
546 | font-size: 8rem;
547 | color: rgba(255, 255, 255, 0.8);
548 | }
549 |
550 | .profile-img-placeholder img {
551 | width: 100%;
552 | height: 100%;
553 | object-fit: cover;
554 | }
555 |
556 | /* About section */
557 | .about {
558 | padding: 5rem 1rem;
559 | padding-top: 120px; /* Extra padding for fixed header */
560 | background-color: var(--bg-color);
561 | position: relative;
562 | }
563 |
564 | .about-content {
565 | max-width: 900px;
566 | margin: 3rem auto 0;
567 | }
568 |
569 | .about-text p {
570 | margin-bottom: 1.5rem;
571 | font-size: 1.1rem;
572 | color: var(--text-color);
573 | }
574 |
575 | .tech-stack {
576 | display: flex;
577 | flex-wrap: wrap;
578 | gap: 0.8rem;
579 | margin: 1.5rem 0;
580 | }
581 |
582 | .tech-tag {
583 | background-color: var(--light-gray);
584 | color: var(--text-color);
585 | padding: 0.5rem 1rem;
586 | border-radius: 30px;
587 | font-size: 0.9rem;
588 | transition: all 0.3s ease;
589 | }
590 |
591 | .tech-tag:hover {
592 | background-color: var(--primary-color);
593 | color: white;
594 | transform: translateY(-3px);
595 | }
596 |
597 | /* Education section */
598 | .education {
599 | padding: 5rem 1rem;
600 | padding-top: 120px; /* Extra padding for fixed header */
601 | background-color: var(--bg-color);
602 | position: relative;
603 | }
604 |
605 | .education-container {
606 | max-width: 900px;
607 | margin: 3rem auto 0;
608 | display: flex;
609 | flex-direction: column;
610 | gap: 2.5rem;
611 | }
612 |
613 | .education-card {
614 | display: flex;
615 | background: linear-gradient(145deg, rgba(30, 30, 30, 0.6), rgba(20, 20, 20, 0.8));
616 | border-radius: 12px;
617 | overflow: hidden;
618 | box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
619 | transition: all 0.3s ease;
620 | position: relative;
621 | border: 1px solid rgba(255, 255, 255, 0.05);
622 | }
623 |
624 | .education-card:hover {
625 | transform: translateY(-8px);
626 | box-shadow: 0 15px 40px rgba(109, 142, 255, 0.1);
627 | border-color: rgba(109, 142, 255, 0.2);
628 | }
629 |
630 | .education-card::before {
631 | content: '';
632 | position: absolute;
633 | left: 0;
634 | top: 0;
635 | height: 100%;
636 | width: 3px;
637 | background: linear-gradient(to bottom, var(--primary-color), var(--accent-color));
638 | }
639 |
640 | .education-logo {
641 | flex: 0 0 160px;
642 | display: flex;
643 | align-items: center;
644 | justify-content: center;
645 | padding: 1.5rem;
646 | background-color: white;
647 | border-right: 1px solid rgba(255, 255, 255, 0.05);
648 | }
649 |
650 | .education-logo img {
651 | max-width: 120px;
652 | height: auto;
653 | transition: transform 0.3s ease;
654 | filter: drop-shadow(0 4px 6px rgba(0, 0, 0, 0.1));
655 | }
656 |
657 | .education-card:hover .education-logo img {
658 | transform: scale(1.05);
659 | }
660 |
661 | .education-details {
662 | flex: 1;
663 | padding: 2rem;
664 | position: relative;
665 | }
666 |
667 | .education-header {
668 | display: flex;
669 | justify-content: space-between;
670 | align-items: center;
671 | flex-wrap: wrap;
672 | margin-bottom: 1rem;
673 | }
674 |
675 | .education-header h3 {
676 | font-size: 1.6rem;
677 | font-weight: 600;
678 | color: var(--text-color);
679 | margin: 0;
680 | padding: 0;
681 | }
682 |
683 | .education-year {
684 | color: var(--primary-color);
685 | font-size: 1.1rem;
686 | font-weight: 500;
687 | background-color: rgba(109, 142, 255, 0.1);
688 | padding: 0.3rem 1rem;
689 | border-radius: 20px;
690 | margin-left: 1rem;
691 | }
692 |
693 | .education-divider {
694 | width: 100%;
695 | height: 1px;
696 | background: linear-gradient(to right, var(--primary-color), transparent);
697 | margin: 1rem 0;
698 | }
699 |
700 | .education-institution {
701 | font-size: 1.2rem;
702 | color: var(--text-secondary);
703 | margin-bottom: 1.2rem;
704 | font-weight: 500;
705 | letter-spacing: 0.5px;
706 | }
707 |
708 | .education-content {
709 | margin-top: 1.5rem;
710 | color: var(--text-secondary);
711 | font-size: 1.1rem;
712 | }
713 |
714 | .education-achievement {
715 | display: inline-block;
716 | background-color: rgba(255, 255, 255, 0.05);
717 | padding: 0.8rem 1.5rem;
718 | border-radius: 8px;
719 | margin-top: 0.5rem;
720 | display: flex;
721 | align-items: center;
722 | gap: 1rem;
723 | border-left: 3px solid var(--accent-color);
724 | }
725 |
726 | .achievement-label {
727 | font-weight: 600;
728 | color: var(--text-secondary);
729 | }
730 |
731 | .achievement-value {
732 | font-size: 1.3rem;
733 | font-weight: 700;
734 | color: var(--accent-color);
735 | }
736 |
737 | @media (max-width: 768px) {
738 | .education-card {
739 | flex-direction: column;
740 | }
741 |
742 | .education-card::before {
743 | width: 100%;
744 | height: 3px;
745 | top: 0;
746 | left: 0;
747 | background: linear-gradient(to right, var(--primary-color), var(--accent-color));
748 | }
749 |
750 | .education-logo {
751 | padding: 1.5rem;
752 | border-right: none;
753 | border-bottom: 1px solid rgba(255, 255, 255, 0.05);
754 | flex: unset;
755 | width: 100%;
756 | }
757 |
758 | .education-header {
759 | flex-direction: column;
760 | align-items: flex-start;
761 | }
762 |
763 | .education-year {
764 | margin-left: 0;
765 | margin-top: 0.5rem;
766 | }
767 | }
768 |
769 | @media (max-width: 480px) {
770 | .education-details {
771 | padding: 1.5rem;
772 | }
773 |
774 | .education-header h3 {
775 | font-size: 1.3rem;
776 | }
777 |
778 | .education-logo img {
779 | max-width: 100px;
780 | }
781 | }
782 |
783 | /* Course Work section */
784 | .course-work {
785 | padding: 2.5rem 1rem;
786 | padding-top: 100px; /* Reduced padding for fixed header */
787 | background-color: var(--bg-color); /* Single color background */
788 | position: relative;
789 | }
790 |
791 | .course-work-content {
792 | max-width: 800px;
793 | margin: 1.5rem auto 0;
794 | }
795 |
796 | .tech-certifications {
797 | display: grid;
798 | grid-template-columns: repeat(4, 1fr);
799 | gap: 2.5rem;
800 | justify-content: center;
801 | align-items: center;
802 | max-width: 600px;
803 | margin: 0 auto;
804 | position: relative;
805 | padding: 1.5rem 0;
806 | }
807 |
808 | /* Offset every other row to create diamond pattern */
809 | .tech-certifications .cert-item:nth-child(4n-2),
810 | .tech-certifications .cert-item:nth-child(4n-1) {
811 | transform: translateY(1.5rem);
812 | }
813 |
814 | .cert-item {
815 | text-align: center;
816 | transition: all 0.3s ease;
817 | position: relative;
818 | perspective: 1000px;
819 | }
820 |
821 | .cert-item:hover {
822 | transform: translateY(-10px) scale(1.1);
823 | z-index: 5;
824 | }
825 |
826 | /* Reset the hover for the offset items to maintain diamond pattern */
827 | .tech-certifications .cert-item:nth-child(4n-2):hover,
828 | .tech-certifications .cert-item:nth-child(4n-1):hover {
829 | transform: translateY(-10px) scale(1.1);
830 | }
831 |
832 | .cert-logo {
833 | width: 60px;
834 | height: 60px;
835 | filter: grayscale(20%); /* Consistent styling */
836 | opacity: 0.9;
837 | transition: all 0.3s ease;
838 | background-color: rgba(255, 255, 255, 0.05);
839 | border-radius: 12px;
840 | padding: 10px;
841 | box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
842 | transform-style: preserve-3d;
843 | }
844 |
845 | .cert-item:hover .cert-logo {
846 | filter: grayscale(0%);
847 | opacity: 1;
848 | box-shadow: 0 8px 16px rgba(109, 142, 255, 0.2);
849 | background-color: rgba(255, 255, 255, 0.08);
850 | transform: translateZ(20px) rotateY(10deg);
851 | }
852 |
853 | .cert-item::before {
854 | content: '';
855 | position: absolute;
856 | width: 100%;
857 | height: 100%;
858 | background: radial-gradient(circle at center, rgba(109, 142, 255, 0.1), transparent 70%);
859 | top: 0;
860 | left: 0;
861 | opacity: 0;
862 | transition: opacity 0.3s ease;
863 | border-radius: 12px;
864 | pointer-events: none;
865 | z-index: -1;
866 | }
867 |
868 | .cert-item:hover::before {
869 | opacity: 1;
870 | }
871 |
872 | .cert-item:hover::after {
873 | content: attr(data-tooltip);
874 | position: absolute;
875 | top: -40px;
876 | left: 50%;
877 | transform: translateX(-50%);
878 | background-color: var(--primary-color);
879 | color: white;
880 | padding: 6px 12px;
881 | border-radius: 4px;
882 | font-size: 0.8rem;
883 | white-space: nowrap;
884 | opacity: 0;
885 | animation: fadeIn 0.3s forwards;
886 | z-index: 10;
887 | box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
888 | }
889 |
890 | @keyframes fadeIn {
891 | to {
892 | opacity: 1;
893 | }
894 | }
895 |
896 | /* Enable title tooltip on hover via JavaScript for better UX */
897 | .cert-item img {
898 | cursor: pointer;
899 | }
900 |
901 | @media (max-width: 768px) {
902 | .tech-certifications {
903 | grid-template-columns: repeat(3, 1fr);
904 | gap: 2rem;
905 | }
906 |
907 | /* Reset diamond pattern on tablets */
908 | .tech-certifications .cert-item:nth-child(4n-2),
909 | .tech-certifications .cert-item:nth-child(4n-1) {
910 | transform: translateY(0);
911 | }
912 |
913 | /* Create new diamond pattern for 3 column layout */
914 | .tech-certifications .cert-item:nth-child(3n-1) {
915 | transform: translateY(1.5rem);
916 | }
917 |
918 | .tech-certifications .cert-item:nth-child(3n-1):hover {
919 | transform: translateY(-10px) scale(1.1);
920 | }
921 | }
922 |
923 | @media (max-width: 576px) {
924 | .course-work {
925 | padding: 2rem 0.5rem;
926 | }
927 |
928 | .tech-certifications {
929 | grid-template-columns: repeat(2, 1fr);
930 | gap: 1.5rem;
931 | }
932 |
933 | /* Reset all offset patterns */
934 | .tech-certifications .cert-item:nth-child(4n-2),
935 | .tech-certifications .cert-item:nth-child(4n-1),
936 | .tech-certifications .cert-item:nth-child(3n-1) {
937 | transform: translateY(0);
938 | }
939 |
940 | .cert-logo {
941 | width: 50px;
942 | height: 50px;
943 | padding: 8px;
944 | }
945 |
946 | .section-title {
947 | margin-bottom: 0.3rem;
948 | }
949 | }
950 |
951 | /* Projects section */
952 | .projects {
953 | padding: 5rem 1rem;
954 | padding-top: 120px; /* Extra padding for fixed header */
955 | background-color: var(--light-gray);
956 | }
957 |
958 | .project-grid {
959 | max-width: 1200px;
960 | margin: 3rem auto 0;
961 | display: grid;
962 | grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
963 | gap: 2rem;
964 | }
965 |
966 | .project-card {
967 | background-color: var(--bg-color);
968 | border-radius: 8px;
969 | overflow: hidden;
970 | box-shadow: var(--shadow);
971 | transition: transform 0.3s ease, box-shadow 0.3s ease;
972 | padding: 1.5rem;
973 | display: flex;
974 | flex-direction: column;
975 | }
976 |
977 | .project-card:hover {
978 | transform: translateY(-10px);
979 | box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
980 | }
981 |
982 | .project-card h3 {
983 | font-size: 1.5rem;
984 | margin-bottom: 0.8rem;
985 | color: var(--text-color);
986 | }
987 |
988 | .project-card p {
989 | margin-bottom: 1.5rem;
990 | color: var(--text-secondary);
991 | flex-grow: 1;
992 | }
993 |
994 | .project-links {
995 | display: flex;
996 | gap: 1rem;
997 | margin-top: auto;
998 | }
999 |
1000 | .project-links .btn {
1001 | padding: 0.5rem 1rem;
1002 | font-size: 0.9rem;
1003 | }
1004 |
1005 | .loading {
1006 | text-align: center;
1007 | padding: 2rem;
1008 | color: var(--text-secondary);
1009 | }
1010 |
1011 | /* Coding Profiles Section */
1012 | .coding-profiles {
1013 | padding: 5rem 1rem;
1014 | padding-top: 120px; /* Extra padding for fixed header */
1015 | background-color: var(--bg-color);
1016 | }
1017 |
1018 | .profiles-container {
1019 | max-width: 1000px;
1020 | margin: 3rem auto;
1021 | display: flex;
1022 | justify-content: center;
1023 | align-items: center;
1024 | gap: 5rem;
1025 | }
1026 |
1027 | .profile-link {
1028 | display: flex;
1029 | flex-direction: column;
1030 | align-items: center;
1031 | text-decoration: none;
1032 | color: var(--text-color);
1033 | transition: transform 0.3s ease;
1034 | }
1035 |
1036 | .profile-link:hover {
1037 | transform: translateY(-10px);
1038 | }
1039 |
1040 | .profile-logo {
1041 | width: 70px;
1042 | height: 70px;
1043 | margin-bottom: 1rem;
1044 | object-fit: contain;
1045 | transition: transform 0.3s ease;
1046 | }
1047 |
1048 | /* Specific logo styling */
1049 | .github-logo {
1050 | background-color: #fff;
1051 | border-radius: 50%;
1052 | padding: 5px;
1053 | }
1054 |
1055 | .leetcode-logo {
1056 | border-radius: 10px;
1057 | }
1058 |
1059 | .codeforces-logo {
1060 | border-radius: 10px;
1061 | }
1062 |
1063 | .profile-link span {
1064 | font-size: 1.1rem;
1065 | font-weight: 500;
1066 | letter-spacing: 0.5px;
1067 | margin-top: 0.5rem;
1068 | color: #fff;
1069 | }
1070 |
1071 | /* Media query for smaller screens */
1072 | @media (max-width: 768px) {
1073 | .profiles-container {
1074 | gap: 3rem;
1075 | flex-wrap: wrap;
1076 | }
1077 |
1078 | .profile-logo {
1079 | width: 60px;
1080 | height: 60px;
1081 | }
1082 | }
1083 |
1084 | @media (max-width: 576px) {
1085 | .profiles-container {
1086 | gap: 2rem;
1087 | }
1088 |
1089 | .profile-logo {
1090 | width: 50px;
1091 | height: 50px;
1092 | }
1093 | }
1094 |
1095 | /* Featured Project Section */
1096 | .featured-project {
1097 | padding: 5rem 1rem;
1098 | padding-top: 120px; /* Extra padding for fixed header */
1099 | background-color: var(--bg-color);
1100 | }
1101 |
1102 | .featured-project-container {
1103 | max-width: 1000px;
1104 | margin: 3rem auto 0;
1105 | position: relative;
1106 | }
1107 |
1108 | /* Project Slider Styles */
1109 | .featured-project-slider {
1110 | width: 100%;
1111 | overflow: hidden;
1112 | position: relative;
1113 | display: flex;
1114 | transition: transform 0.5s ease;
1115 | }
1116 |
1117 | .project-card {
1118 | flex: 0 0 100%;
1119 | background-color: rgba(255, 255, 255, 0.03);
1120 | border-radius: 12px;
1121 | box-shadow: var(--shadow);
1122 | margin-bottom: 2rem;
1123 | overflow: hidden;
1124 | position: relative;
1125 | transition: all 0.3s ease;
1126 | }
1127 |
1128 | .project-card:not(:first-child) {
1129 | display: none;
1130 | }
1131 |
1132 | .project-preview {
1133 | padding: 2rem;
1134 | cursor: pointer;
1135 | position: relative;
1136 | border-bottom: 1px solid rgba(255, 255, 255, 0.05);
1137 | display: flex;
1138 | flex-direction: column;
1139 | align-items: center;
1140 | text-align: center;
1141 | background: linear-gradient(to bottom, rgba(255, 255, 255, 0.05), transparent);
1142 | }
1143 |
1144 | .project-preview h3 {
1145 | font-size: 1.8rem;
1146 | margin-bottom: 1rem;
1147 | color: var(--primary-color);
1148 | transition: color 0.3s ease;
1149 | }
1150 |
1151 | .project-details {
1152 | padding: 0 2rem 2rem;
1153 | display: none;
1154 | animation: fadeInUp 0.5s ease forwards;
1155 | }
1156 |
1157 | .project-details h3 {
1158 | font-size: 1.6rem;
1159 | margin-bottom: 1rem;
1160 | color: var(--primary-color);
1161 | margin-top: 2rem;
1162 | }
1163 |
1164 | .award-badge {
1165 | display: inline-block;
1166 | color: #ffcc00;
1167 | padding: 0.5rem 0;
1168 | font-size: 0.95rem;
1169 | margin-bottom: 1.5rem;
1170 | font-weight: 500;
1171 | }
1172 |
1173 | .project-description {
1174 | color: var(--text-secondary);
1175 | margin-bottom: 1.5rem;
1176 | font-size: 1.1rem;
1177 | line-height: 1.7;
1178 | }
1179 |
1180 | .expand-btn, .collapse-btn {
1181 | background: none;
1182 | border: none;
1183 | color: var(--primary-color);
1184 | font-size: 1.2rem;
1185 | cursor: pointer;
1186 | margin-top: 1rem;
1187 | padding: 0.5rem;
1188 | border-radius: 50%;
1189 | width: 40px;
1190 | height: 40px;
1191 | display: flex;
1192 | align-items: center;
1193 | justify-content: center;
1194 | transition: all 0.3s ease;
1195 | background-color: rgba(255, 255, 255, 0.05);
1196 | }
1197 |
1198 | .expand-btn:hover, .collapse-btn:hover {
1199 | background-color: var(--primary-color);
1200 | color: white;
1201 | transform: translateY(-3px);
1202 | }
1203 |
1204 | .slider-controls {
1205 | display: flex;
1206 | justify-content: center;
1207 | align-items: center;
1208 | gap: 1.5rem;
1209 | margin-top: 1rem;
1210 | }
1211 |
1212 | .slider-btn {
1213 | background: none;
1214 | border: none;
1215 | color: var(--text-color);
1216 | font-size: 1.2rem;
1217 | cursor: pointer;
1218 | padding: 0.5rem;
1219 | border-radius: 50%;
1220 | width: 40px;
1221 | height: 40px;
1222 | display: flex;
1223 | align-items: center;
1224 | justify-content: center;
1225 | transition: all 0.3s ease;
1226 | background-color: rgba(255, 255, 255, 0.05);
1227 | }
1228 |
1229 | .slider-btn:hover {
1230 | background-color: var(--primary-color);
1231 | color: white;
1232 | transform: translateY(-2px);
1233 | }
1234 |
1235 | .slider-dots {
1236 | display: flex;
1237 | gap: 0.5rem;
1238 | align-items: center;
1239 | }
1240 |
1241 | .dot {
1242 | width: 10px;
1243 | height: 10px;
1244 | border-radius: 50%;
1245 | background-color: var(--light-gray);
1246 | cursor: pointer;
1247 | transition: all 0.3s ease;
1248 | }
1249 |
1250 | .dot.active {
1251 | background-color: var(--primary-color);
1252 | transform: scale(1.2);
1253 | }
1254 |
1255 | @keyframes fadeInUp {
1256 | from {
1257 | opacity: 0;
1258 | transform: translateY(20px);
1259 | }
1260 | to {
1261 | opacity: 1;
1262 | transform: translateY(0);
1263 | }
1264 | }
1265 |
1266 | /* Fix Button Styling */
1267 | .btn {
1268 | display: inline-block;
1269 | padding: 0.8rem 1.8rem;
1270 | background-color: var(--primary-color);
1271 | color: white;
1272 | border-radius: 50px;
1273 | transition: all 0.3s ease;
1274 | border: none;
1275 | cursor: pointer;
1276 | font-size: 0.95rem;
1277 | text-align: center;
1278 | font-weight: 500;
1279 | letter-spacing: 0.5px;
1280 | box-shadow: 0 4px 12px rgba(109, 142, 255, 0.2);
1281 | position: relative;
1282 | overflow: hidden;
1283 | }
1284 |
1285 | .btn:hover {
1286 | background-color: var(--secondary-color);
1287 | transform: translateY(-3px);
1288 | box-shadow: 0 8px 20px rgba(0, 0, 0, 0.2);
1289 | }
1290 |
1291 | .btn:active {
1292 | transform: translateY(-1px);
1293 | box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
1294 | }
1295 |
1296 | .btn::after {
1297 | content: '';
1298 | position: absolute;
1299 | top: 50%;
1300 | left: 50%;
1301 | width: 120%;
1302 | height: 120%;
1303 | background: rgba(255, 255, 255, 0.1);
1304 | border-radius: 50%;
1305 | transform: translate(-50%, -50%) scale(0);
1306 | opacity: 0;
1307 | transition: transform 0.4s ease, opacity 0.3s ease;
1308 | }
1309 |
1310 | .btn:hover::after {
1311 | transform: translate(-50%, -50%) scale(1);
1312 | opacity: 1;
1313 | }
1314 |
1315 | .project-links .btn {
1316 | padding: 0.7rem 1.6rem;
1317 | font-size: 0.9rem;
1318 | margin-top: 0.5rem;
1319 | }
1320 |
1321 | /* Media Queries */
1322 |
1323 | /* Media Queries */
1324 |
1325 | /* Internships Section */
1326 | .internships {
1327 | padding: 5rem 1rem;
1328 | padding-top: 120px; /* Extra padding for fixed header */
1329 | background-color: var(--bg-color); /* Changed to match main background */
1330 | position: relative;
1331 | }
1332 |
1333 | .internships-container {
1334 | max-width: 1000px;
1335 | margin: 3rem auto 0;
1336 | display: flex;
1337 | flex-direction: column;
1338 | gap: 2.5rem;
1339 | }
1340 |
1341 | .internship-card {
1342 | background-color: var(--bg-color);
1343 | border-radius: 12px;
1344 | overflow: hidden;
1345 | box-shadow: var(--shadow);
1346 | display: flex;
1347 | transition: transform 0.3s ease, box-shadow 0.3s ease;
1348 | position: relative;
1349 | }
1350 |
1351 | .internship-card:hover {
1352 | transform: translateY(-10px);
1353 | box-shadow: 0 15px 30px rgba(0, 0, 0, 0.2);
1354 | }
1355 |
1356 | .company-logo {
1357 | flex: 0 0 180px;
1358 | padding: 1.5rem;
1359 | display: flex;
1360 | align-items: center;
1361 | justify-content: center;
1362 | background-color: rgba(255, 255, 255, 0.03);
1363 | border-right: 1px solid rgba(255, 255, 255, 0.05);
1364 | }
1365 |
1366 | .styled-logo {
1367 | display: flex;
1368 | flex-direction: column;
1369 | align-items: center;
1370 | justify-content: center;
1371 | width: 120px;
1372 | height: 120px;
1373 | border-radius: 12px;
1374 | overflow: hidden;
1375 | background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
1376 | box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
1377 | transition: all 0.3s ease;
1378 | padding: 1rem;
1379 | text-align: center;
1380 | }
1381 |
1382 | .nms-logo {
1383 | background: linear-gradient(135deg, #3d4b75, #6d8eff);
1384 | }
1385 |
1386 | .ineuron-logo {
1387 | background: linear-gradient(135deg, #0f2027, #203a43, #2c5364);
1388 | }
1389 |
1390 | .logo-text {
1391 | font-size: 2rem;
1392 | font-weight: 700;
1393 | color: white;
1394 | letter-spacing: 1px;
1395 | margin-bottom: 0.3rem;
1396 | text-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
1397 | }
1398 |
1399 | .logo-subtext {
1400 | font-size: 0.9rem;
1401 | font-weight: 400;
1402 | color: rgba(255, 255, 255, 0.9);
1403 | letter-spacing: 0.5px;
1404 | }
1405 |
1406 | .internship-card:hover .styled-logo {
1407 | transform: scale(1.05);
1408 | box-shadow: 0 12px 24px rgba(0, 0, 0, 0.3);
1409 | }
1410 |
1411 | .company-img {
1412 | width: 100%;
1413 | max-width: 120px;
1414 | height: auto;
1415 | object-fit: contain;
1416 | filter: grayscale(20%);
1417 | transition: filter 0.3s ease;
1418 | }
1419 |
1420 | .internship-card:hover .company-img {
1421 | filter: grayscale(0%);
1422 | }
1423 |
1424 | .internship-details {
1425 | flex: 1;
1426 | padding: 1.5rem 2rem;
1427 | }
1428 |
1429 | .internship-details h3 {
1430 | font-size: 1.5rem;
1431 | margin-bottom: 0.5rem;
1432 | color: var(--primary-color);
1433 | display: flex;
1434 | align-items: center;
1435 | flex-wrap: wrap;
1436 | gap: 1rem;
1437 | }
1438 |
1439 | .internship-tag {
1440 | font-size: 0.8rem;
1441 | font-weight: 500;
1442 | padding: 0.2rem 0.8rem;
1443 | background-color: var(--secondary-color);
1444 | color: white;
1445 | border-radius: 20px;
1446 | display: inline-block;
1447 | }
1448 |
1449 | .company-name {
1450 | font-size: 1.1rem;
1451 | color: var(--text-secondary);
1452 | margin-bottom: 1rem;
1453 | font-weight: 400;
1454 | }
1455 |
1456 | .internship-description {
1457 | margin-bottom: 1.5rem;
1458 | color: var(--text-secondary);
1459 | line-height: 1.6;
1460 | }
1461 |
1462 | .internship-links {
1463 | display: flex;
1464 | gap: 1rem;
1465 | margin-top: 1.5rem;
1466 | }
1467 |
1468 | @media (max-width: 768px) {
1469 | .internship-card {
1470 | flex-direction: column;
1471 | }
1472 |
1473 | .company-logo {
1474 | flex: 0;
1475 | padding: 2rem;
1476 | border-right: none;
1477 | border-bottom: 1px solid rgba(255, 255, 255, 0.05);
1478 | }
1479 |
1480 | .company-img {
1481 | max-width: 100px;
1482 | }
1483 | }
1484 |
1485 | /* Chart and Progress Bar Styles */
1486 | .leetcode-distribution {
1487 | margin-top: 1.5rem;
1488 | width: 100%;
1489 | }
1490 |
1491 | .difficulty-bar {
1492 | margin-bottom: 1rem;
1493 | }
1494 |
1495 | .difficulty-label {
1496 | font-size: 0.9rem;
1497 | margin-bottom: 0.3rem;
1498 | color: var(--text-secondary);
1499 | display: block;
1500 | }
1501 |
1502 | .progress-container {
1503 | background-color: var(--light-gray);
1504 | border-radius: 20px;
1505 | height: 10px;
1506 | position: relative;
1507 | overflow: hidden;
1508 | width: 100%;
1509 | }
1510 |
1511 | .progress-bar {
1512 | height: 100%;
1513 | border-radius: 20px;
1514 | transition: width 1s ease;
1515 | }
1516 |
1517 | .progress-bar.easy {
1518 | background-color: var(--easy-color);
1519 | }
1520 |
1521 | .progress-bar.medium {
1522 | background-color: var(--medium-color);
1523 | }
1524 |
1525 | .progress-bar.hard {
1526 | background-color: var(--hard-color);
1527 | }
1528 |
1529 | .progress-text {
1530 | position: absolute;
1531 | right: 5px;
1532 | top: -20px;
1533 | font-size: 0.8rem;
1534 | color: var(--text-secondary);
1535 | }
1536 |
1537 | /* Chart containers */
1538 | .chart-container {
1539 | width: 100%;
1540 | height: 150px;
1541 | background-color: rgba(255, 255, 255, 0.05);
1542 | border-radius: 8px;
1543 | margin-top: 1.5rem;
1544 | display: flex;
1545 | align-items: center;
1546 | justify-content: center;
1547 | color: var(--text-secondary);
1548 | }
1549 |
1550 | /* GitHub Stats Section */
1551 | .github-stats {
1552 | padding: 5rem 1rem;
1553 | padding-top: 120px; /* Extra padding for fixed header */
1554 | background-color: var(--bg-color);
1555 | }
1556 |
1557 | .github-stats-container {
1558 | max-width: 1000px;
1559 | margin: 3rem auto 0;
1560 | }
1561 |
1562 | .github-readme-stats {
1563 | display: flex;
1564 | flex-wrap: wrap;
1565 | justify-content: center;
1566 | gap: 2rem;
1567 | margin-bottom: 2rem;
1568 | }
1569 |
1570 | .github-stats-card-img {
1571 | border-radius: 12px;
1572 | box-shadow: var(--shadow);
1573 | transition: transform 0.3s ease, box-shadow 0.3s ease;
1574 | max-width: 100%;
1575 | height: auto;
1576 | }
1577 |
1578 | .github-stats-card-img:hover {
1579 | transform: translateY(-8px);
1580 | box-shadow: 0 15px 30px rgba(0, 0, 0, 0.3);
1581 | }
1582 |
1583 | @media (max-width: 768px) {
1584 | .github-readme-stats {
1585 | flex-direction: column;
1586 | align-items: center;
1587 | }
1588 |
1589 | .github-stats-card-img {
1590 | max-width: 100%;
1591 | }
1592 | }
1593 |
1594 | /* Coding Profiles Section */
1595 | @media (max-width: 992px) {
1596 | .hero-content {
1597 | grid-template-columns: 1fr;
1598 | text-align: center;
1599 | }
1600 |
1601 | .hero-text {
1602 | text-align: center;
1603 | }
1604 |
1605 | .hero-buttons {
1606 | justify-content: center;
1607 | }
1608 | }
1609 |
1610 | /* Mobile menu animations and styling */
1611 | @media (max-width: 768px) {
1612 | .menu-toggle {
1613 | display: flex;
1614 | }
1615 |
1616 | .section-title {
1617 | font-size: 2rem;
1618 | }
1619 |
1620 | .nav-links {
1621 | position: fixed;
1622 | top: 65px;
1623 | left: -100%;
1624 | width: 100%;
1625 | height: calc(100vh - 65px);
1626 | background-color: rgba(17, 17, 17, 0.98);
1627 | flex-direction: column;
1628 | align-items: center;
1629 | justify-content: flex-start;
1630 | padding-top: 2rem;
1631 | transition: all 0.4s cubic-bezier(0.77, 0.2, 0.05, 1.0);
1632 | z-index: 99;
1633 | backdrop-filter: blur(10px);
1634 | -webkit-backdrop-filter: blur(10px);
1635 | }
1636 |
1637 | .nav-links.active {
1638 | left: 0;
1639 | box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
1640 | }
1641 |
1642 | .nav-links li {
1643 | margin: 0;
1644 | width: 80%;
1645 | opacity: 0;
1646 | transform: translateY(20px);
1647 | transition: opacity 0.4s ease, transform 0.4s ease;
1648 | transition-delay: 0.1s;
1649 | }
1650 |
1651 | .nav-links.active li {
1652 | opacity: 1;
1653 | transform: translateY(0);
1654 | }
1655 |
1656 | .nav-links li:nth-child(2) {
1657 | transition-delay: 0.15s;
1658 | }
1659 |
1660 | .nav-links li:nth-child(3) {
1661 | transition-delay: 0.2s;
1662 | }
1663 |
1664 | .nav-links li:nth-child(4) {
1665 | transition-delay: 0.25s;
1666 | }
1667 |
1668 | .nav-links li:nth-child(5) {
1669 | transition-delay: 0.3s;
1670 | }
1671 |
1672 | .nav-links li:nth-child(6) {
1673 | transition-delay: 0.35s;
1674 | }
1675 |
1676 | .nav-links li:nth-child(7) {
1677 | transition-delay: 0.4s;
1678 | }
1679 |
1680 | .nav-links a {
1681 | display: block;
1682 | padding: 1rem 0;
1683 | text-align: center;
1684 | font-size: 1.1rem;
1685 | width: 100%;
1686 | border-bottom: 1px solid rgba(255, 255, 255, 0.05);
1687 | }
1688 |
1689 | .nav-links a:after {
1690 | bottom: -2px;
1691 | }
1692 |
1693 | /* Hamburger Icon Animation */
1694 | .menu-toggle {
1695 | position: relative;
1696 | }
1697 |
1698 | .menu-toggle i {
1699 | transition: all 0.3s ease;
1700 | }
1701 |
1702 | .menu-toggle.active i.fa-bars {
1703 | transform: rotate(90deg);
1704 | opacity: 0;
1705 | }
1706 |
1707 | .menu-toggle.active:before {
1708 | content: '\f00d';
1709 | font-family: 'Font Awesome 5 Free';
1710 | font-weight: 900;
1711 | position: absolute;
1712 | font-size: 1.5rem;
1713 | color: var(--primary-color);
1714 | animation: rotateIn 0.3s ease;
1715 | }
1716 |
1717 | @keyframes rotateIn {
1718 | from {
1719 | transform: rotate(-90deg);
1720 | opacity: 0;
1721 | }
1722 | to {
1723 | transform: rotate(0);
1724 | opacity: 1;
1725 | }
1726 | }
1727 |
1728 | /* Restore other mobile styles */
1729 | .hero h1 {
1730 | font-size: 2.5rem;
1731 | }
1732 |
1733 | .hero h2 {
1734 | font-size: 1.5rem;
1735 | }
1736 |
1737 | .hero-image {
1738 | margin-top: 2rem;
1739 | }
1740 |
1741 | .profile-img-placeholder {
1742 | width: 200px;
1743 | height: 200px;
1744 | }
1745 |
1746 | .tech-stack {
1747 | justify-content: center;
1748 | }
1749 | }
1750 |
1751 | @media (max-width: 576px) {
1752 | .section-title {
1753 | font-size: 1.8rem;
1754 | }
1755 |
1756 | .hero h1 {
1757 | font-size: 2rem;
1758 | }
1759 |
1760 | .hero h2 {
1761 | font-size: 1.2rem;
1762 | }
1763 |
1764 | .hero p {
1765 | font-size: 1rem;
1766 | }
1767 |
1768 | .about-text p {
1769 | font-size: 1rem;
1770 | }
1771 |
1772 | .profile-img-placeholder {
1773 | width: 180px;
1774 | height: 180px;
1775 | }
1776 | }
1777 |
1778 | /* News Section */
1779 | .news-section {
1780 | width: 100%;
1781 | background-color: rgba(25, 25, 35, 0.95);
1782 | padding: 25px 0;
1783 | border-top: 1px solid rgba(255, 255, 255, 0.05);
1784 | border-bottom: 1px solid rgba(255, 255, 255, 0.05);
1785 | box-shadow: 0 5px 20px rgba(0, 0, 0, 0.2);
1786 | }
1787 |
1788 | .news-header {
1789 | text-align: center;
1790 | margin-bottom: 20px;
1791 | }
1792 |
1793 | .news-header h3 {
1794 | display: inline-block;
1795 | background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
1796 | color: white;
1797 | padding: 8px 25px;
1798 | border-radius: 30px;
1799 | font-size: 1.2rem;
1800 | font-weight: 600;
1801 | text-transform: uppercase;
1802 | letter-spacing: 1px;
1803 | box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
1804 | }
1805 |
1806 | .news-items {
1807 | max-width: 1000px;
1808 | margin: 0 auto;
1809 | padding: 0 20px;
1810 | display: flex;
1811 | flex-direction: column;
1812 | gap: 15px;
1813 | }
1814 |
1815 | .news-item {
1816 | display: flex;
1817 | align-items: center;
1818 | background-color: rgba(255, 255, 255, 0.03);
1819 | border-radius: 8px;
1820 | padding: 15px;
1821 | transition: transform 0.3s ease, box-shadow 0.3s ease;
1822 | border-left: 3px solid var(--primary-color);
1823 | }
1824 |
1825 | .news-item:hover {
1826 | transform: translateY(-3px);
1827 | box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
1828 | background-color: rgba(255, 255, 255, 0.05);
1829 | }
1830 |
1831 | .news-item i {
1832 | font-size: 1.4rem;
1833 | color: var(--accent-color);
1834 | margin-right: 15px;
1835 | }
1836 |
1837 | .news-content {
1838 | flex: 1;
1839 | display: flex;
1840 | justify-content: space-between;
1841 | align-items: center;
1842 | flex-wrap: wrap;
1843 | gap: 10px;
1844 | }
1845 |
1846 | .news-content p {
1847 | margin: 0;
1848 | font-size: 1rem;
1849 | color: var(--text-color);
1850 | }
1851 |
1852 | .news-date {
1853 | font-size: 0.85rem;
1854 | background-color: rgba(255, 255, 255, 0.05);
1855 | padding: 3px 10px;
1856 | border-radius: 20px;
1857 | color: var(--text-secondary);
1858 | white-space: nowrap;
1859 | }
1860 |
1861 | .news-item a {
1862 | color: var(--primary-color);
1863 | text-decoration: none;
1864 | transition: color 0.2s ease, text-decoration 0.2s ease;
1865 | }
1866 |
1867 | .news-item a:hover {
1868 | color: var(--accent-color);
1869 | text-decoration: underline;
1870 | }
1871 |
1872 | @media (max-width: 768px) {
1873 | .news-content {
1874 | flex-direction: column;
1875 | align-items: flex-start;
1876 | }
1877 |
1878 | .news-item {
1879 | padding: 12px;
1880 | }
1881 |
1882 | .news-date {
1883 | align-self: flex-start;
1884 | }
1885 | }
1886 |
1887 | @media (max-width: 480px) {
1888 | .news-item i {
1889 | font-size: 1.2rem;
1890 | margin-right: 10px;
1891 | }
1892 |
1893 | .news-content p {
1894 | font-size: 0.9rem;
1895 | }
1896 | }
1897 |
1898 | /* Modal Styles */
1899 | .modal {
1900 | display: none;
1901 | position: fixed;
1902 | z-index: 1000;
1903 | left: 0;
1904 | top: 0;
1905 | width: 100%;
1906 | height: 100%;
1907 | overflow: auto;
1908 | background-color: rgba(0, 0, 0, 0.8);
1909 | backdrop-filter: blur(5px);
1910 | opacity: 0;
1911 | transition: opacity 0.3s ease;
1912 | }
1913 |
1914 | .modal.show {
1915 | display: block;
1916 | opacity: 1;
1917 | }
1918 |
1919 | .modal-content {
1920 | background-color: var(--card-bg);
1921 | margin: 5vh auto;
1922 | width: 90%;
1923 | max-width: 1000px;
1924 | border-radius: 10px;
1925 | box-shadow: 0 5px 30px rgba(0, 0, 0, 0.5);
1926 | animation: modalFadeIn 0.5s ease;
1927 | max-height: 90vh;
1928 | display: flex;
1929 | flex-direction: column;
1930 | }
1931 |
1932 | .modal-header {
1933 | padding: 20px 25px;
1934 | display: flex;
1935 | justify-content: space-between;
1936 | align-items: center;
1937 | border-bottom: 1px solid rgba(255, 255, 255, 0.1);
1938 | }
1939 |
1940 | .modal-header h2 {
1941 | margin: 0;
1942 | color: var(--primary-color);
1943 | font-size: 1.5rem;
1944 | }
1945 |
1946 | .close-modal {
1947 | color: var(--text-secondary);
1948 | font-size: 28px;
1949 | font-weight: bold;
1950 | cursor: pointer;
1951 | transition: all 0.3s ease;
1952 | }
1953 |
1954 | .close-modal:hover {
1955 | color: var(--accent-color);
1956 | transform: scale(1.1);
1957 | }
1958 |
1959 | .modal-body {
1960 | padding: 20px 25px;
1961 | overflow-y: auto;
1962 | flex: 1;
1963 | }
1964 |
1965 | .modal-footer {
1966 | padding: 10px 25px;
1967 | text-align: center;
1968 | border-top: 1px solid rgba(255, 255, 255, 0.1);
1969 | color: var(--text-secondary);
1970 | font-size: 0.9rem;
1971 | }
1972 |
1973 | .table-container {
1974 | width: 100%;
1975 | overflow-x: auto;
1976 | }
1977 |
1978 | .events-table {
1979 | width: 100%;
1980 | border-collapse: separate;
1981 | border-spacing: 0;
1982 | }
1983 |
1984 | .events-table th,
1985 | .events-table td {
1986 | padding: 12px 15px;
1987 | text-align: left;
1988 | border-bottom: 1px solid rgba(255, 255, 255, 0.1);
1989 | }
1990 |
1991 | .events-table th {
1992 | background-color: rgba(0, 0, 0, 0.3);
1993 | color: var(--primary-color);
1994 | font-weight: 600;
1995 | text-transform: uppercase;
1996 | font-size: 0.8rem;
1997 | letter-spacing: 1px;
1998 | }
1999 |
2000 | .events-table tr {
2001 | background-color: rgba(255, 255, 255, 0.02);
2002 | transition: background-color 0.3s ease;
2003 | }
2004 |
2005 | .events-table tr:nth-child(odd) {
2006 | background-color: rgba(255, 255, 255, 0.04);
2007 | }
2008 |
2009 | .events-table tr:hover {
2010 | background-color: rgba(255, 255, 255, 0.08);
2011 | }
2012 |
2013 | .events-table td a.btn-sm {
2014 | display: inline-block;
2015 | padding: 5px 12px;
2016 | background-color: var(--primary-color);
2017 | color: white;
2018 | font-size: 0.8rem;
2019 | border-radius: 20px;
2020 | transition: all 0.3s ease;
2021 | text-decoration: none;
2022 | text-align: center;
2023 | }
2024 |
2025 | .events-table td a.btn-sm:hover {
2026 | background-color: var(--accent-color);
2027 | transform: translateY(-2px);
2028 | }
2029 |
2030 | @keyframes modalFadeIn {
2031 | from {
2032 | opacity: 0;
2033 | transform: translateY(-20px);
2034 | }
2035 | to {
2036 | opacity: 1;
2037 | transform: translateY(0);
2038 | }
2039 | }
2040 |
2041 | /* Mobile Optimizations */
2042 | @media (max-width: 992px) {
2043 | .modal-content {
2044 | width: 95%;
2045 | margin: 3vh auto;
2046 | }
2047 |
2048 | .modal-header h2 {
2049 | font-size: 1.3rem;
2050 | }
2051 | }
2052 |
2053 | @media (max-width: 768px) {
2054 | .news-ticker-label {
2055 | min-width: 120px;
2056 | font-size: 0.8rem;
2057 | padding: 12px 15px;
2058 | }
2059 |
2060 | .ticker-item {
2061 | font-size: 0.9rem;
2062 | }
2063 |
2064 | .events-table th,
2065 | .events-table td {
2066 | padding: 10px;
2067 | font-size: 0.9rem;
2068 | }
2069 |
2070 | /* Stack columns on mobile */
2071 | .events-table thead {
2072 | display: none;
2073 | }
2074 |
2075 | .events-table tr {
2076 | margin-bottom: 15px;
2077 | display: block;
2078 | border: 1px solid rgba(255, 255, 255, 0.1);
2079 | border-radius: 8px;
2080 | padding: 10px;
2081 | }
2082 |
2083 | .events-table td {
2084 | display: flex;
2085 | text-align: right;
2086 | padding: 8px 10px;
2087 | border-bottom: 1px solid rgba(255, 255, 255, 0.05);
2088 | }
2089 |
2090 | .events-table td:last-child {
2091 | border-bottom: none;
2092 | }
2093 |
2094 | .events-table td::before {
2095 | content: attr(data-label);
2096 | font-weight: bold;
2097 | text-align: left;
2098 | color: var(--primary-color);
2099 | padding-right: 10px;
2100 | flex: 1;
2101 | }
2102 | }
2103 |
2104 | @media (max-width: 480px) {
2105 | .news-ticker-container {
2106 | flex-direction: column;
2107 | }
2108 |
2109 | .news-ticker-label {
2110 | width: 100%;
2111 | padding: 15px 20px;
2112 | position: relative;
2113 | z-index: 20;
2114 | border-radius: 0;
2115 | min-height: 48px; /* Ensure minimum touch target size */
2116 | touch-action: manipulation; /* Optimize for touch */
2117 | -webkit-tap-highlight-color: rgba(109, 142, 255, 0.3); /* Add tap highlight */
2118 | user-select: none; /* Prevent text selection on touch */
2119 | }
2120 |
2121 | .news-ticker-label::after {
2122 | display: none;
2123 | }
2124 |
2125 | /* Add an explicit tap/click indicator for mobile */
2126 | .news-ticker-label::before {
2127 | content: '\f0a9'; /* Font Awesome arrow icon */
2128 | font-family: 'Font Awesome 5 Free';
2129 | font-weight: 900;
2130 | margin-right: 8px;
2131 | font-size: 0.9rem;
2132 | }
2133 |
2134 | .news-ticker-label span {
2135 | display: flex;
2136 | align-items: center;
2137 | justify-content: center;
2138 | width: 100%;
2139 | pointer-events: none; /* Let parent handle all events */
2140 | }
2141 |
2142 | /* Improve mobile button interaction */
2143 | .news-ticker-label:active {
2144 | background: linear-gradient(135deg, var(--secondary-color), var(--primary-color));
2145 | transform: scale(0.98);
2146 | }
2147 |
2148 | /* Ensure ticker items are visible on mobile */
2149 | .ticker-item {
2150 | font-size: 0.85rem;
2151 | white-space: normal;
2152 | display: inline-block;
2153 | padding: 5px 0;
2154 | line-height: 1.4;
2155 | }
2156 |
2157 | /* Ensure proper display of ticker content on mobile */
2158 | .news-ticker {
2159 | padding: 15px 0;
2160 | overflow-x: hidden;
2161 | }
2162 |
2163 | /* Ensure the ticker content stays visible */
2164 | .news-ticker-content {
2165 | animation-duration: 30s !important;
2166 | display: flex;
2167 | align-items: center;
2168 | }
2169 |
2170 | .modal-content {
2171 | width: 100%;
2172 | height: 100%;
2173 | max-height: none;
2174 | margin: 0;
2175 | border-radius: 0;
2176 | }
2177 |
2178 | .modal-body {
2179 | padding: 15px;
2180 | }
2181 |
2182 | .events-table td {
2183 | font-size: 0.85rem;
2184 | padding: 6px 8px;
2185 | }
2186 | }
2187 |
2188 | /* --- News Ticker Enhancements --- */
2189 | .animated-badge {
2190 | animation: bellPulse 1.2s infinite alternate;
2191 | color: var(--accent-color);
2192 | margin-left: 6px;
2193 | }
2194 | @keyframes bellPulse {
2195 | 0% { filter: drop-shadow(0 0 0px var(--accent-color)); }
2196 | 100% { filter: drop-shadow(0 0 8px var(--accent-color)); }
2197 | }
2198 | .news-badge {
2199 | display: inline-block;
2200 | background: var(--accent-color);
2201 | color: #fff;
2202 | font-size: 0.7em;
2203 | border-radius: 50%;
2204 | width: 16px;
2205 | height: 16px;
2206 | text-align: center;
2207 | line-height: 16px;
2208 | margin-left: 8px;
2209 | box-shadow: 0 0 8px var(--accent-color);
2210 | animation: badgeGlow 1.5s infinite alternate;
2211 | }
2212 | @keyframes badgeGlow {
2213 | 0% { box-shadow: 0 0 8px var(--accent-color); }
2214 | 100% { box-shadow: 0 0 16px var(--accent-color); }
2215 | }
2216 | .news-logo {
2217 | width: 22px;
2218 | height: 22px;
2219 | object-fit: contain;
2220 | border-radius: 4px;
2221 | margin-right: 8px;
2222 | vertical-align: middle;
2223 | box-shadow: 0 1px 4px rgba(0,0,0,0.10);
2224 | }
2225 | /* --- Modal Enhancements --- */
2226 | .modal-badge {
2227 | display: inline-block;
2228 | background: var(--accent-color);
2229 | color: #fff;
2230 | font-size: 0.7em;
2231 | border-radius: 12px;
2232 | padding: 2px 10px;
2233 | margin-left: 10px;
2234 | vertical-align: middle;
2235 | animation: badgeGlow 1.5s infinite alternate;
2236 | }
2237 | .news-logo-table {
2238 | width: 18px;
2239 | height: 18px;
2240 | object-fit: contain;
2241 | border-radius: 3px;
2242 | margin-right: 5px;
2243 | vertical-align: middle;
2244 | }
2245 | /* --- Highlight most recent row in modal --- */
2246 | .highlight-row {
2247 | background: rgba(255, 255, 255, 0.08);
2248 | font-weight: 600;
2249 | border-left: 4px solid var(--accent-color);
2250 | }
--------------------------------------------------------------------------------