diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0dc8c2f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,40 @@
+# Dependencies
+node_modules/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Build outputs
+dist/
+build/
+.cache/
+
+# Environment variables
+.env
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+# IDE
+.vscode/
+.idea/
+*.swp
+*.swo
+*~
+
+# OS
+.DS_Store
+Thumbs.db
+
+# Logs
+logs/
+*.log
+
+# Temporary files
+/tmp/
+*.tmp
+
+# Testing
+coverage/
+.nyc_output/
diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md
new file mode 100644
index 0000000..cc6f99e
--- /dev/null
+++ b/DEPLOYMENT.md
@@ -0,0 +1,88 @@
+# Deployment Guide
+
+## GitHub Pages Deployment
+
+This website is ready for immediate deployment to GitHub Pages with zero configuration required.
+
+### Quick Start
+
+1. Go to your repository on GitHub
+2. Click on **Settings**
+3. Navigate to **Pages** in the left sidebar
+4. Under "Source", select the branch: `copilot/recreate-portfolio-website` (or your preferred branch)
+5. Keep the folder as `/ (root)`
+6. Click **Save**
+7. Wait a few minutes for GitHub to build and deploy
+8. Your site will be available at: `https://yourusername.github.io/Tech-Blog/`
+
+### Custom Domain (Optional)
+
+To use a custom domain:
+
+1. In the Pages settings, enter your custom domain
+2. Add a CNAME file to the repository root with your domain name
+3. Configure DNS with your domain provider:
+ - Add a CNAME record pointing to `yourusername.github.io`
+ - Or add A records pointing to GitHub Pages IPs
+
+### Verification
+
+Once deployed, verify that:
+- [ ] All pages load correctly
+- [ ] Dark mode toggle works
+- [ ] Mobile menu functions properly
+- [ ] Smooth scrolling works on all sections
+- [ ] All links are functional
+- [ ] Images load properly (when added)
+
+### Troubleshooting
+
+**Site not loading?**
+- Check that GitHub Pages is enabled in settings
+- Verify the correct branch is selected
+- Wait 5-10 minutes after enabling Pages
+
+**CSS not loading?**
+- Ensure all files are committed and pushed
+- Check browser console for errors
+- Clear browser cache
+
+**JavaScript errors?**
+- Check browser console for specific errors
+- Verify all script files are properly linked
+- Ensure no external CDN dependencies are blocked
+
+### Performance
+
+The site is optimized for performance:
+- No external dependencies
+- Minimal file sizes (< 70KB total)
+- Lazy loading support
+- Efficient CSS and JavaScript
+
+### Security
+
+✅ CodeQL security scan passed with 0 vulnerabilities
+✅ No external script injection
+✅ No hardcoded credentials
+✅ Safe localStorage usage
+
+### Maintenance
+
+To update content:
+1. Edit `index.html` for text content
+2. Edit `style.css` for styling changes
+3. Edit `script.js` for functionality changes
+4. Commit and push changes
+5. GitHub Pages will automatically rebuild
+
+### Support
+
+For issues or questions:
+- Check the README.md for documentation
+- Review the code comments for guidance
+- Test locally before deploying changes
+
+---
+
+Built with ❤️ for GitHub Pages
diff --git a/README.md b/README.md
index 9fe4524..7b99412 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,166 @@
-# Tech-Blog
\ No newline at end of file
+# Tech Blog - Portfolio Website
+
+A modern, responsive portfolio website built with HTML5, CSS3, and vanilla JavaScript. Features a clean design, dark mode toggle, smooth animations, and full accessibility support.
+
+## 🌟 Features
+
+- **Modern Design**: Clean, professional layout with gradient accents
+- **Fully Responsive**: Optimized for mobile, tablet, and desktop devices
+- **Dark Mode**: Toggle between light and dark themes with localStorage persistence
+- **Smooth Animations**: Fade-in effects, smooth scrolling, and interactive hover states
+- **Accessibility**: Semantic HTML5, ARIA labels, keyboard navigation
+- **Performance**: No external dependencies, optimized CSS and JavaScript
+- **SEO Ready**: Proper meta tags and semantic structure
+
+## 📁 Project Structure
+
+```
+Tech-Blog/
+├── index.html # Main HTML file
+├── style.css # Custom CSS styles (standalone, no dependencies)
+├── script.js # Interactive JavaScript features
+├── assets/ # Directory for images and icons
+│ ├── images/
+│ └── icons/
+├── .gitignore # Git ignore rules
+└── README.md # This file
+```
+
+## 🚀 Getting Started
+
+### Local Development
+
+1. Clone the repository:
+```bash
+git clone https://github.com/ambicuity/Tech-Blog.git
+cd Tech-Blog
+```
+
+2. Open `index.html` in your browser or start a local server:
+```bash
+# Using Python
+python -m http.server 8000
+
+# Using Node.js
+npx http-server
+
+# Using PHP
+php -S localhost:8000
+```
+
+3. Visit `http://localhost:8000` in your browser
+
+### Deployment to GitHub Pages
+
+This site is ready for GitHub Pages deployment:
+
+1. Go to your repository Settings
+2. Navigate to Pages section
+3. Select the branch (e.g., `main` or `copilot/recreate-portfolio-website`)
+4. Select root directory
+5. Save and wait for deployment
+
+Your site will be available at: `https://yourusername.github.io/Tech-Blog/`
+
+See [DEPLOYMENT.md](DEPLOYMENT.md) for detailed deployment instructions.
+
+### Updating Your Site
+
+Once deployed, you can easily update your site content regularly. Any changes pushed to your deployed branch will automatically update your live site within 1-2 minutes.
+
+See [UPDATING.md](UPDATING.md) for a complete guide on:
+- Making content updates (bio, projects, skills, contact info)
+- Changing colors and themes
+- Adding images
+- Best practices for regular updates
+- Quick reference guide for common changes
+
+## 🎨 Customization
+
+### Colors
+
+The color palette is defined in CSS variables in `style.css`:
+
+```css
+:root {
+ --primary-500: #0ea5e9;
+ --primary-600: #0284c7;
+ --blue-600: #2563eb;
+ /* ... more colors */
+}
+```
+
+### Content
+
+Edit `index.html` to customize:
+- Personal information and bio
+- Project descriptions
+- Skills and technologies
+- Contact information and social links
+
+### Styling
+
+Modify `style.css` to adjust:
+- Typography and spacing
+- Colors and gradients
+- Animations and transitions
+- Responsive breakpoints
+
+## 🔧 Technical Stack
+
+- **HTML5**: Semantic markup
+- **CSS3**: Custom styles with flexbox and grid
+- **JavaScript (ES6+)**: Vanilla JS for interactions
+- **No frameworks or libraries**: Lightweight and fast
+
+## ✨ Key Sections
+
+1. **Header/Navigation**: Fixed header with smooth scroll links
+2. **Hero Section**: Landing section with call-to-action buttons
+3. **About**: Professional introduction and competencies
+4. **Projects**: Featured portfolio projects showcase
+5. **Skills**: Technical skills organized by category
+6. **Contact**: Multiple contact methods and social links
+7. **Footer**: Copyright and navigation
+
+## 🌙 Dark Mode
+
+The site includes a fully functional dark mode that:
+- Toggles with a button in the header
+- Saves preference in localStorage
+- Respects system color scheme preference
+- Provides smooth transitions between themes
+
+## ♿ Accessibility
+
+- Semantic HTML5 elements
+- ARIA labels and roles
+- Keyboard navigation support
+- Focus indicators
+- Sufficient color contrast
+- Responsive text sizing
+- Reduced motion support
+
+## 📱 Browser Support
+
+- Chrome (latest)
+- Firefox (latest)
+- Safari (latest)
+- Edge (latest)
+- Mobile browsers (iOS Safari, Chrome Mobile)
+
+## 📄 License
+
+This project is open source and available under the MIT License.
+
+## 🤝 Contributing
+
+Contributions, issues, and feature requests are welcome!
+
+## 📧 Contact
+
+For questions or feedback, please reach out through the contact form on the website.
+
+---
+
+Built with ❤️ for GitHub Pages
\ No newline at end of file
diff --git a/UPDATING.md b/UPDATING.md
new file mode 100644
index 0000000..791b0fc
--- /dev/null
+++ b/UPDATING.md
@@ -0,0 +1,290 @@
+# Regular Updates Guide
+
+This guide shows you how to easily update your GitHub Pages site and have changes go live automatically.
+
+## How GitHub Pages Auto-Updates Work
+
+Once you've deployed your site to GitHub Pages (see [DEPLOYMENT.md](DEPLOYMENT.md)), any changes you push to the deployed branch will automatically trigger a rebuild and update your live site within 1-2 minutes.
+
+## Quick Update Workflow
+
+### For Content Changes
+
+1. **Clone or pull the latest version** (if working from a new location):
+```bash
+git clone https://github.com/ambicuity/Tech-Blog.git
+cd Tech-Blog
+git checkout copilot/recreate-portfolio-website # or your deployed branch
+```
+
+Or if you already have it locally:
+```bash
+git pull origin copilot/recreate-portfolio-website
+```
+
+2. **Make your changes** (see sections below for specific updates)
+
+3. **Test locally** (optional but recommended):
+```bash
+# Start a local server
+python -m http.server 8000
+# Open http://localhost:8000 in your browser
+```
+
+4. **Commit and push your changes**:
+```bash
+git add .
+git commit -m "Update: describe your changes"
+git push origin copilot/recreate-portfolio-website
+```
+
+5. **Wait 1-2 minutes** - GitHub Pages will automatically rebuild and deploy your changes!
+
+## Common Update Scenarios
+
+### 1. Update Your Bio or About Section
+
+**File:** `index.html`
+**Location:** Lines 252-277 (About section)
+
+**What to change:**
+- Update the heading (line 260)
+- Modify the description paragraphs (lines 261-268)
+- Change skill badges (lines 270-275)
+
+**Example:**
+```html
+
+ Your New Title Here
+
+
+ Your updated bio paragraph here...
+
+```
+
+### 2. Add or Update Projects
+
+**File:** `index.html`
+**Location:** Lines 286-387 (Projects section)
+
+**To add a new project**, copy this template and paste it in the projects grid:
+
+```html
+
+
+
+
+
+
+ Your Project Name
+
+ Project description goes here...
+
+
+ Tech1
+ Tech2
+ Tech3
+
+
+ View Project →
+
+
+```
+
+**To update existing projects:**
+- Change the project name (h3 tag)
+- Update the description
+- Modify technology tags
+- Update the project link
+
+### 3. Update Skills
+
+**File:** `index.html`
+**Location:** Lines 396-486 (Skills section)
+
+**To add a skill to a category:**
+
+```html
+New Skill Name
+```
+
+**To add a new skill category**, copy this template:
+
+```html
+
+
+
+
+
+
+
Category Name
+
+ Skill 1
+ Skill 2
+ Skill 3
+
+
+```
+
+### 4. Update Contact Information
+
+**File:** `index.html`
+**Location:** Lines 495-553 (Contact section)
+
+**Email:** Line 504 (update both mailto: link and display text)
+```html
+
+ ...
+ your.email@example.com
+
+```
+
+**Social Links:** Lines 516-543
+- Update GitHub username (line 520)
+- Update LinkedIn profile (line 531)
+- Update social media links in footer (lines 546-551)
+
+### 5. Change Colors and Theme
+
+**File:** `style.css`
+**Location:** Lines 11-31 (CSS variables)
+
+**To change the color scheme:**
+
+```css
+:root {
+ /* Change these values to your preferred colors */
+ --primary-500: #0ea5e9; /* Main accent color */
+ --primary-600: #0284c7; /* Darker accent */
+ --blue-600: #2563eb; /* Secondary accent */
+}
+```
+
+**Popular color schemes:**
+- **Purple Theme**: `--primary-500: #a855f7; --blue-600: #7c3aed;`
+- **Green Theme**: `--primary-500: #10b981; --blue-600: #059669;`
+- **Orange Theme**: `--primary-500: #f59e0b; --blue-600: #d97706;`
+- **Pink Theme**: `--primary-500: #ec4899; --blue-600: #db2777;`
+
+### 6. Update Site Title and Metadata
+
+**File:** `index.html`
+**Location:** Lines 1-9 (Head section)
+
+```html
+
+
+
+Your Site Title
+```
+
+### 7. Add Images
+
+**Location:** Create files in `assets/images/` directory
+
+**Steps:**
+1. Add your image files to the `assets/images/` folder
+2. Update the `index.html` to reference your images
+
+**For profile picture:**
+```html
+
+
+```
+
+**For project images:**
+```html
+
+
+```
+
+## Tips for Regular Updates
+
+### Best Practices
+
+1. **Test locally first**: Always preview changes in your browser before pushing
+2. **Commit often**: Make small, frequent commits with clear messages
+3. **Use descriptive commit messages**: E.g., "Update project portfolio with new app", "Change contact email"
+4. **Keep backups**: GitHub automatically keeps your version history
+5. **Check live site**: After pushing, wait 2 minutes and refresh your live site to verify changes
+
+### Commit Message Examples
+
+```bash
+git commit -m "Add new portfolio project: Weather App"
+git commit -m "Update bio and skills section"
+git commit -m "Change theme colors to purple scheme"
+git commit -m "Update contact email address"
+git commit -m "Add profile picture and project images"
+```
+
+### Common Issues
+
+**Problem:** Changes not showing on live site
+**Solution:**
+- Wait 2-3 minutes for GitHub Pages to rebuild
+- Clear your browser cache (Ctrl+Shift+R or Cmd+Shift+R)
+- Check GitHub Actions tab for build status
+
+**Problem:** Site broken after update
+**Solution:**
+- Check browser console (F12) for errors
+- Revert to previous commit if needed:
+ ```bash
+ git revert HEAD
+ git push origin copilot/recreate-portfolio-website
+ ```
+
+**Problem:** Can't push changes
+**Solution:**
+- Make sure you have write access to the repository
+- Pull latest changes first: `git pull`
+- Resolve any conflicts, then push again
+
+## Automated Updates (Advanced)
+
+### Using GitHub's Web Interface
+
+You can edit files directly on GitHub without cloning:
+
+1. Navigate to the file on GitHub
+2. Click the pencil icon (Edit)
+3. Make your changes
+4. Scroll down and commit directly to the branch
+5. Changes will deploy automatically!
+
+This is great for quick text updates when you don't have access to your computer.
+
+### Schedule Regular Updates
+
+You can use GitHub Actions to schedule automatic updates (like updating the copyright year):
+
+1. Create `.github/workflows/update.yml`
+2. Set up a scheduled workflow
+3. Automate repetitive updates
+
+(See GitHub Actions documentation for details)
+
+## Quick Reference
+
+| Update Type | File | Approximate Line |
+|------------|------|------------------|
+| Site title | `index.html` | 9 |
+| Hero heading | `index.html` | 76-78 |
+| About bio | `index.html` | 252-277 |
+| Projects | `index.html` | 286-387 |
+| Skills | `index.html` | 396-486 |
+| Contact info | `index.html` | 495-553 |
+| Colors | `style.css` | 11-31 |
+| Fonts | `style.css` | Various |
+
+## Need Help?
+
+- Check the [README.md](README.md) for general documentation
+- See [DEPLOYMENT.md](DEPLOYMENT.md) for deployment setup
+- Review the code comments in each file for guidance
+- Test changes locally before pushing to avoid breaking the live site
+
+---
+
+**Remember:** Every push to your deployed branch automatically updates your live site! 🚀
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..fbb589c
--- /dev/null
+++ b/index.html
@@ -0,0 +1,401 @@
+
+
+
+
+
+
+
+
+ Tech Blog - Portfolio
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Welcome to Tech Blog
+
+
+ Building innovative digital experiences through modern web technologies and creative problem-solving
+
+
+
+
+
+
+
+
+
+
+
+
+
+
About Me
+
+
+
+
+ Passionate Developer & Creative Thinker
+
+
+ With expertise in modern web development, I specialize in creating responsive,
+ accessible, and performant applications that deliver exceptional user experiences.
+
+
+ My approach combines technical proficiency with creative problem-solving,
+ ensuring that every project not only meets but exceeds expectations.
+
+
+
+
+
+
+ Web Development
+
+
+
+
+
+ UI/UX Design
+
+
+
+
+
+ Performance Optimization
+
+
+
+
+
+
+ Accessibility
+
+
+
+
+
+
+
+
+
+
+
Featured Projects
+
+
+
+
+ E-Commerce Platform
+
+ A full-featured online shopping platform with modern UI, secure payments, and real-time inventory management.
+
+
+ React
+ Node.js
+ MongoDB
+
+
+ View Project →
+
+
+
+
+
+
+ Task Management App
+
+ Collaborative task manager with real-time updates, drag-and-drop interface, and team productivity analytics.
+
+
+ Vue.js
+ Firebase
+ Tailwind
+
+
+ View Project →
+
+
+
+
+
+
+ Analytics Dashboard
+
+ Interactive data visualization dashboard with customizable widgets, real-time metrics, and export capabilities.
+
+
+ D3.js
+ TypeScript
+ REST API
+
+
+ View Project →
+
+
+
+
+
+
+
+
+
+
Technical Skills
+
+
+
+
+
Frontend
+
+ HTML5 & CSS3
+ JavaScript (ES6+)
+ React & Vue.js
+ Tailwind CSS
+ Responsive Design
+
+
+
+
+
+
+
Backend
+
+ Node.js
+ Python
+ RESTful APIs
+ GraphQL
+ Express.js
+
+
+
+
+
+
+
Database
+
+ MongoDB
+ PostgreSQL
+ MySQL
+ Firebase
+ Redis
+
+
+
+
+
+
+
Tools & Others
+
+ Git & GitHub
+ Docker
+ CI/CD
+ Webpack/Vite
+ Testing (Jest)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ © 2024 Tech Blog. All rights reserved.
+
+
+
+
+
+
+
+
+
+
diff --git a/script.js b/script.js
new file mode 100644
index 0000000..b745a0e
--- /dev/null
+++ b/script.js
@@ -0,0 +1,423 @@
+/**
+ * TECH BLOG PORTFOLIO - JAVASCRIPT
+ * Modern, accessible, and performant interactions
+ */
+
+// Wait for DOM to be fully loaded
+document.addEventListener('DOMContentLoaded', () => {
+ initializeThemeToggle();
+ initializeMobileMenu();
+ initializeNavigation();
+ initializeAnimations();
+ initializeAccessibility();
+ updateCurrentYear();
+ logWelcomeMessage();
+});
+
+// ==============================================
+// THEME TOGGLE FUNCTIONALITY
+// ==============================================
+
+function initializeThemeToggle() {
+ const themeToggleBtn = document.getElementById('theme-toggle');
+ const htmlElement = document.documentElement;
+ const themeToggleDarkIcon = document.getElementById('theme-toggle-dark-icon');
+ const themeToggleLightIcon = document.getElementById('theme-toggle-light-icon');
+
+ if (!themeToggleBtn || !themeToggleDarkIcon || !themeToggleLightIcon) {
+ console.warn('Theme toggle elements not found');
+ return;
+ }
+
+ // Check for saved theme preference or default to system preference
+ function getThemePreference() {
+ if (localStorage.getItem('theme')) {
+ return localStorage.getItem('theme');
+ }
+ return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
+ }
+
+ // Set theme
+ function setTheme(theme) {
+ if (theme === 'dark') {
+ htmlElement.classList.add('dark');
+ themeToggleLightIcon.classList.remove('hidden');
+ themeToggleDarkIcon.classList.add('hidden');
+ } else {
+ htmlElement.classList.remove('dark');
+ themeToggleLightIcon.classList.add('hidden');
+ themeToggleDarkIcon.classList.remove('hidden');
+ }
+ localStorage.setItem('theme', theme);
+ }
+
+ // Initialize theme on page load
+ setTheme(getThemePreference());
+
+ // Theme toggle button event listener
+ themeToggleBtn.addEventListener('click', () => {
+ const currentTheme = htmlElement.classList.contains('dark') ? 'dark' : 'light';
+ const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
+ setTheme(newTheme);
+ });
+
+ // Listen for system theme changes
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
+ if (!localStorage.getItem('theme')) {
+ setTheme(e.matches ? 'dark' : 'light');
+ }
+ });
+}
+
+// ==============================================
+// MOBILE MENU TOGGLE
+// ==============================================
+
+function initializeMobileMenu() {
+ const mobileMenuButton = document.getElementById('mobile-menu-button');
+ const mobileMenu = document.getElementById('mobile-menu');
+
+ if (!mobileMenuButton || !mobileMenu) {
+ console.warn('Mobile menu elements not found');
+ return;
+ }
+
+ mobileMenuButton.addEventListener('click', () => {
+ const isExpanded = mobileMenuButton.getAttribute('aria-expanded') === 'true';
+ mobileMenuButton.setAttribute('aria-expanded', !isExpanded);
+ mobileMenu.classList.toggle('hidden');
+ });
+
+ // Close mobile menu when clicking on a link
+ const mobileNavLinks = document.querySelectorAll('.mobile-nav-link');
+ mobileNavLinks.forEach(link => {
+ link.addEventListener('click', () => {
+ mobileMenu.classList.add('hidden');
+ mobileMenuButton.setAttribute('aria-expanded', 'false');
+ });
+ });
+
+ // Close mobile menu when clicking outside
+ document.addEventListener('click', (e) => {
+ if (!mobileMenuButton.contains(e.target) && !mobileMenu.contains(e.target)) {
+ mobileMenu.classList.add('hidden');
+ mobileMenuButton.setAttribute('aria-expanded', 'false');
+ }
+ });
+
+ // Keyboard support for mobile menu
+ mobileMenuButton.addEventListener('keydown', (e) => {
+ if (e.key === 'Escape' && !mobileMenu.classList.contains('hidden')) {
+ mobileMenu.classList.add('hidden');
+ mobileMenuButton.setAttribute('aria-expanded', 'false');
+ mobileMenuButton.focus();
+ }
+ });
+}
+
+// ==============================================
+// NAVIGATION FUNCTIONALITY
+// ==============================================
+
+function initializeNavigation() {
+ initializeSmoothScrolling();
+ initializeHeaderScrollEffect();
+ initializeActiveNavHighlighting();
+}
+
+// ==============================================
+// SMOOTH SCROLLING WITH OFFSET FOR FIXED HEADER
+// ==============================================
+
+function initializeSmoothScrolling() {
+ const navLinks = document.querySelectorAll('a[href^="#"]');
+
+ navLinks.forEach(link => {
+ link.addEventListener('click', (e) => {
+ const href = link.getAttribute('href');
+
+ // Skip if it's just '#' or '#home'
+ if (href === '#' || href === '#home') {
+ return;
+ }
+
+ e.preventDefault();
+
+ const targetId = href.substring(1);
+ const targetElement = document.getElementById(targetId);
+
+ if (targetElement) {
+ const header = document.getElementById('header');
+ const headerHeight = header ? header.offsetHeight : 0;
+ const targetPosition = targetElement.offsetTop - headerHeight;
+
+ window.scrollTo({
+ top: targetPosition,
+ behavior: 'smooth'
+ });
+
+ // Update URL without triggering scroll
+ history.pushState(null, null, href);
+ }
+ });
+ });
+}
+
+// ==============================================
+// HEADER SCROLL EFFECT
+// ==============================================
+
+function initializeHeaderScrollEffect() {
+ const header = document.getElementById('header');
+
+ if (!header) {
+ console.warn('Header element not found');
+ return;
+ }
+
+ let lastScroll = 0;
+
+ window.addEventListener('scroll', () => {
+ const currentScroll = window.pageYOffset;
+
+ // Add shadow when scrolled
+ if (currentScroll > 20) {
+ header.classList.add('scrolled');
+ } else {
+ header.classList.remove('scrolled');
+ }
+
+ lastScroll = currentScroll;
+ });
+}
+
+// ==============================================
+// ACTIVE NAVIGATION LINK HIGHLIGHTING
+// ==============================================
+
+function initializeActiveNavHighlighting() {
+ function updateActiveNavLink() {
+ const sections = document.querySelectorAll('section[id]');
+ const scrollPosition = window.pageYOffset + 100;
+
+ sections.forEach(section => {
+ const sectionTop = section.offsetTop;
+ const sectionHeight = section.offsetHeight;
+ const sectionId = section.getAttribute('id');
+
+ if (scrollPosition >= sectionTop && scrollPosition < sectionTop + sectionHeight) {
+ // Remove active class from all links
+ document.querySelectorAll('.nav-link').forEach(link => {
+ link.classList.remove('active');
+ });
+
+ // Add active class to current section's link
+ const activeLink = document.querySelector(`.nav-link[href="#${sectionId}"]`);
+ if (activeLink) {
+ activeLink.classList.add('active');
+ }
+ }
+ });
+ }
+
+ // Debounce scroll and resize events
+ const debouncedScroll = debounce(updateActiveNavLink, 10);
+
+ window.addEventListener('scroll', debouncedScroll);
+ window.addEventListener('load', updateActiveNavLink);
+}
+
+// ==============================================
+// INTERSECTION OBSERVER FOR FADE-IN ANIMATIONS
+// ==============================================
+
+function initializeAnimations() {
+ const observerOptions = {
+ threshold: 0.1,
+ rootMargin: '0px 0px -50px 0px'
+ };
+
+ const observer = new IntersectionObserver((entries) => {
+ entries.forEach(entry => {
+ if (entry.isIntersecting) {
+ entry.target.classList.add('fade-in');
+ // Optionally unobserve after animation
+ observer.unobserve(entry.target);
+ }
+ });
+ }, observerOptions);
+
+ // Observe all elements with animation classes
+ const animatedElements = document.querySelectorAll('.fade-in, .skill-category, .project-card, .contact-card');
+ animatedElements.forEach(el => observer.observe(el));
+
+ // Lazy loading for images (when added)
+ initializeLazyLoading();
+}
+
+// ==============================================
+// LAZY LOADING FOR IMAGES
+// ==============================================
+
+function initializeLazyLoading() {
+ if ('loading' in HTMLImageElement.prototype) {
+ // Browser supports native lazy loading
+ const images = document.querySelectorAll('img[loading="lazy"]');
+ images.forEach(img => {
+ if (img.dataset.src) {
+ img.src = img.dataset.src;
+ }
+ });
+ } else {
+ // Fallback for browsers that don't support lazy loading
+ const imageObserver = new IntersectionObserver((entries, observer) => {
+ entries.forEach(entry => {
+ if (entry.isIntersecting) {
+ const img = entry.target;
+ if (img.dataset.src) {
+ img.src = img.dataset.src;
+ img.classList.remove('lazy-blur');
+ img.classList.add('loaded');
+ }
+ imageObserver.unobserve(img);
+ }
+ });
+ });
+
+ const lazyImages = document.querySelectorAll('img[data-src]');
+ lazyImages.forEach(img => imageObserver.observe(img));
+ }
+}
+
+// ==============================================
+// ACCESSIBILITY FEATURES
+// ==============================================
+
+function initializeAccessibility() {
+ // Add skip to main content functionality
+ const skipLink = document.querySelector('a[href="#main"]');
+ if (skipLink) {
+ skipLink.addEventListener('click', (e) => {
+ e.preventDefault();
+ const main = document.querySelector('main');
+ if (main) {
+ main.setAttribute('tabindex', '-1');
+ main.focus();
+ }
+ });
+ }
+}
+
+// ==============================================
+// PERFORMANCE: DEBOUNCE FUNCTION
+// ==============================================
+
+function debounce(func, wait) {
+ let timeout;
+ return function executedFunction(...args) {
+ const later = () => {
+ clearTimeout(timeout);
+ func(...args);
+ };
+ clearTimeout(timeout);
+ timeout = setTimeout(later, wait);
+ };
+}
+
+// ==============================================
+// DYNAMIC YEAR IN FOOTER
+// ==============================================
+
+function updateCurrentYear() {
+ const yearElements = document.querySelectorAll('.current-year');
+ const currentYear = new Date().getFullYear();
+ yearElements.forEach(el => {
+ el.textContent = currentYear;
+ });
+}
+
+// ==============================================
+// CONSOLE WELCOME MESSAGE
+// ==============================================
+
+function logWelcomeMessage() {
+ console.log(
+ '%c👋 Welcome to Tech Blog Portfolio!',
+ 'font-size: 20px; font-weight: bold; color: #0ea5e9;'
+ );
+ console.log(
+ '%cInterested in the code? Check out the repository!',
+ 'font-size: 14px; color: #666;'
+ );
+ console.log('✅ Portfolio initialized successfully');
+}
+
+// ==============================================
+// ANALYTICS & PERFORMANCE MONITORING
+// ==============================================
+
+// Track page load time
+window.addEventListener('load', () => {
+ if (window.performance) {
+ const perfData = window.performance.timing;
+ const pageLoadTime = perfData.loadEventEnd - perfData.navigationStart;
+ if (pageLoadTime > 0) {
+ console.log(`Page load time: ${pageLoadTime}ms`);
+ }
+ }
+});
+
+// Track visibility changes (for analytics)
+document.addEventListener('visibilitychange', () => {
+ if (document.hidden) {
+ console.log('Page is hidden');
+ } else {
+ console.log('Page is visible');
+ }
+});
+
+// ==============================================
+// ERROR HANDLING
+// ==============================================
+
+window.addEventListener('error', (e) => {
+ console.error('Global error:', e.error);
+});
+
+window.addEventListener('unhandledrejection', (e) => {
+ console.error('Unhandled promise rejection:', e.reason);
+});
+
+// ==============================================
+// PRINT OPTIMIZATION
+// ==============================================
+
+window.addEventListener('beforeprint', () => {
+ console.log('Preparing to print...');
+});
+
+window.addEventListener('afterprint', () => {
+ console.log('Print completed');
+});
+
+// ==============================================
+// PERFORMANCE: PREFETCH LINKS ON HOVER
+// ==============================================
+
+const prefetchLinks = document.querySelectorAll('a[data-prefetch]');
+
+prefetchLinks.forEach(link => {
+ link.addEventListener('mouseenter', () => {
+ const href = link.getAttribute('href');
+ if (href && !href.startsWith('#')) {
+ const linkElement = document.createElement('link');
+ linkElement.rel = 'prefetch';
+ linkElement.href = href;
+ document.head.appendChild(linkElement);
+ }
+ });
+});
+
+// ==============================================
+// INITIALIZATION COMPLETE
+// ==============================================
diff --git a/style.css b/style.css
new file mode 100644
index 0000000..10a5032
--- /dev/null
+++ b/style.css
@@ -0,0 +1,1663 @@
+/* ==============================================
+ CUSTOM STYLES FOR TECH BLOG PORTFOLIO
+ Modern, accessible, and performant CSS
+ Standalone version - no external dependencies
+ ============================================== */
+
+/* Base Styles & Variables */
+:root {
+ --transition-speed: 0.3s;
+ --ease-out-expo: cubic-bezier(0.19, 1, 0.22, 1);
+
+ /* Color Palette */
+ --primary-50: #f0f9ff;
+ --primary-100: #e0f2fe;
+ --primary-200: #bae6fd;
+ --primary-300: #7dd3fc;
+ --primary-400: #38bdf8;
+ --primary-500: #0ea5e9;
+ --primary-600: #0284c7;
+ --primary-700: #0369a1;
+ --primary-800: #075985;
+ --primary-900: #0c4a6e;
+
+ --gray-50: #f9fafb;
+ --gray-100: #f3f4f6;
+ --gray-200: #e5e7eb;
+ --gray-300: #d1d5db;
+ --gray-400: #9ca3af;
+ --gray-500: #6b7280;
+ --gray-600: #4b5563;
+ --gray-700: #374151;
+ --gray-800: #1f2937;
+ --gray-900: #111827;
+
+ --blue-50: #eff6ff;
+ --blue-600: #2563eb;
+}
+
+/* CSS Reset & Base Styles */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', sans-serif;
+ line-height: 1.6;
+ color: var(--gray-900);
+ background-color: #ffffff;
+ transition: background-color var(--transition-speed), color var(--transition-speed);
+}
+
+/* Dark Mode */
+body.dark {
+ background-color: var(--gray-900);
+ color: var(--gray-100);
+}
+
+/* Container */
+.container {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 0 1.5rem;
+}
+
+/* Utility Classes - Display */
+.hidden {
+ display: none;
+}
+
+.flex {
+ display: flex;
+}
+
+.inline-flex {
+ display: inline-flex;
+}
+
+.grid {
+ display: grid;
+}
+
+/* Utility Classes - Flexbox */
+.items-center {
+ align-items: center;
+}
+
+.justify-center {
+ justify-content: center;
+}
+
+.justify-between {
+ justify-content: space-between;
+}
+
+.flex-col {
+ flex-direction: column;
+}
+
+.flex-wrap {
+ flex-wrap: wrap;
+}
+
+.space-x-4 > * + * {
+ margin-left: 1rem;
+}
+
+.space-x-6 > * + * {
+ margin-left: 1.5rem;
+}
+
+.space-x-8 > * + * {
+ margin-left: 2rem;
+}
+
+.space-y-2 > * + * {
+ margin-top: 0.5rem;
+}
+
+.gap-2 {
+ gap: 0.5rem;
+}
+
+.gap-3 {
+ gap: 0.75rem;
+}
+
+.gap-4 {
+ gap: 1rem;
+}
+
+.gap-6 {
+ gap: 1.5rem;
+}
+
+.gap-8 {
+ gap: 2rem;
+}
+
+.gap-12 {
+ gap: 3rem;
+}
+
+/* Utility Classes - Spacing */
+.p-1 { padding: 0.25rem; }
+.p-2 { padding: 0.5rem; }
+.p-4 { padding: 1rem; }
+.p-6 { padding: 1.5rem; }
+.p-8 { padding: 2rem; }
+
+.px-3 { padding-left: 0.75rem; padding-right: 0.75rem; }
+.px-4 { padding-left: 1rem; padding-right: 1rem; }
+.px-6 { padding-left: 1.5rem; padding-right: 1.5rem; }
+.px-8 { padding-left: 2rem; padding-right: 2rem; }
+
+.py-1 { padding-top: 0.25rem; padding-bottom: 0.25rem; }
+.py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; }
+.py-3 { padding-top: 0.75rem; padding-bottom: 0.75rem; }
+.py-4 { padding-top: 1rem; padding-bottom: 1rem; }
+.py-8 { padding-top: 2rem; padding-bottom: 2rem; }
+.py-20 { padding-top: 5rem; padding-bottom: 5rem; }
+
+.pt-4 { padding-top: 1rem; }
+.pt-20 { padding-top: 5rem; }
+.pb-4 { padding-bottom: 1rem; }
+
+.mb-1 { margin-bottom: 0.25rem; }
+.mb-2 { margin-bottom: 0.5rem; }
+.mb-4 { margin-bottom: 1rem; }
+.mb-6 { margin-bottom: 1.5rem; }
+.mb-8 { margin-bottom: 2rem; }
+.mb-12 { margin-bottom: 3rem; }
+.mb-16 { margin-bottom: 4rem; }
+
+.mt-4 { margin-top: 1rem; }
+.mt-16 { margin-top: 4rem; }
+
+.mx-auto { margin-left: auto; margin-right: auto; }
+
+/* Utility Classes - Sizing */
+.w-5 { width: 1.25rem; }
+.w-6 { width: 1.5rem; }
+.w-8 { width: 2rem; }
+.w-16 { width: 4rem; }
+.w-32 { width: 8rem; }
+.w-full { width: 100%; }
+
+.h-5 { height: 1.25rem; }
+.h-6 { height: 1.5rem; }
+.h-8 { height: 2rem; }
+.h-16 { height: 4rem; }
+.h-32 { height: 8rem; }
+.h-48 { height: 12rem; }
+.h-full { height: 100%; }
+
+.min-h-screen {
+ min-height: 100vh;
+}
+
+.max-w-4xl {
+ max-width: 56rem;
+}
+
+.max-w-6xl {
+ max-width: 72rem;
+}
+
+/* Utility Classes - Positioning */
+.fixed {
+ position: fixed;
+}
+
+.relative {
+ position: relative;
+}
+
+.top-0 { top: 0; }
+.left-0 { left: 0; }
+.right-0 { right: 0; }
+.bottom-0 { bottom: 0; }
+
+.z-50 {
+ z-index: 50;
+}
+
+/* Utility Classes - Typography */
+.text-xs { font-size: 0.75rem; }
+.text-sm { font-size: 0.875rem; }
+.text-xl { font-size: 1.25rem; line-height: 1.75rem; }
+.text-2xl { font-size: 1.5rem; line-height: 2rem; }
+.text-3xl { font-size: 1.875rem; line-height: 2.25rem; }
+.text-4xl { font-size: 2.25rem; line-height: 2.5rem; }
+.text-5xl { font-size: 3rem; line-height: 1; }
+.text-7xl { font-size: 4.5rem; line-height: 1; }
+
+.font-medium { font-weight: 500; }
+.font-semibold { font-weight: 600; }
+.font-bold { font-weight: 700; }
+
+.text-center {
+ text-align: center;
+}
+
+.leading-relaxed {
+ line-height: 1.625;
+}
+
+/* Text Colors */
+.text-white { color: #ffffff; }
+.text-primary-600 { color: var(--primary-600); }
+.text-primary-700 { color: var(--primary-700); }
+.text-gray-600 { color: var(--gray-600); }
+.text-gray-700 { color: var(--gray-700); }
+.text-gray-900 { color: var(--gray-900); }
+
+.dark .text-primary-400 { color: var(--primary-400); }
+.dark .text-primary-300 { color: var(--primary-300); }
+.dark .text-gray-100 { color: var(--gray-100); }
+.dark .text-gray-300 { color: var(--gray-300); }
+.dark .text-gray-400 { color: var(--gray-400); }
+.dark .text-white { color: #ffffff; }
+
+/* Background Colors */
+.bg-white { background-color: #ffffff; }
+.bg-primary-50 { background-color: var(--primary-50); }
+.bg-primary-100 { background-color: var(--primary-100); }
+.bg-gray-50 { background-color: var(--gray-50); }
+.bg-gray-100 { background-color: var(--gray-100); }
+.bg-gray-800 { background-color: var(--gray-800); }
+.bg-gray-900 { background-color: var(--gray-900); }
+
+.dark .bg-white { background-color: var(--gray-900); }
+.dark .bg-gray-50 { background-color: var(--gray-800); }
+.dark .bg-gray-100 { background-color: var(--gray-800); }
+.dark .bg-gray-800 { background-color: var(--gray-700); }
+.dark .bg-gray-900 { background-color: var(--gray-900); }
+
+/* Background Gradients */
+.bg-gradient-to-r {
+ background-image: linear-gradient(to right, var(--tw-gradient-stops));
+}
+
+.bg-gradient-to-br {
+ background-image: linear-gradient(to bottom right, var(--tw-gradient-stops));
+}
+
+.from-primary-50 {
+ --tw-gradient-from: var(--primary-50);
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, transparent);
+}
+
+.from-primary-100 {
+ --tw-gradient-from: var(--primary-100);
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, transparent);
+}
+
+.from-primary-500 {
+ --tw-gradient-from: var(--primary-500);
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, transparent);
+}
+
+.from-primary-600 {
+ --tw-gradient-from: var(--primary-600);
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to, transparent);
+}
+
+.via-white {
+ --tw-gradient-stops: var(--tw-gradient-from), #ffffff, var(--tw-gradient-to, transparent);
+}
+
+.dark .via-gray-900 {
+ --tw-gradient-stops: var(--tw-gradient-from), var(--gray-900), var(--tw-gradient-to, transparent);
+}
+
+.to-blue-50 {
+ --tw-gradient-to: var(--blue-50);
+}
+
+.to-blue-600 {
+ --tw-gradient-to: var(--blue-600);
+}
+
+.dark .to-gray-800 {
+ --tw-gradient-to: var(--gray-800);
+}
+
+.bg-clip-text {
+ -webkit-background-clip: text;
+ background-clip: text;
+ -webkit-text-fill-color: transparent;
+}
+
+.text-transparent {
+ color: transparent;
+}
+
+/* Borders */
+.border { border-width: 1px; }
+.border-2 { border-width: 2px; }
+.border-t { border-top-width: 1px; }
+.border-b { border-bottom-width: 1px; }
+
+.border-gray-200 { border-color: var(--gray-200); }
+.border-primary-600 { border-color: var(--primary-600); }
+
+.dark .border-gray-200 { border-color: var(--gray-800); }
+.dark .border-gray-800 { border-color: var(--gray-800); }
+.dark .border-primary-400 { border-color: var(--primary-400); }
+
+.rounded-lg { border-radius: 0.5rem; }
+.rounded-xl { border-radius: 0.75rem; }
+.rounded-2xl { border-radius: 1rem; }
+.rounded-full { border-radius: 9999px; }
+
+/* Shadows */
+.shadow-lg {
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
+}
+
+.shadow-xl {
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
+}
+
+.shadow-2xl {
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
+}
+
+/* Transitions */
+.transition-colors {
+ transition-property: color, background-color, border-color;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-all {
+ transition-property: all;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.duration-300 {
+ transition-duration: 300ms;
+}
+
+/* Hover Effects */
+.hover\:bg-primary-50:hover {
+ background-color: var(--primary-50);
+}
+
+.hover\:bg-gray-100:hover {
+ background-color: var(--gray-100);
+}
+
+.dark .hover\:bg-gray-700:hover {
+ background-color: var(--gray-700);
+}
+
+.dark .hover\:bg-gray-800:hover {
+ background-color: var(--gray-800);
+}
+
+.hover\:text-primary-600:hover {
+ color: var(--primary-600);
+}
+
+.hover\:text-primary-700:hover {
+ color: var(--primary-700);
+}
+
+.dark .hover\:text-primary-300:hover {
+ color: var(--primary-300);
+}
+
+.dark .hover\:text-primary-400:hover {
+ color: var(--primary-400);
+}
+
+.hover\:scale-105:hover {
+ transform: scale(1.05);
+}
+
+.hover\:scale-110:hover {
+ transform: scale(1.1);
+}
+
+.hover\:-translate-y-2:hover {
+ transform: translateY(-0.5rem);
+}
+
+.hover\:shadow-xl:hover {
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
+}
+
+.hover\:shadow-2xl:hover {
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
+}
+
+/* Aspect Ratio */
+.aspect-square {
+ aspect-ratio: 1 / 1;
+}
+
+/* Backdrop */
+.backdrop-blur-sm {
+ backdrop-filter: blur(4px);
+}
+
+/* Cursor */
+[aria-label],
+button,
+a {
+ cursor: pointer;
+}
+
+/* Focus Ring */
+.focus\:ring-4:focus {
+ box-shadow: 0 0 0 4px rgba(14, 165, 233, 0.3);
+}
+
+/* Animate */
+.animate-bounce {
+ animation: bounce 1s infinite;
+}
+
+@keyframes bounce {
+ 0%, 100% {
+ transform: translateY(-25%);
+ animation-timing-function: cubic-bezier(0.8, 0, 1, 1);
+ }
+ 50% {
+ transform: translateY(0);
+ animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
+ }
+}
+
+/* Smooth Scrolling */
+html {
+ scroll-behavior: smooth;
+}
+
+/* Custom Scrollbar */
+::-webkit-scrollbar {
+ width: 10px;
+}
+
+::-webkit-scrollbar-track {
+ background: #f1f5f9;
+}
+
+.dark ::-webkit-scrollbar-track {
+ background: #1e293b;
+}
+
+::-webkit-scrollbar-thumb {
+ background: #0ea5e9;
+ border-radius: 5px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: #0284c7;
+}
+
+/* Focus Visible for Accessibility */
+*:focus-visible {
+ outline: 2px solid #0ea5e9;
+ outline-offset: 2px;
+}
+
+/* ==============================================
+ NAVIGATION STYLES
+ ============================================== */
+
+.nav-link {
+ color: var(--gray-700);
+ font-weight: 500;
+ position: relative;
+ transition: color var(--transition-speed);
+}
+
+.dark .nav-link {
+ color: var(--gray-300);
+}
+
+.nav-link:hover {
+ color: var(--primary-600);
+}
+
+.dark .nav-link:hover {
+ color: var(--primary-400);
+}
+
+.nav-link::after {
+ content: '';
+ position: absolute;
+ bottom: -4px;
+ left: 0;
+ width: 0;
+ height: 2px;
+ background: linear-gradient(90deg, #0ea5e9, #3b82f6);
+ transition: width var(--transition-speed) var(--ease-out-expo);
+}
+
+.nav-link:hover::after,
+.nav-link.active::after {
+ width: 100%;
+}
+
+.mobile-nav-link {
+ display: block;
+ padding: 0.5rem 1rem;
+ color: var(--gray-700);
+ border-radius: 0.5rem;
+ transition: all var(--transition-speed);
+ font-weight: 500;
+}
+
+.dark .mobile-nav-link {
+ color: var(--gray-300);
+}
+
+.mobile-nav-link:hover {
+ background-color: var(--primary-50);
+ color: var(--primary-600);
+}
+
+.dark .mobile-nav-link:hover {
+ background-color: var(--gray-800);
+ color: var(--primary-400);
+}
+
+/* Header Scroll Effect */
+#header.scrolled {
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
+}
+
+/* ==============================================
+ BUTTON STYLES
+ ============================================== */
+
+.btn-primary {
+ display: inline-block;
+ padding: 0.75rem 2rem;
+ background: linear-gradient(to right, var(--primary-600), var(--blue-600));
+ color: #ffffff;
+ font-weight: 600;
+ border-radius: 0.5rem;
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
+ transition: all 300ms;
+ text-decoration: none;
+}
+
+.btn-primary:hover {
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
+ transform: scale(1.05);
+}
+
+.btn-secondary {
+ display: inline-block;
+ padding: 0.75rem 2rem;
+ background-color: #ffffff;
+ color: var(--primary-600);
+ font-weight: 600;
+ border-radius: 0.5rem;
+ border: 2px solid var(--primary-600);
+ transition: all 300ms;
+ text-decoration: none;
+}
+
+.dark .btn-secondary {
+ background-color: var(--gray-800);
+ color: var(--primary-400);
+ border-color: var(--primary-400);
+}
+
+.btn-secondary:hover {
+ background-color: var(--primary-50);
+ transform: scale(1.05);
+}
+
+.dark .btn-secondary:hover {
+ background-color: var(--gray-700);
+}
+
+/* ==============================================
+ SECTION STYLES
+ ============================================== */
+
+.section-title {
+ font-size: 3rem;
+ font-weight: 700;
+ text-align: center;
+ margin-bottom: 4rem;
+ background: linear-gradient(to right, var(--primary-600), var(--blue-600));
+ -webkit-background-clip: text;
+ background-clip: text;
+ -webkit-text-fill-color: transparent;
+}
+
+/* ==============================================
+ SCROLL INDICATOR
+ ============================================== */
+
+.scroll-indicator {
+ margin-top: 4rem;
+ color: var(--gray-400);
+}
+
+.dark .scroll-indicator {
+ color: var(--gray-600);
+}
+
+/* ==============================================
+ PROJECT CARD STYLES
+ ============================================== */
+
+.project-card {
+ background-color: #ffffff;
+ border-radius: 0.75rem;
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
+ padding: 1.5rem;
+ border: 1px solid var(--gray-200);
+ transition: all 300ms;
+}
+
+.dark .project-card {
+ background-color: var(--gray-900);
+ border-color: var(--gray-800);
+}
+
+.project-card:hover {
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
+ transform: scale(1.05) translateY(-0.5rem);
+}
+
+.project-image-placeholder {
+ width: 100%;
+ height: 12rem;
+ background: linear-gradient(to bottom right, var(--primary-100), var(--blue-100));
+ border-radius: 0.5rem;
+ margin-bottom: 1rem;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.dark .project-image-placeholder {
+ background: linear-gradient(to bottom right, var(--gray-800), var(--gray-700));
+}
+
+.project-tag {
+ font-size: 0.75rem;
+ padding: 0.25rem 0.75rem;
+ background-color: var(--primary-100);
+ color: var(--primary-700);
+ border-radius: 9999px;
+ font-weight: 500;
+}
+
+.dark .project-tag {
+ background-color: rgba(14, 165, 233, 0.2);
+ color: var(--primary-300);
+}
+
+.project-link {
+ color: var(--primary-600);
+ font-weight: 600;
+ display: inline-flex;
+ align-items: center;
+ gap: 0.25rem;
+ transition: color var(--transition-speed);
+ text-decoration: none;
+}
+
+.dark .project-link {
+ color: var(--primary-400);
+}
+
+.project-link:hover {
+ color: var(--primary-700);
+}
+
+.dark .project-link:hover {
+ color: var(--primary-300);
+}
+
+/* ==============================================
+ TECH BADGE STYLES
+ ============================================== */
+
+.tech-badge {
+ padding: 0.5rem 1rem;
+ background: linear-gradient(to right, var(--primary-100), var(--blue-100));
+ color: var(--primary-700);
+ border-radius: 0.5rem;
+ font-weight: 500;
+ font-size: 0.875rem;
+}
+
+.dark .tech-badge {
+ background: linear-gradient(to right, var(--gray-800), var(--gray-700));
+ color: var(--primary-300);
+}
+
+/* ==============================================
+ SKILL CATEGORY STYLES
+ ============================================== */
+
+.skill-category {
+ background-color: #ffffff;
+ border-radius: 0.75rem;
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
+ padding: 1.5rem;
+ border: 1px solid var(--gray-200);
+ transition: all 300ms;
+}
+
+.dark .skill-category {
+ background-color: var(--gray-900);
+ border-color: var(--gray-800);
+}
+
+.skill-category:hover {
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
+ transform: scale(1.05);
+}
+
+.skill-icon {
+ width: 4rem;
+ height: 4rem;
+ background: linear-gradient(to bottom right, var(--primary-500), var(--blue-600));
+ border-radius: 0.5rem;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #ffffff;
+ margin-bottom: 1rem;
+}
+
+.skill-title {
+ font-size: 1.25rem;
+ font-weight: 700;
+ margin-bottom: 1rem;
+ color: var(--gray-900);
+}
+
+.dark .skill-title {
+ color: #ffffff;
+}
+
+.skill-list {
+ list-style: none;
+}
+
+.skill-list li {
+ margin-top: 0.5rem;
+ color: var(--gray-600);
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.dark .skill-list li {
+ color: var(--gray-300);
+}
+
+.skill-list li::before {
+ content: '▹';
+ color: var(--primary-600);
+ font-weight: 700;
+}
+
+.dark .skill-list li::before {
+ color: var(--primary-400);
+}
+
+/* ==============================================
+ CONTACT CARD STYLES
+ ============================================== */
+
+.contact-card {
+ background-color: #ffffff;
+ border-radius: 0.75rem;
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
+ padding: 2rem;
+ border: 1px solid var(--gray-200);
+ transition: all 300ms;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+ text-decoration: none;
+}
+
+.dark .contact-card {
+ background-color: var(--gray-900);
+ border-color: var(--gray-800);
+}
+
+.contact-card:hover {
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
+ transform: scale(1.05);
+}
+
+.social-link {
+ color: var(--gray-600);
+ transition: all 300ms;
+}
+
+.dark .social-link {
+ color: var(--gray-400);
+}
+
+.social-link:hover {
+ color: var(--primary-600);
+ transform: scale(1.1);
+}
+
+.dark .social-link:hover {
+ color: var(--primary-400);
+}
+
+/* ==============================================
+ ANIMATION UTILITIES
+ ============================================== */
+
+/* Fade In Up Animation */
+@keyframes fadeInUp {
+ from {
+ opacity: 0;
+ transform: translateY(30px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.fade-in-up {
+ animation: fadeInUp 0.8s var(--ease-out-expo) forwards;
+}
+
+.fade-in {
+ animation: fadeInUp 0.8s var(--ease-out-expo) forwards;
+}
+
+/* Stagger Animation for Children */
+.fade-in-up > * {
+ opacity: 0;
+ animation: fadeInUp 0.8s var(--ease-out-expo) forwards;
+}
+
+.fade-in-up > *:nth-child(1) { animation-delay: 0.1s; }
+.fade-in-up > *:nth-child(2) { animation-delay: 0.2s; }
+.fade-in-up > *:nth-child(3) { animation-delay: 0.3s; }
+.fade-in-up > *:nth-child(4) { animation-delay: 0.4s; }
+.fade-in-up > *:nth-child(5) { animation-delay: 0.5s; }
+
+/* ==============================================
+ RESPONSIVE ADJUSTMENTS
+ ============================================== */
+
+/* Mobile (md: 768px) */
+@media (min-width: 768px) {
+ .md\:hidden {
+ display: none;
+ }
+
+ .md\:flex {
+ display: flex;
+ }
+
+ .md\:grid-cols-2 {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+
+ .md\:flex-row {
+ flex-direction: row;
+ }
+
+ .md\:text-2xl {
+ font-size: 1.5rem;
+ line-height: 2rem;
+ }
+
+ .md\:text-4xl {
+ font-size: 2.25rem;
+ line-height: 2.5rem;
+ }
+
+ .md\:text-5xl {
+ font-size: 3rem;
+ line-height: 1;
+ }
+
+ .md\:text-7xl {
+ font-size: 4.5rem;
+ line-height: 1;
+ }
+
+ .md\:mb-0 {
+ margin-bottom: 0;
+ }
+}
+
+/* Desktop (lg: 1024px) */
+@media (min-width: 1024px) {
+ .lg\:grid-cols-3 {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ }
+
+ .lg\:grid-cols-4 {
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ }
+}
+
+/* Mobile Optimizations */
+@media (max-width: 768px) {
+ .section-title {
+ font-size: 1.875rem !important;
+ }
+
+ .project-card:hover {
+ transform: scale(1) !important;
+ }
+
+ .skill-category:hover {
+ transform: scale(1) !important;
+ }
+
+ .contact-card:hover {
+ transform: scale(1) !important;
+ }
+}
+
+/* Tablet Adjustments */
+@media (min-width: 768px) and (max-width: 1024px) {
+ .section-title {
+ font-size: 2.25rem;
+ }
+}
+
+/* ==============================================
+ UTILITY CLASSES
+ ============================================== */
+
+/* Glass Morphism Effect */
+.glass {
+ backdrop-filter: blur(10px);
+ background: rgba(255, 255, 255, 0.7);
+}
+
+.dark .glass {
+ background: rgba(17, 24, 39, 0.7);
+}
+
+/* Gradient Text */
+.gradient-text {
+ background: linear-gradient(to right, var(--primary-600), var(--blue-600));
+ -webkit-background-clip: text;
+ background-clip: text;
+ -webkit-text-fill-color: transparent;
+}
+
+/* Card Hover Glow */
+.card-glow:hover {
+ box-shadow: 0 20px 60px rgba(14, 165, 233, 0.3);
+}
+
+.dark .card-glow:hover {
+ box-shadow: 0 20px 60px rgba(14, 165, 233, 0.2);
+}
+
+/* ==============================================
+ LOADING & PERFORMANCE
+ ============================================== */
+
+/* Loading State */
+.loading {
+ opacity: 0;
+}
+
+.loaded {
+ opacity: 1;
+ transition: opacity 0.3s ease-in;
+}
+
+/* Lazy Load Blur Effect */
+.lazy-blur {
+ filter: blur(10px);
+ transition: filter 0.3s ease-in;
+}
+
+.lazy-blur.loaded {
+ filter: blur(0);
+}
+
+/* Reduce Motion for Accessibility */
+@media (prefers-reduced-motion: reduce) {
+ *,
+ *::before,
+ *::after {
+ animation-duration: 0.01ms !important;
+ animation-iteration-count: 1 !important;
+ transition-duration: 0.01ms !important;
+ scroll-behavior: auto !important;
+ }
+}
+
+/* ==============================================
+ PRINT STYLES
+ ============================================== */
+
+@media print {
+ header,
+ footer,
+ .no-print {
+ display: none;
+ }
+
+ body {
+ background: white;
+ color: black;
+ }
+
+ a {
+ text-decoration: underline;
+ }
+
+ a[href^="http"]::after {
+ content: " (" attr(href) ")";
+ }
+}
+
+/* ==============================================
+ DARK MODE SPECIFIC ADJUSTMENTS
+ ============================================== */
+
+.dark {
+ color-scheme: dark;
+}
+
+/* Dark mode image adjustments */
+.dark img {
+ opacity: 0.9;
+}
+
+.dark img:hover {
+ opacity: 1;
+}
+
+/* ==============================================
+ MODERN SHADCN-INSPIRED UI COMPONENTS
+ ============================================== */
+
+/* Enhanced Card Styles with Shadcn aesthetics */
+.modern-card {
+ background: white;
+ border: 1px solid var(--gray-200);
+ border-radius: 0.75rem;
+ padding: 1.5rem;
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
+}
+
+.dark .modern-card {
+ background: var(--gray-800);
+ border-color: var(--gray-700);
+}
+
+.modern-card:hover {
+ border-color: var(--primary-500);
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
+ transform: translateY(-2px);
+}
+
+/* Modern Button Variants (Shadcn-style) */
+.btn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0.625rem 1.5rem;
+ font-size: 0.875rem;
+ font-weight: 500;
+ line-height: 1.25rem;
+ border-radius: 0.5rem;
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
+ cursor: pointer;
+ border: none;
+ text-decoration: none;
+ white-space: nowrap;
+}
+
+.btn-default {
+ background: white;
+ color: var(--gray-900);
+ border: 1px solid var(--gray-300);
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
+}
+
+.dark .btn-default {
+ background: var(--gray-800);
+ color: var(--gray-100);
+ border-color: var(--gray-700);
+}
+
+.btn-default:hover {
+ background: var(--gray-50);
+ border-color: var(--gray-400);
+}
+
+.dark .btn-default:hover {
+ background: var(--gray-700);
+}
+
+.btn-ghost {
+ background: transparent;
+ color: var(--gray-700);
+ border: none;
+}
+
+.dark .btn-ghost {
+ color: var(--gray-300);
+}
+
+.btn-ghost:hover {
+ background: var(--gray-100);
+ color: var(--gray-900);
+}
+
+.dark .btn-ghost:hover {
+ background: var(--gray-800);
+ color: var(--gray-100);
+}
+
+.btn-outline {
+ background: transparent;
+ color: var(--primary-600);
+ border: 1px solid var(--primary-600);
+}
+
+.dark .btn-outline {
+ color: var(--primary-400);
+ border-color: var(--primary-400);
+}
+
+.btn-outline:hover {
+ background: var(--primary-600);
+ color: white;
+}
+
+.dark .btn-outline:hover {
+ background: var(--primary-500);
+}
+
+/* Modern Badge Component */
+.badge {
+ display: inline-flex;
+ align-items: center;
+ padding: 0.125rem 0.625rem;
+ font-size: 0.75rem;
+ font-weight: 500;
+ border-radius: 9999px;
+ border: 1px solid transparent;
+ white-space: nowrap;
+}
+
+.badge-default {
+ background: var(--gray-100);
+ color: var(--gray-900);
+ border-color: var(--gray-200);
+}
+
+.dark .badge-default {
+ background: var(--gray-800);
+ color: var(--gray-100);
+ border-color: var(--gray-700);
+}
+
+.badge-primary {
+ background: var(--primary-100);
+ color: var(--primary-700);
+ border-color: var(--primary-200);
+}
+
+.dark .badge-primary {
+ background: rgba(14, 165, 233, 0.2);
+ color: var(--primary-300);
+ border-color: rgba(14, 165, 233, 0.3);
+}
+
+.badge-outline {
+ background: transparent;
+ color: var(--gray-700);
+ border-color: var(--gray-300);
+}
+
+.dark .badge-outline {
+ color: var(--gray-300);
+ border-color: var(--gray-700);
+}
+
+/* Input Field Styling (Shadcn-inspired) */
+.input {
+ display: flex;
+ width: 100%;
+ padding: 0.625rem 0.75rem;
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+ color: var(--gray-900);
+ background: white;
+ border: 1px solid var(--gray-300);
+ border-radius: 0.5rem;
+ transition: all 0.2s;
+ outline: none;
+}
+
+.dark .input {
+ background: var(--gray-800);
+ color: var(--gray-100);
+ border-color: var(--gray-700);
+}
+
+.input:focus {
+ border-color: var(--primary-500);
+ ring: 2px;
+ ring-color: var(--primary-200);
+}
+
+.dark .input:focus {
+ ring-color: rgba(14, 165, 233, 0.3);
+}
+
+.input::placeholder {
+ color: var(--gray-400);
+}
+
+/* Textarea Styling */
+.textarea {
+ min-height: 100px;
+ resize: vertical;
+}
+
+/* Separator/Divider Component */
+.separator {
+ height: 1px;
+ background: var(--gray-200);
+ margin: 1.5rem 0;
+}
+
+.dark .separator {
+ background: var(--gray-800);
+}
+
+/* Modern Alert/Notification Component */
+.alert {
+ position: relative;
+ padding: 1rem;
+ border-radius: 0.5rem;
+ border: 1px solid;
+ margin-bottom: 1rem;
+}
+
+.alert-info {
+ background: var(--primary-50);
+ border-color: var(--primary-200);
+ color: var(--primary-800);
+}
+
+.dark .alert-info {
+ background: rgba(14, 165, 233, 0.1);
+ border-color: rgba(14, 165, 233, 0.3);
+ color: var(--primary-300);
+}
+
+/* Enhanced Glassmorphism Effect */
+.glass-card {
+ background: rgba(255, 255, 255, 0.8);
+ backdrop-filter: blur(12px);
+ -webkit-backdrop-filter: blur(12px);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.15);
+}
+
+.dark .glass-card {
+ background: rgba(31, 41, 55, 0.8);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+}
+
+/* Accordion/Collapsible Component */
+.accordion-item {
+ border: 1px solid var(--gray-200);
+ border-radius: 0.5rem;
+ margin-bottom: 0.5rem;
+ overflow: hidden;
+}
+
+.dark .accordion-item {
+ border-color: var(--gray-800);
+}
+
+.accordion-trigger {
+ width: 100%;
+ padding: 1rem;
+ background: white;
+ border: none;
+ text-align: left;
+ cursor: pointer;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ font-weight: 500;
+ transition: background 0.2s;
+}
+
+.dark .accordion-trigger {
+ background: var(--gray-900);
+ color: var(--gray-100);
+}
+
+.accordion-trigger:hover {
+ background: var(--gray-50);
+}
+
+.dark .accordion-trigger:hover {
+ background: var(--gray-800);
+}
+
+.accordion-content {
+ padding: 1rem;
+ background: var(--gray-50);
+}
+
+.dark .accordion-content {
+ background: var(--gray-800);
+}
+
+/* Skeleton Loading Component */
+.skeleton {
+ background: linear-gradient(
+ 90deg,
+ var(--gray-200) 25%,
+ var(--gray-300) 50%,
+ var(--gray-200) 75%
+ );
+ background-size: 200% 100%;
+ animation: skeleton-loading 1.5s ease-in-out infinite;
+ border-radius: 0.25rem;
+}
+
+.dark .skeleton {
+ background: linear-gradient(
+ 90deg,
+ var(--gray-800) 25%,
+ var(--gray-700) 50%,
+ var(--gray-800) 75%
+ );
+}
+
+@keyframes skeleton-loading {
+ 0% {
+ background-position: 200% 0;
+ }
+ 100% {
+ background-position: -200% 0;
+ }
+}
+
+/* Tooltip Component */
+.tooltip {
+ position: relative;
+ display: inline-block;
+}
+
+.tooltip-content {
+ position: absolute;
+ bottom: 100%;
+ left: 50%;
+ transform: translateX(-50%) translateY(-8px);
+ padding: 0.5rem 0.75rem;
+ background: var(--gray-900);
+ color: white;
+ font-size: 0.75rem;
+ border-radius: 0.375rem;
+ white-space: nowrap;
+ opacity: 0;
+ pointer-events: none;
+ transition: opacity 0.2s, transform 0.2s;
+ z-index: 50;
+}
+
+.tooltip:hover .tooltip-content {
+ opacity: 1;
+ transform: translateX(-50%) translateY(-4px);
+}
+
+/* Progress Bar Component */
+.progress {
+ width: 100%;
+ height: 0.5rem;
+ background: var(--gray-200);
+ border-radius: 9999px;
+ overflow: hidden;
+}
+
+.dark .progress {
+ background: var(--gray-800);
+}
+
+.progress-bar {
+ height: 100%;
+ background: linear-gradient(to right, var(--primary-500), var(--primary-600));
+ border-radius: 9999px;
+ transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+/* Enhanced Hover Ring Effect */
+.ring-hover {
+ transition: all 0.2s;
+}
+
+.ring-hover:hover {
+ box-shadow: 0 0 0 3px var(--primary-200);
+}
+
+.dark .ring-hover:hover {
+ box-shadow: 0 0 0 3px rgba(14, 165, 233, 0.3);
+}
+
+/* Modern Checkbox Styling */
+.checkbox {
+ width: 1.25rem;
+ height: 1.25rem;
+ border: 2px solid var(--gray-300);
+ border-radius: 0.25rem;
+ cursor: pointer;
+ transition: all 0.2s;
+}
+
+.checkbox:checked {
+ background: var(--primary-600);
+ border-color: var(--primary-600);
+}
+
+.dark .checkbox {
+ border-color: var(--gray-700);
+ background: var(--gray-800);
+}
+
+.dark .checkbox:checked {
+ background: var(--primary-500);
+ border-color: var(--primary-500);
+}
+
+/* Switch/Toggle Component */
+.switch {
+ position: relative;
+ display: inline-block;
+ width: 44px;
+ height: 24px;
+}
+
+.switch input {
+ opacity: 0;
+ width: 0;
+ height: 0;
+}
+
+.switch-slider {
+ position: absolute;
+ cursor: pointer;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background-color: var(--gray-300);
+ transition: 0.3s;
+ border-radius: 34px;
+}
+
+.switch-slider:before {
+ position: absolute;
+ content: "";
+ height: 18px;
+ width: 18px;
+ left: 3px;
+ bottom: 3px;
+ background-color: white;
+ transition: 0.3s;
+ border-radius: 50%;
+}
+
+.switch input:checked + .switch-slider {
+ background-color: var(--primary-600);
+}
+
+.switch input:checked + .switch-slider:before {
+ transform: translateX(20px);
+}
+
+.dark .switch-slider {
+ background-color: var(--gray-700);
+}
+
+/* Enhanced Project Cards with Modern UI */
+.project-card {
+ background-color: #ffffff;
+ border-radius: 0.75rem;
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
+ padding: 1.5rem;
+ border: 1px solid var(--gray-200);
+ transition: all 300ms cubic-bezier(0.4, 0, 0.2, 1);
+ position: relative;
+ overflow: hidden;
+}
+
+.dark .project-card {
+ background-color: var(--gray-800);
+ border-color: var(--gray-700);
+}
+
+.project-card::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 3px;
+ background: linear-gradient(to right, var(--primary-500), var(--blue-600));
+ transform: scaleX(0);
+ transition: transform 0.3s ease;
+}
+
+.project-card:hover::before {
+ transform: scaleX(1);
+}
+
+.project-card:hover {
+ border-color: var(--primary-300);
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
+ transform: translateY(-4px);
+}
+
+/* Enhanced Skill Cards */
+.skill-category {
+ background-color: #ffffff;
+ border-radius: 0.75rem;
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);
+ padding: 1.5rem;
+ border: 1px solid var(--gray-200);
+ transition: all 300ms cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.dark .skill-category {
+ background-color: var(--gray-800);
+ border-color: var(--gray-700);
+}
+
+.skill-category:hover {
+ border-color: var(--primary-400);
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
+ transform: translateY(-2px);
+}
+
+/* Modern Contact Cards */
+.contact-card {
+ background-color: #ffffff;
+ border-radius: 0.75rem;
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);
+ padding: 2rem;
+ border: 1px solid var(--gray-200);
+ transition: all 300ms cubic-bezier(0.4, 0, 0.2, 1);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+ text-decoration: none;
+ position: relative;
+ overflow: hidden;
+}
+
+.dark .contact-card {
+ background-color: var(--gray-800);
+ border-color: var(--gray-700);
+}
+
+.contact-card:hover {
+ border-color: var(--primary-400);
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
+ transform: translateY(-4px);
+}
+
+/* Ripple Effect for Interactive Elements */
+@keyframes ripple {
+ to {
+ transform: scale(4);
+ opacity: 0;
+ }
+}
+
+.ripple-effect {
+ position: relative;
+ overflow: hidden;
+}
+
+.ripple-effect::after {
+ content: "";
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 0;
+ height: 0;
+ border-radius: 50%;
+ background: rgba(255, 255, 255, 0.5);
+ transform: translate(-50%, -50%);
+ transition: width 0.6s, height 0.6s;
+}
+
+.ripple-effect:active::after {
+ width: 200px;
+ height: 200px;
+ animation: ripple 0.6s ease-out;
+}