Sliding menus have become a staple in modern web design, offering a sleek and efficient way to navigate websites. These menus not only enhance user experience but also add a touch of sophistication to any interface.
In this article, we will explore ten exemplary sliding menu designs that showcase creativity and functionality. Each example highlights unique features and design elements that can inspire your next project.
CODE1
Here's the code:
CODETEXT1
CODE2
Here's the code:
CODETEXT2
CODE3
Here's the code:
CODETEXT3
CODE4
Here's the code:
CODETEXT4
CODE5
Here's the code:
CODETEXT5
Subframe's drag-and-drop interface and intuitive, responsive canvas make designing pixel-perfect sliding menus a breeze. Loved by designers and developers alike, it ensures your UI is both stunning and functional.
Start for free and experience the ease of creating beautiful interfaces with Subframe today!
CODE6
Here's the code:
CODETEXT6
CODE7
Here's the code:
CODETEXT7
CODE8
Here's the code:
CODETEXT8
CODE9
Here's the code:
CODETEXT9
CODE10
Here's the code:
CODETEXT10
Ready to elevate your UI design game? With Subframe, you can create pixel-perfect sliding menus and stunning interfaces in minutes. Our drag-and-drop editor ensures efficiency and precision.
Start for free and begin designing beautiful, functional UIs right away. Experience the ease and power of Subframe today!
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>NomadMarket - Mobile Navigation</title> <style> :root { --primary: #f6f6f6; --secondary: #333333; --accent: #3d7c8a; --accent-light: #76b2c0; --neutral-light: #e5e5e5; --neutral-mid: #999999; --neutral-dark: #4a4a4a; --success: #64a36f; --spacer: 16px; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; -webkit-tap-highlight-color: transparent; } body { background-color: var(--primary); color: var(--secondary); height: 100vh; max-height: 700px; width: 100%; max-width: 700px; margin: 0 auto; overflow: hidden; position: relative; } .mobile-frame { width: 100%; height: 100%; max-width: 414px; max-height: 700px; margin: 0 auto; position: relative; overflow: hidden; background-color: var(--primary); box-shadow: 0 0 40px rgba(0, 0, 0, 0.1); border-radius: 24px; } .status-bar { height: 44px; width: 100%; background-color: var(--primary); display: flex; justify-content: space-between; align-items: center; padding: 0 var(--spacer); position: relative; z-index: 10; } .status-bar__time { font-weight: 600; font-size: 14px; } .status-bar__icons { display: flex; gap: 5px; } .status-bar__icons svg { height: 16px; } .header { display: flex; justify-content: space-between; align-items: center; height: 60px; padding: 0 var(--spacer); background-color: var(--primary); position: relative; z-index: 10; border-bottom: 1px solid var(--neutral-light); } .header__logo { font-weight: 700; font-size: 20px; color: var(--accent); } .header__icons { display: flex; gap: 20px; } .header__icon { position: relative; cursor: pointer; } .header__icon-badge { position: absolute; top: -6px; right: -6px; width: 18px; height: 18px; background-color: var(--accent); border-radius: 50%; color: white; font-size: 10px; display: flex; align-items: center; justify-content: center; font-weight: 600; } .nav-toggle { background: none; border: none; cursor: pointer; display: flex; flex-direction: column; gap: 5px; justify-content: center; padding: 8px; transition: all 0.3s ease; z-index: 101; } .nav-toggle__line { width: 22px; height: 2px; background-color: var(--secondary); transition: all 0.3s ease; transform-origin: center; } .nav-open .nav-toggle__line:nth-child(1) { transform: translateY(7px) rotate(45deg); } .nav-open .nav-toggle__line:nth-child(2) { opacity: 0; } .nav-open .nav-toggle__line:nth-child(3) { transform: translateY(-7px) rotate(-45deg); } .overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.4); opacity: 0; pointer-events: none; transition: opacity 0.35s ease; z-index: 90; } .nav-open .overlay { opacity: 1; pointer-events: auto; } .side-nav { position: fixed; top: 0; left: 0; width: 80%; max-width: 320px; height: 100%; background-color: var(--primary); transform: translateX(-100%); transition: transform 0.35s cubic-bezier(0.16, 1, 0.3, 1); z-index: 100; padding: 60px 0 20px; display: flex; flex-direction: column; justify-content: space-between; overflow-y: auto; } .nav-open .side-nav { transform: translateX(0); box-shadow: 2px 0 20px rgba(0, 0, 0, 0.15); } .side-nav__user { display: flex; align-items: center; gap: 12px; padding: 0 var(--spacer); margin-bottom: 30px; } .side-nav__avatar { width: 48px; height: 48px; border-radius: 50%; background-color: var(--accent-light); display: flex; align-items: center; justify-content: center; color: white; font-weight: 600; font-size: 18px; } .side-nav__welcome { flex: 1; } .side-nav__greeting { font-size: 14px; color: var(--neutral-mid); margin-bottom: 4px; } .side-nav__name { font-weight: 600; font-size: 16px; } .nav-section { margin-bottom: 24px; } .nav-section__title { text-transform: uppercase; font-size: 12px; font-weight: 600; color: var(--neutral-mid); letter-spacing: 0.5px; padding: 8px var(--spacer); } .nav-list { list-style: none; } .nav-list__item { position: relative; } .nav-list__link { display: flex; align-items: center; gap: 14px; padding: 14px var(--spacer); text-decoration: none; color: var(--secondary); font-size: 16px; transition: all 0.2s ease; position: relative; } .nav-list__link::after { content: ''; position: absolute; left: 0; top: 0; width: 4px; height: 100%; background-color: var(--accent); opacity: 0; transition: opacity 0.2s ease; } .nav-list__link:hover, .nav-list__link.active { background-color: rgba(61, 124, 138, 0.08); color: var(--accent); } .nav-list__link.active::after { opacity: 1; } .nav-list__icon { display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; color: var(--neutral-dark); transition: color 0.2s ease; } .nav-list__link:hover .nav-list__icon, .nav-list__link.active .nav-list__icon { color: var(--accent); } .nav-list__badge { position: absolute; right: var(--spacer); top: 50%; transform: translateY(-50%); background-color: var(--success); color: white; font-size: 10px; padding: 2px 8px; border-radius: 10px; font-weight: 600; } .side-nav__footer { margin-top: auto; padding: 20px var(--spacer); border-top: 1px solid var(--neutral-light); } .app-version { text-align: center; font-size: 12px; color: var(--neutral-mid); margin-top: 10px; } .signout-btn { display: flex; align-items: center; justify-content: center; gap: 8px; width: 100%; padding: 12px; border: 1px solid var(--neutral-light); border-radius: 8px; background: none; color: var(--secondary); font-size: 14px; font-weight: 500; cursor: pointer; transition: all 0.2s ease; } .signout-btn:hover { background-color: var(--neutral-light); } .main-content { height: calc(100vh - 104px); overflow-y: auto; transition: transform 0.35s cubic-bezier(0.16, 1, 0.3, 1); padding: var(--spacer); position: relative; z-index: 1; } .nav-open .main-content { transform: translateX(20px) scale(0.95); border-radius: 16px; overflow: hidden; pointer-events: none; } .search-bar { width: 100%; position: relative; margin-bottom: 20px; } .search-bar__input { width: 100%; padding: 12px 16px 12px 40px; border: none; border-radius: 8px; background-color: var(--neutral-light); font-size: 15px; transition: all 0.2s ease; } .search-bar__input:focus { outline: none; background-color: white; box-shadow: 0 2px 10px rgba(0,0,0,0.08); } .search-bar__icon { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); color: var(--neutral-dark); } .categories { display: flex; gap: 10px; margin-bottom: 24px; padding-bottom: 10px; overflow-x: auto; scrollbar-width: none; } .categories::-webkit-scrollbar { display: none; } .category-item { flex: 0 0 auto; padding: 8px 16px; border-radius: 20px; font-size: 14px; cursor: pointer; transition: all 0.2s ease; white-space: nowrap; border: 1px solid var(--neutral-light); } .category-item.active { background-color: var(--accent); color: white; border-color: var(--accent); } .products-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; padding-bottom: 20px; } .product-card { background-color: white; border-radius: 12px; overflow: hidden; box-shadow: 0 2px 10px rgba(0,0,0,0.04); transition: all 0.3s ease; } .product-card:hover { transform: translateY(-4px); box-shadow: 0 10px 20px rgba(0,0,0,0.08); } .product-card__image { width: 100%; height: 140px; object-fit: cover; background-color: var(--neutral-light); } .product-card__content { padding: 12px; } .product-card__name { font-size: 14px; font-weight: 600; margin-bottom: 4px; line-height: 1.3; } .product-card__price { font-size: 14px; font-weight: 700; color: var(--accent); } /* Animation keyframes */ @keyframes slideIn { from { transform: translateY(20px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } .product-card { animation: slideIn 0.4s ease forwards; opacity: 0; } .product-card:nth-child(1) { animation-delay: 0.1s; } .product-card:nth-child(2) { animation-delay: 0.2s; } .product-card:nth-child(3) { animation-delay: 0.3s; } .product-card:nth-child(4) { animation-delay: 0.4s; } /* Touch feedback effects */ .nav-list__link, .category-item, .product-card, .signout-btn { position: relative; overflow: hidden; } .ripple { position: absolute; background: rgba(255, 255, 255, 0.7); border-radius: 50%; transform: scale(0); animation: ripple 0.6s linear; pointer-events: none; } @keyframes ripple { to { transform: scale(4); opacity: 0; } } /* Notification dot pulse animation */ @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.1); } 100% { transform: scale(1); } } .header__icon-badge { animation: pulse 1.5s infinite; } /* Responsive adjustments */ @media (max-width: 375px) { .products-grid { gap: 12px; } .product-card__image { height: 120px; } .product-card__content { padding: 10px; } } </style> </head> <body> <div class="mobile-frame"> <div class="status-bar"> <div class="status-bar__time">9:41</div> <div class="status-bar__icons"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M18 10a6 6 0 0 0-12 0v4m12-4v4m-6-10v2m3.5 1.5l1.5-1.5m-10.5 0l1.5 1.5M2 16h20"></path> </svg> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M20 8h-2.3M20 12h-3M20 16h-2.3M4 8h2.3M4 12h3M4 16h2.3M12 4v16"></path> </svg> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M18 11V6a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v0M18 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2zM6 18h.01M10 18h.01"></path> </svg> </div> </div> <header class="header"> <button class="nav-toggle"> <span class="nav-toggle__line"></span> <span class="nav-toggle__line"></span> <span class="nav-toggle__line"></span> </button> <div class="header__logo">NomadMarket</div> <div class="header__icons"> <div class="header__icon"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M21 8a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3m18 0v8a3 3 0 0 1-3 3H7a3 3 0 0 1-3-3V8m18 0l-6.5-6.5C15.2 1.2 14.8 1 14.4 1H9.6c-.4 0-.8.2-1.1.5L2 8"></path> <circle cx="9" cy="19" r="1"></circle> <circle cx="15" cy="19" r="1"></circle> </svg> <span class="header__icon-badge">3</span> </div> <div class="header__icon"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M12 20s-8-4.5-8-8.3a8.3 8.3 0 0 1 16.6 0c0 3.8-8 8.3-8 8.3z"></path> <circle cx="12" cy="10" r="3"></circle> </svg> </div> </div> </header> <div class="overlay"></div> <nav class="side-nav"> <div> <div class="side-nav__user"> <div class="side-nav__avatar">JD</div> <div class="side-nav__welcome"> <div class="side-nav__greeting">Welcome back,</div> <div class="side-nav__name">Jamie Doe</div> </div> </div> <div class="nav-section"> <div class="nav-section__title">Shop</div> <ul class="nav-list"> <li class="nav-list__item"> <a href="#" class="nav-list__link active"> <div class="nav-list__icon"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path> <polyline points="9 22 9 12 15 12 15 22"></polyline> </svg> </div> Home </a> </li> <li class="nav-list__item"> <a href="#" class="nav-list__link"> <div class="nav-list__icon"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <rect x="2" y="3" width="20" height="14" rx="2" ry="2"></rect> <line x1="8" y1="21" x2="16" y2="21"></line> <line x1="12" y1="17" x2="12" y2="21"></line> </svg> </div> New Arrivals <span class="nav-list__badge">New</span> </a> </li> <li class="nav-list__item"> <a href="#" class="nav-list__link"> <div class="nav-list__icon"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z"></path> <line x1="3" y1="6" x2="21" y2="6"></line> <path d="M16 10a4 4 0 0 1-8 0"></path> </svg> </div> Collections </a> </li> <li class="nav-list__item"> <a href="#" class="nav-list__link"> <div class="nav-list__icon"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <circle cx="9" cy="21" r="1"></circle> <circle cx="20" cy="21" r="1"></circle> <path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"></path> </svg> </div> Cart </a> </li> </ul> </div> <div class="nav-section"> <div class="nav-section__title">Account</div> <ul class="nav-list"> <li class="nav-list__item"> <a href="#" class="nav-list__link"> <div class="nav-list__icon"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"></path> <circle cx="12" cy="7" r="4"></circle> </svg> </div> My Profile </a> </li> <li class="nav-list__item"> <a href="#" class="nav-list__link"> <div class="nav-list__icon"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z"></path> </svg> </div> Wishlist </a> </li> <li class="nav-list__item"> <a href="#" class="nav-list__link"> <div class="nav-list__icon"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <rect x="1" y="4" width="22" height="16" rx="2" ry="2"></rect> <line x1="1" y1="10" x2="23" y2="10"></line> </svg> </div> Payment Methods </a> </li> <li class="nav-list__item"> <a href="#" class="nav-list__link"> <div class="nav-list__icon"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path> </svg> </div> Order History </a> </li> </ul> </div> </div> <div class="side-nav__footer"> <button class="signout-btn"> <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"></path> <polyline points="16 17 21 12 16 7"></polyline> <line x1="21" y1="12" x2="9" y2="12"></line> </svg> Sign Out </button> <div class="app-version">Version 2.4.1</div> </div> </nav> <main class="main-content"> <div class="search-bar"> <div class="search-bar__icon"> <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <circle cx="11" cy="11" r="8"></circle> <line x1="21" y1="21" x2="16.65" y2="16.65"></line> </svg> </div> <input type="text" class="search-bar__input" placeholder="Search sustainable products..."> </div> <div class="categories"> <div class="category-item active">All Items</div> <div class="category-item">Essentials</div> <div class="category-item">Homeware</div> <div class="category-item">Travel Gear</div> <div class="category-item">Eco-friendly</div> </div> <div class="products-grid"> <div class="product-card"> <div class="product-card__image" style="background-image: url('https://images.unsplash.com/photo-1583394838336-acd977736f90?ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=80'); background-size: cover; background-position: center;"></div> <div class="product-card__content"> <div class="product-card__name">Bamboo Travel Utensil Set</div> <div class="product-card__price">$24.99</div> </div> </div> <div class="product-card"> <div class="product-card__image" style="background-image: url('https://images.unsplash.com/photo-1585914924626-15adac1e6402?ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=80'); background-size: cover; background-position: center;"></div> <div class="product-card__content"> <div class="product-card__name">Organic Cotton Travel Tote</div> <div class="product-card__price">$38.50</div> </div> </div> <div class="product-card"> <div class="product-card__image" style="background-image: url('https://images.unsplash.com/photo-1587500036195-23a7b14a36ef?ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=80'); background-size: cover; background-position: center;"></div> <div class="product-card__content"> <div class="product-card__name">Reusable Silicone Food Pouches</div> <div class="product-card__price">$16.75</div> </div> </div> <div class="product-card"> <div class="product-card__image" style="background-image: url('https://images.unsplash.com/photo-1595188525426-2a7138c5bd04?ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=80'); background-size: cover; background-position: center;"></div> <div class="product-card__content"> <div class="product-card__name">Recycled Glass Water Bottle</div> <div class="product-card__price">$32.00</div> </div> </div> </div> </main> </div> <script> // Toggle navigation menu const navToggle = document.querySelector('.nav-toggle'); const body = document.querySelector('body'); const overlay = document.querySelector('.overlay'); navToggle.addEventListener('click', () => { body.classList.toggle('nav-open'); }); overlay.addEventListener('click', () => { body.classList.remove('nav-open'); }); // Touch ripple effect const rippleElements = document.querySelectorAll('.nav-list__link, .category-item, .product-card, .signout-btn'); rippleElements.forEach(element => { element.addEventListener('touchstart', function(e) { const rect = this.getBoundingClientRect(); const x = e.touches[0].clientX - rect.left; const y = e.touches[0].clientY - rect.top; const ripple = document.createElement('span'); ripple.classList.add('ripple'); ripple.style.left = x + 'px'; ripple.style.top = y + 'px'; this.appendChild(ripple); setTimeout(() => { ripple.remove(); }, 600); }); }); // Category selection const categoryItems = document.querySelectorAll('.category-item'); categoryItems.forEach(item => { item.addEventListener('click', () => { categoryItems.forEach(i => i.classList.remove('active')); item.classList.add('active'); }); }); // Swipe to close navigation let touchStartX = 0; let touchEndX = 0; const sideNav = document.querySelector('.side-nav'); sideNav.addEventListener('touchstart', e => { touchStartX = e.changedTouches[0].screenX; }, false); sideNav.addEventListener('touchend', e => { touchEndX = e.changedTouches[0].screenX; handleSwipe(); }, false); function handleSwipe() { if (touchStartX - touchEndX > 50) { body.classList.remove('nav-open'); } } </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Enterprise Dashboard Sidebar</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } :root { --primary: #2a52be; --primary-dark: #1a3c8a; --secondary: #445e93; --accent: #5f9ea0; --text-light: #f8f9fa; --text-dark: #343a40; --bg-light: #f8f9fa; --bg-dark: #212529; --success: #28a745; --warning: #ffc107; --danger: #dc3545; --info: #17a2b8; --shadow: 0 4px 6px rgba(0, 0, 0, 0.1); --transition: all 0.3s ease; } body { background-color: #f0f2f5; display: flex; height: 100vh; overflow: hidden; } .dashboard-container { display: flex; width: 100%; height: 100%; transition: var(--transition); position: relative; } /* Sidebar Styles */ .sidebar { width: 280px; height: 100%; background: linear-gradient(145deg, var(--primary), var(--primary-dark)); color: var(--text-light); transition: var(--transition); box-shadow: var(--shadow); position: relative; z-index: 100; transform: translateX(0); } .sidebar.collapsed { transform: translateX(-280px); } .sidebar-header { padding: 20px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid rgba(255, 255, 255, 0.1); } .logo { display: flex; align-items: center; gap: 10px; } .logo-icon { font-size: 24px; } .logo-text { font-size: 18px; font-weight: 600; letter-spacing: 0.5px; } .toggle-btn { background: transparent; border: none; color: var(--text-light); cursor: pointer; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; border-radius: 4px; transition: var(--transition); } .toggle-btn:hover { background: rgba(255, 255, 255, 0.1); } .sidebar-content { height: calc(100% - 76px); overflow-y: auto; padding: 10px 0; } .sidebar-content::-webkit-scrollbar { width: 5px; } .sidebar-content::-webkit-scrollbar-track { background: rgba(255, 255, 255, 0.05); } .sidebar-content::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.2); border-radius: 10px; } .nav-section { margin-bottom: 20px; } .section-title { font-size: 11px; text-transform: uppercase; letter-spacing: 1px; padding: 10px 20px; opacity: 0.7; font-weight: 600; } .nav-item { padding: 0; transition: var(--transition); } .nav-link { display: flex; align-items: center; padding: 12px 20px; color: var(--text-light); text-decoration: none; transition: var(--transition); position: relative; cursor: pointer; } .nav-link:hover { background: rgba(255, 255, 255, 0.1); } .nav-link.active { background: rgba(255, 255, 255, 0.15); border-left: 3px solid var(--accent); } .nav-icon { margin-right: 10px; font-size: 18px; width: 24px; text-align: center; } .nav-text { flex-grow: 1; font-weight: 500; } .nav-badge { background: var(--accent); border-radius: 10px; padding: 2px 8px; font-size: 10px; font-weight: bold; } .dropdown-indicator { transition: var(--transition); } .dropdown-indicator.open { transform: rotate(180deg); } .subnav { background-color: rgba(0, 0, 0, 0.15); max-height: 0; overflow: hidden; transition: max-height 0.3s ease; } .subnav.open { max-height: 500px; } .subnav-link { padding: 10px 20px 10px 54px; display: block; color: var(--text-light); text-decoration: none; opacity: 0.8; transition: var(--transition); font-size: 14px; } .subnav-link:hover { opacity: 1; background: rgba(255, 255, 255, 0.05); } .subnav-link.active { background: rgba(255, 255, 255, 0.1); opacity: 1; } /* Main content area */ .main-content { flex-grow: 1; overflow-y: auto; padding: 20px; transition: var(--transition); background-color: var(--bg-light); } .top-bar { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; padding-bottom: 15px; border-bottom: 1px solid #e1e5eb; } .page-title { font-size: 24px; font-weight: 600; color: var(--text-dark); } .user-menu { display: flex; align-items: center; gap: 15px; } .search-bar { position: relative; margin-right: 15px; } .search-input { padding: 8px 12px 8px 36px; border-radius: 20px; border: 1px solid #e1e5eb; width: 200px; transition: var(--transition); font-size: 14px; } .search-input:focus { width: 250px; outline: none; border-color: var(--primary); box-shadow: 0 0 0 2px rgba(42, 82, 190, 0.2); } .search-icon { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); color: #adb5bd; } .notification-btn, .user-profile { background: none; border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; color: var(--text-dark); position: relative; } .notification-btn { font-size: 20px; } .notification-indicator { position: absolute; top: 0; right: 0; width: 8px; height: 8px; background-color: var(--danger); border-radius: 50%; } .user-profile { gap: 8px; } .user-avatar { width: 36px; height: 36px; border-radius: 50%; background: linear-gradient(45deg, var(--primary), var(--accent)); display: flex; align-items: center; justify-content: center; color: white; font-weight: bold; font-size: 16px; } .user-name { font-size: 14px; font-weight: 500; } /* Dashboard Content */ .dashboard-content { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; margin-bottom: 20px; } .metric-card { background: white; border-radius: 8px; padding: 20px; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05); transition: var(--transition); } .metric-card:hover { transform: translateY(-3px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); } .metric-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 15px; } .metric-title { font-size: 14px; color: #6c757d; font-weight: 500; } .metric-icon { width: 36px; height: 36px; border-radius: 8px; display: flex; align-items: center; justify-content: center; font-size: 18px; color: white; } .revenue .metric-icon { background: linear-gradient(135deg, var(--success), #51cf66); } .users .metric-icon { background: linear-gradient(135deg, var(--primary), #4dabf7); } .conversion .metric-icon { background: linear-gradient(135deg, var(--warning), #ffa94d); } .metric-value { font-size: 28px; font-weight: 600; color: var(--text-dark); margin-bottom: 5px; } .metric-trend { display: flex; align-items: center; font-size: 12px; font-weight: 500; } .trend-up { color: var(--success); } .trend-down { color: var(--danger); } .trend-neutral { color: var(--info); } .trend-icon { margin-right: 4px; } /* Charts Sections */ .charts-section { display: grid; grid-template-columns: 2fr 1fr; gap: 20px; } .chart-container { background: white; border-radius: 8px; padding: 20px; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05); } .chart-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; } .chart-title { font-size: 16px; font-weight: 600; color: var(--text-dark); } .time-filter { display: flex; gap: 8px; } .time-option { padding: 4px 12px; border-radius: 16px; font-size: 12px; font-weight: 500; cursor: pointer; transition: var(--transition); color: #6c757d; } .time-option:hover { background-color: #f1f3f5; } .time-option.active { background-color: var(--primary); color: white; } .chart-placeholder { height: 250px; display: flex; align-items: center; justify-content: center; background: linear-gradient(to right, #f8f9fa 0%, #e9ecef 50%, #f8f9fa 100%); background-size: 200% 100%; animation: shimmer 1.5s infinite; border-radius: 4px; } @keyframes shimmer { 0% { background-position: -100% 0; } 100% { background-position: 100% 0; } } .activity-list { list-style-type: none; } .activity-item { display: flex; align-items: flex-start; padding: 12px 0; border-bottom: 1px solid #f1f3f5; } .activity-item:last-child { border-bottom: none; } .activity-icon { width: 32px; height: 32px; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin-right: 12px; flex-shrink: 0; font-size: 14px; color: white; } .activity-success { background: var(--success); } .activity-warning { background: var(--warning); } .activity-danger { background: var(--danger); } .activity-info { background: var(--info); } .activity-content { flex-grow: 1; } .activity-title { font-size: 14px; font-weight: 500; color: var(--text-dark); margin-bottom: 4px; } .activity-time { font-size: 12px; color: #6c757d; } /* Mobile Sidebar Toggle Button */ .mobile-toggle-btn { position: fixed; bottom: 20px; right: 20px; width: 50px; height: 50px; border-radius: 50%; background: var(--primary); color: white; display: none; align-items: center; justify-content: center; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2); border: none; cursor: pointer; z-index: 1000; transition: var(--transition); } .mobile-toggle-btn:hover { background: var(--primary-dark); } /* Tooltip */ .tooltip { position: relative; } .tooltip:before { content: attr(data-tooltip); position: absolute; top: -30px; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.8); color: white; padding: 5px 10px; border-radius: 4px; font-size: 12px; white-space: nowrap; opacity: 0; pointer-events: none; transition: var(--transition); } .tooltip:after { content: ''; position: absolute; top: -10px; left: 50%; transform: translateX(-50%); border-width: 5px; border-style: solid; border-color: rgba(0, 0, 0, 0.8) transparent transparent transparent; opacity: 0; pointer-events: none; transition: var(--transition); } .tooltip:hover:before, .tooltip:hover:after { opacity: 1; } /* Responsive Design */ @media (max-width: 1024px) { .dashboard-content { grid-template-columns: repeat(2, 1fr); } .charts-section { grid-template-columns: 1fr; } } @media (max-width: 768px) { .sidebar { transform: translateX(-280px); position: fixed; top: 0; left: 0; height: 100%; z-index: 1000; } .sidebar.collapsed { transform: translateX(0); } .main-content { width: 100%; } .dashboard-content { grid-template-columns: 1fr; } .mobile-toggle-btn { display: flex; } .search-input { width: 150px; } .search-input:focus { width: 180px; } } /* Animations */ @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(42, 82, 190, 0.4); } 70% { box-shadow: 0 0 0 10px rgba(42, 82, 190, 0); } 100% { box-shadow: 0 0 0 0 rgba(42, 82, 190, 0); } } .pulse { animation: pulse 2s infinite; } /* Custom scrollbar for the page */ ::-webkit-scrollbar { width: 8px; } ::-webkit-scrollbar-track { background: #f1f1f1; } ::-webkit-scrollbar-thumb { background: #cccccc; border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: #999999; } </style> </head> <body> <div class="dashboard-container"> <div class="sidebar"> <div class="sidebar-header"> <div class="logo"> <div class="logo-icon">⚙️</div> <div class="logo-text">DataVerse Inc.</div> </div> <button class="toggle-btn" id="sidebarToggle"> <i class="fas">◀</i> </button> </div> <div class="sidebar-content"> <div class="nav-section"> <div class="section-title">Core</div> <div class="nav-item"> <a class="nav-link active"> <span class="nav-icon">📊</span> <span class="nav-text">Dashboard</span> </a> </div> <div class="nav-item"> <div class="nav-link dropdown-trigger"> <span class="nav-icon">📈</span> <span class="nav-text">Analytics</span> <span class="dropdown-indicator">▼</span> </div> <div class="subnav"> <a class="subnav-link">Performance Metrics</a> <a class="subnav-link">Traffic Sources</a> <a class="subnav-link active">Conversion Rates</a> <a class="subnav-link">User Engagement</a> </div> </div> <div class="nav-item"> <div class="nav-link dropdown-trigger"> <span class="nav-icon">🔍</span> <span class="nav-text">Reports</span> <span class="dropdown-indicator">▼</span> </div> <div class="subnav"> <a class="subnav-link">Financial Summary</a> <a class="subnav-link">Quarterly Review</a> <a class="subnav-link">Annual Projections</a> <a class="subnav-link">Custom Reports</a> </div> </div> </div> <div class="nav-section"> <div class="section-title">Management</div> <div class="nav-item"> <a class="nav-link"> <span class="nav-icon">👥</span> <span class="nav-text">Team</span> </a> </div> <div class="nav-item"> <a class="nav-link"> <span class="nav-icon">📁</span> <span class="nav-text">Projects</span> <span class="nav-badge">8</span> </a> </div> <div class="nav-item"> <div class="nav-link dropdown-trigger"> <span class="nav-icon">🎯</span> <span class="nav-text">KPIs</span> <span class="dropdown-indicator">▼</span> </div> <div class="subnav"> <a class="subnav-link">Revenue Goals</a> <a class="subnav-link">Customer Acquisition</a> <a class="subnav-link">Operational Efficiency</a> </div> </div> <div class="nav-item"> <a class="nav-link"> <span class="nav-icon">📅</span> <span class="nav-text">Calendar</span> </a> </div> </div> <div class="nav-section"> <div class="section-title">Resources</div> <div class="nav-item"> <a class="nav-link"> <span class="nav-icon">📚</span> <span class="nav-text">Documentation</span> </a> </div> <div class="nav-item"> <a class="nav-link"> <span class="nav-icon">🔧</span> <span class="nav-text">Tools</span> </a> </div> <div class="nav-item"> <a class="nav-link"> <span class="nav-icon">💡</span> <span class="nav-text">Knowledge Base</span> </a> </div> </div> <div class="nav-section"> <div class="section-title">System</div> <div class="nav-item"> <a class="nav-link"> <span class="nav-icon">⚙️</span> <span class="nav-text">Settings</span> </a> </div> <div class="nav-item"> <a class="nav-link"> <span class="nav-icon">🔒</span> <span class="nav-text">Security</span> </a> </div> <div class="nav-item"> <a class="nav-link"> <span class="nav-icon">📤</span> <span class="nav-text">Log Out</span> </a> </div> </div> </div> </div> <div class="main-content"> <div class="top-bar"> <h1 class="page-title">Executive Dashboard</h1> <div class="user-menu"> <div class="search-bar"> <span class="search-icon">🔍</span> <input type="text" class="search-input" placeholder="Search..."> </div> <button class="notification-btn tooltip" data-tooltip="Notifications"> 🔔 <span class="notification-indicator"></span> </button> <div class="user-profile"> <div class="user-avatar">JD</div> <span class="user-name">Jane Doe</span> </div> </div> </div> <div class="dashboard-content"> <div class="metric-card revenue"> <div class="metric-header"> <div> <div class="metric-title">Monthly Revenue</div> <div class="metric-value">$1.8M</div> <div class="metric-trend trend-up"> <span class="trend-icon">↑</span> 12.3% vs last month </div> </div> <div class="metric-icon">💰</div> </div> </div> <div class="metric-card users"> <div class="metric-header"> <div> <div class="metric-title">Active Enterprise Users</div> <div class="metric-value">2,854</div> <div class="metric-trend trend-up"> <span class="trend-icon">↑</span> 8.7% vs last month </div> </div> <div class="metric-icon">👥</div> </div> </div> <div class="metric-card conversion"> <div class="metric-header"> <div> <div class="metric-title">Conversion Rate</div> <div class="metric-value">24.8%</div> <div class="metric-trend trend-down"> <span class="trend-icon">↓</span> 2.1% vs last month </div> </div> <div class="metric-icon">🎯</div> </div> </div> </div> <div class="charts-section"> <div class="chart-container"> <div class="chart-header"> <div class="chart-title">Quarterly Revenue Performance</div> <div class="time-filter"> <span class="time-option">Week</span> <span class="time-option active">Month</span> <span class="time-option">Quarter</span> <span class="time-option">Year</span> </div> </div> <div class="chart-placeholder pulse" id="revenueChart"> Revenue chart visualization would appear here </div> </div> <div class="chart-container"> <div class="chart-header"> <div class="chart-title">Recent Activity</div> </div> <ul class="activity-list"> <li class="activity-item"> <div class="activity-icon activity-success">✓</div> <div class="activity-content"> <div class="activity-title">Q3 Sales Target Achieved</div> <div class="activity-time">Just now</div> </div> </li> <li class="activity-item"> <div class="activity-icon activity-warning">!</div> <div class="activity-content"> <div class="activity-title">Server Load at 82%</div> <div class="activity-time">2 hours ago</div> </div> </li> <li class="activity-item"> <div class="activity-icon activity-info">i</div> <div class="activity-content"> <div class="activity-title">New Integration Deployed</div> <div class="activity-time">Yesterday</div> </div> </li> <li class="activity-item"> <div class="activity-icon activity-danger">!</div> <div class="activity-content"> <div class="activity-title">Security Alert: Unauthorized Access</div> <div class="activity-time">2 days ago</div> </div> </li> </ul> </div> </div> </div> </div> <button class="mobile-toggle-btn" id="mobileToggle"> ≡ </button> <script> // Sidebar Toggle Functionality document.addEventListener('DOMContentLoaded', function() { const sidebar = document.querySelector('.sidebar'); const sidebarToggle = document.getElementById('sidebarToggle'); const mobileToggle = document.getElementById('mobileToggle'); const dropdownTriggers = document.querySelectorAll('.dropdown-trigger'); // Toggle sidebar on desktop sidebarToggle.addEventListener('click', function() { sidebar.classList.toggle('collapsed'); // Change toggle button icon const icon = sidebarToggle.querySelector('i'); if (sidebar.classList.contains('collapsed')) { icon.textContent = '▶'; } else { icon.textContent = '◀'; } }); // Toggle sidebar on mobile mobileToggle.addEventListener('click', function() { sidebar.classList.toggle('collapsed'); }); // Handle dropdown menus dropdownTriggers.forEach(trigger => { trigger.addEventListener('click', function() { // Toggle dropdown indicator const dropdownIndicator = this.querySelector('.dropdown-indicator'); dropdownIndicator.classList.toggle('open'); // Toggle subnav visibility const subnav = this.nextElementSibling; subnav.classList.toggle('open'); }); }); // Time filter options const timeOptions = document.querySelectorAll('.time-option'); timeOptions.forEach(option => { option.addEventListener('click', function() { // Remove active class from all options timeOptions.forEach(opt => opt.classList.remove('active')); // Add active class to clicked option this.classList.add('active'); }); }); // Simulate loading state for the chart setTimeout(() => { const chartPlaceholder = document.getElementById('revenueChart'); chartPlaceholder.classList.remove('pulse'); chartPlaceholder.innerHTML = ` <svg width="100%" height="250" viewBox="0 0 500 250" xmlns="http://www.w3.org/2000/svg"> <!-- Chart Grid --> <line x1="50" y1="220" x2="480" y2="220" stroke="#E0E0E0" stroke-width="1" /> <line x1="50" y1="180" x2="480" y2="180" stroke="#E0E0E0" stroke-width="1" /> <line x1="50" y1="140" x2="480" y2="140" stroke="#E0E0E0" stroke-width="1" /> <line x1="50" y1="100" x2="480" y2="100" stroke="#E0E0E0" stroke-width="1" /> <line x1="50" y1="60" x2="480" y2="60" stroke="#E0E0E0" stroke-width="1" /> <!-- Y-axis labels --> <text x="40" y="220" text-anchor="end" fill="#6c757d" font-size="12">0</text> <text x="40" y="180" text-anchor="end" fill="#6c757d" font-size="12">500K</text> <text x="40" y="140" text-anchor="end" fill="#6c757d" font-size="12">1M</text> <text x="40" y="100" text-anchor="end" fill="#6c757d" font-size="12">1.5M</text> <text x="40" y="60" text-anchor="end" fill="#6c757d" font-size="12">2M</text> <!-- X-axis labels --> <text x="80" y="235" text-anchor="middle" fill="#6c757d" font-size="12">Jan</text> <text x="170" y="235" text-anchor="middle" fill="#6c757d" font-size="12">Feb</text> <text x="260" y="235" text-anchor="middle" fill="#6c757d" font-size="12">Mar</text> <text x="350" y="235" text-anchor="middle" fill="#6c757d" font-size="12">Apr</text> <text x="440" y="235" text-anchor="middle" fill="#6c757d" font-size="12">May</text> <!-- Revenue Line --> <path d="M80,180 L170,160 L260,120 L350,90 L440,60" fill="none" stroke="#2a52be" stroke-width="3" /> <!-- Data Points --> <circle cx="80" cy="180" r="5" fill="#2a52be" /> <circle cx="170" cy="160" r="5" fill="#2a52be" /> <circle cx="260" cy="120" r="5" fill="#2a52be" /> <circle cx="350" cy="90" r="5" fill="#2a52be" /> <circle cx="440" cy="60" r="5" fill="#2a52be" /> <!-- Trend Area --> <path d="M80,180 L170,160 L260,120 L350,90 L440,60 L440,220 L80,220 Z" fill="url(#gradient)" opacity="0.2" /> <!-- Gradient Definition --> <defs> <linearGradient id="gradient" x1="0%" y1="0%" x2="0%" y2="100%"> <stop offset="0%" stop-color="#2a52be" stop-opacity="0.8" /> <stop offset="100%" stop-color="#2a52be" stop-opacity="0.1" /> </linearGradient> </defs> <!-- Target Line --> <line x1="50" y1="100" x2="480" y2="100" stroke="#dc3545" stroke-width="1" stroke-dasharray="5,5" /> <text x="485" y="100" text-anchor="start" fill="#dc3545" font-size="11">Target</text> </svg> `; }, 1500); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap'); :root { --primary: #FF416C; --primary-alt: #FF4B2B; --secondary: #7F00FF; --secondary-alt: #5B2FE4; --accent: #00D2FF; --dark: #151515; --light: #FAFAFA; --grey: #8E8E8E; --transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Poppins', sans-serif; } body { width: 100%; height: 100vh; background: linear-gradient(45deg, var(--secondary), var(--primary)); display: flex; justify-content: center; align-items: center; overflow: hidden; color: var(--light); } .app-container { width: 100%; max-width: 700px; height: 100%; max-height: 700px; background-color: var(--dark); border-radius: 20px; position: relative; overflow: hidden; box-shadow: 0 20px 50px rgba(0, 0, 0, 0.3); } .app-header { width: 100%; display: flex; justify-content: space-between; align-items: center; padding: 24px; z-index: 10; position: relative; } .menu-toggle { width: 40px; height: 40px; background: linear-gradient(45deg, var(--primary), var(--primary-alt)); border-radius: 12px; display: flex; justify-content: center; align-items: center; cursor: pointer; z-index: 100; transition: var(--transition); } .menu-toggle:hover { transform: scale(1.1) rotate(5deg); box-shadow: 0 5px 15px rgba(255, 65, 108, 0.4); } .menu-toggle:active { transform: scale(0.95); } .menu-toggle .bar { width: 20px; height: 2px; background: white; position: relative; transition: var(--transition); } .menu-toggle .bar::before, .menu-toggle .bar::after { content: ''; position: absolute; width: 20px; height: 2px; background: white; transition: var(--transition); } .menu-toggle .bar::before { transform: translateY(-7px); } .menu-toggle .bar::after { transform: translateY(7px); } .menu-toggle.active .bar { background: transparent; } .menu-toggle.active .bar::before { transform: rotate(45deg); } .menu-toggle.active .bar::after { transform: rotate(-45deg); } .profile { display: flex; align-items: center; gap: 12px; } .profile-img { width: 45px; height: 45px; border-radius: 15px; background: linear-gradient(45deg, var(--accent), var(--secondary)); overflow: hidden; position: relative; } .profile-img img { width: 100%; height: 100%; object-fit: cover; } .profile-status { display: flex; flex-direction: column; } .profile-name { font-weight: 600; font-size: 16px; } .profile-activity { font-size: 12px; color: var(--grey); } .menu-container { position: absolute; top: 0; left: -100%; width: 80%; height: 100%; background: rgba(21, 21, 21, 0.97); backdrop-filter: blur(8px); z-index: 50; transition: all 0.5s cubic-bezier(0.645, 0.045, 0.355, 1); display: flex; flex-direction: column; padding: 100px 30px 30px; box-shadow: 0 0 50px rgba(0, 0, 0, 0.8); } .menu-container.active { left: 0; } .menu-item { display: flex; align-items: center; gap: 18px; margin-bottom: 30px; padding: 16px 20px; border-radius: 16px; cursor: pointer; transition: var(--transition); position: relative; overflow: hidden; opacity: 0; transform: translateX(-30px); transition-delay: calc(0.1s * var(--i)); } .menu-container.active .menu-item { opacity: 1; transform: translateX(0); } .menu-item::before { content: ''; position: absolute; top: 0; left: 0; width: 5px; height: 100%; background: linear-gradient(to bottom, var(--primary), var(--secondary)); border-radius: 10px; opacity: 0; transition: var(--transition); } .menu-item:hover { background: rgba(255, 255, 255, 0.05); transform: translateX(5px); } .menu-item:hover::before { opacity: 1; } .menu-item.active { background: linear-gradient(90deg, rgba(255, 65, 108, 0.1), transparent); } .menu-item.active::before { opacity: 1; width: 5px; } .menu-item i { font-size: 24px; width: 40px; height: 40px; display: flex; justify-content: center; align-items: center; border-radius: 12px; transition: var(--transition); } .menu-item:nth-child(1) i { background: rgba(255, 65, 108, 0.15); color: var(--primary); } .menu-item:nth-child(2) i { background: rgba(91, 47, 228, 0.15); color: var(--secondary-alt); } .menu-item:nth-child(3) i { background: rgba(0, 210, 255, 0.15); color: var(--accent); } .menu-item:nth-child(4) i { background: rgba(255, 190, 0, 0.15); color: #FFBE00; } .menu-item:nth-child(5) i { background: rgba(0, 210, 110, 0.15); color: #00D26E; } .menu-item h3 { font-weight: 500; font-size: 16px; } .menu-item .notification { margin-left: auto; background: var(--primary); color: white; border-radius: 50px; padding: 3px 10px; font-size: 12px; font-weight: 600; transition: var(--transition); } .menu-item:hover .notification { transform: scale(1.1); } .content-area { width: 100%; height: calc(100% - 88px); padding: 0 24px 24px; position: relative; z-index: 5; display: flex; flex-direction: column; gap: 20px; } .content-header { display: flex; justify-content: space-between; align-items: center; } .content-title { font-size: 28px; font-weight: 700; } .content-actions { display: flex; gap: 16px; } .action-button { width: 45px; height: 45px; border-radius: 15px; background: rgba(255, 255, 255, 0.08); display: flex; justify-content: center; align-items: center; cursor: pointer; transition: var(--transition); } .action-button:hover { background: var(--primary); transform: translateY(-3px); box-shadow: 0 10px 20px rgba(255, 65, 108, 0.3); } .search-box { width: 100%; display: flex; align-items: center; gap: 12px; background: rgba(255, 255, 255, 0.08); border-radius: 15px; padding: 12px 20px; transition: var(--transition); } .search-box:focus-within { background: rgba(255, 255, 255, 0.12); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1); } .search-box i { color: var(--grey); } .search-box input { background: transparent; border: none; outline: none; flex: 1; color: var(--light); font-size: 16px; } .search-box input::placeholder { color: var(--grey); } .feed-container { flex: 1; overflow-y: auto; display: flex; flex-direction: column; gap: 20px; padding-right: 5px; } .feed-container::-webkit-scrollbar { width: 5px; } .feed-container::-webkit-scrollbar-track { background: rgba(255, 255, 255, 0.05); border-radius: 10px; } .feed-container::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.1); border-radius: 10px; } .feed-item { background: rgba(255, 255, 255, 0.08); border-radius: 20px; padding: 20px; transition: var(--transition); transform: translateY(20px); opacity: 0; animation: fadeIn 0.5s forwards; animation-delay: calc(0.2s * var(--i)); } @keyframes fadeIn { to { opacity: 1; transform: translateY(0); } } .feed-item:hover { background: rgba(255, 255, 255, 0.12); transform: translateY(-5px); } .feed-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; } .feed-user { display: flex; align-items: center; gap: 12px; } .feed-user-img { width: 40px; height: 40px; border-radius: 12px; overflow: hidden; } .feed-user-img img { width: 100%; height: 100%; object-fit: cover; } .feed-user-info { display: flex; flex-direction: column; } .feed-user-name { font-weight: 600; font-size: 16px; } .feed-time { font-size: 12px; color: var(--grey); } .feed-options { cursor: pointer; width: 35px; height: 35px; display: flex; justify-content: center; align-items: center; border-radius: 50%; transition: var(--transition); } .feed-options:hover { background: rgba(255, 255, 255, 0.1); } .feed-content { margin-bottom: 15px; } .feed-interactions { display: flex; justify-content: space-between; } .interaction { display: flex; align-items: center; gap: 8px; padding: 8px 15px; border-radius: 10px; cursor: pointer; transition: var(--transition); } .interaction:hover { background: rgba(255, 255, 255, 0.1); } .interaction i { font-size: 16px; } .interaction.like:hover i { color: var(--primary); } .interaction.comment:hover i { color: var(--accent); } .interaction.share:hover i { color: var(--secondary); } .interaction-count { font-size: 14px; } .menu-background { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); z-index: 40; opacity: 0; pointer-events: none; transition: var(--transition); } .menu-background.active { opacity: 1; pointer-events: all; } .blob { position: absolute; border-radius: 50%; filter: blur(80px); z-index: 1; opacity: 0.3; } .blob-1 { width: 300px; height: 300px; background: var(--primary); top: -100px; right: -100px; animation: float 8s infinite ease-in-out; } .blob-2 { width: 250px; height: 250px; background: var(--secondary); bottom: -80px; left: -80px; animation: float 7s infinite ease-in-out reverse; } .blob-3 { width: 180px; height: 180px; background: var(--accent); bottom: 100px; right: 50px; animation: float 10s infinite ease-in-out; } @keyframes float { 0%, 100% { transform: translate(0, 0); } 25% { transform: translate(10px, 20px); } 50% { transform: translate(-15px, 10px); } 75% { transform: translate(5px, -15px); } } .floating-btn { position: absolute; bottom: 30px; right: 30px; width: 60px; height: 60px; border-radius: 50%; background: linear-gradient(45deg, var(--primary), var(--primary-alt)); display: flex; justify-content: center; align-items: center; box-shadow: 0 10px 20px rgba(255, 65, 108, 0.3); cursor: pointer; z-index: 30; transition: var(--transition); } .floating-btn:hover { transform: scale(1.1) rotate(10deg); } .floating-btn:active { transform: scale(0.95); } .floating-btn i { font-size: 24px; color: white; } @media (max-width: 500px) { .app-container { border-radius: 0; } .menu-container { width: 90%; } } </style> </head> <body> <div class="app-container"> <div class="app-header"> <div class="menu-toggle"> <div class="bar"></div> </div> <div class="profile"> <div class="profile-img"> <img src="https://i.pravatar.cc/150?img=32" alt="Profile"> </div> <div class="profile-status"> <div class="profile-name">Skylar</div> <div class="profile-activity">Online now</div> </div> </div> </div> <div class="menu-container"> <div class="menu-item active" style="--i: 1;"> <i class="fas fa-home"></i> <h3>Feed</h3> <div class="notification">3</div> </div> <div class="menu-item" style="--i: 2;"> <i class="fas fa-user-friends"></i> <h3>Friends</h3> <div class="notification">12</div> </div> <div class="menu-item" style="--i: 3;"> <i class="fas fa-comment-alt"></i> <h3>Messages</h3> <div class="notification">5</div> </div> <div class="menu-item" style="--i: 4;"> <i class="fas fa-compass"></i> <h3>Discover</h3> </div> <div class="menu-item" style="--i: 5;"> <i class="fas fa-cog"></i> <h3>Settings</h3> </div> </div> <div class="menu-background"></div> <div class="content-area"> <div class="content-header"> <div class="content-title">My Feed</div> <div class="content-actions"> <div class="action-button"> <i class="fas fa-bell" style="color: var(--light);"></i> </div> <div class="action-button"> <i class="fas fa-th" style="color: var(--light);"></i> </div> </div> </div> <div class="search-box"> <i class="fas fa-search"></i> <input type="text" placeholder="Search your vibes..."> </div> <div class="feed-container"> <div class="feed-item" style="--i: 1;"> <div class="feed-header"> <div class="feed-user"> <div class="feed-user-img"> <img src="https://i.pravatar.cc/150?img=47" alt="User"> </div> <div class="feed-user-info"> <div class="feed-user-name">Alex Rivers</div> <div class="feed-time">37 minutes ago</div> </div> </div> <div class="feed-options"> <i class="fas fa-ellipsis-h" style="color: var(--grey);"></i> </div> </div> <div class="feed-content"> Just dropped a new mixtape! Link in bio 🎵 Who's coming to the secret beach party this Friday? #VibeCheck #NewTunes </div> <div class="feed-interactions"> <div class="interaction like"> <i class="fas fa-heart"></i> <span class="interaction-count">217</span> </div> <div class="interaction comment"> <i class="fas fa-comment"></i> <span class="interaction-count">42</span> </div> <div class="interaction share"> <i class="fas fa-share-alt"></i> <span class="interaction-count">18</span> </div> </div> </div> <div class="feed-item" style="--i: 2;"> <div class="feed-header"> <div class="feed-user"> <div class="feed-user-img"> <img src="https://i.pravatar.cc/150?img=23" alt="User"> </div> <div class="feed-user-info"> <div class="feed-user-name">Mina Chen</div> <div class="feed-time">2 hours ago</div> </div> </div> <div class="feed-options"> <i class="fas fa-ellipsis-h" style="color: var(--grey);"></i> </div> </div> <div class="feed-content"> Anyone else obsessed with the new Tame Impala album? Been on repeat mode for days now. Perfect soundtrack for late night drives 🌙🚗 </div> <div class="feed-interactions"> <div class="interaction like"> <i class="fas fa-heart"></i> <span class="interaction-count">183</span> </div> <div class="interaction comment"> <i class="fas fa-comment"></i> <span class="interaction-count">37</span> </div> <div class="interaction share"> <i class="fas fa-share-alt"></i> <span class="interaction-count">9</span> </div> </div> </div> <div class="feed-item" style="--i: 3;"> <div class="feed-header"> <div class="feed-user"> <div class="feed-user-img"> <img src="https://i.pravatar.cc/150?img=65" alt="User"> </div> <div class="feed-user-info"> <div class="feed-user-name">Jamal Woods</div> <div class="feed-time">4 hours ago</div> </div> </div> <div class="feed-options"> <i class="fas fa-ellipsis-h" style="color: var(--grey);"></i> </div> </div> <div class="feed-content"> Just finished designing my first AR filter! Tag me if you try it out 📱✨ Been learning 3D modeling for months and finally created something I'm proud of. </div> <div class="feed-interactions"> <div class="interaction like"> <i class="fas fa-heart"></i> <span class="interaction-count">279</span> </div> <div class="interaction comment"> <i class="fas fa-comment"></i> <span class="interaction-count">58</span> </div> <div class="interaction share"> <i class="fas fa-share-alt"></i> <span class="interaction-count">32</span> </div> </div> </div> <div class="feed-item" style="--i: 4;"> <div class="feed-header"> <div class="feed-user"> <div class="feed-user-img"> <img src="https://i.pravatar.cc/150?img=5" alt="User"> </div> <div class="feed-user-info"> <div class="feed-user-name">Zoe Martinez</div> <div class="feed-time">7 hours ago</div> </div> </div> <div class="feed-options"> <i class="fas fa-ellipsis-h" style="color: var(--grey);"></i> </div> </div> <div class="feed-content"> Just thrifted the most amazing vintage jacket! 70s vibes all summer 🌈 Who's down for a sustainable fashion challenge next month? </div> <div class="feed-interactions"> <div class="interaction like"> <i class="fas fa-heart"></i> <span class="interaction-count">156</span> </div> <div class="interaction comment"> <i class="fas fa-comment"></i> <span class="interaction-count">23</span> </div> <div class="interaction share"> <i class="fas fa-share-alt"></i> <span class="interaction-count">7</span> </div> </div> </div> </div> </div> <div class="floating-btn"> <i class="fas fa-plus"></i> </div> <div class="blob blob-1"></div> <div class="blob blob-2"></div> <div class="blob blob-3"></div> </div> <script src="https://kit.fontawesome.com/a076d05399.js" crossorigin="anonymous"></script> <script> document.addEventListener('DOMContentLoaded', function() { const menuToggle = document.querySelector('.menu-toggle'); const menuContainer = document.querySelector('.menu-container'); const menuBackground = document.querySelector('.menu-background'); const menuItems = document.querySelectorAll('.menu-item'); const floatingBtn = document.querySelector('.floating-btn'); // Menu toggle functionality menuToggle.addEventListener('click', function() { this.classList.toggle('active'); menuContainer.classList.toggle('active'); menuBackground.classList.toggle('active'); }); // Close menu when clicking on background menuBackground.addEventListener('click', function() { menuToggle.classList.remove('active'); menuContainer.classList.remove('active'); this.classList.remove('active'); }); // Menu item click handler menuItems.forEach(item => { item.addEventListener('click', function() { menuItems.forEach(i => i.classList.remove('active')); this.classList.add('active'); // For demo purposes, close menu after selecting on mobile if (window.innerWidth <= 768) { menuToggle.classList.remove('active'); menuContainer.classList.remove('active'); menuBackground.classList.remove('active'); } // Add a fun scale animation to the clicked item this.style.transform = 'scale(0.95)'; setTimeout(() => { this.style.transform = ''; }, 200); }); }); // Floating button animation floatingBtn.addEventListener('click', function() { this.classList.add('clicked'); // Create and animate a ripple effect const ripple = document.createElement('div'); ripple.style.position = 'absolute'; ripple.style.width = '20px'; ripple.style.height = '20px'; ripple.style.background = 'rgba(255, 255, 255, 0.8)'; ripple.style.borderRadius = '50%'; ripple.style.transition = 'all 0.5s ease-out'; ripple.style.left = '50%'; ripple.style.top = '50%'; ripple.style.transform = 'translate(-50%, -50%)'; this.appendChild(ripple); setTimeout(() => { ripple.style.width = '200px'; ripple.style.height = '200px'; ripple.style.opacity = '0'; }, 10); setTimeout(() => { ripple.remove(); this.classList.remove('clicked'); }, 500); }); // Feed item hover effects const feedItems = document.querySelectorAll('.feed-item'); feedItems.forEach(item => { item.addEventListener('mouseenter', function() { const interactions = this.querySelectorAll('.interaction'); interactions.forEach((interaction, index) => { interaction.style.transitionDelay = `${index * 0.05}s`; interaction.style.transform = 'translateY(-3px)'; }); }); item.addEventListener('mouseleave', function() { const interactions = this.querySelectorAll('.interaction'); interactions.forEach(interaction => { interaction.style.transitionDelay = '0s'; interaction.style.transform = ''; }); }); }); // Like interaction const likeButtons = document.querySelectorAll('.interaction.like'); likeButtons.forEach(button => { button.addEventListener('click', function() { const icon = this.querySelector('i'); const count = this.querySelector('.interaction-count'); if (icon.style.color === 'var(--primary)') { icon.style.color = ''; count.textContent = parseInt(count.textContent) - 1; } else { icon.style.color = 'var(--primary)'; count.textContent = parseInt(count.textContent) + 1; // Create heart animation const heart = document.createElement('i'); heart.classList.add('fas', 'fa-heart'); heart.style.position = 'absolute'; heart.style.color = 'var(--primary)'; heart.style.fontSize = '16px'; heart.style.left = `${Math.random() * 30 + 5}px`; heart.style.top = '10px'; heart.style.transition = 'all 0.6s ease-out'; heart.style.opacity = '1'; heart.style.zIndex = '10'; this.style.position = 'relative'; this.appendChild(heart); setTimeout(() => { heart.style.transform = `translateY(-${Math.random() * 40 + 20}px)`; heart.style.opacity = '0'; }, 10); setTimeout(() => { heart.remove(); }, 600); } }); }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Creative Portfolio Navigation</title> <style> @import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@300;500;700&family=Space+Grotesk:wght@300;400;700&display=swap'); :root { --bg-color: #0e0e0e; --text-color: #f2f2f2; --accent-color: #ff5e3a; --secondary-color: #2d4ef5; --tertiary-color: #f4f0ec; --transition-speed: 0.7s; } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Space Grotesk', sans-serif; background-color: var(--bg-color); color: var(--text-color); overflow-x: hidden; height: 100vh; width: 100%; } .container { max-width: 700px; height: 700px; margin: 0 auto; overflow: hidden; position: relative; } header { padding: 20px; display: flex; justify-content: space-between; align-items: center; position: relative; z-index: 30; } .logo { font-family: 'Cormorant Garamond', serif; font-weight: 700; font-size: 1.8rem; letter-spacing: -1px; color: var(--text-color); text-decoration: none; position: relative; } .logo::after { content: ''; position: absolute; bottom: 0; left: 0; width: 100%; height: 2px; background-color: var(--accent-color); transform: scaleX(0); transform-origin: right; transition: transform 0.5s cubic-bezier(0.25, 1, 0.5, 1); } .logo:hover::after { transform: scaleX(1); transform-origin: left; } .menu-toggle { background: transparent; border: none; color: var(--text-color); font-size: 1rem; cursor: pointer; display: flex; flex-direction: column; gap: 6px; padding: 6px; position: relative; z-index: 50; } .menu-toggle:focus { outline: none; } .menu-bar { display: block; width: 30px; height: 2px; background-color: var(--text-color); transition: all 0.3s; } .menu-toggle.active .menu-bar:nth-child(1) { transform: translateY(8px) rotate(45deg); background-color: var(--tertiary-color); } .menu-toggle.active .menu-bar:nth-child(2) { opacity: 0; } .menu-toggle.active .menu-bar:nth-child(3) { transform: translateY(-8px) rotate(-45deg); background-color: var(--tertiary-color); } .overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: var(--bg-color); z-index: 20; visibility: hidden; opacity: 0; transform: translateY(-100%); transition: transform var(--transition-speed) cubic-bezier(0.16, 1, 0.3, 1), opacity var(--transition-speed) cubic-bezier(0.16, 1, 0.3, 1), visibility 0s var(--transition-speed); display: flex; flex-direction: column; justify-content: center; overflow: hidden; } .overlay.active { visibility: visible; opacity: 1; transform: translateY(0); transition: transform var(--transition-speed) cubic-bezier(0.16, 1, 0.3, 1), opacity var(--transition-speed) cubic-bezier(0.16, 1, 0.3, 1), visibility 0s 0s; } .menu-container { padding: 40px; display: flex; flex-direction: column; height: 100%; justify-content: center; } .menu-category { margin-bottom: 40px; } .category-title { font-family: 'Cormorant Garamond', serif; color: var(--accent-color); font-size: 0.9rem; font-weight: 400; letter-spacing: 2px; text-transform: uppercase; margin-bottom: 10px; opacity: 0; transform: translateY(20px); transition: transform 0.5s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.5s cubic-bezier(0.16, 1, 0.3, 1); transition-delay: 0.2s; } .overlay.active .category-title { opacity: 1; transform: translateY(0); } .nav-list { list-style: none; } .nav-item { margin-bottom: 15px; overflow: hidden; padding-left: 0; transition: padding-left 0.3s ease; } .nav-link { font-family: 'Cormorant Garamond', serif; color: var(--text-color); text-decoration: none; font-size: 2.5rem; font-weight: 300; position: relative; display: inline-block; transform: translateY(100%); opacity: 0; transition: transform 0.8s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.8s cubic-bezier(0.16, 1, 0.3, 1); } .overlay.active .nav-link { transform: translateY(0); opacity: 1; } .nav-item:nth-child(1) .nav-link { transition-delay: 0.3s; } .nav-item:nth-child(2) .nav-link { transition-delay: 0.4s; } .nav-item:nth-child(3) .nav-link { transition-delay: 0.5s; } .nav-item:nth-child(4) .nav-link { transition-delay: 0.6s; } .nav-link::after { content: ''; position: absolute; bottom: 5px; left: 0; width: 100%; height: 1px; background-color: var(--accent-color); transform: scaleX(0); transform-origin: right; transition: transform 0.6s cubic-bezier(0.16, 1, 0.3, 1); } .nav-item:hover { padding-left: 15px; } .nav-item:hover .nav-link::after { transform: scaleX(1); transform-origin: left; } .preview-container { position: relative; height: calc(100% - 80px); overflow: hidden; padding: 20px; } .preview { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; z-index: 10; padding: 40px; } .preview-image { width: 100%; height: 100%; object-fit: cover; border-radius: 6px; box-shadow: 0 15px 35px rgba(0, 0, 0, 0.5); transition: transform 0.5s ease; } .preview-content { position: absolute; bottom: 60px; left: 60px; max-width: 70%; } .preview-title { font-family: 'Cormorant Garamond', serif; font-size: 2.5rem; margin-bottom: 10px; font-weight: 700; line-height: 1.1; color: var(--tertiary-color); text-shadow: 0 2px 10px rgba(0, 0, 0, 0.4); } .preview-desc { font-size: 1rem; line-height: 1.5; max-width: 90%; margin-bottom: 20px; color: var(--tertiary-color); text-shadow: 0 2px 10px rgba(0, 0, 0, 0.6); backdrop-filter: blur(5px); padding: 8px; background: rgba(14, 14, 14, 0.3); border-radius: 4px; } .preview-cta { display: inline-block; padding: 10px 25px; background-color: var(--accent-color); color: var(--tertiary-color); text-decoration: none; font-weight: 500; border-radius: 4px; transition: all 0.3s ease; position: relative; overflow: hidden; } .preview-cta::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.2); transition: transform 0.5s cubic-bezier(0.16, 1, 0.3, 1); } .preview-cta:hover::before { transform: translateX(100%); } .preview-cta:hover { box-shadow: 0 5px 15px rgba(255, 94, 58, 0.4); transform: translateY(-2px); } .cursor { position: fixed; width: 30px; height: 30px; border: 1px solid var(--accent-color); border-radius: 50%; pointer-events: none; transform: translate(-50%, -50%); transition: width 0.3s, height 0.3s, border-color 0.3s; z-index: 9999; mix-blend-mode: difference; } .cursor-dot { position: fixed; width: 6px; height: 6px; background-color: var(--accent-color); border-radius: 50%; pointer-events: none; transform: translate(-50%, -50%); z-index: 10000; mix-blend-mode: difference; } .cursor.hover { width: 60px; height: 60px; border-color: var(--secondary-color); background-color: rgba(45, 78, 245, 0.1); } .decorative-circle { position: absolute; bottom: -150px; right: -150px; width: 300px; height: 300px; border-radius: 50%; background: linear-gradient(135deg, var(--secondary-color) 0%, var(--accent-color) 100%); opacity: 0.1; z-index: 5; } .social-links { position: absolute; bottom: 30px; right: 40px; display: flex; gap: 15px; } .social-link { color: var(--text-color); font-size: 1.2rem; transition: color 0.3s, transform 0.3s; } .social-link:hover { color: var(--accent-color); transform: translateY(-3px); } @media (max-width: 768px) { .preview-content { bottom: 30px; left: 30px; max-width: 80%; } .preview-title { font-size: 2rem; } .preview-desc { font-size: 0.9rem; } .nav-link { font-size: 2rem; } .decorative-circle { width: 200px; height: 200px; bottom: -100px; right: -100px; } } @media (max-width: 480px) { .menu-container { padding: 20px; } .preview-content { bottom: 20px; left: 20px; max-width: 90%; } .preview-title { font-size: 1.5rem; } .preview-desc { font-size: 0.8rem; max-width: 100%; } .nav-link { font-size: 1.5rem; } .category-title { font-size: 0.8rem; } .social-links { bottom: 20px; right: 20px; } } /* Animated shapes */ .shape { position: absolute; opacity: 0.1; z-index: 2; } .shape-1 { top: 20%; left: 10%; width: 60px; height: 60px; border: 2px solid var(--accent-color); border-radius: 50%; animation: floatAnimation 10s infinite ease-in-out; } .shape-2 { bottom: 30%; right: 15%; width: 40px; height: 40px; background-color: var(--secondary-color); transform: rotate(45deg); animation: floatAnimation 12s infinite ease-in-out reverse; } .shape-3 { top: 15%; right: 10%; width: 30px; height: 30px; background-color: var(--accent-color); border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; animation: morphAnimation 15s infinite ease-in-out; } @keyframes floatAnimation { 0% { transform: translate(0, 0); } 50% { transform: translate(20px, 20px); } 100% { transform: translate(0, 0); } } @keyframes morphAnimation { 0% { border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; } 25% { border-radius: 58% 42% 75% 25% / 76% 46% 54% 24%; } 50% { border-radius: 50% 50% 33% 67% / 55% 27% 73% 45%; } 75% { border-radius: 33% 67% 58% 42% / 63% 68% 32% 37%; } 100% { border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; } } </style> </head> <body> <div class="container"> <header> <a href="#" class="logo">Atelier.</a> <button class="menu-toggle" id="menuToggle"> <span class="menu-bar"></span> <span class="menu-bar"></span> <span class="menu-bar"></span> </button> </header> <div class="overlay" id="overlay"> <div class="menu-container"> <div class="menu-category"> <h3 class="category-title">Portfolio</h3> <ul class="nav-list"> <li class="nav-item"> <a href="#" class="nav-link" data-category="visual">Visual Design</a> </li> <li class="nav-item"> <a href="#" class="nav-link" data-category="interactive">Interactive Experiences</a> </li> <li class="nav-item"> <a href="#" class="nav-link" data-category="motion">Motion & Animation</a> </li> <li class="nav-item"> <a href="#" class="nav-link" data-category="conceptual">Conceptual Art</a> </li> </ul> </div> <div class="menu-category"> <h3 class="category-title">Info</h3> <ul class="nav-list"> <li class="nav-item"> <a href="#" class="nav-link">About Studio</a> </li> <li class="nav-item"> <a href="#" class="nav-link">Contact</a> </li> </ul> </div> <div class="social-links"> <a href="#" class="social-link">In</a> <a href="#" class="social-link">Be</a> <a href="#" class="social-link">Ig</a> </div> </div> </div> <div class="preview-container"> <div class="preview active" id="default-preview"> <img src="https://images.unsplash.com/photo-1558655146-364adaf1fcc9?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80" alt="Portfolio Preview" class="preview-image"> <div class="preview-content"> <h2 class="preview-title">Crafting Digital Experiences</h2> <p class="preview-desc">Explore our curated collection of creative projects spanning multiple disciplines and mediums.</p> <a href="#" class="preview-cta">Discover Work</a> </div> </div> <div class="preview" id="visual-preview" style="display:none;"> <img src="https://images.unsplash.com/photo-1618005182384-a83a8bd57fbe?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80" alt="Visual Design" class="preview-image"> <div class="preview-content"> <h2 class="preview-title">Visual Design</h2> <p class="preview-desc">Striking brand identities, typography experiments, and graphic compositions that push creative boundaries.</p> <a href="#" class="preview-cta">View Projects</a> </div> </div> <div class="preview" id="interactive-preview" style="display:none;"> <img src="https://images.unsplash.com/photo-1550745165-9bc0b252726f?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80" alt="Interactive Experiences" class="preview-image"> <div class="preview-content"> <h2 class="preview-title">Interactive Experiences</h2> <p class="preview-desc">Immersive digital environments that blend technology and aesthetics to create meaningful user engagement.</p> <a href="#" class="preview-cta">Explore Interactions</a> </div> </div> <div class="preview" id="motion-preview" style="display:none;"> <img src="https://images.unsplash.com/photo-1550684376-efcbd6e3f031?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80" alt="Motion & Animation" class="preview-image"> <div class="preview-content"> <h2 class="preview-title">Motion & Animation</h2> <p class="preview-desc">Kinetic storytelling through carefully crafted movement, transitions, and temporal sequences.</p> <a href="#" class="preview-cta">Watch Showreel</a> </div> </div> <div class="preview" id="conceptual-preview" style="display:none;"> <img src="https://images.unsplash.com/photo-1518640467707-6811f4a6ab73?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80" alt="Conceptual Art" class="preview-image"> <div class="preview-content"> <h2 class="preview-title">Conceptual Art</h2> <p class="preview-desc">Thought-provoking experimental works that challenge perceptions and explore abstract ideas through visual language.</p> <a href="#" class="preview-cta">View Collection</a> </div> </div> <div class="shape shape-1"></div> <div class="shape shape-2"></div> <div class="shape shape-3"></div> <div class="decorative-circle"></div> </div> <div class="cursor"></div> <div class="cursor-dot"></div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const menuToggle = document.getElementById('menuToggle'); const overlay = document.getElementById('overlay'); const navLinks = document.querySelectorAll('.nav-link'); const cursor = document.querySelector('.cursor'); const cursorDot = document.querySelector('.cursor-dot'); const hoverElements = document.querySelectorAll('a, button, .nav-item'); const previews = { 'visual': document.getElementById('visual-preview'), 'interactive': document.getElementById('interactive-preview'), 'motion': document.getElementById('motion-preview'), 'conceptual': document.getElementById('conceptual-preview'), 'default': document.getElementById('default-preview') }; // Custom cursor document.addEventListener('mousemove', function(e) { const x = e.clientX; const y = e.clientY; cursor.style.left = `${x}px`; cursor.style.top = `${y}px`; // Small delay for the dot for a trailing effect setTimeout(() => { cursorDot.style.left = `${x}px`; cursorDot.style.top = `${y}px`; }, 50); }); document.addEventListener('mousedown', () => { cursor.style.transform = 'translate(-50%, -50%) scale(0.8)'; cursorDot.style.transform = 'translate(-50%, -50%) scale(0.8)'; }); document.addEventListener('mouseup', () => { cursor.style.transform = 'translate(-50%, -50%) scale(1)'; cursorDot.style.transform = 'translate(-50%, -50%) scale(1)'; }); // Hover effect for cursor hoverElements.forEach(element => { element.addEventListener('mouseenter', () => { cursor.classList.add('hover'); }); element.addEventListener('mouseleave', () => { cursor.classList.remove('hover'); }); }); // Menu toggle menuToggle.addEventListener('click', function() { this.classList.toggle('active'); overlay.classList.toggle('active'); document.body.classList.toggle('menu-open'); }); // Preview functionality navLinks.forEach(link => { const category = link.getAttribute('data-category'); if (category) { link.addEventListener('mouseenter', () => { Object.values(previews).forEach(preview => { preview.style.display = 'none'; }); previews[category].style.display = 'flex'; }); link.addEventListener('mouseleave', () => { Object.values(previews).forEach(preview => { preview.style.display = 'none'; }); previews['default'].style.display = 'flex'; }); } // Prevent default link behavior for demo purposes link.addEventListener('click', function(e) { e.preventDefault(); menuToggle.classList.remove('active'); overlay.classList.remove('active'); }); }); // Image loading animation const previewImages = document.querySelectorAll('.preview-image'); previewImages.forEach(img => { img.addEventListener('load', () => { img.style.animation = 'fadeIn 0.5s ease-in-out forwards'; }); }); // Prevent form submission const forms = document.querySelectorAll('form'); forms.forEach(form => { form.addEventListener('submit', (e) => { e.preventDefault(); }); }); // Prevent default on CTA buttons const ctaButtons = document.querySelectorAll('.preview-cta'); ctaButtons.forEach(button => { button.addEventListener('click', (e) => { e.preventDefault(); }); }); }); </script> </body> </html>
<html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', sans-serif; user-select: none; } body { background: #121212; width: 100%; height: 100vh; overflow: hidden; display: flex; justify-content: center; align-items: center; color: white; } .car-display { width: 700px; height: 700px; background: linear-gradient(135deg, #1E1E1E 0%, #0A0A0A 100%); border-radius: 20px; overflow: hidden; position: relative; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5); } .status-bar { height: 50px; display: flex; justify-content: space-between; align-items: center; padding: 0 20px; background: rgba(10, 10, 10, 0.9); backdrop-filter: blur(10px); border-bottom: 1px solid rgba(255, 255, 255, 0.1); } .time { font-size: 18px; font-weight: 600; } .status-icons { display: flex; gap: 15px; } .status-icon { width: 22px; height: 22px; display: flex; align-items: center; justify-content: center; } .main-content { height: calc(100% - 150px); overflow: hidden; position: relative; } .menu-container { display: flex; height: 100%; transition: transform 0.5s cubic-bezier(0.23, 1, 0.32, 1); } .menu-panel { min-width: 100%; height: 100%; padding: 30px; display: flex; flex-direction: column; gap: 25px; } .panel-title { font-size: 28px; font-weight: 700; margin-bottom: 10px; } .card-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 20px; margin-top: 10px; } .card { background: rgba(255, 255, 255, 0.1); border-radius: 15px; padding: 20px; transition: all 0.3s ease; cursor: pointer; position: relative; overflow: hidden; } .card:hover { background: rgba(255, 255, 255, 0.15); transform: translateY(-5px); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3); } .card.active { background: linear-gradient(135deg, #3a47d5 0%, #00d2ff 100%); } .card-icon { font-size: 28px; margin-bottom: 15px; } .card-title { font-size: 18px; font-weight: 600; } .card-subtitle { font-size: 14px; opacity: 0.7; margin-top: 5px; } .music-card { display: flex; background: rgba(255, 255, 255, 0.1); border-radius: 15px; height: 100px; overflow: hidden; margin-top: 10px; } .music-art { width: 100px; height: 100px; background: url('https://images.unsplash.com/photo-1470225620780-dba8ba36b745?ixlib=rb-1.2.1&auto=format&fit=crop&w=300&q=80') center/cover; } .music-info { padding: 15px; flex: 1; display: flex; flex-direction: column; justify-content: center; } .music-title { font-size: 18px; font-weight: 600; } .music-artist { font-size: 14px; opacity: 0.7; margin-top: 5px; } .music-controls { display: flex; align-items: center; gap: 20px; margin-top: 10px; } .music-control { font-size: 20px; cursor: pointer; transition: transform 0.2s ease; width: 35px; height: 35px; display: flex; align-items: center; justify-content: center; } .music-control:hover { transform: scale(1.2); } .weather-card { display: flex; align-items: center; background: rgba(255, 255, 255, 0.1); border-radius: 15px; padding: 20px; margin-top: 10px; } .temp { font-size: 36px; font-weight: 700; } .weather-details { margin-left: 20px; } .weather-condition { font-size: 18px; font-weight: 600; } .weather-location { font-size: 14px; opacity: 0.7; margin-top: 5px; } .weather-icon { font-size: 40px; margin-right: 20px; } .nav-buttons { position: absolute; bottom: 20px; width: 100%; display: flex; justify-content: center; gap: 10px; } .nav-dot { width: 10px; height: 10px; border-radius: 50%; background: rgba(255, 255, 255, 0.3); cursor: pointer; transition: all 0.3s ease; } .nav-dot.active { background: white; width: 30px; border-radius: 5px; } .control-bar { height: 100px; background: rgba(10, 10, 10, 0.95); backdrop-filter: blur(10px); display: flex; justify-content: space-around; align-items: center; position: relative; z-index: 10; border-top: 1px solid rgba(255, 255, 255, 0.1); } .control-icon { width: 50px; height: 50px; display: flex; align-items: center; justify-content: center; border-radius: 50%; background: rgba(255, 255, 255, 0.1); cursor: pointer; transition: all 0.3s ease; } .control-icon:hover, .control-icon.active { background: rgba(255, 255, 255, 0.2); transform: translateY(-5px); } .control-icon.home { background: linear-gradient(135deg, #3a47d5 0%, #00d2ff 100%); } .control-label { font-size: 12px; margin-top: 5px; opacity: 0.7; text-align: center; } .control-item { display: flex; flex-direction: column; align-items: center; } .swipe-indicator { position: absolute; top: 50%; transform: translateY(-50%); width: 50px; height: 50px; background: rgba(255, 255, 255, 0.2); border-radius: 50%; display: flex; align-items: center; justify-content: center; transition: all 0.3s ease; opacity: 0; pointer-events: none; } .swipe-left { left: 10px; } .swipe-right { right: 10px; } .show-indicator { opacity: 0.8; } /* Responsive styles */ @media (max-width: 700px) { .card-grid { grid-template-columns: 1fr; } .panel-title { font-size: 24px; } .control-bar { height: 80px; } .control-icon { width: 40px; height: 40px; } .status-bar { height: 40px; } } /* Map styling */ .map-container { width: 100%; height: 300px; background: #1A1A1A; border-radius: 15px; position: relative; overflow: hidden; margin-top: 10px; } .map { width: 100%; height: 100%; background: url('https://maps.googleapis.com/maps/api/staticmap?center=37.7749,-122.4194&zoom=13&size=600x400&style=element:geometry%7Ccolor:0x212121&style=element:labels.icon%7Cvisibility:off&style=element:labels.text.fill%7Ccolor:0x757575&style=element:labels.text.stroke%7Ccolor:0x212121&style=feature:administrative%7Celement:geometry%7Ccolor:0x757575&style=feature:administrative.country%7Celement:labels.text.fill%7Ccolor:0x9e9e9e&style=feature:administrative.land_parcel%7Cvisibility:off&style=feature:administrative.locality%7Celement:labels.text.fill%7Ccolor:0xbdbdbd&style=feature:poi%7Celement:labels.text.fill%7Ccolor:0x757575&style=feature:poi.park%7Celement:geometry%7Ccolor:0x181818&style=feature:poi.park%7Celement:labels.text.fill%7Ccolor:0x616161&style=feature:poi.park%7Celement:labels.text.stroke%7Ccolor:0x1b1b1b&style=feature:road%7Celement:geometry.fill%7Ccolor:0x2c2c2c&style=feature:road%7Celement:labels.text.fill%7Ccolor:0x8a8a8a&style=feature:road.arterial%7Celement:geometry%7Ccolor:0x373737&style=feature:road.highway%7Celement:geometry%7Ccolor:0x3c3c3c&style=feature:road.highway.controlled_access%7Celement:geometry%7Ccolor:0x4e4e4e&style=feature:road.local%7Celement:labels.text.fill%7Ccolor:0x616161&style=feature:transit%7Celement:labels.text.fill%7Ccolor:0x757575&style=feature:water%7Celement:geometry%7Ccolor:0x000000&style=feature:water%7Celement:labels.text.fill%7Ccolor:0x3d3d3d&key=YOUR_API_KEY') center/cover; } .route-info { position: absolute; bottom: 0; width: 100%; padding: 15px; background: rgba(0, 0, 0, 0.7); backdrop-filter: blur(5px); } .destination { font-size: 18px; font-weight: 600; } .eta { font-size: 14px; opacity: 0.7; margin-top: 5px; } .map-marker { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 20px; height: 20px; background: #3a47d5; border-radius: 50%; border: 3px solid white; box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); } .map-pulse { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 50px; height: 50px; background: rgba(58, 71, 213, 0.3); border-radius: 50%; animation: pulse 2s infinite; } @keyframes pulse { 0% { transform: translate(-50%, -50%) scale(0.5); opacity: 1; } 100% { transform: translate(-50%, -50%) scale(1.5); opacity: 0; } } /* Climate panel styling */ .temperature-control { display: flex; align-items: center; justify-content: space-between; margin-top: 20px; } .temp-display { font-size: 50px; font-weight: 700; text-align: center; width: 120px; } .temp-unit { font-size: 20px; vertical-align: top; } .temp-btn { width: 50px; height: 50px; border-radius: 50%; background: rgba(255, 255, 255, 0.1); display: flex; align-items: center; justify-content: center; font-size: 24px; cursor: pointer; transition: all 0.2s ease; } .temp-btn:hover { background: rgba(255, 255, 255, 0.2); transform: scale(1.1); } .climate-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px; margin-top: 30px; } .climate-option { background: rgba(255, 255, 255, 0.1); border-radius: 12px; padding: 15px; cursor: pointer; text-align: center; transition: all 0.3s ease; } .climate-option:hover { background: rgba(255, 255, 255, 0.15); } .climate-option.active { background: linear-gradient(135deg, #3a47d5 0%, #00d2ff 100%); } .climate-icon { font-size: 24px; margin-bottom: 10px; } .climate-label { font-size: 14px; } /* Phone panel styling */ .recent-calls { margin-top: 20px; } .call-item { display: flex; align-items: center; padding: 15px; border-radius: 12px; background: rgba(255, 255, 255, 0.1); margin-bottom: 15px; cursor: pointer; transition: all 0.3s ease; } .call-item:hover { background: rgba(255, 255, 255, 0.15); transform: translateX(5px); } .contact-avatar { width: 50px; height: 50px; border-radius: 50%; background: #3a47d5; display: flex; align-items: center; justify-content: center; font-size: 20px; font-weight: 600; margin-right: 15px; } .call-details { flex: 1; } .contact-name { font-size: 16px; font-weight: 600; } .call-time { font-size: 14px; opacity: 0.7; margin-top: 5px; } .call-type { margin-left: auto; font-size: 20px; color: #3a47d5; } .action-buttons { display: flex; justify-content: space-around; margin-top: 30px; } .action-btn { width: 60px; height: 60px; border-radius: 50%; background: rgba(255, 255, 255, 0.1); display: flex; align-items: center; justify-content: center; font-size: 24px; cursor: pointer; transition: all 0.3s ease; } .action-btn:hover { background: rgba(255, 255, 255, 0.2); transform: translateY(-5px); } .action-btn.call { background: #4CAF50; } .action-btn.call:hover { background: #45a049; } /* Settings panel styling */ .settings-list { margin-top: 20px; } .setting-item { display: flex; align-items: center; padding: 15px; border-radius: 12px; background: rgba(255, 255, 255, 0.1); margin-bottom: 15px; cursor: pointer; transition: all 0.3s ease; } .setting-item:hover { background: rgba(255, 255, 255, 0.15); } .setting-icon { width: 40px; height: 40px; border-radius: 10px; background: rgba(255, 255, 255, 0.2); display: flex; align-items: center; justify-content: center; font-size: 20px; margin-right: 15px; } .setting-details { flex: 1; } .setting-name { font-size: 16px; font-weight: 600; } .setting-description { font-size: 14px; opacity: 0.7; margin-top: 5px; } .toggle { position: relative; width: 50px; height: 24px; border-radius: 12px; background: rgba(255, 255, 255, 0.2); cursor: pointer; transition: all 0.3s ease; } .toggle.active { background: #3a47d5; } .toggle-handle { position: absolute; top: 2px; left: 2px; width: 20px; height: 20px; border-radius: 50%; background: white; transition: all 0.3s ease; } .toggle.active .toggle-handle { transform: translateX(26px); } /* Animation for swipe */ @keyframes swipeIndicator { 0% { transform: translateX(0); opacity: 0.8; } 50% { transform: translateX(-10px); opacity: 0.8; } 100% { transform: translateX(0); opacity: 0.8; } } @keyframes swipeIndicatorRight { 0% { transform: translateX(0); opacity: 0.8; } 50% { transform: translateX(10px); opacity: 0.8; } 100% { transform: translateX(0); opacity: 0.8; } } .swipe-left.animating { animation: swipeIndicator 1.5s infinite; } .swipe-right.animating { animation: swipeIndicatorRight 1.5s infinite; } /* Battery animation */ .battery-icon { position: relative; width: 22px; height: 12px; border: 2px solid white; border-radius: 3px; } .battery-icon::after { content: ''; position: absolute; top: 2px; right: -4px; width: 2px; height: 8px; background: white; border-radius: 0 2px 2px 0; } .battery-level { position: absolute; top: 2px; left: 2px; height: 8px; width: 70%; background: #4CAF50; border-radius: 1px; } </style> </head> <body> <div class="car-display"> <div class="status-bar"> <div class="time">10:45 AM</div> <div class="status-icons"> <div class="status-icon"> <div class="battery-icon"> <div class="battery-level"></div> </div> </div> <div class="status-icon"> <i class="fas fa-wifi"></i> </div> <div class="status-icon"> <i class="fas fa-bluetooth-b"></i> </div> </div> </div> <div class="main-content"> <div class="menu-container"> <!-- Home Panel --> <div class="menu-panel" id="panel-home"> <div class="panel-title">Home</div> <div class="weather-card"> <div class="weather-icon"> <i class="fas fa-sun"></i> </div> <div class="temp">72°</div> <div class="weather-details"> <div class="weather-condition">Sunny</div> <div class="weather-location">San Francisco, CA</div> </div> </div> <div class="music-card"> <div class="music-art"></div> <div class="music-info"> <div class="music-title">Roadtrip Vibes</div> <div class="music-artist">The Highway Band</div> <div class="music-controls"> <div class="music-control"><i class="fas fa-step-backward"></i></div> <div class="music-control"><i class="fas fa-play"></i></div> <div class="music-control"><i class="fas fa-step-forward"></i></div> </div> </div> </div> <div class="card-grid"> <div class="card"> <div class="card-icon"><i class="fas fa-map-marker-alt"></i></div> <div class="card-title">Navigation</div> <div class="card-subtitle">Start your journey</div> </div> <div class="card"> <div class="card-icon"><i class="fas fa-phone"></i></div> <div class="card-title">Phone</div> <div class="card-subtitle">Make a call</div> </div> <div class="card"> <div class="card-icon"><i class="fas fa-snowflake"></i></div> <div class="card-title">Climate</div> <div class="card-subtitle">72° F</div> </div> <div class="card"> <div class="card-icon"><i class="fas fa-cog"></i></div> <div class="card-title">Settings</div> <div class="card-subtitle">System preferences</div> </div> </div> </div> <!-- Navigation Panel --> <div class="menu-panel" id="panel-nav"> <div class="panel-title">Navigation</div> <div class="map-container"> <div class="map"></div> <div class="map-pulse"></div> <div class="map-marker"></div> <div class="route-info"> <div class="destination">Golden Gate Bridge</div> <div class="eta">Arrival in 15 min · 5.3 miles</div> </div> </div> <div class="card-grid"> <div class="card"> <div class="card-icon"><i class="fas fa-home"></i></div> <div class="card-title">Home</div> <div class="card-subtitle">20 min away</div> </div> <div class="card"> <div class="card-icon"><i class="fas fa-briefcase"></i></div> <div class="card-title">Work</div> <div class="card-subtitle">15 min away</div> </div> <div class="card"> <div class="card-icon"><i class="fas fa-gas-pump"></i></div> <div class="card-title">Gas Station</div> <div class="card-subtitle">2.1 miles</div> </div> <div class="card"> <div class="card-icon"><i class="fas fa-utensils"></i></div> <div class="card-title">Restaurants</div> <div class="card-subtitle">Nearby options</div> </div> </div> </div> <!-- Climate Panel --> <div class="menu-panel" id="panel-climate"> <div class="panel-title">Climate Control</div> <div class="temperature-control"> <div class="temp-btn" id="temp-down"><i class="fas fa-minus"></i></div> <div class="temp-display"><span id="temp-value">72</span><span class="temp-unit">°F</span></div> <div class="temp-btn" id="temp-up"><i class="fas fa-plus"></i></div> </div> <div class="climate-grid"> <div class="climate-option active" id="auto"> <div class="climate-icon"><i class="fas fa-magic"></i></div> <div class="climate-label">AUTO</div> </div> <div class="climate-option" id="ac"> <div class="climate-icon"><i class="fas fa-snowflake"></i></div> <div class="climate-label">A/C</div> </div> <div class="climate-option" id="heat"> <div class="climate-icon"><i class="fas fa-fire"></i></div> <div class="climate-label">HEAT</div> </div> <div class="climate-option" id="face"> <div class="climate-icon"><i class="fas fa-user"></i></div> <div class="climate-label">FACE</div> </div> <div class="climate-option" id="feet"> <div class="climate-icon"><i class="fas fa-socks"></i></div> <div class="climate-label">FEET</div> </div> <div class="climate-option" id="defrost"> <div class="climate-icon"><i class="fas fa-wind"></i></div> <div class="climate-label">DEFROST</div> </div> </div> <div class="card-grid"> <div class="card" id="driver-seat"> <div class="card-icon"><i class="fas fa-chair"></i></div> <div class="card-title">Driver Seat</div> <div class="card-subtitle">Heat level 2</div> </div> <div class="card" id="passenger-seat"> <div class="card-icon"><i class="fas fa-chair"></i></div> <div class="card-title">Passenger Seat</div> <div class="card-subtitle">Heat off</div> </div> </div> </div> <!-- Phone Panel --> <div class="menu-panel" id="panel-phone"> <div class="panel-title">Phone</div> <div class="recent-calls"> <div class="call-item"> <div class="contact-avatar">JD</div> <div class="call-details"> <div class="contact-name">John Doe</div> <div class="call-time">Today, 9:45 AM</div> </div> <div class="call-type"><i class="fas fa-phone-alt"></i></div> </div> <div class="call-item"> <div class="contact-avatar">MS</div> <div class="call-details"> <div class="contact-name">Mike Smith</div> <div class="call-time">Yesterday, 6:30 PM</div> </div> <div class="call-type"><i class="fas fa-phone-alt"></i></div> </div> <div class="call-item"> <div class="contact-avatar">AJ</div> <div class="call-details"> <div class="contact-name">Amy Johnson</div> <div class="call-time">Yesterday, 1:15 PM</div> </div> <div class="call-type"><i class="fas fa-phone-alt"></i></div> </div> </div> <div class="action-buttons"> <div class="action-btn"><i class="fas fa-user"></i></div> <div class="action-btn call"><i class="fas fa-phone-alt"></i></div> <div class="action-btn"><i class="fas fa-history"></i></div> </div> </div> <!-- Settings Panel --> <div class="menu-panel" id="panel-settings"> <div class="panel-title">Settings</div> <div class="settings-list"> <div class="setting-item"> <div class="setting-icon"><i class="fas fa-moon"></i></div> <div class="setting-details"> <div class="setting-name">Night Mode</div> <div class="setting-description">Reduce screen brightness for night driving</div> </div> <div class="toggle active" id="night-mode-toggle"> <div class="toggle-handle"></div> </div> </div> <div class="setting-item"> <div class="setting-icon"><i class="fas fa-volume-up"></i></div> <div class="setting-details"> <div class="setting-name">Voice Assistant</div> <div class="setting-description">Enable hands-free voice commands</div> </div> <div class="toggle active" id="voice-toggle"> <div class="toggle-handle"></div> </div> </div> <div class="setting-item"> <div class="setting-icon"><i class="fas fa-mobile-alt"></i></div> <div class="setting-details"> <div class="setting-name">Bluetooth Devices</div> <div class="setting-description">Manage connected devices</div> </div> <i class="fas fa-chevron-right"></i> </div> <div class="setting-item"> <div class="setting-icon"><i class="fas fa-palette"></i></div> <div class="setting-details"> <div class="setting-name">Display Theme</div> <div class="setting-description">Customize interface appearance</div> </div> <i class="fas fa-chevron-right"></i> </div> </div> </div> </div> <div class="swipe-indicator swipe-left"><i class="fas fa-chevron-left"></i></div> <div class="swipe-indicator swipe-right"><i class="fas fa-chevron-right"></i></div> <div class="nav-buttons"> <div class="nav-dot active" data-index="0"></div> <div class="nav-dot" data-index="1"></div> <div class="nav-dot" data-index="2"></div> <div class="nav-dot" data-index="3"></div> <div class="nav-dot" data-index="4"></div> </div> </div> <div class="control-bar"> <div class="control-item"> <div class="control-icon home" data-target="panel-home"> <i class="fas fa-home"></i> </div> <div class="control-label">Home</div> </div> <div class="control-item"> <div class="control-icon" data-target="panel-nav"> <i class="fas fa-map-marker-alt"></i> </div> <div class="control-label">Navigate</div> </div> <div class="control-item"> <div class="control-icon" data-target="panel-climate"> <i class="fas fa-snowflake"></i> </div> <div class="control-label">Climate</div> </div> <div class="control-item"> <div class="control-icon" data-target="panel-phone"> <i class="fas fa-phone"></i> </div> <div class="control-label">Phone</div> </div> <div class="control-item"> <div class="control-icon" data-target="panel-settings"> <i class="fas fa-cog"></i> </div> <div class="control-label">Settings</div> </div> </div> </div> <script src="https://kit.fontawesome.com/a076d05399.js" crossorigin="anonymous"></script> <script> document.addEventListener('DOMContentLoaded', function() { // Font Awesome fallback if (typeof FontAwesome === 'undefined') { const link = document.createElement('link'); link.rel = 'stylesheet'; link.href = 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css'; document.head.appendChild(link); } // Variables let currentPanel = 0; const totalPanels = 5; const menuContainer = document.querySelector('.menu-container'); const navDots = document.querySelectorAll('.nav-dot'); const controlIcons = document.querySelectorAll('.control-icon'); const swipeLeft = document.querySelector('.swipe-left'); const swipeRight = document.querySelector('.swipe-right'); // Initialize updateNavDots(); updateControlIcons(); // Touch events for sliding menu let touchStartX = 0; let touchEndX = 0; menuContainer.addEventListener('touchstart', function(e) { touchStartX = e.changedTouches[0].screenX; }, false); menuContainer.addEventListener('touchend', function(e) { touchEndX = e.changedTouches[0].screenX; handleSwipe(); }, false); // Mouse events for sliding menu (for desktop testing) let mouseStartX = 0; let mouseEndX = 0; let isDragging = false; menuContainer.addEventListener('mousedown', function(e) { mouseStartX = e.clientX; isDragging = true; }); menuContainer.addEventListener('mousemove', function(e) { if (!isDragging) return; const difference = mouseStartX - e.clientX; const absMove = Math.abs(difference); // Show swipe indicator based on direction if (difference > 10 && currentPanel < totalPanels - 1) { showSwipeIndicator(swipeRight); } else if (difference < -10 && currentPanel > 0) { showSwipeIndicator(swipeLeft); } if (absMove > 50) { if (difference > 0 && currentPanel < totalPanels - 1) { goToPanel(currentPanel + 1); } else if (difference < 0 && currentPanel > 0) { goToPanel(currentPanel - 1); } isDragging = false; } }); menuContainer.addEventListener('mouseup', function() { isDragging = false;
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Healthcare Appointment Scheduler</title> <style> :root { --primary-color: #4e8098; --secondary-color: #a8dadc; --accent-color: #e63946; --light-color: #f1faee; --dark-color: #1d3557; --shadow: 0 4px 12px rgba(29, 53, 87, 0.15); --transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { background-color: #f8f9fa; color: var(--dark-color); height: 100vh; display: flex; flex-direction: column; overflow: hidden; } .container { max-width: 700px; margin: 0 auto; width: 100%; height: 100%; display: flex; flex-direction: column; position: relative; overflow: hidden; } header { background: linear-gradient(135deg, var(--primary-color), var(--dark-color)); color: white; padding: 1.5rem; border-radius: 0 0 20px 20px; box-shadow: var(--shadow); position: relative; z-index: 3; } .header-content { display: flex; align-items: center; justify-content: space-between; } .user-info { display: flex; align-items: center; gap: 12px; } .user-avatar { width: 40px; height: 40px; border-radius: 50%; background-color: var(--secondary-color); display: flex; align-items: center; justify-content: center; border: 2px solid white; overflow: hidden; box-shadow: var(--shadow); } .user-avatar img { width: 100%; height: 100%; object-fit: cover; } .lock-icon { width: 24px; height: 24px; background-color: var(--light-color); border-radius: 50%; display: flex; align-items: center; justify-content: center; color: var(--primary-color); font-size: 12px; } .title { margin-top: 10px; font-size: 1.5rem; font-weight: 600; } .subtitle { font-size: 0.9rem; opacity: 0.8; margin-top: 4px; } .menu-wrapper { flex: 1; overflow: hidden; position: relative; margin-top: 20px; } .appointment-options { display: flex; position: absolute; transition: transform 0.5s cubic-bezier(0.645, 0.045, 0.355, 1); width: 100%; height: 100%; } .appointment-option { min-width: 100%; height: 100%; padding: 1.5rem; display: flex; flex-direction: column; } .option-header { display: flex; align-items: center; margin-bottom: 1.5rem; } .step-indicator { display: flex; align-items: center; margin-left: auto; } .dot { width: 10px; height: 10px; border-radius: 50%; background-color: var(--secondary-color); margin: 0 4px; transition: var(--transition); } .dot.active { background-color: var(--primary-color); width: 20px; border-radius: 10px; } .option-content { flex: 1; display: flex; flex-direction: column; gap: 15px; } .appointment-type { background-color: white; border-radius: 12px; padding: 1.2rem; box-shadow: var(--shadow); cursor: pointer; transition: var(--transition); display: flex; align-items: center; gap: 15px; position: relative; overflow: hidden; } .appointment-type:hover, .time-slot:hover, .doctor-option:hover, .confirmation-card:hover { transform: translateY(-3px); box-shadow: 0 8px 20px rgba(29, 53, 87, 0.2); } .appointment-type:active, .time-slot:active, .doctor-option:active, .confirmation-card:active { transform: translateY(0); } .appointment-type::after { content: ''; position: absolute; width: 5px; height: 0; background-color: var(--accent-color); left: 0; top: 50%; transform: translateY(-50%); transition: height 0.3s ease; border-radius: 0 3px 3px 0; } .appointment-type:hover::after { height: 60%; } .appointment-icon { width: 45px; height: 45px; border-radius: 50%; background-color: var(--light-color); display: flex; align-items: center; justify-content: center; color: var(--primary-color); font-size: 1.5rem; } .appointment-details { flex: 1; } .appointment-details h3 { font-size: 1.1rem; margin-bottom: 5px; } .appointment-details p { font-size: 0.85rem; color: #666; } .time-slots { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; } .time-slot { background-color: white; border-radius: 12px; padding: 1rem; box-shadow: var(--shadow); cursor: pointer; transition: var(--transition); border: 2px solid transparent; text-align: center; } .time-slot.selected { border-color: var(--primary-color); background-color: rgba(78, 128, 152, 0.1); } .time-slot h3 { font-size: 1rem; margin-bottom: 5px; } .time-slot p { font-size: 0.8rem; color: #666; } .availability { font-size: 0.7rem; color: var(--accent-color); margin-top: 5px; } .doctor-options { display: flex; flex-direction: column; gap: 15px; } .doctor-option { background-color: white; border-radius: 12px; padding: 1rem; box-shadow: var(--shadow); cursor: pointer; transition: var(--transition); display: flex; align-items: center; gap: 15px; border: 2px solid transparent; } .doctor-option.selected { border-color: var(--primary-color); background-color: rgba(78, 128, 152, 0.1); } .doctor-avatar { width: 55px; height: 55px; border-radius: 50%; background-color: var(--light-color); display: flex; align-items: center; justify-content: center; overflow: hidden; } .doctor-avatar img { width: 100%; height: 100%; object-fit: cover; } .doctor-info { flex: 1; } .doctor-info h3 { font-size: 1.1rem; margin-bottom: 3px; } .doctor-info p { font-size: 0.8rem; color: #666; margin-bottom: 3px; } .rating { display: flex; align-items: center; gap: 5px; font-size: 0.8rem; } .stars { color: #ffc107; } .confirmation-card { background: linear-gradient(135deg, #ffffff, #f1faee); border-radius: 15px; padding: 1.5rem; box-shadow: var(--shadow); margin-bottom: 20px; position: relative; overflow: hidden; } .confirmation-card::before { content: ''; position: absolute; top: 0; right: 0; width: 100px; height: 100px; background: radial-gradient(circle at top right, rgba(168, 218, 220, 0.5), transparent 70%); border-radius: 0 0 0 100%; } .confirmation-header { display: flex; align-items: center; gap: 15px; margin-bottom: 20px; } .confirmation-icon { width: 55px; height: 55px; border-radius: 50%; background-color: var(--primary-color); display: flex; align-items: center; justify-content: center; color: white; font-size: 1.5rem; } .confirmation-details { flex: 1; } .confirmation-section { margin-bottom: 15px; } .confirmation-section h4 { font-size: 0.9rem; color: #666; margin-bottom: 5px; } .confirmation-section p { font-size: 1.1rem; font-weight: 500; } .divider { height: 1px; background-color: rgba(0, 0, 0, 0.1); margin: 15px 0; } .instructions { background-color: rgba(168, 218, 220, 0.3); padding: 15px; border-radius: 10px; font-size: 0.9rem; line-height: 1.4; } .navigation { display: flex; gap: 12px; margin-top: auto; padding: 1.5rem; background-color: white; border-top: 1px solid rgba(0, 0, 0, 0.05); z-index: 2; } .btn { padding: 14px 25px; border-radius: 12px; border: none; font-size: 1rem; font-weight: 500; cursor: pointer; transition: var(--transition); display: flex; align-items: center; justify-content: center; gap: 8px; } .btn-back { background-color: var(--light-color); color: var(--dark-color); flex: 1; } .btn-next { background-color: var(--primary-color); color: white; flex: 2; } .btn:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); } .btn:active { transform: translateY(0); } .btn-confirm { background-color: var(--accent-color); color: white; flex: 1; } .accessibility-features { position: absolute; bottom: 85px; right: 15px; display: flex; flex-direction: column; gap: 10px; z-index: 4; } .accessibility-button { width: 45px; height: 45px; border-radius: 50%; background-color: white; box-shadow: var(--shadow); border: none; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: var(--transition); color: var(--dark-color); font-size: 1.2rem; } .accessibility-button:hover { transform: scale(1.1); } .pulse { animation: pulse 2s infinite; } @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(230, 57, 70, 0.7); } 70% { box-shadow: 0 0 0 10px rgba(230, 57, 70, 0); } 100% { box-shadow: 0 0 0 0 rgba(230, 57, 70, 0); } } .floating-text { position: absolute; background-color: var(--dark-color); color: white; padding: 8px 12px; border-radius: 8px; font-size: 0.8rem; opacity: 0; transition: opacity 0.3s ease; pointer-events: none; bottom: 60px; left: 50%; transform: translateX(-50%); width: max-content; max-width: 250px; text-align: center; box-shadow: var(--shadow); } .floating-text.show { opacity: 1; } /* Responsive adjustments */ @media (max-width: 600px) { .time-slots { grid-template-columns: 1fr; } .appointment-type { padding: 1rem; } .navigation { padding: 1rem; } .btn { padding: 12px 15px; font-size: 0.9rem; } } /* High contrast mode */ body.high-contrast { background-color: black; color: white; } body.high-contrast header { background: #000; } body.high-contrast .appointment-type, body.high-contrast .time-slot, body.high-contrast .doctor-option, body.high-contrast .confirmation-card, body.high-contrast .navigation { background-color: #222; color: white; } body.high-contrast .appointment-details p, body.high-contrast .time-slot p, body.high-contrast .doctor-info p { color: #ccc; } body.high-contrast .btn-back { background-color: #444; color: white; } body.high-contrast .btn-next, body.high-contrast .btn-confirm { background-color: white; color: black; } /* Large text mode */ body.large-text .title { font-size: 2rem; } body.large-text .subtitle { font-size: 1.2rem; } body.large-text .appointment-details h3, body.large-text .doctor-info h3 { font-size: 1.4rem; } body.large-text .appointment-details p, body.large-text .time-slot p, body.large-text .doctor-info p { font-size: 1.1rem; } body.large-text .btn { font-size: 1.2rem; } </style> </head> <body> <div class="container"> <header> <div class="header-content"> <div class="user-info"> <div class="user-avatar"> <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48Y2lyY2xlIGN4PSIxMDAiIGN5PSI4MCIgcj0iNDAiIGZpbGw9IiM0ZTgwOTgiLz48cGF0aCBkPSJNMTgwIDIwMGMwLTQ0LjE4My0zNS44MTctODAtODAtODBzLTgwIDM1LjgxNy04MCA4MGg4MHoiIGZpbGw9IiM0ZTgwOTgiLz48L3N2Zz4=" alt="User avatar"> </div> <div> <strong>Hello, Sarah</strong> </div> </div> <div class="lock-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 10 0v4"></path></svg> </div> </div> <h1 class="title">Schedule Your Appointment</h1> <p class="subtitle">Let's find a time that works best for you</p> </header> <div class="menu-wrapper"> <div class="appointment-options"> <!-- Option 1: Appointment Type --> <div class="appointment-option" id="option1"> <div class="option-header"> <h2>Select Appointment Type</h2> <div class="step-indicator"> <div class="dot active"></div> <div class="dot"></div> <div class="dot"></div> <div class="dot"></div> </div> </div> <div class="option-content"> <div class="appointment-type" data-value="checkup"> <div class="appointment-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 12h-4l-3 9L9 3l-3 9H2"></path></svg> </div> <div class="appointment-details"> <h3>Annual Check-up</h3> <p>Comprehensive health assessment and preventive care</p> </div> </div> <div class="appointment-type" data-value="followup"> <div class="appointment-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83"></path></svg> </div> <div class="appointment-details"> <h3>Follow-up Visit</h3> <p>Short appointment to review your progress and treatment plan</p> </div> </div> <div class="appointment-type" data-value="specialist"> <div class="appointment-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><polyline points="9 22 9 12 15 12 15 22"></polyline></svg> </div> <div class="appointment-details"> <h3>Specialist Consultation</h3> <p>In-depth assessment with a specialist physician</p> </div> </div> <div class="appointment-type" data-value="urgent"> <div class="appointment-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="12"></line><line x1="12" y1="16" x2="12.01" y2="16"></line></svg> </div> <div class="appointment-details"> <h3>Urgent Care</h3> <p>Same-day appointment for non-emergency medical issues</p> </div> </div> </div> </div> <!-- Option 2: Appointment Time --> <div class="appointment-option" id="option2"> <div class="option-header"> <h2>Select Time & Date</h2> <div class="step-indicator"> <div class="dot"></div> <div class="dot active"></div> <div class="dot"></div> <div class="dot"></div> </div> </div> <div class="option-content"> <p>Available slots for Annual Check-up on May 20, 2023</p> <div class="time-slots"> <div class="time-slot" data-value="9am"> <h3>Morning</h3> <p>9:00 AM</p> <div class="availability">3 slots available</div> </div> <div class="time-slot" data-value="11am"> <h3>Morning</h3> <p>11:30 AM</p> <div class="availability">1 slot available</div> </div> <div class="time-slot" data-value="2pm"> <h3>Afternoon</h3> <p>2:15 PM</p> <div class="availability">5 slots available</div> </div> <div class="time-slot" data-value="4pm"> <h3>Afternoon</h3> <p>4:45 PM</p> <div class="availability">2 slots available</div> </div> </div> </div> </div> <!-- Option 3: Select Doctor --> <div class="appointment-option" id="option3"> <div class="option-header"> <h2>Select Provider</h2> <div class="step-indicator"> <div class="dot"></div> <div class="dot"></div> <div class="dot active"></div> <div class="dot"></div> </div> </div> <div class="option-content"> <p>Available providers for your Annual Check-up on May 20, 2023 at 2:15 PM</p> <div class="doctor-options"> <div class="doctor-option" data-value="dr-smith"> <div class="doctor-avatar"> <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48Y2lyY2xlIGN4PSIxMDAiIGN5PSI4MCIgcj0iNDAiIGZpbGw9IiMxZDM1NTciLz48cGF0aCBkPSJNMTgwIDIwMGMwLTQ0LjE4My0zNS44MTctODAtODAtODBzLTgwIDM1LjgxNy04MCA4MGg4MHoiIGZpbGw9IiMxZDM1NTciLz48L3N2Zz4=" alt="Dr. Smith"> </div> <div class="doctor-info"> <h3>Dr. Michael Smith</h3> <p>Family Medicine • 15+ years exp.</p> <div class="rating"> <div class="stars">★★★★★</div> <span>4.9 (127 reviews)</span> </div> </div> </div> <div class="doctor-option" data-value="dr-patel"> <div class="doctor-avatar"> <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48Y2lyY2xlIGN4PSIxMDAiIGN5PSI4MCIgcj0iNDAiIGZpbGw9IiM0ZTgwOTgiLz48cGF0aCBkPSJNMTgwIDIwMGMwLTQ0LjE4My0zNS44MTctODAtODAtODBzLTgwIDM1LjgxNy04MCA4MGg4MHoiIGZpbGw9IiM0ZTgwOTgiLz48L3N2Zz4=" alt="Dr. Patel"> </div> <div class="doctor-info"> <h3>Dr. Anika Patel</h3> <p>Internal Medicine • 8 years exp.</p> <div class="rating"> <div class="stars">★★★★☆</div> <span>4.7 (89 reviews)</span> </div> </div> </div> <div class="doctor-option" data-value="dr-williams"> <div class="doctor-avatar"> <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48Y2lyY2xlIGN4PSIxMDAiIGN5PSI4MCIgcj0iNDAiIGZpbGw9IiNhOGRhZGMiLz48cGF0aCBkPSJNMTgwIDIwMGMwLTQ0LjE4My0zNS44MTctODAtODAtODBzLTgwIDM1LjgxNy04MCA4MGg4MHoiIGZpbGw9IiNhOGRhZGMiLz48L3N2Zz4=" alt="Dr. Williams"> </div> <div class="doctor-info"> <h3>Dr. James Williams</h3> <p>Family Medicine • 12 years exp.</p> <div class="rating"> <div class="stars">★★★★★</div> <span>4.8 (103 reviews)</span> </div> </div> </div> </div> </div> </div> <!-- Option 4: Confirmation --> <div class="appointment-option" id="option4"> <div class="option-header"> <h2>Confirm Appointment</h2> <div class="step-indicator"> <div class="dot"></div> <div class="dot"></div> <div class="dot"></div> <div class="dot active"></div> </div> </div> <div class="option-content"> <div class="confirmation-card"> <div class="confirmation-header"> <div class="confirmation-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"></path><polyline points="22 4 12 14.01 9 11.01"></polyline></svg> </div> <div class="confirmation-details"> <h3>Your Appointment Details</h3> <p>Please review your appointment information</p> </div> </div> <div class="confirmation-section"> <h4>Appointment Type</h4> <p>Annual Check-up</p> </div> <div class="confirmation-section"> <h4>Date and Time</h4> <p>May 20, 2023 • 2:15 PM</p> </div> <div class="confirmation-section"> <h4>Provider</h4> <p>Dr. Anika Patel</p> </div> <div class="divider"></div> <div class="instructions"> <strong>Preparation Instructions:</strong> <ul> <li>Please arrive 15 minutes before your appointment time</li> <li>Bring your insurance card and ID</li> <li>If this is your first visit, please complete the new patient forms sent to your email</li> </ul> </div> </div> <p>By confirming, you agree to our <a href="#">appointment policy</a> including the 24-hour cancellation notice requirement.</p> </div> </div> </div> </div> <div class="accessibility-features"> <button class="accessibility-button" id="highContrastBtn" aria-label="Toggle high contrast mode"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><path d="M12 2v20M2 12h20"></path></svg> </button> <button class="accessibility-button" id="largeTextBtn" aria-label="Toggle large text mode"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="4 7 4 4 20 4 20 7"></polyline><line x1="9" y1="20" x2="15" y2="20"></line><line x1="12" y1="4" x2="12" y2="20"></line></svg> </button> </div> <div class="floating-text" id="floatingText">Message</div> <div class="navigation"> <button class="btn btn-back" id="backBtn"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="19" y1="12" x2="5" y2="12"></line><polyline points="12 19 5 12 12 5"></polyline></svg> Back </button> <button class="btn btn-next" id="nextBtn"> Continue <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="5" y1="12" x2="19" y2="12"></line><polyline points="12 5 19 12 12 19"></polyline></svg> </button> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Variables const appointmentOptions = document.querySelector('.appointment-options'); const nextBtn = document.getElementById('nextBtn'); const backBtn = document.getElementById('backBtn'); const highContrastBtn = document.getElementById('highContrastBtn'); const largeTextBtn = document.getElementById('largeTextBtn'); const floatingText = document.getElementById('floatingText'); const appointmentTypes = document.querySelectorAll('.appointment-type'); const timeSlots = document.querySelectorAll('.time-slot'); const doctorOptions = document.querySelectorAll('.doctor-option'); let currentStep = 0; const totalSteps = 4; // Functions function updateView() { // Update the transform property to show the current option appointmentOptions.style.transform = `translateX(-${currentStep * 100}%)`; // Update the navigation buttons if (currentStep === 0) { backBtn.style.display = 'none'; } else { backBtn.style.display = 'flex'; } if (currentStep === totalSteps - 1) { nextBtn.textContent = 'Confirm Appointment'; nextBtn.classList.add('btn-confirm'); nextBtn.classList.add('pulse'); } else { nextBtn.textContent = 'Continue'; nextBtn.classList.remove('btn-confirm'); nextBtn.classList.remove('pulse'); } } function showFloatingText(message, duration = 3000) { floatingText.textContent = message; floatingText.classList.add('show'); setTimeout(() => { floatingText.classList.remove('show'); }, duration); } // Event Listeners nextBtn.addEventListener('click', function() { if (currentStep < totalSteps - 1) { currentStep++; updateView(); } else { // This is the final step - appointment confirmed showFloatingText('Appointment confirmed! Confirmation has been sent to your email.', 5000); // Reset to step 1 after a delay setTimeout(() => { currentStep = 0; updateView(); }, 2000); }
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> :root { --primary-blue: #3b82f6; --dark-blue: #1e40af; --light-blue: #dbeafe; --accent-blue: #60a5fa; --text-dark: #1e293b; --text-light: #f8fafc; --border-radius: 12px; --transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { background-color: #f8fafc; color: var(--text-dark); display: flex; height: 100vh; overflow: hidden; } .platform-container { display: flex; max-width: 700px; width: 100%; height: 700px; margin: auto; overflow: hidden; border-radius: var(--border-radius); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); position: relative; } .sidebar { width: 280px; background: white; height: 100%; transform: translateX(-100%); position: absolute; top: 0; left: 0; z-index: 20; transition: var(--transition); box-shadow: 5px 0 15px rgba(0, 0, 0, 0.05); } .sidebar.open { transform: translateX(0); } .sidebar-header { padding: 24px 20px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid #e2e8f0; } .logo { display: flex; align-items: center; gap: 10px; font-weight: 700; font-size: 1.2rem; color: var(--primary-blue); } .logo-icon { background-color: var(--primary-blue); width: 32px; height: 32px; border-radius: 8px; display: flex; align-items: center; justify-content: center; color: white; } .close-menu { background: none; border: none; cursor: pointer; color: var(--text-dark); font-size: 1.2rem; } .search-bar { margin: 15px; position: relative; } .search-bar input { width: 100%; padding: 12px 15px 12px 40px; border-radius: 8px; border: 1px solid #e2e8f0; background-color: #f8fafc; font-size: 0.9rem; transition: var(--transition); } .search-bar input:focus { outline: none; border-color: var(--primary-blue); box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.2); } .search-icon { position: absolute; left: 15px; top: 50%; transform: translateY(-50%); color: #94a3b8; } .course-categories { padding: 10px 15px; } .category-title { font-size: 0.8rem; text-transform: uppercase; letter-spacing: 1px; color: #64748b; margin-bottom: 10px; padding-left: 5px; } .course-list { list-style: none; } .course-item { margin-bottom: 5px; border-radius: 8px; transition: var(--transition); } .course-item:hover { background-color: var(--light-blue); } .course-item.active { background-color: var(--light-blue); } .course-item.active a { color: var(--primary-blue); font-weight: 600; } .course-link { display: flex; align-items: center; padding: 12px 15px; text-decoration: none; color: var(--text-dark); font-size: 0.95rem; transition: var(--transition); position: relative; } .course-icon { margin-right: 12px; width: 20px; height: 20px; display: flex; align-items: center; justify-content: center; color: #64748b; } .course-link:hover .course-icon, .course-item.active .course-icon { color: var(--primary-blue); } .progress-indicator { width: 6px; height: 6px; border-radius: 50%; background-color: #e2e8f0; display: inline-block; margin-left: auto; } .progress-complete { background-color: #10b981; } .progress-in-progress { background-color: #f59e0b; } .main-content { flex: 1; padding: 20px; overflow-y: auto; background-color: white; position: relative; transition: var(--transition); } .menu-toggle { position: absolute; top: 20px; left: 20px; border: none; background: white; width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; cursor: pointer; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.05); z-index: 10; transition: var(--transition); } .menu-toggle:hover { box-shadow: 0 6px 15px rgba(0, 0, 0, 0.1); transform: translateY(-2px); } .course-header { margin-top: 50px; margin-bottom: 30px; text-align: center; } .course-title { font-size: 1.8rem; color: var(--dark-blue); margin-bottom: 10px; } .course-description { color: #64748b; line-height: 1.6; max-width: 600px; margin: 0 auto; } .module-navigation { display: flex; gap: 10px; margin-bottom: 25px; overflow-x: auto; scrollbar-width: thin; padding-bottom: 10px; } .module-navigation::-webkit-scrollbar { height: 6px; } .module-navigation::-webkit-scrollbar-track { background: #f1f5f9; border-radius: 10px; } .module-navigation::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 10px; } .module-tab { padding: 10px 18px; background: #f1f5f9; border: none; border-radius: var(--border-radius); color: #64748b; font-size: 0.9rem; font-weight: 500; cursor: pointer; transition: var(--transition); white-space: nowrap; } .module-tab:hover { background: #e2e8f0; color: var(--text-dark); } .module-tab.active { background: var(--primary-blue); color: white; } .lesson-cards { display: grid; grid-template-columns: 1fr; gap: 15px; } .lesson-card { background: white; border-radius: var(--border-radius); overflow: hidden; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.05); transition: var(--transition); position: relative; cursor: pointer; } .lesson-card:hover { transform: translateY(-5px); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.08); } .lesson-card.active { border: 2px solid var(--primary-blue); } .lesson-card-header { padding: 15px; border-bottom: 1px solid #f1f5f9; display: flex; justify-content: space-between; align-items: center; } .lesson-number { background: var(--light-blue); color: var(--primary-blue); font-weight: 600; font-size: 0.85rem; padding: 4px 10px; border-radius: 6px; } .lesson-duration { color: #64748b; font-size: 0.85rem; display: flex; align-items: center; gap: 5px; } .duration-icon { width: 16px; height: 16px; } .lesson-card-content { padding: 15px; } .lesson-title { font-size: 1.1rem; margin-bottom: 10px; color: var(--text-dark); } .lesson-description { color: #64748b; font-size: 0.9rem; line-height: 1.5; margin-bottom: 15px; } .lesson-resources { display: flex; flex-wrap: wrap; gap: 8px; } .resource-chip { padding: 6px 12px; background: #f1f5f9; border-radius: 20px; font-size: 0.8rem; color: #475569; display: flex; align-items: center; gap: 6px; transition: var(--transition); } .resource-chip:hover { background: #e2e8f0; color: var(--text-dark); } .resource-icon { width: 14px; height: 14px; } .module-content { display: none; } .module-content.active { display: block; animation: fadeIn 0.5s ease forwards; } .progress-bar-container { width: 100%; height: 6px; background-color: #f1f5f9; border-radius: 10px; overflow: hidden; margin-top: 20px; } .progress-bar { height: 100%; background-color: var(--primary-blue); border-radius: 10px; width: 0; transition: width 1s ease; } .completion-status { display: flex; justify-content: space-between; align-items: center; margin-top: 8px; } .completion-text { font-size: 0.8rem; color: #64748b; } .continue-button { background-color: var(--primary-blue); color: white; border: none; padding: 10px 16px; border-radius: 8px; font-weight: 500; cursor: pointer; transition: var(--transition); display: flex; align-items: center; gap: 8px; margin-top: 15px; } .continue-button:hover { background-color: var(--dark-blue); transform: translateY(-2px); } .continue-icon { width: 18px; height: 18px; } .back-to-top { position: fixed; bottom: 30px; right: 30px; background-color: var(--primary-blue); color: white; width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; cursor: pointer; opacity: 0; transition: var(--transition); transform: translateY(20px); z-index: 100; } .back-to-top.visible { opacity: 1; transform: translateY(0); } .floating-hint { position: fixed; bottom: 80px; right: 30px; background-color: white; padding: 10px 15px; border-radius: 10px; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); font-size: 0.85rem; color: var(--text-dark); max-width: 200px; opacity: 0; transform: translateY(20px); transition: var(--transition); z-index: 100; } .floating-hint.visible { opacity: 1; transform: translateY(0); } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } @media (max-width: 600px) { .sidebar { width: 240px; } .course-title { font-size: 1.5rem; } .module-tab { padding: 8px 14px; font-size: 0.8rem; } .lesson-title { font-size: 1rem; } } .ripple-effect { position: absolute; border-radius: 50%; background-color: rgba(59, 130, 246, 0.3); transform: scale(0); animation: ripple 0.6s linear; pointer-events: none; } @keyframes ripple { to { transform: scale(2); opacity: 0; } } .highlight-pulse { animation: pulse 1s ease-in-out; } .notification-badge { position: absolute; top: -5px; right: -5px; background-color: #ef4444; color: white; font-size: 0.7rem; width: 18px; height: 18px; border-radius: 50%; display: flex; align-items: center; justify-content: center; } .status-badge { position: absolute; top: 10px; right: 10px; padding: 4px 8px; border-radius: 4px; font-size: 0.7rem; font-weight: 600; } .status-new { background-color: #10b981; color: white; } .status-updated { background-color: #f59e0b; color: white; } .favorite-button { background: none; border: none; color: #94a3b8; cursor: pointer; position: absolute; top: 10px; right: 10px; transition: var(--transition); z-index: 5; } .favorite-button:hover, .favorite-button.active { color: #f59e0b; transform: scale(1.1); } .favorite-button.active { animation: pulse 0.5s ease-in-out; } .context-highlight { position: relative; } .context-highlight::after { content: ''; position: absolute; bottom: -2px; left: 0; width: 100%; height: 6px; background-color: rgba(59, 130, 246, 0.2); border-radius: 3px; z-index: -1; } </style> </head> <body> <div class="platform-container"> <div class="sidebar"> <div class="sidebar-header"> <div class="logo"> <div class="logo-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path d="M1 2.828c.885-.37 2.154-.769 3.388-.893 1.33-.134 2.458.063 3.112.752v9.746c-.935-.53-2.12-.603-3.213-.493-1.18.12-2.37.461-3.287.811V2.828zm7.5-.141c.654-.689 1.782-.886 3.112-.752 1.234.124 2.503.523 3.388.893v9.923c-.918-.35-2.107-.692-3.287-.81-1.094-.111-2.278-.039-3.213.492V2.687zM8 1.783C7.015.936 5.587.81 4.287.94c-1.514.153-3.042.672-3.994 1.105A.5.5 0 0 0 0 2.5v11a.5.5 0 0 0 .707.455c.882-.4 2.303-.881 3.68-1.02 1.409-.142 2.59.087 3.223.877a.5.5 0 0 0 .78 0c.633-.79 1.814-1.019 3.222-.877 1.378.139 2.8.62 3.681 1.02A.5.5 0 0 0 16 13.5v-11a.5.5 0 0 0-.293-.455c-.952-.433-2.48-.952-3.994-1.105C10.413.809 8.985.936 8 1.783z"/> </svg> </div> <span>LearnSphere</span> </div> <button class="close-menu"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 16 16"> <path d="M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z"/> </svg> </button> </div> <div class="search-bar"> <div class="search-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z"/> </svg> </div> <input type="text" placeholder="Search courses..."> </div> <div class="course-categories"> <h3 class="category-title">My Current Courses</h3> <ul class="course-list"> <li class="course-item active"> <a href="#" class="course-link"> <div class="course-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path d="M5.338 1.59a61.44 61.44 0 0 0-2.837.856.481.481 0 0 0-.328.39c-.554 4.157.726 7.19 2.253 9.188a10.725 10.725 0 0 0 2.287 2.233c.346.244.652.42.893.533.12.057.218.095.293.118a.55.55 0 0 0 .101.025.615.615 0 0 0 .1-.025c.076-.023.174-.061.294-.118.24-.113.547-.29.893-.533a10.726 10.726 0 0 0 2.287-2.233c1.527-1.997 2.807-5.031 2.253-9.188a.48.48 0 0 0-.328-.39c-.651-.213-1.75-.56-2.837-.855C9.552 1.29 8.531 1.067 8 1.067c-.53 0-1.552.223-2.662.524zM5.072.56C6.157.265 7.31 0 8 0s1.843.265 2.928.56c1.11.3 2.229.655 2.887.87a1.54 1.54 0 0 1 1.044 1.262c.596 4.477-.787 7.795-2.465 9.99a11.775 11.775 0 0 1-2.517 2.453 7.159 7.159 0 0 1-1.048.625c-.28.132-.581.24-.829.24s-.548-.108-.829-.24a7.158 7.158 0 0 1-1.048-.625 11.777 11.777 0 0 1-2.517-2.453C1.928 10.487.545 7.169 1.141 2.692A1.54 1.54 0 0 1 2.185 1.43 62.456 62.456 0 0 1 5.072.56z"/> <path d="M9.5 6.5a1.5 1.5 0 0 1-1 1.415l.385 1.99a.5.5 0 0 1-.491.595h-.788a.5.5 0 0 1-.49-.595l.384-1.99a1.5 1.5 0 1 1 2-1.415z"/> </svg> </div> Advanced Data Science <span class="progress-indicator progress-in-progress"></span> </a> </li> <li class="course-item"> <a href="#" class="course-link"> <div class="course-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path d="M8.186 1.113a.5.5 0 0 0-.372 0L1.846 3.5l2.404.961L10.404 2l-2.218-.887zm3.564 1.426L5.596 5 8 5.961 14.154 3.5l-2.404-.961zm3.25 1.7-6.5 2.6v7.922l6.5-2.6V4.24zM7.5 14.762V6.838L1 4.239v7.923l6.5 2.6zM7.443.184a1.5 1.5 0 0 1 1.114 0l7.129 2.852A.5.5 0 0 1 16 3.5v8.662a1 1 0 0 1-.629.928l-7.185 2.874a.5.5 0 0 1-.372 0L.63 13.09a1 1 0 0 1-.63-.928V3.5a.5.5 0 0 1 .314-.464L7.443.184z"/> </svg> </div> Web Development Mastery <span class="progress-indicator progress-complete"></span> </a> </li> <li class="course-item"> <a href="#" class="course-link"> <div class="course-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path d="M6 12.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1-.5-.5ZM3 8.062C3 6.76 4.235 5.765 5.53 5.886a26.58 26.58 0 0 0 4.94 0C11.765 5.765 13 6.76 13 8.062v1.157a.933.933 0 0 1-.765.935c-.845.147-2.34.346-4.235.346-1.895 0-3.39-.2-4.235-.346A.933.933 0 0 1 3 9.219V8.062Zm4.542-.827a.25.25 0 0 0-.217.068l-.92.9a24.767 24.767 0 0 1-1.871-.183.25.25 0 0 0-.068.495c.55.076 1.232.149 2.02.193a.25.25 0 0 0 .189-.071l.754-.736.847 1.71a.25.25 0 0 0 .404.062l.932-.97a25.286 25.286 0 0 0 1.922-.188.25.25 0 0 0-.068-.495c-.538.074-1.207.145-1.98.189a.25.25 0 0 0-.166.076l-.754.785-.842-1.7a.25.25 0 0 0-.182-.135Z"/> <path d="M8.5 1.866a1 1 0 1 0-1 0V3h-2A4.5 4.5 0 0 0 1 7.5V8a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1v1a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-1a1 1 0 0 0 1-1V9a1 1 0 0 0-1-1v-.5A4.5 4.5 0 0 0 10.5 3h-2V1.866ZM14 7.5V13a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V7.5A3.5 3.5 0 0 1 5.5 4h5A3.5 3.5 0 0 1 14 7.5Z"/> </svg> </div> UX Design Principles <span class="progress-indicator"></span> </a> </li> </ul> </div> <div class="course-categories"> <h3 class="category-title">Available Courses</h3> <ul class="course-list"> <li class="course-item"> <a href="#" class="course-link"> <div class="course-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path d="M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z"/> <path d="M6.854 4.646a.5.5 0 0 1 0 .708L4.207 8l2.647 2.646a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708l3-3a.5.5 0 0 1 .708 0zm2.292 0a.5.5 0 0 0 0 .708L11.793 8l-2.647 2.646a.5.5 0 0 0 .708.708l3-3a.5.5 0 0 0 0-.708l-3-3a.5.5 0 0 0-.708 0z"/> </svg> </div> Advanced Algorithms <div class="notification-badge">3</div> </a> </li> <li class="course-item"> <a href="#" class="course-link"> <div class="course-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path d="M14 5a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1h12zM2 4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H2z"/> <path d="M13 10.25a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm0-2a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm-5 0A.25.25 0 0 1 8.25 8h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 8 8.75v-.5zm2 0a.25.25 0 0 1 .25-.25h1.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-1.5a.25.25 0 0 1-.25-.25v-.5zm1 2a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm-5-2A.25.25 0 0 1 6.25 8h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 6 8.75v-.5zm-2 0A.25.25 0 0 1 4.25 8h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 4 8.75v-.5zm-2 0A.25.25 0 0 1 2.25 8h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 2 8.75v-.5zm11-2a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm-2 0a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm-2 0A.25.25 0 0 1 9.25 6h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 9 6.75v-.5zm-2 0A.25.25 0 0 1 7.25 6h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 7 6.75v-.5zm-2 0A.25.25 0 0 1 5.25 6h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 5 6.75v-.5zm-3 0A.25.25 0 0 1 2.25 6h1.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-1.5A.25.25 0 0 1 2 6.75v-.5zm0 4a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm2 0a.25.25 0 0 1 .25-.25h5.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-5.5a.25.25 0 0 1-.25-.25v-.5z"/> </svg> </div> Machine Learning Fundamentals </a> </li> <li class="course-item"> <a href="#" class="course-link"> <div class="course-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path d="M9.293 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V4.707A1 1 0 0 0 13.707 4L10 .293A1 1 0 0 0 9.293 0zM9.5 3.5v-2l3 3h-2a1 1 0 0 1-1-1zm-1 4v3.793l1.146-1.147a.5.5 0 0 1 .708.708l-2 2a.5.5 0 0 1-.708 0l-2-2a.5.5 0 0 1 .708
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>NeoHome Control Panel</title> <style> :root { --bg-color: #0a0a12; --panel-color: #12121f; --accent-primary: #00e5ff; --accent-secondary: #8c1eff; --text-color: #ffffff; --text-secondary: #a0a0c0; --shadow-color: rgba(0, 229, 255, 0.2); --transition-speed: 0.3s; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', 'Roboto', sans-serif; } body { background-color: var(--bg-color); color: var(--text-color); height: 700px; width: 100%; max-width: 700px; margin: 0 auto; overflow: hidden; display: flex; flex-direction: column; position: relative; } .container { flex: 1; display: flex; flex-direction: column; overflow: hidden; position: relative; padding: 20px; } .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; } .header h1 { font-size: 28px; font-weight: 600; background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; text-shadow: 0 0 15px var(--shadow-color); } .user-profile { display: flex; align-items: center; cursor: pointer; position: relative; } .user-avatar { width: 40px; height: 40px; border-radius: 50%; background: linear-gradient(45deg, var(--accent-primary), var(--accent-secondary)); display: flex; align-items: center; justify-content: center; color: var(--text-color); font-weight: bold; border: 2px solid transparent; transition: all var(--transition-speed) ease; } .user-profile:hover .user-avatar { box-shadow: 0 0 15px var(--shadow-color); transform: scale(1.05); } .status-indicator { width: 10px; height: 10px; background-color: #4caf50; border-radius: 50%; position: absolute; right: 0; bottom: 0; border: 2px solid var(--bg-color); box-shadow: 0 0 5px rgba(76, 175, 80, 0.5); } .panel-menu { position: absolute; top: 0; left: -280px; width: 280px; height: 100%; background-color: var(--panel-color); z-index: 100; transition: transform var(--transition-speed) cubic-bezier(0.16, 1, 0.3, 1); border-right: 1px solid rgba(255, 255, 255, 0.05); box-shadow: 5px 0 25px rgba(0, 0, 0, 0.5); padding: 20px; display: flex; flex-direction: column; } .panel-menu.open { transform: translateX(280px); } .overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); backdrop-filter: blur(5px); opacity: 0; visibility: hidden; transition: opacity var(--transition-speed) ease; z-index: 99; } .overlay.active { opacity: 1; visibility: visible; } .menu-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 30px; } .menu-header h2 { font-size: 20px; font-weight: 500; } .close-menu { background: none; border: none; color: var(--text-color); cursor: pointer; width: 30px; height: 30px; display: flex; align-items: center; justify-content: center; border-radius: 50%; transition: background-color var(--transition-speed) ease; } .close-menu:hover { background-color: rgba(255, 255, 255, 0.1); } .menu-items { display: flex; flex-direction: column; gap: 10px; flex: 1; } .menu-item { display: flex; align-items: center; padding: 12px 15px; border-radius: 10px; cursor: pointer; transition: background-color var(--transition-speed) ease; } .menu-item:hover { background-color: rgba(255, 255, 255, 0.05); } .menu-item.active { background: linear-gradient(90deg, rgba(0, 229, 255, 0.15), transparent); border-left: 3px solid var(--accent-primary); } .menu-item i { margin-right: 15px; font-size: 20px; width: 25px; text-align: center; color: var(--text-secondary); transition: color var(--transition-speed) ease; } .menu-item:hover i, .menu-item.active i { color: var(--accent-primary); } .menu-item span { font-size: 16px; transition: color var(--transition-speed) ease; } .menu-item:hover span, .menu-item.active span { color: var(--accent-primary); } .menu-footer { margin-top: 20px; border-top: 1px solid rgba(255, 255, 255, 0.05); padding-top: 20px; display: flex; justify-content: space-between; } .settings-btn, .logout-btn { background: none; border: none; color: var(--text-secondary); cursor: pointer; display: flex; align-items: center; gap: 5px; transition: color var(--transition-speed) ease; font-size: 14px; } .settings-btn:hover, .logout-btn:hover { color: var(--accent-primary); } .menu-toggle { background: none; border: none; color: var(--text-color); cursor: pointer; font-size: 24px; width: 40px; height: 40px; display: flex; align-items: center; justify-content: center; border-radius: 10px; transition: all var(--transition-speed) ease; margin-right: 15px; } .menu-toggle:hover { background-color: rgba(255, 255, 255, 0.1); color: var(--accent-primary); } .content-area { flex: 1; display: flex; flex-direction: column; overflow: hidden; } .search-bar { margin-bottom: 20px; position: relative; } .search-bar input { width: 100%; padding: 15px 20px; padding-left: 45px; background-color: rgba(255, 255, 255, 0.05); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 10px; color: var(--text-color); font-size: 16px; transition: all var(--transition-speed) ease; } .search-bar input:focus { outline: none; border-color: var(--accent-primary); box-shadow: 0 0 10px var(--shadow-color); background-color: rgba(255, 255, 255, 0.07); } .search-bar i { position: absolute; left: 15px; top: 50%; transform: translateY(-50%); color: var(--text-secondary); font-size: 18px; } .quick-access { display: flex; gap: 15px; overflow-x: auto; padding-bottom: 15px; margin-bottom: 20px; scrollbar-width: none; } .quick-access::-webkit-scrollbar { display: none; } .quick-card { min-width: 120px; height: 100px; background-color: var(--panel-color); border-radius: 15px; display: flex; flex-direction: column; align-items: center; justify-content: center; cursor: pointer; transition: all var(--transition-speed) ease; position: relative; overflow: hidden; } .quick-card::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 4px; background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary)); opacity: 0; transition: opacity var(--transition-speed) ease; } .quick-card:hover::before { opacity: 1; } .quick-card:hover { transform: translateY(-5px); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3); } .quick-card i { font-size: 28px; margin-bottom: 10px; color: var(--accent-primary); transition: color var(--transition-speed) ease; } .quick-card span { font-size: 14px; color: var(--text-secondary); transition: color var(--transition-speed) ease; } .quick-card:hover i, .quick-card:hover span { color: var(--accent-primary); } .device-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 20px; flex: 1; overflow-y: auto; padding-right: 10px; scrollbar-width: thin; scrollbar-color: var(--accent-primary) transparent; } .device-grid::-webkit-scrollbar { width: 6px; } .device-grid::-webkit-scrollbar-track { background: transparent; } .device-grid::-webkit-scrollbar-thumb { background-color: rgba(0, 229, 255, 0.3); border-radius: 10px; } .device-card { background-color: var(--panel-color); border-radius: 15px; padding: 20px; transition: all var(--transition-speed) ease; cursor: pointer; position: relative; overflow: hidden; } .device-card:hover { transform: translateY(-5px); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3); } .device-icon { font-size: 24px; margin-bottom: 15px; color: var(--accent-primary); transition: color var(--transition-speed) ease; } .device-name { font-size: 16px; font-weight: 500; margin-bottom: 10px; } .device-status { font-size: 14px; color: var(--text-secondary); display: flex; align-items: center; margin-bottom: 15px; } .status-dot { width: 8px; height: 8px; border-radius: 50%; margin-right: 8px; } .status-dot.on { background-color: #4caf50; box-shadow: 0 0 5px rgba(76, 175, 80, 0.5); } .status-dot.off { background-color: #f44336; box-shadow: 0 0 5px rgba(244, 67, 54, 0.5); } .device-controls { display: flex; align-items: center; justify-content: space-between; } .toggle-switch { position: relative; width: 55px; height: 26px; } .toggle-switch input { opacity: 0; width: 0; height: 0; } .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(255, 255, 255, 0.1); transition: .4s; border-radius: 34px; } .slider:before { position: absolute; content: ""; height: 18px; width: 18px; left: 4px; bottom: 4px; background-color: white; transition: .4s; border-radius: 50%; } input:checked + .slider { background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary)); } input:checked + .slider:before { transform: translateX(29px); } .device-temperature { font-size: 18px; font-weight: 600; } .bottom-nav { display: flex; justify-content: space-between; background-color: var(--panel-color); padding: 15px 25px; border-radius: 20px 20px 0 0; border-top: 1px solid rgba(255, 255, 255, 0.05); } .nav-item { display: flex; flex-direction: column; align-items: center; cursor: pointer; transition: all var(--transition-speed) ease; } .nav-item i { font-size: 20px; margin-bottom: 5px; color: var(--text-secondary); transition: color var(--transition-speed) ease; } .nav-item span { font-size: 12px; color: var(--text-secondary); transition: color var(--transition-speed) ease; } .nav-item.active i, .nav-item.active span, .nav-item:hover i, .nav-item:hover span { color: var(--accent-primary); } .nav-item.active i { text-shadow: 0 0 10px var(--shadow-color); } .scene-template { background: rgba(140, 30, 255, 0.1); border: 1px solid rgba(140, 30, 255, 0.3); border-radius: 10px; padding: 15px; margin-bottom: 20px; display: flex; flex-direction: column; } .template-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; } .template-title { font-size: 16px; font-weight: 500; color: var(--accent-secondary); } .activate-btn { background: linear-gradient(90deg, var(--accent-secondary), var(--accent-primary)); border: none; color: var(--text-color); padding: 5px 12px; border-radius: 5px; cursor: pointer; font-size: 12px; font-weight: 500; transition: all var(--transition-speed) ease; } .activate-btn:hover { transform: scale(1.05); box-shadow: 0 0 15px rgba(140, 30, 255, 0.4); } .template-description { font-size: 14px; color: var(--text-secondary); margin-bottom: 10px; } .device-preview { display: flex; gap: 10px; } .preview-icon { width: 30px; height: 30px; border-radius: 50%; background-color: rgba(255, 255, 255, 0.1); display: flex; align-items: center; justify-content: center; font-size: 14px; color: var(--accent-primary); } @keyframes pulseEffect { 0% { box-shadow: 0 0 0 0 rgba(0, 229, 255, 0.4); } 70% { box-shadow: 0 0 0 10px rgba(0, 229, 255, 0); } 100% { box-shadow: 0 0 0 0 rgba(0, 229, 255, 0); } } .status-dot.pulse { animation: pulseEffect 2s infinite; } /* Microinteractions */ @keyframes glowEffect { 0% { text-shadow: 0 0 5px var(--shadow-color); } 50% { text-shadow: 0 0 15px var(--shadow-color), 0 0 20px var(--shadow-color); } 100% { text-shadow: 0 0 5px var(--shadow-color); } } .glow-text { animation: glowEffect 3s infinite; } .slide-in { animation: slideIn 0.5s forwards; } @keyframes slideIn { from { transform: translateY(20px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } @media (max-width: 500px) { .device-grid { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); } .quick-card { min-width: 100px; } .header h1 { font-size: 24px; } } </style> </head> <body> <div class="container"> <div class="header"> <div style="display: flex; align-items: center;"> <button class="menu-toggle" id="menuToggle"> <i class="fas fa-bars"></i> </button> <h1 class="glow-text">NeoHome</h1> </div> <div class="user-profile"> <div class="user-avatar">MJ</div> <div class="status-indicator pulse"></div> </div> </div> <div class="content-area"> <div class="search-bar"> <i class="fas fa-search"></i> <input type="text" placeholder="Search for devices or rooms..."> </div> <div class="scene-template slide-in"> <div class="template-header"> <div class="template-title">Evening Movie Mode</div> <button class="activate-btn">Activate</button> </div> <div class="template-description">Dims lights, closes blinds, and sets perfect TV viewing temperature</div> <div class="device-preview"> <div class="preview-icon"><i class="fas fa-tv"></i></div> <div class="preview-icon"><i class="fas fa-lightbulb"></i></div> <div class="preview-icon"><i class="fas fa-temperature-low"></i></div> </div> </div> <div class="quick-access slide-in" style="animation-delay: 0.1s"> <div class="quick-card"> <i class="fas fa-couch"></i> <span>Living Room</span> </div> <div class="quick-card"> <i class="fas fa-bed"></i> <span>Bedroom</span> </div> <div class="quick-card"> <i class="fas fa-utensils"></i> <span>Kitchen</span> </div> <div class="quick-card"> <i class="fas fa-bath"></i> <span>Bathroom</span> </div> <div class="quick-card"> <i class="fas fa-door-open"></i> <span>Front Door</span> </div> </div> <div class="device-grid"> <div class="device-card slide-in" style="animation-delay: 0.2s"> <div class="device-icon"><i class="fas fa-lightbulb"></i></div> <div class="device-name">Smart Lamp</div> <div class="device-status"> <div class="status-dot on"></div> <span>On - Living Room</span> </div> <div class="device-controls"> <span>Power</span> <label class="toggle-switch"> <input type="checkbox" checked> <span class="slider"></span> </label> </div> </div> <div class="device-card slide-in" style="animation-delay: 0.3s"> <div class="device-icon"><i class="fas fa-fan"></i></div> <div class="device-name">Smart Fan</div> <div class="device-status"> <div class="status-dot on"></div> <span>Speed 2 - Bedroom</span> </div> <div class="device-controls"> <span>Power</span> <label class="toggle-switch"> <input type="checkbox" checked> <span class="slider"></span> </label> </div> </div> <div class="device-card slide-in" style="animation-delay: 0.4s"> <div class="device-icon"><i class="fas fa-thermometer-half"></i></div> <div class="device-name">Thermostat</div> <div class="device-status"> <div class="status-dot on"></div> <span>Cooling - Whole Home</span> </div> <div class="device-controls"> <div class="device-temperature">21°C</div> <label class="toggle-switch"> <input type="checkbox" checked> <span class="slider"></span> </label> </div> </div> <div class="device-card slide-in" style="animation-delay: 0.5s"> <div class="device-icon"><i class="fas fa-tv"></i></div> <div class="device-name">Smart TV</div> <div class="device-status"> <div class="status-dot off"></div> <span>Off - Living Room</span> </div> <div class="device-controls"> <span>Power</span> <label class="toggle-switch"> <input type="checkbox"> <span class="slider"></span> </label> </div> </div> <div class="device-card slide-in" style="animation-delay: 0.6s"> <div class="device-icon"><i class="fas fa-lock"></i></div> <div class="device-name">Smart Lock</div> <div class="device-status"> <div class="status-dot on"></div> <span>Locked - Front Door</span> </div> <div class="device-controls"> <span>Lock</span> <label class="toggle-switch"> <input type="checkbox" checked> <span class="slider"></span> </label> </div> </div> <div class="device-card slide-in" style="animation-delay: 0.7s"> <div class="device-icon"><i class="fas fa-video"></i></div> <div class="device-name">Security Camera</div> <div class="device-status"> <div class="status-dot on"></div> <span>Recording - Front Yard</span> </div> <div class="device-controls"> <span>Camera</span> <label class="toggle-switch"> <input type="checkbox" checked> <span class="slider"></span> </label> </div> </div> </div> </div> <div class="panel-menu" id="panelMenu"> <div class="menu-header"> <h2>Menu</h2> <button class="close-menu" id="closeMenu"> <i class="fas fa-times"></i> </button> </div> <div class="menu-items"> <div class="menu-item active"> <i class="fas fa-home"></i> <span>Dashboard</span> </div> <div class="menu-item"> <i class="fas fa-lightbulb"></i> <span>Devices</span> </div> <div class="menu-item"> <i class="fas fa-sliders-h"></i> <span>Scenes</span> </div> <div class="menu-item"> <i class="fas fa-chart-line"></i> <span>Energy Usage</span> </div> <div class="menu-item"> <i class="fas fa-bell"></i> <span>Notifications</span> </div> <div class="menu-item"> <i class="fas fa-cog"></i> <span>Settings</span> </div> </div> <div class="menu-footer"> <button class="settings-btn"> <i class="fas fa-cog"></i> <span>Settings</span> </button> <button class="logout-btn"> <i class="fas fa-sign-out-alt"></i> <span>Logout</span> </button> </div> </div> <div class="overlay" id="overlay"></div> </div> <div class="bottom-nav"> <div class="nav-item active"> <i class="fas fa-home"></i> <span>Home</span> </div> <div class="nav-item"> <i class="fas fa-lightbulb"></i> <span>Devices</span> </div> <div class="nav-item"> <i class="fas fa-magic"></i> <span>Scenes</span> </div> <div class="nav-item"> <i class="fas fa-chart-bar"></i> <span>Stats</span> </div> <div class="nav-item"> <i class="fas fa-user"></i> <span>Profile</span> </div> </div> <script src="https://kit.fontawesome.com/a076d05399.js" crossorigin="anonymous"></script> <script> // Menu toggle functionality const menuToggle = document.getElementById('menuToggle'); const closeMenu = document.getElementById('closeMenu'); const panelMenu = document.getElementById('panelMenu'); const overlay = document.getElementById('overlay'); menuToggle.addEventListener('click', function() { panelMenu.classList.add('open'); overlay.classList.add('active'); // Haptic feedback simulation if (window.navigator.vibrate) { window.navigator.vibrate(50); } }); closeMenu.addEventListener('click', function() { panelMenu.classList.remove('open'); overlay.classList.remove('active'); // Haptic feedback simulation if (window.navigator.vibrate) { window.navigator.vibrate(50); } }); overlay.addEventListener('click', function() { panelMenu.classList.remove('open'); overlay.classList.remove('active'); }); // Toggle switches with haptic feedback const toggleSwitches = document.querySelectorAll('.toggle-switch input'); toggleSwitches.forEach(toggle => { toggle.addEventListener('change', function() { const deviceCard = this.closest('.device-card'); const statusDot = deviceCard.querySelector('.status-dot'); const statusText = deviceCard.querySelector('.device-status span'); const deviceName = deviceCard.querySelector('.device-name').textContent; if (this.checked) { statusDot.classList.remove('off'); statusDot.classList.add('on'); // Update status text based on device type if (deviceName.includes('Lamp') || deviceName.includes('Light')) { statusText.textContent = "On - " + statusText.textContent.split('-')[1]; } else if (deviceName.includes('Fan')) { statusText.textContent = "Speed 2 - " + statusText.textContent.split('-')[1]; } else if (deviceName.includes('Thermostat')) { statusText.textContent = "Cooling - " + statusText.textContent.split('-')[1]; } else if (deviceName.includes('TV')) { statusText.textContent = "On - " + statusText.textContent.split('-')[1]; } else if (deviceName.includes('Lock')) { statusText.textContent = "Locked - " + statusText.textContent.split('-')[1]; } else if (deviceName.includes('Camera')) { statusText.textContent = "Recording - " + statusText.textContent.split('-')[1]; } } else { statusDot.classList.remove('on'); statusDot.classList.add('off'); // Update status text statusText.textContent = "Off - " + statusText.textContent.split('-')[1]; } // Haptic feedback simulation if (window.navigator.vibrate) { window.navigator.vibrate(30); } }); }); // Navigation item selection const navItems = document.querySelectorAll('.nav-item'); navItems.forEach(item => { item.addEventListener('click', function() { navItems.forEach(navItem => { navItem.classList.remove('active'); }); this.classList.add('active'); // Haptic feedback simulation if (window.navigator.vibrate) { window.navigator.vibrate(20); } }); }); // Menu item selection const menuItems = document.querySelectorAll('.menu-item'); menuItems.forEach(item => { item.addEventListener('click', function() { menuItems.forEach(menuItem => { menuItem.classList.remove('active'); }); this.classList.add('active'); // Close menu after selection on mobile if (window.innerWidth < 768) { panelMenu.classList.remove('open'); overlay.classList.remove('active'); } // Haptic feedback simulation if (window.navigator.vibrate) { window.navigator.vibrate(20); } }); }); // Activate button with haptic feedback const activateBtn = document.querySelector('.activate-btn'); activateBtn.addEventListener('click', function() { // Visual feedback this.textContent = "Activated"; this.style.background = 'linear-gradient(90deg, #4caf50, #45a049)'; setTimeout(() => { this.textContent = "Activate"; this.style.background = 'linear-gradient(90deg, var(--accent-secondary), var(--accent-primary))'; }, 2000); // Haptic feedback simulation if (window.navigator.vibrate) { window.navigator.vibrate([30, 50, 30]); } }); // Fallback for Font Awesome if CDN fails document.addEventListener('DOMContentLoaded', function() { const faScript = document.querySelector('script[src*="fontawesome"]'); if (faScript) { faScript.onerror = function() { const fallbackIcons = { 'fa-bars': '☰', 'fa-times': '✕', 'fa-home': '⌂', 'fa-lightbulb': '💡', 'fa-sliders-h': '⟿', 'fa-chart-line': '📈', 'fa-bell': '🔔', 'fa-cog': '⚙️', 'fa-sign-out-alt': '🚪', 'fa-couch': '🛋️', 'fa-bed': '🛏️', 'fa-utensils': '🍽️', 'fa-bath': '🛁', 'fa-door-open': '🚪', 'fa-fan': '🌀', 'fa-thermometer-half': '🌡️', 'fa-tv': '📺', 'fa-lock': '🔒', 'fa-video': '📹', 'fa-search': '🔍', 'fa-magic': '✨', 'fa-chart-bar': '📊', 'fa-user': '👤' }; document.querySelectorAll('.fas').forEach(icon => { for (const className in fallbackIcons) { if (icon.classList.contains(className)) { icon.textContent = fallbackIcons[className]; break; } } }); }; } }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Wanderlust Navigator</title> <style> :root { --primary: #e67e22; --secondary: #d35400; --accent: #f39c12; --light: #f5f5f5; --dark: #2c3e50; --beige: #f8f3e9; --terracotta: #d35400; --sage: #7D8471; --sand: #E8DCCA; --midnight: #2c3e50; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { background-color: var(--beige); color: var(--dark); overflow: hidden; height: 100vh; width: 100%; max-width: 700px; max-height: 700px; margin: 0 auto; position: relative; } .app-container { position: relative; height: 100%; width: 100%; overflow: hidden; } .header { display: flex; justify-content: space-between; align-items: center; padding: 20px; background-color: var(--beige); position: relative; z-index: 10; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); } .logo { display: flex; align-items: center; font-weight: 700; color: var(--terracotta); font-size: 1.5rem; } .logo svg { margin-right: 10px; width: 30px; height: 30px; } .menu-button { background: none; border: none; cursor: pointer; width: 40px; height: 40px; display: flex; align-items: center; justify-content: center; border-radius: 50%; color: var(--terracotta); transition: all 0.3s ease; position: relative; z-index: 15; } .menu-button:hover { background-color: rgba(211, 84, 0, 0.1); } .sliding-menu { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: var(--beige); transform: translateX(-100%); transition: transform 0.5s cubic-bezier(0.65, 0, 0.35, 1); z-index: 5; padding-top: 80px; overflow-y: auto; display: flex; flex-direction: column; } .sliding-menu.active { transform: translateX(0); } .menu-header { padding: 0 20px 20px; border-bottom: 1px solid rgba(0, 0, 0, 0.1); } .menu-header h2 { color: var(--terracotta); margin-bottom: 10px; } .search-bar { display: flex; align-items: center; background-color: white; border-radius: 25px; padding: 10px 15px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); margin-bottom: 15px; } .search-bar input { flex: 1; border: none; padding: 5px 10px; outline: none; font-size: 0.9rem; } .search-bar button { background: none; border: none; color: var(--terracotta); cursor: pointer; } .filter-chips { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 15px; } .filter-chip { background-color: white; border: 1px solid var(--sand); border-radius: 20px; padding: 8px 15px; font-size: 0.8rem; cursor: pointer; transition: all 0.3s ease; color: var(--dark); display: flex; align-items: center; } .filter-chip:hover { background-color: var(--sand); } .filter-chip.active { background-color: var(--terracotta); color: white; border-color: var(--terracotta); } .filter-chip svg { margin-right: 5px; width: 14px; height: 14px; } .interactive-map { height: 250px; background-color: var(--sand); margin: 0 20px 20px; border-radius: 15px; position: relative; overflow: hidden; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); } .map-container { position: relative; width: 100%; height: 100%; background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><rect width="100" height="100" fill="%23E8DCCA"/><path d="M0,50 L100,50" stroke="%23d3540030" stroke-width="0.5" stroke-dasharray="5,5"/><path d="M50,0 L50,100" stroke="%23d3540030" stroke-width="0.5" stroke-dasharray="5,5"/></svg>'); background-size: 100px 100px; transition: transform 0.3s ease; } .location-marker { position: absolute; width: 16px; height: 16px; background-color: var(--terracotta); border-radius: 50%; transform: translate(-50%, -50%); cursor: pointer; transition: all 0.3s ease; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } .location-marker:before { content: ''; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 8px; height: 8px; background-color: white; border-radius: 50%; } .location-marker:hover { transform: translate(-50%, -50%) scale(1.2); } .location-marker.active { background-color: var(--accent); z-index: 2; } .location-marker .location-tooltip { position: absolute; bottom: 25px; left: 50%; transform: translateX(-50%) scale(0); background-color: white; padding: 8px 12px; border-radius: 8px; white-space: nowrap; font-size: 0.8rem; color: var(--dark); box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); opacity: 0; transition: all 0.3s ease; pointer-events: none; z-index: 10; } .location-marker:hover .location-tooltip { transform: translateX(-50%) scale(1); opacity: 1; } .map-controls { position: absolute; top: 10px; right: 10px; display: flex; flex-direction: column; gap: 5px; } .map-controls button { width: 30px; height: 30px; border-radius: 50%; border: none; background-color: white; color: var(--dark); cursor: pointer; display: flex; align-items: center; justify-content: center; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); transition: all 0.3s ease; } .map-controls button:hover { background-color: var(--sand); } .category-section { padding: 0 20px; } .category-section h3 { margin-bottom: 15px; color: var(--midnight); font-weight: 600; } .destination-cards { display: flex; gap: 15px; overflow-x: auto; padding-bottom: 15px; scrollbar-width: none; -ms-overflow-style: none; scroll-behavior: smooth; } .destination-cards::-webkit-scrollbar { display: none; } .destination-card { flex: 0 0 auto; width: 200px; background-color: white; border-radius: 12px; overflow: hidden; box-shadow: 0 3px 10px rgba(0, 0, 0, 0.08); transition: all 0.3s ease; position: relative; } .destination-card:hover { transform: translateY(-5px); box-shadow: 0 6px 15px rgba(0, 0, 0, 0.1); } .card-image { height: 130px; background-size: cover; background-position: center; position: relative; } .card-badge { position: absolute; top: 10px; right: 10px; background-color: var(--terracotta); color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.7rem; font-weight: 500; } .card-content { padding: 15px; } .card-title { font-weight: 600; font-size: 1rem; margin-bottom: 5px; color: var(--dark); } .card-meta { display: flex; align-items: center; color: #666; font-size: 0.8rem; margin-bottom: 5px; } .card-meta svg { margin-right: 5px; width: 12px; height: 12px; } .card-price { color: var(--terracotta); font-weight: 700; font-size: 1.1rem; margin-top: 8px; } .main-content { padding: 20px; transition: margin-left 0.5s cubic-bezier(0.65, 0, 0.35, 1); height: calc(100% - 80px); overflow-y: auto; position: relative; display: flex; flex-direction: column; gap: 25px; } .featured-section { position: relative; } .featured-heading { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; } .featured-heading h2 { color: var(--midnight); font-weight: 600; } .view-all { color: var(--terracotta); text-decoration: none; font-size: 0.9rem; font-weight: 500; display: flex; align-items: center; } .view-all svg { margin-left: 5px; width: 14px; height: 14px; } .featured-card { position: relative; height: 200px; border-radius: 15px; overflow: hidden; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); } .featured-image { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-size: cover; background-position: center; transition: transform 0.5s ease; } .featured-card:hover .featured-image { transform: scale(1.05); } .featured-overlay { position: absolute; bottom: 0; left: 0; width: 100%; padding: 20px; background: linear-gradient(to top, rgba(0, 0, 0, 0.7), transparent); color: white; } .featured-title { font-size: 1.4rem; font-weight: 700; margin-bottom: 5px; } .featured-description { font-size: 0.9rem; opacity: 0.9; margin-bottom: 10px; } .featured-cta { display: inline-block; background-color: var(--terracotta); color: white; padding: 8px 16px; border-radius: 20px; font-size: 0.9rem; font-weight: 500; text-decoration: none; transition: all 0.3s ease; } .featured-cta:hover { background-color: var(--secondary); transform: translateY(-2px); } .trending-section { position: relative; } .trending-heading { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; } .trending-heading h2 { color: var(--midnight); font-weight: 600; } .trending-cards { display: flex; flex-wrap: wrap; gap: 15px; } .trending-card { flex: 1 1 calc(50% - 15px); min-width: 140px; background-color: white; border-radius: 12px; overflow: hidden; box-shadow: 0 3px 10px rgba(0, 0, 0, 0.08); transition: all 0.3s ease; } .trending-card:hover { transform: translateY(-5px); box-shadow: 0 6px 15px rgba(0, 0, 0, 0.1); } .trending-image { height: 100px; background-size: cover; background-position: center; } .trending-content { padding: 15px; } .trending-title { font-weight: 600; font-size: 1rem; margin-bottom: 5px; color: var(--dark); } .trending-price { color: var(--terracotta); font-weight: 700; font-size: 1.1rem; } .swipe-indicator { position: absolute; bottom: 20px; left: 50%; transform: translateX(-50%); background-color: rgba(255, 255, 255, 0.8); padding: 8px 15px; border-radius: 20px; display: flex; align-items: center; gap: 8px; opacity: 0; transition: opacity 0.5s ease; pointer-events: none; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } .swipe-indicator.show { opacity: 1; animation: fadeInOut 3s ease; } .swipe-indicator svg { width: 18px; height: 18px; color: var(--terracotta); animation: swipeLeft 1.5s infinite; } .swipe-indicator span { font-size: 0.9rem; color: var(--dark); font-weight: 500; } @keyframes fadeInOut { 0% { opacity: 0; } 20% { opacity: 1; } 80% { opacity: 1; } 100% { opacity: 0; } } @keyframes swipeLeft { 0% { transform: translateX(0); } 50% { transform: translateX(-5px); } 100% { transform: translateX(0); } } .map-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.7); z-index: 20; display: flex; align-items: center; justify-content: center; opacity: 0; pointer-events: none; transition: opacity 0.3s ease; } .map-overlay.active { opacity: 1; pointer-events: all; } .map-modal { width: 90%; max-width: 600px; height: 80%; max-height: 500px; background-color: var(--beige); border-radius: 15px; position: relative; overflow: hidden; box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2); transform: scale(0.9); transition: transform 0.3s ease; } .map-overlay.active .map-modal { transform: scale(1); } .modal-close { position: absolute; top: 15px; right: 15px; width: 36px; height: 36px; background-color: white; border-radius: 50%; border: none; display: flex; align-items: center; justify-content: center; cursor: pointer; z-index: 1; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); transition: all 0.3s ease; } .modal-close:hover { background-color: var(--sand); } .full-map { width: 100%; height: 100%; background-color: var(--sand); background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><rect width="100" height="100" fill="%23E8DCCA"/><path d="M0,50 L100,50" stroke="%23d3540030" stroke-width="0.5" stroke-dasharray="5,5"/><path d="M50,0 L50,100" stroke="%23d3540030" stroke-width="0.5" stroke-dasharray="5,5"/></svg>'); background-size: 100px 100px; position: relative; } @media (max-width: 500px) { .trending-card { flex: 0 0 100%; } } /* Touch indicators for zoom and drag */ .touch-hint { position: absolute; bottom: 15px; left: 15px; display: flex; gap: 10px; } .touch-action { background-color: white; padding: 6px 12px; border-radius: 15px; font-size: 0.8rem; display: flex; align-items: center; gap: 5px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } .touch-action svg { width: 14px; height: 14px; } .pulse-animation { animation: pulse 2s infinite; } @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } /* Add this for swipe feedback */ .swipe-feedback { position: absolute; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; overflow: hidden; } .ripple { position: absolute; border-radius: 50%; background-color: rgba(211, 84, 0, 0.2); transform: scale(0); animation: ripple 0.8s ease-out; } @keyframes ripple { to { transform: scale(2); opacity: 0; } } </style> </head> <body> <div class="app-container"> <header class="header"> <div class="logo"> <svg viewBox="0 0 24 24" fill="currentColor"> <path d="M12,1.25c-3.75,0-6.75,3-6.75,6.75c0,4.63,6.75,14.75,6.75,14.75s6.75-10.13,6.75-14.75C18.75,4.25,15.75,1.25,12,1.25z M12,12c-2.21,0-4-1.79-4-4s1.79-4,4-4s4,1.79,4,4S14.21,12,12,12z"/> </svg> Wanderlust </div> <button class="menu-button" id="menuButton"> <svg viewBox="0 0 24 24" width="24" height="24" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"> <line x1="3" y1="12" x2="21" y2="12"></line> <line x1="3" y1="6" x2="21" y2="6"></line> <line x1="3" y1="18" x2="21" y2="18"></line> </svg> </button> </header> <div class="sliding-menu" id="slidingMenu"> <div class="menu-header"> <h2>Explore Destinations</h2> <div class="search-bar"> <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none"> <circle cx="11" cy="11" r="8"></circle> <line x1="21" y1="21" x2="16.65" y2="16.65"></line> </svg> <input type="text" placeholder="Search destinations..."> <button> <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none"> <line x1="18" y1="6" x2="6" y2="18"></line> <line x1="6" y1="6" x2="18" y2="18"></line> </svg> </button> </div> <div class="filter-chips"> <div class="filter-chip active" data-filter="all"> <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none"> <path d="M4 21v-7m0 0V5a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2zm0 0h16"></path> </svg> All </div> <div class="filter-chip" data-filter="beach"> <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none"> <path d="M12 17.5a7.5 7.5 0 1 0 0-15 7.5 7.5 0 0 0 0 15Z"></path> <path d="M12 22v-4.5"></path> <path d="M5 17.5h14"></path> <path d="M5 12h2"></path> <path d="M17 12h2"></path> <path d="M8 14.5l-1.5 1.5"></path> <path d="M16 14.5l1.5 1.5"></path> </svg> Beaches </div> <div class="filter-chip" data-filter="mountain"> <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none"> <path d="m8 3 4 8 5-5 5 15H2L8 3z"></path> </svg> Mountains </div> <div class="filter-chip" data-filter="city"> <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none"> <rect x="4" y="2" width="16" height="20" rx="2" ry="2"></rect> <path d="M9 22v-4h6v4"></path> <path d="M8 6h.01"></path> <path d="M16 6h.01"></path> <path d="M12 6h.01"></path> <path d="M12 10h.01"></path> <path d="M12 14h.01"></path> <path d="M16 10h.01"></path> <path d="M16 14h.01"></path> <path d="M8 10h.01"></path> <path d="M8 14h.01"></path> </svg> Cities </div> <div class="filter-chip" data-filter="historic"> <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none"> <path d="M12 3c-1.2 0-2.4.6-3 1.7A3.6 3.6 0 0 0 4.6 9c0 1 .4 1.9 1 2.6"></path> <path d="M9 13a3 3 0 1 1 6 0"></path> <path d="M14 13h2.8a2 2 0 0 1 2 2.8c-.6 2-2 3.2-4.8 3.2"></path> <path d="M12 19v3"></path> <path d="M13 3h5a2 2 0 0 1 0 4h-3"></path> </svg> Historic </div> </div> </div> <div class="interactive-map"> <div class="map-container" id="mapContainer"> <div class="location-marker" style="left: 30%; top: 40%;"> <div class="location-tooltip">Santorini, Greece</div> </div> <div class="location-marker" style="left: 45%; top: 20%;"> <div class="location-tooltip">Paris, France</div> </div> <div class="location-marker" style="left: 70%; top: 55%;"> <div class="location-tooltip">Bali, Indonesia</div> </div> <div class="location-marker" style="left: 15%; top: 65%;"> <div class="location-tooltip">Rio de Janeiro, Brazil</div> </div> <div class="location-marker active" style="left: 55%; top: 35%;"> <div class="location-tooltip">Istanbul, Turkey</div> </div> </div> <div class="map-controls"> <button id="zoomIn">+</button> <button id="zoomOut">-</button> </div> <div class="touch-hint"> <div class="touch-action"> <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none"> <path d="M13 11.5V6l-4 4 4 4v-5.5z"></path> <path d="M19 11.5V6l-4 4 4 4v-5.5z"></path> </svg> Drag to explore </div> </div> </div> <div class="category-section"> <h3>Popular Destinations</h3> <div class="destination-cards"> <div class="destination-card" data-location="bali"> <div class="card-image" style="background-image: url('https://images.unsplash.com/photo-1537996194471-e657df975ab4?auto=format&fit=crop&w=400&h=250')"> <div class="card-badge">-15% OFF</div> </div> <div class="card-content"> <div class="card-title">Bali, Indonesia</div> <div class="card-meta"> <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none"> <path d="M12 8V12L15 15"></path> <circle cx="12" cy="12" r="9"></circle> </svg> 8 days, 7 nights </div> <div class="card-meta"> <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none"> <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"></path> </svg> 97% satisfaction rate </div> <div class="card-price">From $899</div> </div> </div> <div class="destination-card" data-location="santorini"> <div class="card-image" style="background-image: url('https://images.unsplash.com/photo-1570077188670-e3a8d69ac5ff?auto=format&fit=crop&w=400&h=250')"> <div class="card-badge">Hot Deal</div> </div> <div class="card-content"> <div class="card-title">Santorini, Greece</div> <div class="card-meta"> <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none"> <path d="M12 8V12L15 15"></path> <circle cx="12" cy="12" r="9"></circle> </svg> 6 days, 5 nights </div> <div class="card-meta"> <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none"> <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"></path> </svg> 99% satisfaction rate </div> <div class="card-price">From $1,149</div> </div> </div> <div class="destination-card" data-location="paris"> <div class="card-image" style="background-image: url('https://images.unsplash.com/photo-1502602898657-3e91760cbb34?auto=format&fit=crop&w=400&h=250')"> </div> <div class="card-content"> <div class="card-title">Paris, France</div> <div class="card-meta"> <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none"> <path d="M12 8V12L15 15"></path> <circle cx="12" cy="12" r="9"></circle> </svg> 5 days, 4 nights </div> <div class="card-meta"> <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none"> <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"></path> </svg> 95% satisfaction rate </div> <div class="card-price">From $1,089</div> </div> </div> <div class="destination-card" data-location="istanbul"> <div class="card-image" style="background-image: url('https://images.unsplash.com/photo-1589561454226-796a8aa89b05?auto=format&fit=crop&w=400&h=250')"> <div class="card-badge">Featured</div> </div> <div class="card-content"> <div class="card-title">Istanbul, Turkey</div> <div class="card-meta"> <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none"> <path d="M12 8V12L15 15"></path> <circle cx="12" cy="12" r="9"></circle> </svg> 7 days, 6 nights </div> <div class="card-meta"> <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none"> <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"></path> </svg> 96% satisfaction rate </div> <div class="card-price">From $779</div> </div> </div> </div> </div> </div> <div class="main-content" id="mainContent"> <div class="featured-section"> <div class="featured-heading"> <h2>Featured Escape</h2> <a href="#" class="view-all"> View all <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none"> <path d="M9 18l6-6-6-6"></path> </svg> </a> </div> <div class="
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Pulse: News Aggregator</title> <style> :root { --primary-color: #000; --secondary-color: #333; --text-color: #f0f0f0; --accent-color: #ff4d4d; --highlight-color: #444; --transition-speed: 0.3s; --menu-width: 280px; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Helvetica Neue', Arial, sans-serif; } body { background-color: var(--primary-color); color: var(--text-color); overflow-x: hidden; height: 100vh; width: 100%; position: relative; } .container { width: 100%; height: 100%; display: flex; transition: transform var(--transition-speed) ease; } .menu-open .container { transform: translateX(var(--menu-width)); } .content { width: 100%; height: 100%; padding: 20px; background: linear-gradient(135deg, #111 0%, #000 100%); transition: all var(--transition-speed) ease; position: relative; overflow-y: auto; } .menu-toggle { position: fixed; top: 20px; left: 20px; z-index: 10; background: none; border: none; cursor: pointer; outline: none; } .menu-icon { width: 30px; height: 25px; position: relative; transition: all var(--transition-speed) ease; } .menu-icon span { display: block; position: absolute; height: 3px; width: 100%; background: var(--text-color); border-radius: 3px; opacity: 1; left: 0; transform: rotate(0deg); transition: all var(--transition-speed) ease-in-out; } .menu-icon span:nth-child(1) { top: 0px; } .menu-icon span:nth-child(2) { top: 10px; } .menu-icon span:nth-child(3) { top: 20px; } .menu-open .menu-icon span:nth-child(1) { top: 10px; transform: rotate(135deg); } .menu-open .menu-icon span:nth-child(2) { opacity: 0; left: -60px; } .menu-open .menu-icon span:nth-child(3) { top: 10px; transform: rotate(-135deg); } .nav-menu { position: fixed; top: 0; left: -var(--menu-width); width: var(--menu-width); height: 100%; background-color: var(--secondary-color); box-shadow: 2px 0 5px rgba(0, 0, 0, 0.5); z-index: 9; transition: left var(--transition-speed) ease; overflow-y: auto; padding-top: 60px; } .menu-open .nav-menu { left: 0; } .nav-menu h2 { color: var(--text-color); text-transform: uppercase; letter-spacing: 2px; padding: 20px; margin-bottom: 10px; font-size: 1.2rem; border-bottom: 1px solid rgba(255, 255, 255, 0.1); } .nav-categories { list-style: none; } .nav-category { position: relative; transition: all var(--transition-speed) ease; } .nav-category > a { display: block; padding: 15px 20px; color: var(--text-color); text-decoration: none; font-size: 1.1rem; font-weight: 700; letter-spacing: 0.5px; transition: all var(--transition-speed) ease; position: relative; z-index: 1; } .nav-category > a::before { content: ""; position: absolute; left: 0; top: 0; height: 100%; width: 0; background-color: var(--highlight-color); z-index: -1; transition: width var(--transition-speed) ease; } .nav-category:hover > a::before { width: 100%; } .nav-category.active > a { color: var(--accent-color); } .nav-category.active > a::before { width: 100%; } .sub-categories { max-height: 0; overflow: hidden; list-style: none; transition: max-height var(--transition-speed) ease; } .nav-category.active .sub-categories { max-height: 500px; } .sub-category { padding: 10px 20px 10px 35px; cursor: pointer; transition: all var(--transition-speed) ease; opacity: 0.8; font-size: 0.95rem; } .sub-category:hover { background-color: var(--highlight-color); opacity: 1; } .sub-category.active { color: var(--accent-color); opacity: 1; } .dropdown-icon { float: right; transition: transform var(--transition-speed) ease; } .nav-category.active .dropdown-icon { transform: rotate(90deg); } .badge { background-color: var(--accent-color); color: white; font-size: 0.7rem; padding: 2px 6px; border-radius: 10px; margin-left: 8px; display: inline-block; font-weight: bold; } .header { display: flex; justify-content: space-between; align-items: center; padding-bottom: 15px; border-bottom: 1px solid rgba(255, 255, 255, 0.1); margin-bottom: 20px; } .logo { font-size: 2.2rem; font-weight: 900; color: var(--text-color); letter-spacing: -1px; margin-left: 45px; } .logo span { color: var(--accent-color); } .search-bar { display: flex; align-items: center; background-color: rgba(255, 255, 255, 0.1); border-radius: 20px; padding: 8px 15px; transition: all var(--transition-speed) ease; } .search-bar:focus-within { background-color: rgba(255, 255, 255, 0.15); box-shadow: 0 0 10px rgba(255, 255, 255, 0.1); } .search-input { background: none; border: none; color: var(--text-color); font-size: 0.9rem; width: 180px; outline: none; } .search-icon { margin-right: 8px; color: rgba(255, 255, 255, 0.6); } .news-content { padding: 10px 0; opacity: 0; transform: translateY(20px); animation: fadeIn 0.5s forwards; } @keyframes fadeIn { to { opacity: 1; transform: translateY(0); } } .headline { font-size: 2.8rem; font-weight: 900; line-height: 1.2; margin-bottom: 15px; letter-spacing: -1px; } .subheadline { font-size: 1.3rem; color: rgba(255, 255, 255, 0.8); line-height: 1.5; margin-bottom: 25px; } .article-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 20px; margin-top: 30px; } .article-card { background-color: rgba(255, 255, 255, 0.05); border-radius: 8px; overflow: hidden; transition: transform 0.2s ease, box-shadow 0.2s ease; } .article-card:hover { transform: translateY(-5px); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2); } .article-image { width: 100%; height: 180px; object-fit: cover; } .article-content { padding: 15px; } .article-title { font-size: 1.1rem; font-weight: 700; margin-bottom: 8px; line-height: 1.3; } .article-meta { display: flex; justify-content: space-between; align-items: center; font-size: 0.8rem; color: rgba(255, 255, 255, 0.6); margin-top: 12px; } .article-source { font-weight: 600; color: var(--accent-color); } .dim-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); opacity: 0; visibility: hidden; transition: all var(--transition-speed) ease; z-index: 8; } .menu-open .dim-overlay { opacity: 1; visibility: visible; } .category-indicator { display: inline-block; padding: 5px 12px; background-color: var(--accent-color); border-radius: 20px; font-size: 0.85rem; font-weight: 600; margin: 0 5px 15px 0; } @media (max-width: 700px) { .logo { font-size: 1.8rem; } .headline { font-size: 2rem; } .subheadline { font-size: 1.1rem; } .article-grid { grid-template-columns: 1fr; } .search-input { width: 120px; } } /* Pulse animation for new content badge */ @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.1); } 100% { transform: scale(1); } } .badge.new { animation: pulse 1.5s infinite; background-color: #0cce6b; } /* Scroll indicator */ .scroll-indicator { position: fixed; top: 0; left: 0; height: 3px; background-color: var(--accent-color); z-index: 11; width: 0%; transition: width 0.1s ease; } </style> </head> <body> <div class="scroll-indicator"></div> <div class="container"> <nav class="nav-menu"> <h2>Pulse News</h2> <ul class="nav-categories"> <li class="nav-category active"> <a href="#" data-section="trending">Trending <span class="dropdown-icon">›</span></a> <ul class="sub-categories"> <li class="sub-category active" data-category="global">Global Headlines</li> <li class="sub-category" data-category="local">Local Stories</li> <li class="sub-category" data-category="popular">Most Read <span class="badge new">LIVE</span></li> </ul> </li> <li class="nav-category"> <a href="#" data-section="politics">Politics <span class="dropdown-icon">›</span></a> <ul class="sub-categories"> <li class="sub-category" data-category="us">U.S. Politics</li> <li class="sub-category" data-category="international">International</li> <li class="sub-category" data-category="policy">Policy & Legislation</li> </ul> </li> <li class="nav-category"> <a href="#" data-section="business">Business <span class="dropdown-icon">›</span></a> <ul class="sub-categories"> <li class="sub-category" data-category="markets">Markets</li> <li class="sub-category" data-category="economy">Economy</li> <li class="sub-category" data-category="startups">Startups <span class="badge">NEW</span></li> <li class="sub-category" data-category="tech">Tech Industry</li> </ul> </li> <li class="nav-category"> <a href="#" data-section="science">Science & Tech <span class="dropdown-icon">›</span></a> <ul class="sub-categories"> <li class="sub-category" data-category="ai">AI & Automation</li> <li class="sub-category" data-category="climate">Climate</li> <li class="sub-category" data-category="space">Space</li> <li class="sub-category" data-category="health">Health Innovation</li> </ul> </li> <li class="nav-category"> <a href="#" data-section="culture">Culture <span class="badge">4</span> <span class="dropdown-icon">›</span></a> <ul class="sub-categories"> <li class="sub-category" data-category="arts">Arts</li> <li class="sub-category" data-category="entertainment">Entertainment</li> <li class="sub-category" data-category="books">Books</li> <li class="sub-category" data-category="food">Food & Drink</li> </ul> </li> <li class="nav-category"> <a href="#" data-section="sports">Sports <span class="dropdown-icon">›</span></a> <ul class="sub-categories"> <li class="sub-category" data-category="football">Football</li> <li class="sub-category" data-category="basketball">Basketball</li> <li class="sub-category" data-category="tennis">Tennis</li> <li class="sub-category" data-category="olympics">Olympics <span class="badge">LIVE</span></li> </ul> </li> <li class="nav-category"> <a href="#" data-section="opinion">Opinion <span class="dropdown-icon">›</span></a> <ul class="sub-categories"> <li class="sub-category" data-category="editorials">Editorials</li> <li class="sub-category" data-category="columnists">Columnists</li> <li class="sub-category" data-category="letters">Letters to Editor</li> </ul> </li> </ul> </nav> <div class="content"> <button class="menu-toggle"> <div class="menu-icon"> <span></span> <span></span> <span></span> </div> </button> <div class="header"> <h1 class="logo">Pulse<span>.</span></h1> <div class="search-bar"> <span class="search-icon">🔍</span> <input type="text" class="search-input" placeholder="Search headlines..."> </div> </div> <div class="news-content"> <div class="category-indicator">Trending</div> <div class="category-indicator">Global Headlines</div> <h2 class="headline">Tech Giants Face New Regulatory Challenges as AI Capabilities Expand</h2> <p class="subheadline">Major technology companies are navigating an increasingly complex regulatory landscape as their artificial intelligence systems become more powerful and integrated into daily life.</p> <div class="article-grid"> <div class="article-card"> <img src="https://source.unsplash.com/random/600x400/?tech,ai" alt="AI Technology" class="article-image"> <div class="article-content"> <h3 class="article-title">EU Proposes Sweeping AI Regulation Framework</h3> <div class="article-meta"> <span class="article-source">Financial Times</span> <span class="article-time">2 hours ago</span> </div> </div> </div> <div class="article-card"> <img src="https://source.unsplash.com/random/600x400/?senate,congress" alt="Congress" class="article-image"> <div class="article-content"> <h3 class="article-title">Senate Hearing on AI Safety Standards Reveals Partisan Divide</h3> <div class="article-meta"> <span class="article-source">Washington Post</span> <span class="article-time">5 hours ago</span> </div> </div> </div> <div class="article-card"> <img src="https://source.unsplash.com/random/600x400/?robot,future" alt="AI Robot" class="article-image"> <div class="article-content"> <h3 class="article-title">Leading AI Researchers Call for Pause on Advanced System Development</h3> <div class="article-meta"> <span class="article-source">MIT Technology Review</span> <span class="article-time">Yesterday</span> </div> </div> </div> <div class="article-card"> <img src="https://source.unsplash.com/random/600x400/?privacy,data" alt="Data Privacy" class="article-image"> <div class="article-content"> <h3 class="article-title">Privacy Concerns Mount as AI Systems Process Personal Information</h3> <div class="article-meta"> <span class="article-source">The Guardian</span> <span class="article-time">1 day ago</span> </div> </div> </div> </div> </div> </div> </div> <div class="dim-overlay"></div> <script> document.addEventListener('DOMContentLoaded', function() { const menuToggle = document.querySelector('.menu-toggle'); const body = document.querySelector('body'); const dimOverlay = document.querySelector('.dim-overlay'); const navCategories = document.querySelectorAll('.nav-category'); const subCategories = document.querySelectorAll('.sub-category'); const newsContent = document.querySelector('.news-content'); const scrollIndicator = document.querySelector('.scroll-indicator'); // Toggle menu menuToggle.addEventListener('click', function() { body.classList.toggle('menu-open'); }); // Close menu when clicking overlay dimOverlay.addEventListener('click', function() { body.classList.remove('menu-open'); }); // Toggle subcategories navCategories.forEach(category => { category.addEventListener('click', function(e) { if (e.target.tagName === 'A') { e.preventDefault(); // Remove active class from all categories navCategories.forEach(c => { if (c !== this) { c.classList.remove('active'); } }); // Toggle active class on clicked category this.classList.toggle('active'); // Update content based on section if (this.classList.contains('active')) { updateContent(e.target.dataset.section); } } }); }); // Handle subcategory selection subCategories.forEach(subCat => { subCat.addEventListener('click', function() { // Remove active class from all subcategories subCategories.forEach(sc => { sc.classList.remove('active'); }); // Add active class to clicked subcategory this.classList.add('active'); // Update content based on category updateContent(this.closest('.nav-category').querySelector('a').dataset.section, this.dataset.category); // Close menu on mobile after selection if (window.innerWidth <= 700) { body.classList.remove('menu-open'); } }); }); // Function to update content function updateContent(section, category = null) { // Content would typically be fetched from an API // For demo purposes, we'll just update the UI with static content let headline, subheadline, indicators = []; // Create fade out effect newsContent.style.opacity = '0'; newsContent.style.transform = 'translateY(20px)'; setTimeout(() => { indicators.push(section.charAt(0).toUpperCase() + section.slice(1)); if (category) { indicators.push(capitalizeWords(category.replace('-', ' '))); } // Set headlines based on section and category switch(section) { case 'trending': if (category === 'global') { headline = "Tech Giants Face New Regulatory Challenges as AI Capabilities Expand"; subheadline = "Major technology companies are navigating an increasingly complex regulatory landscape as their artificial intelligence systems become more powerful and integrated into daily life."; } else if (category === 'local') { headline = "Local Transport Innovations Reshape Urban Mobility"; subheadline = "City planners implement new transportation solutions to address congestion and sustainability challenges facing growing metropolitan areas."; } else if (category === 'popular') { headline = "Climate Summit Concludes with Historic Emissions Agreement"; subheadline = "World leaders reach consensus on unprecedented carbon reduction targets after marathon negotiation session at international climate conference."; } break; case 'politics': headline = "Electoral Reform Bill Gains Bipartisan Support"; subheadline = "Lawmakers from both parties unite behind legislation aimed at modernizing voting systems and enhancing electoral security."; break; case 'business': headline = "Central Banks Signal Policy Shift Amid Economic Uncertainty"; subheadline = "Financial markets respond to indications that major central banks may adjust interest rates in response to inflation concerns and growth forecasts."; break; case 'science': headline = "Breakthrough in Quantum Computing Promises New Possibilities"; subheadline = "Scientists achieve quantum supremacy milestone with processor capable of calculations beyond conventional supercomputers."; break; case 'culture': headline = "Virtual Reality Art Installations Redefine Museum Experience"; subheadline = "Leading cultural institutions embrace immersive technologies to create interactive exhibitions that challenge traditional artistic boundaries."; break; case 'sports': headline = "Underdog Team's Championship Victory Captivates Global Audience"; subheadline = "Against all odds, unheralded squad defeats perennial powerhouses to claim unlikely title in dramatic final match."; break; case 'opinion': headline = "The Digital Divide: A Growing Threat to Democracy"; subheadline = "As essential services move online, unequal access to technology threatens to create new class divisions and undermine civic participation."; break; default: headline = "Tech Giants Face New Regulatory Challenges as AI Capabilities Expand"; subheadline = "Major technology companies are navigating an increasingly complex regulatory landscape as their artificial intelligence systems become more powerful and integrated into daily life."; } // Update DOM document.querySelector('.headline').textContent = headline; document.querySelector('.subheadline').textContent = subheadline; // Update category indicators const indicatorsHTML = indicators.map(ind => `<div class="category-indicator">${ind}</div>` ).join(''); const categoryIndicatorsContainer = document.querySelector('.news-content'); categoryIndicatorsContainer.innerHTML = indicatorsHTML + `<h2 class="headline">${headline}</h2> <p class="subheadline">${subheadline}</p> <div class="article-grid"></div>`; // Simulate loading articles const articleGrid = document.querySelector('.article-grid'); // Generate 4 random articles for (let i = 0; i < 4; i++) { const article = document.createElement('div'); article.className = 'article-card'; // Use random themed images relevant to the section const imageKeywords = getImageKeywords(section, category); article.innerHTML = ` <img src="https://source.unsplash.com/random/600x400/?${imageKeywords}" alt="${section}" class="article-image"> <div class="article-content"> <h3 class="article-title">${getRandomTitle(section, category)}</h3> <div class="article-meta"> <span class="article-source">${getRandomSource()}</span> <span class="article-time">${getRandomTime()}</span> </div> </div> `; articleGrid.appendChild(article); } // Animate back in setTimeout(() => { newsContent.style.opacity = '1'; newsContent.style.transform = 'translateY(0)'; }, 50); }, 300); } // Helper function to get image keywords based on section and category function getImageKeywords(section, category) { const keywordMap = { 'trending': 'news,trending', 'politics': 'politics,government', 'business': 'business,finance', 'science': 'science,technology', 'culture': 'culture,arts', 'sports': 'sports,athletes', 'opinion': 'people,discussion' }; const categoryKeywords = { 'global': 'global,world', 'local': 'city,community', 'popular': 'crowd,popular', 'us': 'usa,congress', 'international': 'united-nations,diplomacy', 'markets': 'stock-market,trading', 'economy': 'economy,financial', 'ai': 'artificial-intelligence,robot', 'climate': 'climate,environment', 'football': 'football,soccer', 'basketball': 'basketball,nba' }; let keywords = keywordMap[section] || 'news'; if (category && categoryKeywords[category]) { keywords += ',' + categoryKeywords[category]; } return keywords; } // Helper function to get random article titles function getRandomTitle(section, category) { const titles = { 'trending': [ "Global Supply Chain Disruptions Continue to Impact Retailers", "New Study Reveals Changing Work Patterns Post-Pandemic", "Renewable Energy Investments Reach Record High", "Tech Industry Faces Talent Shortage Amid Digital Transformation" ], 'politics': [ "Diplomatic Tensions Rise Following Summit Disagreement", "Lawmakers Propose Major Infrastructure Package", "Voter Participation Initiative Gains Momentum", "International Coalition Forms to Address Security Concerns" ], 'business': [ "Startup Secures Record Funding for Sustainable Product Line", "Major Merger Reshapes Industry Landscape", "Consumer Spending Data Shows Shifting Priorities", "Remote Work Policies Become Permanent at Leading Companies" ], 'science': [ "Researchers Develop Novel Approach to Renewable Energy Storage", "Medical Breakthrough Could Transform Treatment Options", "Space Telescope Reveals Unprecedented Cosmic Details", "Ethical Questions Surround New Biotechnology Advances" ], 'culture': [ "Independent Film Garners Critical Acclaim at Festival", "Digital Artist's NFT Collection Breaks Auction Records", "Literary Prize Winner Explores Contemporary Social Themes", "Immersive Exhibition Combines Technology and Traditional Art" ], 'sports': [ "Underdog Team's Championship Victory Defies Expectations", "Athlete Breaks Decades-Old Record in Stunning Performance", "New Analytics Approach Transforms Team Strategy", "International Tournament Expands to Include Emerging Nations" ], 'opinion': [ "The Future of Work Requires New Educational Priorities", "Digital Privacy Concerns Demand Regulatory Response", "Urban Planning Must Center Climate Resilience", "Media Literacy Becomes Essential in Information Age" ] }; const sectionTitles = titles[section] || titles['trending']; return sectionTitles[Math.floor(Math.random() * sectionTitles.length)]; } // Helper function to get random news sources function getRandomSource() { const sources = [ "The Guardian", "Reuters", "Bloomberg", "Associated Press", "The Atlantic", "Financial Times", "Wired", "The Economist", "BBC News", "Al Jazeera", "NPR", "The New Yorker" ]; return sources[Math.floor(Math.random() * sources.length)]; } // Helper function to get random time function getRandomTime() { const times = [ "Just now", "5 minutes ago", "30 minutes ago", "1 hour ago", "2 hours ago", "3 hours ago", "This morning", "Yesterday" ]; return times[Math.floor(Math.random() * times.length)]; } // Helper to capitalize words function capitalizeWords(string) { return string.split(' ') .map(word => word.charAt(0).toUpperCase() + word.slice(1)) .join(' '); } // Update scroll indicator window.addEventListener('scroll', function() { const windowHeight = window.innerHeight; const fullHeight = document.body.scrollHeight; const scrolled = window.scrollY; const percentage = (scrolled / (fullHeight - windowHeight)) * 100; scrollIndicator.style.width = percentage + '%'; }); // Add article hover effect document.addEventListener('mouseover', function(e) { if (e.target.closest('.article-card')) { const cards = document.querySelectorAll('.article-card'); cards.forEach(card => { if (card !== e.target.closest('.article-card')) { card.style.opacity = '0.7'; } }); } }); document.addEventListener('mouseout', function(e) { if (e.target.closest('.article-card')) { const cards = document.querySelectorAll('.article-card'); cards.forEach(card => { card.style.opacity = '1'; }); } }); }); </script> </body> </html>