In the realm of web development, select boxes are indispensable for creating intuitive and user-friendly interfaces. They streamline the process of making selections, enhancing the overall user experience.
This article delves into 10 exemplary select box designs, showcasing their versatility and functionality. Each example highlights unique features 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
Designers and developers, elevate your UI game with Subframe's drag-and-drop interface and intuitive, responsive canvas. Create pixel-perfect select boxes effortlessly, ensuring a seamless user experience every time.
Loved by professionals across the board, Subframe is your go-to tool for stunning designs. Start for free 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 select boxes and other UI elements effortlessly. Our drag-and-drop interface ensures efficiency and precision.
Don't wait! Start for free and begin designing stunning UIs immediately. Join the community of professionals who trust Subframe for their design needs.
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Artisanal Marketplace Filter</title> <style> :root { --primary: #3a506b; --primary-light: #5b7db5; --accent: #ff6b6b; --neutral-100: #f8f9fa; --neutral-200: #e9ecef; --neutral-300: #dee2e6; --neutral-400: #ced4da; --neutral-500: #adb5bd; --neutral-600: #6c757d; --neutral-700: #495057; --neutral-800: #343a40; --neutral-900: #212529; --shadow-sm: 0 2px 5px rgba(0,0,0,0.05); --shadow-md: 0 4px 12px rgba(0,0,0,0.08); --shadow-lg: 0 8px 24px rgba(0,0,0,0.12); --radius-sm: 4px; --radius-md: 8px; --radius-lg: 12px; --transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; } body { background-color: var(--neutral-100); display: flex; justify-content: center; align-items: center; min-height: 700px; color: var(--neutral-800); } .container { width: 100%; max-width: 680px; padding: 20px; background-color: white; border-radius: var(--radius-lg); box-shadow: var(--shadow-md); transition: var(--transition); } .header { margin-bottom: 24px; } .header h1 { font-size: 1.8rem; font-weight: 600; color: var(--neutral-900); margin-bottom: 8px; } .header p { color: var(--neutral-600); line-height: 1.5; } .filter-container { position: relative; margin-bottom: 24px; } .filter-label { display: block; font-weight: 500; margin-bottom: 8px; color: var(--neutral-700); } .filter-select-wrapper { position: relative; cursor: pointer; } .filter-select { width: 100%; padding: 16px 20px; background-color: var(--neutral-100); border: 1px solid var(--neutral-300); border-radius: var(--radius-md); font-size: 1rem; color: var(--neutral-800); cursor: pointer; position: relative; display: flex; justify-content: space-between; align-items: center; transition: var(--transition); } .filter-select:hover { background-color: var(--neutral-200); } .filter-select.active { border-color: var(--primary); box-shadow: 0 0 0 3px rgba(58, 80, 107, 0.15); } .filter-select-arrow { position: relative; width: 14px; height: 14px; transition: var(--transition); } .filter-select-arrow::before, .filter-select-arrow::after { content: ''; position: absolute; background-color: var(--neutral-600); width: 2px; height: 8px; border-radius: 1px; transition: var(--transition); } .filter-select-arrow::before { transform: rotate(45deg); right: 5px; } .filter-select-arrow::after { transform: rotate(-45deg); right: 0; } .filter-select.active .filter-select-arrow::before { transform: rotate(-45deg); background-color: var(--primary); } .filter-select.active .filter-select-arrow::after { transform: rotate(45deg); background-color: var(--primary); } .filter-dropdown { position: absolute; top: calc(100% + 8px); left: 0; width: 100%; background-color: white; border-radius: var(--radius-md); box-shadow: var(--shadow-lg); z-index: 10; opacity: 0; transform: translateY(-10px); visibility: hidden; transition: var(--transition); max-height: 300px; overflow-y: auto; } .filter-dropdown.active { opacity: 1; transform: translateY(0); visibility: visible; } .filter-dropdown-items { list-style: none; padding: 8px 0; } .filter-dropdown-item { padding: 12px 20px; cursor: pointer; transition: var(--transition); display: flex; align-items: center; position: relative; } .filter-dropdown-item:hover { background-color: var(--neutral-100); } .filter-dropdown-item.selected { background-color: rgba(58, 80, 107, 0.08); color: var(--primary); font-weight: 500; } .filter-dropdown-item.selected::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; background-color: var(--primary); } .category-icon { width: 20px; height: 20px; margin-right: 12px; opacity: 0.7; transition: var(--transition); } .filter-dropdown-item:hover .category-icon, .filter-dropdown-item.selected .category-icon { opacity: 1; } .filter-tags { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 24px; } .filter-tag { background-color: var(--neutral-200); color: var(--neutral-700); padding: 6px 12px; border-radius: 100px; font-size: 0.875rem; display: inline-flex; align-items: center; cursor: pointer; transition: var(--transition); border: 1px solid transparent; } .filter-tag:hover { background-color: var(--neutral-300); } .filter-tag.active { background-color: rgba(58, 80, 107, 0.12); color: var(--primary); border-color: rgba(58, 80, 107, 0.2); } .filter-tag-close { margin-left: 6px; width: 16px; height: 16px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; background-color: var(--neutral-400); color: white; font-size: 0.75rem; transition: var(--transition); } .filter-tag:hover .filter-tag-close { background-color: var(--neutral-500); } .filter-tag.active .filter-tag-close { background-color: var(--primary-light); } .products { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 16px; } .product-card { background-color: white; border-radius: var(--radius-md); overflow: hidden; box-shadow: var(--shadow-sm); transition: var(--transition); border: 1px solid var(--neutral-200); } .product-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-md); } .product-image { width: 100%; aspect-ratio: 1; background-color: var(--neutral-200); display: flex; align-items: center; justify-content: center; color: var(--neutral-500); font-size: 0.875rem; overflow: hidden; } .product-image img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.5s ease; } .product-card:hover .product-image img { transform: scale(1.05); } .product-info { padding: 12px; } .product-category { font-size: 0.75rem; color: var(--primary); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 4px; } .product-name { font-weight: 500; margin-bottom: 4px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; } .product-price { color: var(--neutral-700); font-weight: 600; } .empty-state { text-align: center; padding: 40px 0; color: var(--neutral-600); display: none; } .empty-state-icon { font-size: 2rem; margin-bottom: 16px; opacity: 0.5; } @media (max-width: 500px) { .header h1 { font-size: 1.5rem; } .products { grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 12px; } .product-info { padding: 8px; } .product-name { font-size: 0.875rem; } } /* Animations */ @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } .filter-select.just-selected { animation: pulse 0.4s ease; } </style> </head> <body> <div class="container"> <div class="header"> <h1>Artisanal Marketplace</h1> <p>Browse our curated collection of handcrafted goods from independent artisans worldwide.</p> </div> <div class="filter-container"> <label class="filter-label">Filter by Category</label> <div class="filter-select-wrapper"> <div class="filter-select" id="categorySelect"> <span>All Categories</span> <div class="filter-select-arrow"></div> </div> <div class="filter-dropdown"> <ul class="filter-dropdown-items"> <li class="filter-dropdown-item selected" data-value="all"> <svg class="category-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <path d="M4 6h16M4 12h16M4 18h16"></path> </svg> All Categories </li> <li class="filter-dropdown-item" data-value="ceramics"> <svg class="category-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <path d="M8 10V8a4 4 0 0 1 8 0v2M8 10h8m-8 0v7a2 2 0 0 0 2 2h4a2 2 0 0 0 2-2v-7"></path> </svg> Ceramics </li> <li class="filter-dropdown-item" data-value="textiles"> <svg class="category-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"></path> </svg> Textiles </li> <li class="filter-dropdown-item" data-value="jewelry"> <svg class="category-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <circle cx="12" cy="12" r="10"></circle> <circle cx="12" cy="12" r="3"></circle> </svg> Jewelry </li> <li class="filter-dropdown-item" data-value="woodwork"> <svg class="category-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <rect x="3" y="5" width="18" height="14" rx="2"></rect> <line x1="3" y1="10" x2="21" y2="10"></line> </svg> Woodwork </li> <li class="filter-dropdown-item" data-value="prints"> <svg class="category-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <rect x="3" y="3" width="18" height="18" rx="2"></rect> <line x1="3" y1="9" x2="21" y2="9"></line> <line x1="9" y1="21" x2="9" y2="9"></line> </svg> Fine Art Prints </li> <li class="filter-dropdown-item" data-value="candles"> <svg class="category-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <path d="M9 18V5c0-1.1.9-2 2-2h0a2 2 0 0 1 2 2v13"></path> <path d="M18 18H6"></path> </svg> Candles & Scents </li> <li class="filter-dropdown-item" data-value="leatherwork"> <svg class="category-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <rect x="2" y="7" width="20" height="14" rx="2" ry="2"></rect> <path d="M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16"></path> </svg> Leatherwork </li> </ul> </div> </div> </div> <div class="filter-tags"> <div class="filter-tag active" data-value="all">All Categories</div> <div class="filter-tag" data-value="ceramics">Ceramics</div> <div class="filter-tag" data-value="textiles">Textiles</div> <div class="filter-tag" data-value="jewelry">Jewelry</div> <div class="filter-tag" data-value="woodwork">Woodwork</div> </div> <div class="products"> <div class="product-card" data-category="ceramics"> <div class="product-image"> <img src="https://images.unsplash.com/photo-1565193566173-7a0ee3dbe261?ixlib=rb-4.0.3&auto=format&fit=crop&w=400&h=400&q=80" alt="Handcrafted mug"> </div> <div class="product-info"> <div class="product-category">Ceramics</div> <div class="product-name">Artisan Stoneware Mug</div> <div class="product-price">$42</div> </div> </div> <div class="product-card" data-category="textiles"> <div class="product-image"> <img src="https://images.unsplash.com/photo-1606760227091-3dd870d97f1d?ixlib=rb-4.0.3&auto=format&fit=crop&w=400&h=400&q=80" alt="Woven blanket"> </div> <div class="product-info"> <div class="product-category">Textiles</div> <div class="product-name">Hand-Woven Throw Blanket</div> <div class="product-price">$124</div> </div> </div> <div class="product-card" data-category="jewelry"> <div class="product-image"> <img src="https://images.unsplash.com/photo-1584302179602-e4c3d3fd629d?ixlib=rb-4.0.3&auto=format&fit=crop&w=400&h=400&q=80" alt="Gold earrings"> </div> <div class="product-info"> <div class="product-category">Jewelry</div> <div class="product-name">Brass Statement Earrings</div> <div class="product-price">$68</div> </div> </div> <div class="product-card" data-category="woodwork"> <div class="product-image"> <img src="https://images.unsplash.com/photo-1606074280798-2dabb75ce10c?ixlib=rb-4.0.3&auto=format&fit=crop&w=400&h=400&q=80" alt="Wooden cutting board"> </div> <div class="product-info"> <div class="product-category">Woodwork</div> <div class="product-name">Walnut Serving Board</div> <div class="product-price">$89</div> </div> </div> <div class="product-card" data-category="prints"> <div class="product-image"> <img src="https://images.unsplash.com/photo-1576053139339-78933c095a35?ixlib=rb-4.0.3&auto=format&fit=crop&w=400&h=400&q=80" alt="Botanical print"> </div> <div class="product-info"> <div class="product-category">Fine Art Prints</div> <div class="product-name">Botanical Linocut Print</div> <div class="product-price">$65</div> </div> </div> <div class="product-card" data-category="ceramics"> <div class="product-image"> <img src="https://images.unsplash.com/photo-1610701596007-11502861dcfa?ixlib=rb-4.0.3&auto=format&fit=crop&w=400&h=400&q=80" alt="Ceramic planter"> </div> <div class="product-info"> <div class="product-category">Ceramics</div> <div class="product-name">Speckled Ceramic Planter</div> <div class="product-price">$58</div> </div> </div> <div class="product-card" data-category="leatherwork"> <div class="product-image"> <img src="https://images.unsplash.com/photo-1619526881542-c81baff85fa4?ixlib=rb-4.0.3&auto=format&fit=crop&w=400&h=400&q=80" alt="Leather wallet"> </div> <div class="product-info"> <div class="product-category">Leatherwork</div> <div class="product-name">Hand-Stitched Card Holder</div> <div class="product-price">$48</div> </div> </div> <div class="product-card" data-category="candles"> <div class="product-image"> <img src="https://images.unsplash.com/photo-1602178558863-5a4a4a66733a?ixlib=rb-4.0.3&auto=format&fit=crop&w=400&h=400&q=80" alt="Handcrafted candle"> </div> <div class="product-info"> <div class="product-category">Candles & Scents</div> <div class="product-name">Cedar & Sage Soy Candle</div> <div class="product-price">$34</div> </div> </div> </div> <div class="empty-state"> <div class="empty-state-icon">🔍</div> <p>No products found in this category.</p> <p>Try selecting a different category.</p> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const select = document.getElementById('categorySelect'); const dropdown = document.querySelector('.filter-dropdown'); const dropdownItems = document.querySelectorAll('.filter-dropdown-item'); const filterTags = document.querySelectorAll('.filter-tag'); const products = document.querySelectorAll('.product-card'); const emptyState = document.querySelector('.empty-state'); // Toggle dropdown select.addEventListener('click', function() { select.classList.toggle('active'); dropdown.classList.toggle('active'); }); // Close dropdown when clicking outside document.addEventListener('click', function(e) { if (!select.contains(e.target) && !dropdown.contains(e.target)) { select.classList.remove('active'); dropdown.classList.remove('active'); } }); // Handle dropdown item selection dropdownItems.forEach(item => { item.addEventListener('click', function() { const value = this.dataset.value; const text = this.textContent.trim(); // Update select display select.querySelector('span').textContent = text; select.classList.remove('active'); dropdown.classList.remove('active'); select.classList.add('just-selected'); setTimeout(() => { select.classList.remove('just-selected'); }, 400); // Update selected state dropdownItems.forEach(i => i.classList.remove('selected')); this.classList.add('selected'); // Update filter tags filterTags.forEach(tag => { tag.classList.toggle('active', tag.dataset.value === value); }); // Filter products filterProducts(value); }); }); // Handle filter tag selection filterTags.forEach(tag => { tag.addEventListener('click', function() { const value = this.dataset.value; // Update filter tags filterTags.forEach(t => t.classList.remove('active')); this.classList.add('active'); // Update dropdown selection const selectedItem = Array.from(dropdownItems).find(item => item.dataset.value === value); if (selectedItem) { select.querySelector('span').textContent = selectedItem.textContent.trim(); dropdownItems.forEach(i => i.classList.remove('selected')); selectedItem.classList.add('selected'); } // Filter products filterProducts(value); }); }); // Filter products function function filterProducts(category) { let visibleCount = 0; products.forEach(product => { if (category === 'all' || product.dataset.category === category) { product.style.display = 'block'; visibleCount++; // Add a slight stagger to the animation const delay = (visibleCount - 1) * 0.05; product.style.transitionDelay = delay + 's'; // Reset the transition delay after animation completes setTimeout(() => { product.style.transitionDelay = '0s'; }, 300 + delay * 1000); } else { product.style.display = 'none'; } }); // Show/hide empty state emptyState.style.display = visibleCount === 0 ? 'block' : 'none'; } // Initialize with all products filterProducts('all'); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Data Analytics Dashboard</title> <style> :root { --primary: #5664d2; --primary-light: #6b78e6; --secondary: #2c3e50; --accent: #12c2e9; --light: #f5f7fa; --dark: #2d3748; --danger: #ff4757; --success: #2ed573; --warning: #ffa502; --gray-100: #f7fafc; --gray-200: #edf2f7; --gray-300: #e2e8f0; --gray-400: #cbd5e0; --gray-500: #a0aec0; --gray-600: #718096; --gray-700: #4a5568; --gray-800: #2d3748; --gray-900: #1a202c; --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); --shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); --shadow-md: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); --shadow-lg: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif; } body { background-color: var(--light); color: var(--dark); min-height: 100vh; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 1.5rem; } .dashboard { width: 100%; max-width: 700px; height: 100%; max-height: 700px; background-color: white; border-radius: 1rem; box-shadow: var(--shadow-lg); overflow: hidden; display: flex; flex-direction: column; } .dashboard-header { padding: 1.5rem; background: linear-gradient(90deg, var(--primary) 0%, var(--accent) 100%); color: white; display: flex; justify-content: space-between; align-items: center; } .dashboard-title { font-size: 1.5rem; font-weight: 600; letter-spacing: -0.025em; } .dashboard-subtitle { font-size: 0.875rem; opacity: 0.9; margin-top: 0.25rem; } .dashboard-header-right { display: flex; gap: 1rem; } .dashboard-body { flex: 1; padding: 1.5rem; overflow-y: auto; display: flex; flex-direction: column; gap: 1.5rem; } .filter-section { display: flex; flex-direction: column; gap: 0.5rem; } .filter-title { font-size: 1rem; font-weight: 500; color: var(--gray-700); } .dropdown-container { position: relative; margin-bottom: 1rem; } .select-box { width: 100%; padding: 0.75rem 1rem; border: 1px solid var(--gray-300); border-radius: 0.5rem; background-color: white; color: var(--gray-800); font-size: 0.875rem; font-weight: 500; cursor: pointer; transition: all 0.2s ease; display: flex; justify-content: space-between; align-items: center; box-shadow: var(--shadow-sm); } .select-box:hover { border-color: var(--primary-light); box-shadow: 0 0 0 3px rgba(86, 100, 210, 0.1); } .select-box.active { border-color: var(--primary); box-shadow: 0 0 0 3px rgba(86, 100, 210, 0.2); } .select-box-text { display: flex; align-items: center; gap: 0.5rem; } .select-box-count { display: inline-flex; align-items: center; justify-content: center; background-color: var(--primary); color: white; font-size: 0.75rem; font-weight: 600; height: 1.5rem; min-width: 1.5rem; padding: 0 0.5rem; border-radius: 999px; transition: all 0.2s ease; } .select-box-icon { transition: transform 0.2s ease; } .select-box.active .select-box-icon { transform: rotate(180deg); } .dropdown-options { position: absolute; top: calc(100% + 0.25rem); left: 0; width: 100%; max-height: 0; overflow: hidden; background-color: white; border-radius: 0.5rem; border: 1px solid var(--gray-300); box-shadow: var(--shadow-md); z-index: 10; transition: all 0.2s ease; opacity: 0; transform: translateY(-10px); visibility: hidden; } .dropdown-options.open { max-height: 300px; opacity: 1; transform: translateY(0); visibility: visible; } .search-container { padding: 0.75rem; border-bottom: 1px solid var(--gray-200); } .search-input { width: 100%; padding: 0.5rem 0.75rem; border: 1px solid var(--gray-300); border-radius: 0.375rem; font-size: 0.875rem; outline: none; transition: all 0.2s ease; } .search-input:focus { border-color: var(--primary); box-shadow: 0 0 0 3px rgba(86, 100, 210, 0.1); } .options-list { max-height: 200px; overflow-y: auto; padding: 0.5rem 0; } .option-item { display: flex; align-items: center; padding: 0.625rem 0.75rem; cursor: pointer; transition: background-color 0.2s ease; user-select: none; } .option-item:hover { background-color: var(--gray-100); } .option-checkbox { position: relative; width: 1.125rem; height: 1.125rem; border: 1.5px solid var(--gray-400); border-radius: 0.25rem; margin-right: 0.75rem; display: flex; align-items: center; justify-content: center; transition: all 0.2s ease; } .option-item.selected .option-checkbox { background-color: var(--primary); border-color: var(--primary); } .option-checkbox-icon { opacity: 0; transform: scale(0.8); transition: all 0.2s ease; color: white; } .option-item.selected .option-checkbox-icon { opacity: 1; transform: scale(1); } .option-label { font-size: 0.875rem; color: var(--gray-700); font-weight: 400; } .option-item.selected .option-label { color: var(--gray-900); font-weight: 500; } .dropdown-footer { display: flex; justify-content: space-between; padding: 0.75rem; border-top: 1px solid var(--gray-200); } .dropdown-button { padding: 0.5rem 1rem; font-size: 0.875rem; font-weight: 500; border-radius: 0.375rem; cursor: pointer; transition: all 0.2s ease; border: none; } .button-clear { background-color: var(--gray-100); color: var(--gray-700); } .button-clear:hover { background-color: var(--gray-200); color: var(--gray-800); } .button-apply { background-color: var(--primary); color: white; } .button-apply:hover { background-color: var(--primary-light); } .data-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 1rem; overflow-y: auto; flex: 1; } .data-card { background-color: white; border-radius: 0.5rem; box-shadow: var(--shadow); padding: 1.25rem; transition: all 0.2s ease; transform: translateY(0); position: relative; overflow: hidden; display: flex; flex-direction: column; } .data-card::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 4px; background: linear-gradient(90deg, var(--primary) 0%, var(--accent) 100%); opacity: 0; transition: opacity 0.2s ease; } .data-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-md); } .data-card:hover::before { opacity: 1; } .data-card-title { font-size: 1rem; font-weight: 600; color: var(--gray-800); margin-bottom: 0.5rem; } .data-card-value { font-size: 1.5rem; font-weight: 700; color: var(--primary); margin-bottom: 0.5rem; } .data-card-subtitle { font-size: 0.75rem; color: var(--gray-600); margin-top: auto; } .tag { display: inline-flex; align-items: center; padding: 0.25rem 0.5rem; border-radius: 999px; font-size: 0.75rem; font-weight: 500; margin-right: 0.375rem; margin-bottom: 0.375rem; } .tag-success { background-color: rgba(46, 213, 115, 0.1); color: var(--success); } .tag-warning { background-color: rgba(255, 165, 2, 0.1); color: var(--warning); } .tag-danger { background-color: rgba(255, 71, 87, 0.1); color: var(--danger); } .tag-primary { background-color: rgba(86, 100, 210, 0.1); color: var(--primary); } .no-results { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 2rem; text-align: center; color: var(--gray-500); } .no-results-icon { font-size: 2.5rem; color: var(--gray-400); margin-bottom: 1rem; } .no-results-text { font-size: 1rem; font-weight: 500; margin-bottom: 0.5rem; } .no-results-subtext { font-size: 0.875rem; color: var(--gray-500); } .tags-container { display: flex; flex-wrap: wrap; margin-top: 0.5rem; } .summary-banner { display: flex; align-items: center; justify-content: space-between; background-color: var(--gray-100); border-radius: 0.5rem; padding: 1rem 1.25rem; margin-bottom: 1rem; } .summary-text { font-size: 0.875rem; color: var(--gray-700); } .summary-highlight { font-weight: 600; color: var(--primary); } .metrics-row { display: flex; gap: 1rem; margin-bottom: 1rem; } .metric-item { background-color: white; border-radius: 0.5rem; box-shadow: var(--shadow-sm); padding: 1rem; flex: 1; display: flex; flex-direction: column; border: 1px solid var(--gray-200); } .metric-title { font-size: 0.75rem; color: var(--gray-600); margin-bottom: 0.5rem; } .metric-value { font-size: 1.25rem; font-weight: 700; color: var(--gray-800); } .metric-trend { display: flex; align-items: center; font-size: 0.75rem; margin-top: 0.5rem; } .trend-up { color: var(--success); } .trend-down { color: var(--danger); } .trend-neutral { color: var(--gray-500); } .pulse { animation: pulse 2s infinite; } @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } .fade-in { animation: fadeIn 0.5s ease-out; } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .skeleton { background: linear-gradient(90deg, var(--gray-200) 25%, var(--gray-300) 50%, var(--gray-200) 75%); background-size: 200% 100%; animation: loading 1.5s infinite; border-radius: 0.25rem; } @keyframes loading { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } /* Custom scrollbar */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: var(--gray-100); border-radius: 4px; } ::-webkit-scrollbar-thumb { background: var(--gray-300); border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: var(--gray-400); } /* Responsive styles */ @media (max-width: 640px) { .dashboard-header { flex-direction: column; align-items: flex-start; gap: 1rem; } .dashboard-header-right { width: 100%; } .metrics-row { flex-direction: column; gap: 0.75rem; } .data-grid { grid-template-columns: 1fr; } } </style> </head> <body> <div class="dashboard"> <div class="dashboard-header"> <div> <h1 class="dashboard-title">Marketing Performance Analytics</h1> <p class="dashboard-subtitle">Real-time marketing channel performance data</p> </div> <div class="dashboard-header-right"> <div class="select-box-count" id="selected-count">0</div> </div> </div> <div class="dashboard-body"> <div class="filter-section"> <h2 class="filter-title">Data Filters</h2> <div class="dropdown-container"> <div class="select-box" id="marketing-channel-select"> <div class="select-box-text"> <span>Marketing Channels</span> <div class="select-box-count">0</div> </div> <div class="select-box-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </div> </div> <div class="dropdown-options" id="channel-dropdown"> <div class="search-container"> <input type="text" class="search-input" placeholder="Search channels..." id="channel-search"> </div> <div class="options-list" id="channel-options"> <!-- Options will be populated via JavaScript --> </div> <div class="dropdown-footer"> <button class="dropdown-button button-clear" id="clear-selection">Clear All</button> <button class="dropdown-button button-apply" id="apply-selection">Apply Filters</button> </div> </div> </div> </div> <div class="summary-banner fade-in"> <span class="summary-text">Currently showing data for <span class="summary-highlight" id="active-filters">all marketing channels</span></span> </div> <div class="metrics-row fade-in"> <div class="metric-item"> <div class="metric-title">Conversions</div> <div class="metric-value" id="conversion-count">1,248</div> <div class="metric-trend trend-up"> <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="18 15 12 9 6 15"></polyline> </svg> <span>12.4%</span> </div> </div> <div class="metric-item"> <div class="metric-title">Avg. Cost per Conversion</div> <div class="metric-value" id="avg-cost">$24.58</div> <div class="metric-trend trend-down"> <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="6 9 12 15 18 9"></polyline> </svg> <span>3.2%</span> </div> </div> <div class="metric-item"> <div class="metric-title">Total ROI</div> <div class="metric-value" id="total-roi">218%</div> <div class="metric-trend trend-up"> <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="18 15 12 9 6 15"></polyline> </svg> <span>5.7%</span> </div> </div> </div> <div class="data-grid" id="data-grid"> <!-- Data cards will be populated via JavaScript --> </div> <div class="no-results" id="no-results" style="display: none;"> <div class="no-results-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" 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> <line x1="11" y1="8" x2="11" y2="14"></line> <line x1="8" y1="11" x2="14" y2="11"></line> </svg> </div> <h3 class="no-results-text">No matching data found</h3> <p class="no-results-subtext">Try adjusting your filters to see more results</p> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Marketing channels data const marketingChannels = [ { id: 1, name: 'Paid Search', value: 'paid_search', performance: 'high', roi: 245, conversions: 487, cpa: 18.34 }, { id: 2, name: 'Social Media', value: 'social_media', performance: 'medium', roi: 172, conversions: 356, cpa: 22.56 }, { id: 3, name: 'Email Marketing', value: 'email', performance: 'high', roi: 312, conversions: 189, cpa: 12.75 }, { id: 4, name: 'Display Ads', value: 'display', performance: 'low', roi: 98, conversions: 87, cpa: 35.42 }, { id: 5, name: 'Organic Search', value: 'organic', performance: 'medium', roi: 205, conversions: 276, cpa: 0 }, { id: 6, name: 'Affiliate', value: 'affiliate', performance: 'medium', roi: 187, conversions: 124, cpa: 27.15 }, { id: 7, name: 'Direct Traffic', value: 'direct', performance: 'low', roi: 110, conversions: 155, cpa: 0 }, { id: 8, name: 'Video Ads', value: 'video', performance: 'high', roi: 267, conversions: 94, cpa: 28.34 } ]; // DOM elements const selectBox = document.getElementById('marketing-channel-select'); const dropdown = document.getElementById('channel-dropdown'); const optionsList = document.getElementById('channel-options'); const searchInput = document.getElementById('channel-search'); const clearBtn = document.getElementById('clear-selection'); const applyBtn = document.getElementById('apply-selection'); const dataGrid = document.getElementById('data-grid'); const noResults = document.getElementById('no-results'); const activeFiltersText = document.getElementById('active-filters'); const selectBoxCount = selectBox.querySelector('.select-box-count'); const headerSelectedCount = document.getElementById('selected-count'); // Metric counters const conversionCounter = document.getElementById('conversion-count'); const avgCostCounter = document.getElementById('avg-cost'); const totalRoiCounter = document.getElementById('total-roi'); // State management let selectedChannels = []; let filteredChannels = [...marketingChannels]; // Populate options function populateOptions(channels) { optionsList.innerHTML = ''; channels.forEach(channel => { const optionItem = document.createElement('div'); optionItem.classList.add('option-item'); if (selectedChannels.includes(channel.id)) { optionItem.classList.add('selected'); } optionItem.dataset.id = channel.id; optionItem.innerHTML = ` <div class="option-checkbox"> <svg class="option-checkbox-icon" xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="20 6 9 17 4 12"></polyline> </svg> </div> <span class="option-label">${channel.name}</span> `; optionItem.addEventListener('click', () => toggleOption(channel.id)); optionsList.appendChild(optionItem); }); } // Toggle option selection function toggleOption(id) { const index = selectedChannels.indexOf(id); if (index > -1) { selectedChannels.splice(index, 1); } else { selectedChannels.push(id); } updateOptionUI(); updateSelectBoxCount(); } // Update option UI function updateOptionUI() { document.querySelectorAll('.option-item').forEach(item => { const itemId = parseInt(item.dataset.id); if (selectedChannels.includes(itemId)) { item.classList.add('selected'); } else { item.classList.remove('selected'); } }); } // Update select box count function updateSelectBoxCount() { const count = selectedChannels.length; selectBoxCount.textContent = count; headerSelectedCount.textContent = count; if (count > 0) { selectBoxCount.style.display = 'inline-flex'; headerSelectedCount.style.display = 'inline-flex'; } else { selectBoxCount.style.display = 'none'; headerSelectedCount.style.display = 'none'; } } // Filter channels based on search function filterChannels(query) { if (!query) { filteredChannels = [...marketingChannels]; } else { filteredChannels = marketingChannels.filter(channel => channel.name.toLowerCase().includes(query.toLowerCase()) ); } populateOptions(filteredChannels); } // Apply filters and update data grid function applyFilters() { let channelsToShow; if (selectedChannels.length === 0) { channelsToShow = [...marketingChannels]; activeFiltersText.textContent = 'all marketing channels'; } else { channelsToShow = marketingChannels.filter(channel => selectedChannels.includes(channel.id) ); const channelNames = channelsToShow.map(c => c.name).join(', '); activeFiltersText.textContent = channelNames; } updateDataGrid(channelsToShow); updateMetricCounters(channelsToShow); dropdown.classList.remove('open'); selectBox.classList.remove('active'); } // Update data grid with channels function updateDataGrid(channels) { dataGrid.innerHTML = ''; if (channels.length === 0) { noResults.style.display = 'flex'; return; } noResults.style.display = 'none'; channels.forEach(channel => { const performanceClass = channel.performance === 'high' ? 'tag-success' : channel.performance === 'medium' ? 'tag-warning' : 'tag-danger'; const performanceLabel = channel.performance === 'high' ? 'High Performance' : channel.performance === 'medium' ? 'Medium Performance' : 'Low Performance'; const card = document.createElement('div'); card.classList.add('data-card', 'fade-in'); card.innerHTML = ` <h3 class="data-card-title">${channel.name}</h3> <div class="data-card-value">${channel.roi}% ROI</div> <div class="tags-container"> <span class="tag ${performanceClass}">${performanceLabel}</span> <span class="tag tag-primary">${channel.conversions} Conv.</span> </div> <p class="data-card-subtitle"> ${channel.cpa > 0 ? `CPA: $${channel.cpa}` : 'Organic Acquisition'} </p> `; dataGrid.appendChild(card); }); } // Update metric counters based on selected channels function updateMetricCounters(channels) { // Calculate totals const totalConversions = channels.reduce((sum, channel) => sum + channel.conversions, 0); const totalCost = channels.reduce((sum, channel) => { return sum + (channel.conversions * (channel.cpa || 0)); }, 0); const weightedROI = channels.reduce((sum, channel) => { return sum + (channel.roi * channel.conversions); }, 0) / totalConversions; const avgCPA = totalCost / totalConversions; // Update counters with animation animateCounter(conversionCounter, totalConversions, { formatter: (val) => val.toLocaleString(), duration: 1000 }); animateCounter(avgCostCounter, avgCPA, { formatter: (val) => `$${val.toFixed(2)}`, duration: 1000 }); animateCounter(totalRoiCounter, weightedROI, { formatter: (val) => `${Math.round(val)}%`, duration: 1000 }); } // Counter animation function animateCounter(element, targetValue, options = {}) { const defaults = { duration: 1000, formatter: (val) => val }; const settings = { ...defaults, ...options }; const startTime = performance.now(); const startValue = parseFloat(element.textContent.replace(/[^0-9.-]+/g, '')) || 0; function updateCounter(currentTime) { const elapsedTime = currentTime - startTime; const progress = Math.min(elapsedTime / settings.duration, 1); const easedProgress = easeOutQuart(progress); const currentValue = startValue + (targetValue - startValue) * easedProgress; element.textContent = settings.formatter(currentValue); if (progress < 1) { requestAnimationFrame(updateCounter); } } function easeOutQuart(x) { return 1 - Math.pow(1 - x, 4); } requestAnimationFrame(updateCounter); } // Event Listeners selectBox.addEventListener('click', () => { dropdown.classList.toggle('open'); selectBox.classList.toggle('active'); }); searchInput.addEventListener('input', () => { filterChannels(searchInput.value); }); clearBtn.addEventListener('click', () => { selectedChannels = []; updateOptionUI(); updateSelectBoxCount(); }); applyBtn.addEventListener('click', applyFilters); // Close dropdown when clicking outside document.addEventListener('click', (e) => { if (!selectBox.contains(e.target) && !dropdown.contains(e.target)) { dropdown.classList.remove('open'); selectBox.classList.remove('active'); } }); // Initialize populateOptions(marketingChannels); updateDataGrid(marketingChannels); updateMetricCounters(marketingChannels); updateSelectBoxCount(); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Financial Services Application Select</title> <style> :root { --primary: #003366; --primary-light: #004080; --secondary: #e6f0fa; --tertiary: #f8f9fa; --accent: #0066cc; --success: #006633; --error: #cc0000; --warning: #cc6600; --text-primary: #333333; --text-secondary: #666666; --text-light: #999999; --border: #dddddd; --shadow: rgba(0, 0, 0, 0.1); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; } body { display: flex; justify-content: center; align-items: center; min-height: 100vh; background: linear-gradient(145deg, #f8f9fa 0%, #e6f0fa 100%); padding: 20px; } .app-container { width: 100%; max-width: 650px; background-color: #fff; border-radius: 12px; box-shadow: 0 8px 24px var(--shadow); padding: 30px; position: relative; overflow: hidden; } .app-header { margin-bottom: 30px; position: relative; } .app-header:after { content: ''; position: absolute; bottom: -15px; left: 0; width: 60px; height: 3px; background-color: var(--accent); border-radius: 2px; } .app-title { color: var(--primary); font-size: 24px; font-weight: 600; margin-bottom: 8px; } .app-subtitle { color: var(--text-secondary); font-size: 16px; line-height: 1.5; } .select-container { margin-bottom: 25px; } .form-label { display: block; margin-bottom: 8px; color: var(--text-primary); font-weight: 500; font-size: 15px; } .custom-select-wrapper { position: relative; } .custom-select { appearance: none; -webkit-appearance: none; width: 100%; padding: 14px 16px; font-size: 15px; border: 1px solid var(--border); border-radius: 6px; background-color: white; color: var(--text-primary); cursor: pointer; transition: all 0.25s ease; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04); font-weight: 500; } .custom-select:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px rgba(0, 102, 204, 0.15); } .custom-select[disabled] { background-color: var(--tertiary); color: var(--text-light); cursor: not-allowed; opacity: 0.7; } .custom-select.error { border-color: var(--error); box-shadow: 0 0 0 3px rgba(204, 0, 0, 0.1); } .select-icon { position: absolute; right: 16px; top: 50%; transform: translateY(-50%); pointer-events: none; transition: transform 0.25s ease; } .custom-select:focus + .select-icon { transform: translateY(-50%) rotate(180deg); } .helper-text { display: block; margin-top: 8px; font-size: 13px; color: var(--text-secondary); } .error-text { display: block; margin-top: 8px; font-size: 13px; color: var(--error); font-weight: 500; opacity: 0; height: 0; transition: opacity 0.25s ease, height 0.25s ease; } .error-text.visible { opacity: 1; height: auto; } .actions { display: flex; justify-content: space-between; margin-top: 30px; gap: 15px; } .btn { padding: 14px 24px; border-radius: 6px; font-size: 15px; font-weight: 600; cursor: pointer; transition: all 0.25s ease; border: none; display: flex; align-items: center; justify-content: center; flex: 1; } .btn-primary { background: linear-gradient(to right, var(--primary), var(--primary-light)); color: white; box-shadow: 0 4px 12px rgba(0, 51, 102, 0.2); } .btn-primary:hover { box-shadow: 0 6px 16px rgba(0, 51, 102, 0.3); transform: translateY(-2px); } .btn-secondary { background-color: transparent; color: var(--primary); border: 1px solid var(--border); } .btn-secondary:hover { background-color: var(--secondary); border-color: var(--primary-light); } .btn:active { transform: translateY(1px); } .status-indicator { display: flex; align-items: center; gap: 10px; margin-top: 30px; padding: 16px; border-radius: 8px; background-color: var(--secondary); opacity: 0; transform: translateY(10px); transition: all 0.3s ease; } .status-indicator.visible { opacity: 1; transform: translateY(0); } .status-indicator-icon { width: 24px; height: 24px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background-color: var(--success); color: white; } .status-indicator-text { color: var(--text-primary); font-size: 14px; line-height: 1.5; } .security-badge { display: flex; align-items: center; gap: 8px; position: absolute; top: 30px; right: 30px; font-size: 13px; color: var(--text-light); } .security-badge svg { width: 16px; height: 16px; } .select-option-group { color: var(--text-light); font-weight: 600; font-size: 13px; } .custom-select option:not(.select-option-group) { padding: 10px; font-weight: normal; color: var(--text-primary); } .tooltip { position: absolute; left: 0; bottom: -40px; background-color: var(--primary); color: white; padding: 6px 12px; border-radius: 4px; font-size: 12px; opacity: 0; transform: translateY(5px); transition: all 0.3s ease; pointer-events: none; z-index: 10; } .tooltip:before { content: ''; position: absolute; top: -6px; left: 20px; width: 0; height: 0; border-left: 6px solid transparent; border-right: 6px solid transparent; border-bottom: 6px solid var(--primary); } .tooltip.visible { opacity: 1; transform: translateY(0); } .info-icon { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; background-color: var(--accent); color: white; border-radius: 50%; font-size: 11px; margin-left: 8px; cursor: pointer; position: relative; } /* Loading animation */ .loading-overlay { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(255, 255, 255, 0.8); display: flex; align-items: center; justify-content: center; visibility: hidden; opacity: 0; transition: all 0.3s ease; z-index: 100; } .loading-overlay.visible { visibility: visible; opacity: 1; } .spinner { width: 40px; height: 40px; border: 3px solid rgba(0, 51, 102, 0.1); border-radius: 50%; border-top-color: var(--accent); animation: spin 1s ease-in-out infinite; } @keyframes spin { to { transform: rotate(360deg); } } @media (max-width: 600px) { .app-container { padding: 20px; border-radius: 8px; } .app-title { font-size: 20px; } .app-subtitle { font-size: 14px; } .actions { flex-direction: column; } .security-badge { position: static; margin-top: 20px; justify-content: flex-end; } } </style> </head> <body> <div class="app-container"> <div class="app-header"> <h1 class="app-title">Portfolio Allocation</h1> <p class="app-subtitle">Select investment preferences to customize your strategic asset allocation</p> </div> <div class="security-badge"> <svg xmlns="http://www.w3.org/2000/svg" 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> Secure Connection </div> <form id="investmentForm"> <div class="select-container"> <label for="riskTolerance" class="form-label"> Risk Tolerance <span class="info-icon" id="riskToleranceInfo">i</span> </label> <div class="custom-select-wrapper"> <select id="riskTolerance" class="custom-select"> <option value="" selected disabled>Select your risk tolerance</option> <option value="conservative">Conservative</option> <option value="moderately-conservative">Moderately Conservative</option> <option value="moderate">Moderate</option> <option value="moderately-aggressive">Moderately Aggressive</option> <option value="aggressive">Aggressive</option> </select> <svg class="select-icon" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="6 9 12 15 18 9"></polyline> </svg> <div class="tooltip" id="riskToleranceTooltip">How much market volatility you're comfortable with</div> </div> <span class="helper-text">This determines your portfolio's balance between growth and stability</span> <span id="riskToleranceError" class="error-text">Please select your risk tolerance</span> </div> <div class="select-container"> <label for="investmentHorizon" class="form-label">Investment Time Horizon</label> <div class="custom-select-wrapper"> <select id="investmentHorizon" class="custom-select"> <option value="" selected disabled>Select your time horizon</option> <option value="short">Short-term (0-3 years)</option> <option value="medium">Medium-term (4-7 years)</option> <option value="long">Long-term (8+ years)</option> </select> <svg class="select-icon" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </div> <span class="helper-text">The expected length of time until you need to access your investments</span> <span id="investmentHorizonError" class="error-text">Please select your investment time horizon</span> </div> <div class="select-container"> <label for="investmentStrategy" class="form-label">Investment Strategy</label> <div class="custom-select-wrapper"> <select id="investmentStrategy" class="custom-select"> <option value="" selected disabled>Select your strategy</option> <optgroup label="PASSIVE STRATEGIES" class="select-option-group"> <option value="indexing">Index Tracking</option> <option value="buyhold">Buy and Hold</option> </optgroup> <optgroup label="ACTIVE STRATEGIES" class="select-option-group"> <option value="value">Value Investing</option> <option value="growth">Growth Investing</option> <option value="income">Income Generation</option> </optgroup> <optgroup label="SPECIALIZED STRATEGIES" class="select-option-group"> <option value="esg">ESG/Impact Investing</option> <option value="sector">Sector Rotation</option> <option value="tactical">Tactical Asset Allocation</option> </optgroup> </select> <svg class="select-icon" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </div> <span class="helper-text">Your preferred approach to building and managing your portfolio</span> <span id="investmentStrategyError" class="error-text">Please select your investment strategy</span> </div> <div class="select-container"> <label for="taxConsideration" class="form-label">Tax Considerations</label> <div class="custom-select-wrapper"> <select id="taxConsideration" class="custom-select" disabled> <option value="" selected disabled>Available after account verification</option> <option value="taxable">Taxable Account</option> <option value="taxdeferred">Tax-Deferred Account</option> <option value="taxexempt">Tax-Exempt Account</option> </select> <svg class="select-icon" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </div> <span class="helper-text">Complete account verification to unlock tax-optimized strategies</span> </div> <div class="actions"> <button type="button" class="btn btn-secondary" id="resetBtn">Reset Selections</button> <button type="button" class="btn btn-primary" id="generateBtn">Generate Allocation</button> </div> <div class="status-indicator" id="statusIndicator"> <div class="status-indicator-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="20 6 9 17 4 12"></polyline> </svg> </div> <div class="status-indicator-text"> Your selections have been saved. Our system is generating a personalized portfolio allocation based on your preferences. </div> </div> </form> <div class="loading-overlay" id="loadingOverlay"> <div class="spinner"></div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const riskToleranceSelect = document.getElementById('riskTolerance'); const investmentHorizonSelect = document.getElementById('investmentHorizon'); const investmentStrategySelect = document.getElementById('investmentStrategy'); const taxConsiderationSelect = document.getElementById('taxConsideration'); const riskToleranceError = document.getElementById('riskToleranceError'); const investmentHorizonError = document.getElementById('investmentHorizonError'); const investmentStrategyError = document.getElementById('investmentStrategyError'); const resetBtn = document.getElementById('resetBtn'); const generateBtn = document.getElementById('generateBtn'); const statusIndicator = document.getElementById('statusIndicator'); const loadingOverlay = document.getElementById('loadingOverlay'); const riskToleranceInfo = document.getElementById('riskToleranceInfo'); const riskToleranceTooltip = document.getElementById('riskToleranceTooltip'); // Info tooltip functionality riskToleranceInfo.addEventListener('mouseenter', function() { riskToleranceTooltip.classList.add('visible'); }); riskToleranceInfo.addEventListener('mouseleave', function() { riskToleranceTooltip.classList.remove('visible'); }); // Select change effects [riskToleranceSelect, investmentHorizonSelect, investmentStrategySelect].forEach(select => { select.addEventListener('change', function() { if (this.value) { this.classList.remove('error'); const errorElem = document.getElementById(`${this.id}Error`); if (errorElem) errorElem.classList.remove('visible'); } // Add a subtle animation effect when changing selection this.style.transition = 'transform 0.2s ease-out'; this.style.transform = 'scale(1.02)'; setTimeout(() => { this.style.transform = 'scale(1)'; }, 200); }); }); // Reset form resetBtn.addEventListener('click', function() { [riskToleranceSelect, investmentHorizonSelect, investmentStrategySelect].forEach(select => { select.value = ''; select.classList.remove('error'); }); [riskToleranceError, investmentHorizonError, investmentStrategyError].forEach(error => { error.classList.remove('visible'); }); statusIndicator.classList.remove('visible'); // Add reset animation resetBtn.classList.add('active'); setTimeout(() => { resetBtn.classList.remove('active'); }, 300); }); // Generate allocation generateBtn.addEventListener('click', function() { let isValid = true; // Validate risk tolerance if (!riskToleranceSelect.value) { riskToleranceSelect.classList.add('error'); riskToleranceError.classList.add('visible'); isValid = false; } else { riskToleranceSelect.classList.remove('error'); riskToleranceError.classList.remove('visible'); } // Validate investment horizon if (!investmentHorizonSelect.value) { investmentHorizonSelect.classList.add('error'); investmentHorizonError.classList.add('visible'); isValid = false; } else { investmentHorizonSelect.classList.remove('error'); investmentHorizonError.classList.remove('visible'); } // Validate investment strategy if (!investmentStrategySelect.value) { investmentStrategySelect.classList.add('error'); investmentStrategyError.classList.add('visible'); isValid = false; } else { investmentStrategySelect.classList.remove('error'); investmentStrategyError.classList.remove('visible'); } if (isValid) { // Show loading overlay loadingOverlay.classList.add('visible'); // Simulate API call setTimeout(() => { loadingOverlay.classList.remove('visible'); statusIndicator.classList.add('visible'); // Customize status message based on selections const riskProfile = riskToleranceSelect.value; const timeHorizon = investmentHorizonSelect.value; const strategy = investmentStrategySelect.value; const statusText = document.querySelector('.status-indicator-text'); statusText.innerHTML = `Your ${riskProfile} portfolio with a ${timeHorizon} time horizon using a ${strategy} strategy has been configured. <strong>An advisor will review your selections within 24 hours.</strong>`; }, 1500); } }); // Add focus and blur event listeners for custom styling document.querySelectorAll('.custom-select').forEach(select => { select.addEventListener('focus', function() { this.parentElement.classList.add('focused'); }); select.addEventListener('blur', function() { this.parentElement.classList.remove('focused'); }); }); // Add debounced hover effects for selects const selectWrappers = document.querySelectorAll('.custom-select-wrapper'); selectWrappers.forEach(wrapper => { wrapper.addEventListener('mouseenter', function() { const select = this.querySelector('.custom-select'); if (!select.disabled && !select.classList.contains('error')) { select.style.borderColor = '#b3b3b3'; select.style.boxShadow = '0 2px 8px rgba(0, 0, 0, 0.08)'; } }); wrapper.addEventListener('mouseleave', function() { const select = this.querySelector('.custom-select'); if (!select.disabled && !select.classList.contains('error')) { select.style.borderColor = ''; select.style.boxShadow = ''; } }); }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Wanderlust Travel Booking</title> <style> @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap'); :root { --primary: #2c7ae0; --secondary: #ff6b6b; --accent: #ffd166; --dark: #2a2d34; --light: #f8f9fa; --success: #06d6a0; --error: #ef476f; --shadow: 0 4px 20px rgba(0, 0, 0, 0.1); --transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Poppins', sans-serif; background-color: var(--light); display: flex; align-items: center; justify-content: center; min-height: 100vh; padding: 20px; color: var(--dark); } .booking-container { width: 100%; max-width: 650px; background: white; border-radius: 16px; box-shadow: var(--shadow); overflow: hidden; position: relative; } .header { background: linear-gradient(135deg, var(--primary), #1a5fb4); padding: 25px 30px; color: white; position: relative; overflow: hidden; } .header h1 { font-size: 28px; font-weight: 600; margin-bottom: 10px; position: relative; z-index: 2; } .header p { opacity: 0.9; font-weight: 300; font-size: 16px; position: relative; z-index: 2; } .header::before { content: ''; position: absolute; top: -20px; right: -20px; width: 140px; height: 140px; background: rgba(255, 255, 255, 0.1); border-radius: 50%; z-index: 1; } .header::after { content: ''; position: absolute; bottom: -50px; left: -50px; width: 180px; height: 180px; background: rgba(255, 255, 255, 0.08); border-radius: 50%; z-index: 1; } .booking-form { padding: 30px; } .form-row { display: flex; flex-wrap: wrap; margin-bottom: 25px; gap: 20px; } .form-group { flex: 1; min-width: 250px; position: relative; } .form-group label { display: block; margin-bottom: 8px; font-size: 14px; font-weight: 500; color: var(--dark); } .select-wrapper { position: relative; } .custom-select { appearance: none; -webkit-appearance: none; width: 100%; padding: 14px 20px; font-size: 15px; border: 2px solid #e0e0e0; border-radius: 10px; background-color: white; cursor: pointer; transition: var(--transition); font-family: 'Poppins', sans-serif; color: var(--dark); } .custom-select:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(44, 122, 224, 0.1); } .select-icon { position: absolute; top: 50%; right: 15px; transform: translateY(-50%); pointer-events: none; color: #757575; transition: var(--transition); } .custom-select:focus + .select-icon { color: var(--primary); transform: translateY(-50%) rotate(180deg); } .select-dropdown { position: absolute; top: calc(100% + 5px); left: 0; width: 100%; max-height: 0; overflow: hidden; background: white; border-radius: 10px; box-shadow: var(--shadow); z-index: 10; opacity: 0; transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); } .select-dropdown.show { max-height: 250px; opacity: 1; } .option-group { padding: 10px 0; border-bottom: 1px solid #f0f0f0; } .option-group-title { padding: 5px 15px; font-size: 13px; font-weight: 600; color: var(--primary); letter-spacing: 0.5px; text-transform: uppercase; } .option-list { max-height: 180px; overflow-y: auto; scrollbar-width: thin; } .option-list::-webkit-scrollbar { width: 6px; } .option-list::-webkit-scrollbar-thumb { background-color: rgba(0, 0, 0, 0.1); border-radius: 3px; } .option-item { padding: 12px 20px; cursor: pointer; display: flex; align-items: center; transition: background 0.2s; } .option-item:hover { background-color: #f8f9fa; } .option-item.selected { background-color: rgba(44, 122, 224, 0.05); color: var(--primary); font-weight: 500; } .option-icon { margin-right: 10px; display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; } .option-text { flex: 1; } .option-info { font-size: 12px; color: #757575; margin-top: 2px; } .error-message { color: var(--error); font-size: 12px; margin-top: 5px; display: none; animation: fadeIn 0.3s ease; } .form-group.error .custom-select { border-color: var(--error); } .form-group.error .error-message { display: block; } .btn { display: inline-flex; align-items: center; justify-content: center; padding: 14px 30px; border-radius: 10px; border: none; font-family: 'Poppins', sans-serif; font-size: 16px; font-weight: 500; cursor: pointer; transition: var(--transition); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); } .btn-primary { background: var(--primary); color: white; } .btn-primary:hover { background: #2168c5; transform: translateY(-2px); box-shadow: 0 6px 16px rgba(44, 122, 224, 0.25); } .btn-primary:active { transform: translateY(0); } .btn-icon { margin-left: 8px; } .recommendation { margin-top: 30px; padding: 15px; background: rgba(255, 209, 102, 0.1); border-radius: 10px; display: flex; align-items: center; border-left: 4px solid var(--accent); } .recommendation-icon { margin-right: 15px; font-size: 24px; color: var(--accent); } .recommendation-text h3 { font-size: 16px; font-weight: 600; margin-bottom: 2px; } .recommendation-text p { font-size: 14px; color: #666; } .form-footer { margin-top: 20px; text-align: right; } /* Animations */ @keyframes fadeIn { from { opacity: 0; transform: translateY(-5px); } to { opacity: 1; transform: translateY(0); } } @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } /* Map pattern */ .map-pattern { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-image: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23ffffff' fill-opacity='0.05'%3E%3Cpath d='M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); z-index: 0; opacity: 0.8; pointer-events: none; } .success-message { display: none; text-align: center; padding: 30px; animation: fadeIn 0.5s ease; } .success-icon { display: flex; align-items: center; justify-content: center; width: 70px; height: 70px; margin: 0 auto 20px; background: var(--success); color: white; border-radius: 50%; font-size: 32px; } .success-message h2 { margin-bottom: 10px; color: var(--dark); } .success-message p { color: #666; margin-bottom: 20px; } /* Pulse animation for destination icons */ .destination-icon { display: inline-block; animation: pulse 2s infinite; animation-delay: calc(var(--index) * 0.2s); } /* Responsive styles */ @media (max-width: 640px) { .header { padding: 20px; } .header h1 { font-size: 24px; } .booking-form { padding: 20px; } .form-group { min-width: 100%; } .form-footer { text-align: center; } .btn { width: 100%; } } </style> </head> <body> <div class="booking-container"> <div class="header"> <div class="map-pattern"></div> <h1>Where to next?</h1> <p>Begin your journey with our curated destinations</p> </div> <form id="booking-form" class="booking-form"> <div class="form-row"> <div class="form-group" id="departure-group"> <label for="departure">Departure</label> <div class="select-wrapper"> <input type="text" id="departure" class="custom-select" placeholder="Select your departure city" readonly> <div class="select-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path d="M7.247 11.14 2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z"/> </svg> </div> <div class="select-dropdown" id="departure-dropdown"> <div class="option-group"> <div class="option-group-title">Recent Departures</div> <div class="option-list"> <div class="option-item" data-value="New York"> <div class="option-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#2c7ae0" viewBox="0 0 16 16"> <path d="M8 16s6-5.686 6-10A6 6 0 0 0 2 6c0 4.314 6 10 6 10zm0-7a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/> </svg> </div> <div class="option-text"> New York <div class="option-info">JFK, LGA, EWR</div> </div> </div> <div class="option-item" data-value="London"> <div class="option-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#2c7ae0" viewBox="0 0 16 16"> <path d="M8 16s6-5.686 6-10A6 6 0 0 0 2 6c0 4.314 6 10 6 10zm0-7a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/> </svg> </div> <div class="option-text"> London <div class="option-info">LHR, LGW, STN</div> </div> </div> </div> </div> <div class="option-group"> <div class="option-group-title">Popular Cities</div> <div class="option-list"> <div class="option-item" data-value="Tokyo"> <div class="option-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#2c7ae0" viewBox="0 0 16 16"> <path d="M8 16s6-5.686 6-10A6 6 0 0 0 2 6c0 4.314 6 10 6 10zm0-7a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/> </svg> </div> <div class="option-text"> Tokyo <div class="option-info">HND, NRT</div> </div> </div> <div class="option-item" data-value="Paris"> <div class="option-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#2c7ae0" viewBox="0 0 16 16"> <path d="M8 16s6-5.686 6-10A6 6 0 0 0 2 6c0 4.314 6 10 6 10zm0-7a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/> </svg> </div> <div class="option-text"> Paris <div class="option-info">CDG, ORY</div> </div> </div> <div class="option-item" data-value="Singapore"> <div class="option-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#2c7ae0" viewBox="0 0 16 16"> <path d="M8 16s6-5.686 6-10A6 6 0 0 0 2 6c0 4.314 6 10 6 10zm0-7a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/> </svg> </div> <div class="option-text"> Singapore <div class="option-info">SIN</div> </div> </div> <div class="option-item" data-value="Dubai"> <div class="option-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#2c7ae0" viewBox="0 0 16 16"> <path d="M8 16s6-5.686 6-10A6 6 0 0 0 2 6c0 4.314 6 10 6 10zm0-7a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/> </svg> </div> <div class="option-text"> Dubai <div class="option-info">DXB, DWC</div> </div> </div> </div> </div> </div> <div class="error-message">Please select a departure city</div> </div> </div> <div class="form-group" id="destination-group"> <label for="destination">Destination</label> <div class="select-wrapper"> <input type="text" id="destination" class="custom-select" placeholder="Where are you going?" readonly> <div class="select-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path d="M7.247 11.14 2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z"/> </svg> </div> <div class="select-dropdown" id="destination-dropdown"> <div class="option-group"> <div class="option-group-title">Trending Destinations</div> <div class="option-list"> <div class="option-item" data-value="Bali"> <div class="option-icon destination-icon" style="--index: 1;"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#ff6b6b" viewBox="0 0 16 16"> <path d="M8 16s6-5.686 6-10A6 6 0 0 0 2 6c0 4.314 6 10 6 10zm0-7a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/> </svg> </div> <div class="option-text"> Bali, Indonesia <div class="option-info">Tropical paradise • Hot now</div> </div> </div> <div class="option-item" data-value="Santorini"> <div class="option-icon destination-icon" style="--index: 2;"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#ff6b6b" viewBox="0 0 16 16"> <path d="M8 16s6-5.686 6-10A6 6 0 0 0 2 6c0 4.314 6 10 6 10zm0-7a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/> </svg> </div> <div class="option-text"> Santorini, Greece <div class="option-info">Aegean gem • 25% off</div> </div> </div> <div class="option-item" data-value="Maldives"> <div class="option-icon destination-icon" style="--index: 3;"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#ff6b6b" viewBox="0 0 16 16"> <path d="M8 16s6-5.686 6-10A6 6 0 0 0 2 6c0 4.314 6 10 6 10zm0-7a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/> </svg> </div> <div class="option-text"> Maldives <div class="option-info">Luxury escapes • All-inclusive</div> </div> </div> </div> </div> <div class="option-group"> <div class="option-group-title">Weekend Getaways</div> <div class="option-list"> <div class="option-item" data-value="Barcelona"> <div class="option-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#ff6b6b" viewBox="0 0 16 16"> <path d="M8 16s6-5.686 6-10A6 6 0 0 0 2 6c0 4.314 6 10 6 10zm0-7a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/> </svg> </div> <div class="option-text"> Barcelona, Spain <div class="option-info">Direct flights • 3h 20m</div> </div> </div> <div class="option-item" data-value="Amalfi Coast"> <div class="option-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#ff6b6b" viewBox="0 0 16 16"> <path d="M8 16s6-5.686 6-10A6 6 0 0 0 2 6c0 4.314 6 10 6 10zm0-7a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/> </svg> </div> <div class="option-text"> Amalfi Coast, Italy <div class="option-info">Scenic views • Coastal charm</div> </div> </div> <div class="option-item" data-value="Marrakech"> <div class="option-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#ff6b6b" viewBox="0 0 16 16"> <path d="M8 16s6-5.686 6-10A6 6 0 0 0 2 6c0 4.314 6 10 6 10zm0-7a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/> </svg> </div> <div class="option-text"> Marrakech, Morocco <div class="option-info">Cultural escape • Vibrant markets</div> </div> </div> </div> </div> </div> <div class="error-message">Please select a destination</div> </div> </div> </div> <div class="recommendation"> <div class="recommendation-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" viewBox="0 0 16 16"> <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z"/> <path d="m8.93 6.588-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533L8.93 6.588zM9 4.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0z"/> </svg> </div> <div class="recommendation-text"> <h3>Travel Tip</h3> <p>Book 3-4 months in advance for best rates to popular summer destinations.</p> </div> </div> <div class="form-footer"> <button type="submit" class="btn btn-primary"> Find flights <span class="btn-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path d="M3.5 7a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5h3zm13 0a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5h3z"/> <path d="M11.27 1.948l-3.845 3.257A1 1 0 0 0 7 5.938v4.124a1 1 0 0 0 .425.733l3.845 3.257a1 1 0 0 0 1.651-.753V2.701a1 1 0 0 0-1.651-.753z"/> </svg> </span> </button> </div> </form> <div class="success-message" id="success-message"> <div class="success-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" viewBox="0 0 16 16"> <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/> </svg> </div> <h2>Great choice!</h2> <p id="booking-details">You're on your way to an amazing adventure.</p> <button type="button" class="btn btn-primary" id="reset-form">Search again</button> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Select elements const departureSelect = document.getElementById('departure'); const destinationSelect = document.getElementById('destination'); const departureDropdown = document.getElementById('departure-dropdown'); const destinationDropdown = document.getElementById('destination-dropdown'); const departureGroup = document.getElementById('departure-group'); const destinationGroup = document.getElementById('destination-group'); const bookingForm = document.getElementById('booking-form'); const successMessage = document.getElementById('success-message'); const bookingDetails = document.getElementById('booking-details'); const resetButton = document.getElementById('reset-form'); // Toggle dropdowns departureSelect.addEventListener('click', function(e) { e.stopPropagation(); departureDropdown.classList.toggle('show'); destinationDropdown.classList.remove('show'); }); destinationSelect.addEventListener('click', function(e) { e.stopPropagation(); destinationDropdown.classList.toggle('show'); departureDropdown.classList.remove('show'); }); // Close dropdowns when clicking outside document.addEventListener('click', function() { departureDropdown.classList.remove('show'); destinationDropdown.classList.remove('show'); }); // Prevent clicks inside dropdown from closing it departureDropdown.addEventListener('click', function(e) { e.stopPropagation(); }); destinationDropdown.addEventListener('click', function(e) { e.stopPropagation(); }); // Handle option selection for departure const departureOptions = departureDropdown.querySelectorAll('.option-item'); departureOptions.forEach(option => { option.addEventListener('click', function() { const value = this.getAttribute('data-value'); departureSelect.value = value; // Update selected state departureOptions.forEach(opt => opt.classList.remove('selected')); this.classList.add('selected'); // Hide dropdown departureDropdown.classList.remove('show'); // Remove error state if exists departureGroup.classList.remove('error'); }); }); // Handle option selection for destination const destinationOptions = destinationDropdown.querySelectorAll('.option-item'); destinationOptions.forEach(option => { option.addEventListener('click', function() { const value = this.getAttribute('data-value'); destinationSelect.value = value; // Update selected state destinationOptions.forEach(opt => opt.classList.remove('selected')); this.classList.add('selected'); // Hide dropdown destinationDropdown.classList.remove('show'); // Remove error state if exists destinationGroup.classList.remove('error'); }); }); // Form submission bookingForm.addEventListener('submit', function(e) { e.preventDefault(); // Validate form let isValid = true; if (!departureSelect.value) { departureGroup.classList.add('error'); isValid = false; } else { departureGroup.classList.remove('error'); } if (!destinationSelect.value) { destinationGroup.classList.add('error'); isValid = false; } else { destinationGroup.classList.remove('error'); } if (isValid) { // Show success message bookingForm.style.display = 'none'; successMessage.style.display = 'block'; // Update booking details bookingDetails.textContent = `Your search from ${departureSelect.value} to ${destinationSelect.value} is complete.`; } }); // Reset form resetButton.addEventListener('click', function() { bookingForm.style.display = 'block'; successMessage.style.display = 'none'; // Clear form values departureSelect.value = ''; destinationSelect.value = ''; // Remove selected state from options departureOptions.forEach(opt => opt.classList.remove('selected')); destinationOptions.forEach(opt => opt.classList.remove('selected')); }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>FlavorDash - Food Delivery Selector</title> <style> :root { --primary: #FF5A5F; --secondary: #00C9A7; --tertiary: #FFC857; --dark: #2E3532; --light: #F8F9FA; --transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Poppins', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; } body { background-color: var(--light); display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 700px; width: 100%; padding: 20px; overflow-x: hidden; } .container { max-width: 650px; width: 100%; background: white; border-radius: 24px; box-shadow: 0 12px 30px rgba(0, 0, 0, 0.1); padding: 30px; position: relative; overflow: hidden; } .container::before { content: ''; position: absolute; top: 0; left: 0; height: 8px; width: 100%; background: linear-gradient(90deg, var(--primary), var(--secondary), var(--tertiary)); } .header { text-align: center; margin-bottom: 30px; } .logo { font-size: 2.2rem; font-weight: 800; color: var(--dark); margin-bottom: 5px; display: flex; align-items: center; justify-content: center; } .logo span { color: var(--primary); } .logo-icon { margin-right: 10px; font-size: 2.5rem; } .tagline { font-size: 1rem; color: #666; font-weight: 400; } .cuisine-selector { margin-bottom: 30px; } .selector-title { font-size: 1.1rem; color: var(--dark); margin-bottom: 15px; font-weight: 600; } .cuisines-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 15px; margin-bottom: 25px; } .cuisine-card { background: #f8f8f8; border-radius: 16px; padding: 15px; text-align: center; cursor: pointer; transition: var(--transition); position: relative; overflow: hidden; height: 110px; display: flex; flex-direction: column; align-items: center; justify-content: center; border: 2px solid transparent; } .cuisine-card:hover { transform: translateY(-5px); box-shadow: 0 8px 20px rgba(0, 0, 0, 0.08); } .cuisine-card.selected { background: rgba(255, 90, 95, 0.08); border-color: var(--primary); } .cuisine-card.selected::before { content: '✓'; position: absolute; top: 8px; right: 8px; background: var(--primary); color: white; border-radius: 50%; width: 20px; height: 20px; font-size: 12px; display: flex; align-items: center; justify-content: center; } .cuisine-icon { font-size: 2rem; margin-bottom: 8px; } .cuisine-name { font-size: 0.9rem; font-weight: 500; color: var(--dark); } .restaurants-section { opacity: 0; height: 0; overflow: hidden; transition: var(--transition); } .restaurants-section.active { opacity: 1; height: auto; margin-top: 20px; } .restaurant-list { display: flex; flex-direction: column; gap: 12px; } .restaurant-card { display: flex; align-items: center; background: #f8f8f8; border-radius: 16px; padding: 10px; cursor: pointer; transition: var(--transition); border: 2px solid transparent; } .restaurant-card:hover { transform: translateX(8px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05); } .restaurant-card.selected { background: rgba(0, 201, 167, 0.08); border-color: var(--secondary); } .restaurant-img { width: 60px; height: 60px; border-radius: 12px; object-fit: cover; margin-right: 15px; } .restaurant-info { flex: 1; } .restaurant-name { font-weight: 600; font-size: 1rem; color: var(--dark); margin-bottom: 3px; } .restaurant-details { display: flex; align-items: center; font-size: 0.85rem; color: #777; } .restaurant-rating { display: flex; align-items: center; margin-right: 12px; } .rating-star { color: var(--tertiary); margin-right: 3px; } .restaurant-time { display: flex; align-items: center; } .time-icon { margin-right: 3px; } .cta-section { margin-top: 30px; display: flex; justify-content: center; } .order-button { background: var(--primary); color: white; border: none; padding: 14px 28px; border-radius: 12px; font-size: 1rem; font-weight: 600; cursor: pointer; transition: var(--transition); display: flex; align-items: center; justify-content: center; transform-origin: center; opacity: 0; pointer-events: none; transform: scale(0.9); } .order-button.active { opacity: 1; pointer-events: all; transform: scale(1); } .order-button:hover { background: #ff4146; transform: scale(1.05); } .order-button-icon { margin-left: 8px; font-size: 1.2rem; } .selected-items { text-align: center; margin-top: 25px; font-size: 0.9rem; color: #666; height: 20px; } /* Pulse animation for selected cuisine */ @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(255, 90, 95, 0.4); } 70% { box-shadow: 0 0 0 10px rgba(255, 90, 95, 0); } 100% { box-shadow: 0 0 0 0 rgba(255, 90, 95, 0); } } .cuisine-card.selected { animation: pulse 1.5s infinite; } /* Making it responsive */ @media (max-width: 550px) { .container { padding: 20px; border-radius: 20px; } .logo { font-size: 1.8rem; } .cuisines-grid { grid-template-columns: repeat(auto-fill, minmax(110px, 1fr)); gap: 10px; } .cuisine-card { height: 100px; padding: 12px; } } @media (max-width: 400px) { .container { padding: 15px; } .cuisines-grid { grid-template-columns: repeat(auto-fill, minmax(90px, 1fr)); gap: 8px; } .cuisine-card { height: 90px; padding: 10px; } .cuisine-icon { font-size: 1.5rem; } .cuisine-name { font-size: 0.8rem; } } /* Food emoji hover effect */ .emoji-hover { position: absolute; font-size: 20px; opacity: 0; animation: float 2s ease-in-out forwards; z-index: 10; pointer-events: none; } @keyframes float { 0% { transform: translateY(0) rotate(0deg); opacity: 0; } 10% { opacity: 1; } 100% { transform: translateY(-80px) rotate(20deg); opacity: 0; } } /* Success animation */ .order-success { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.95); display: flex; align-items: center; justify-content: center; flex-direction: column; opacity: 0; pointer-events: none; transition: opacity 0.3s ease; z-index: 100; } .order-success.show { opacity: 1; pointer-events: all; } .success-icon { font-size: 5rem; color: var(--secondary); margin-bottom: 20px; } .success-title { font-size: 1.8rem; font-weight: 700; color: var(--dark); margin-bottom: 10px; } .success-message { font-size: 1.1rem; color: #666; margin-bottom: 20px; text-align: center; } .loading-spinner { display: inline-block; width: 50px; height: 50px; border: 5px solid rgba(255, 90, 95, 0.2); border-radius: 50%; border-top-color: var(--primary); animation: spin 1s ease-in-out infinite; } @keyframes spin { to { transform: rotate(360deg); } } </style> </head> <body> <div class="container"> <div class="header"> <div class="logo"> <span class="logo-icon">🍽️</span> Flavor<span>Dash</span> </div> <div class="tagline">Delicious food, delivered in a flash!</div> </div> <div class="cuisine-selector"> <div class="selector-title">What are you craving today?</div> <div class="cuisines-grid"> <div class="cuisine-card" data-cuisine="Italian"> <div class="cuisine-icon">🍕</div> <div class="cuisine-name">Italian</div> </div> <div class="cuisine-card" data-cuisine="Japanese"> <div class="cuisine-icon">🍣</div> <div class="cuisine-name">Japanese</div> </div> <div class="cuisine-card" data-cuisine="Mexican"> <div class="cuisine-icon">🌮</div> <div class="cuisine-name">Mexican</div> </div> <div class="cuisine-card" data-cuisine="Indian"> <div class="cuisine-icon">🍛</div> <div class="cuisine-name">Indian</div> </div> <div class="cuisine-card" data-cuisine="Thai"> <div class="cuisine-icon">🥡</div> <div class="cuisine-name">Thai</div> </div> <div class="cuisine-card" data-cuisine="American"> <div class="cuisine-icon">🍔</div> <div class="cuisine-name">American</div> </div> <div class="cuisine-card" data-cuisine="Chinese"> <div class="cuisine-icon">🥢</div> <div class="cuisine-name">Chinese</div> </div> <div class="cuisine-card" data-cuisine="Healthy"> <div class="cuisine-icon">🥗</div> <div class="cuisine-name">Healthy</div> </div> </div> </div> <div class="restaurants-section" id="italian-restaurants"> <div class="selector-title">Popular Italian spots near you</div> <div class="restaurant-list"> <div class="restaurant-card" data-restaurant="Mama Mia's Trattoria"> <img src="https://source.unsplash.com/random/200x200/?italian-restaurant" alt="Mama Mia's Trattoria" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Mama Mia's Trattoria</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.8 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 25-35 min </div> </div> </div> </div> <div class="restaurant-card" data-restaurant="Romano's Pizza Palace"> <img src="https://source.unsplash.com/random/200x200/?pizza" alt="Romano's Pizza Palace" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Romano's Pizza Palace</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.6 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 20-30 min </div> </div> </div> </div> <div class="restaurant-card" data-restaurant="Pasta Paradise"> <img src="https://source.unsplash.com/random/200x200/?pasta" alt="Pasta Paradise" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Pasta Paradise</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.5 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 35-45 min </div> </div> </div> </div> </div> </div> <div class="restaurants-section" id="japanese-restaurants"> <div class="selector-title">Popular Japanese spots near you</div> <div class="restaurant-list"> <div class="restaurant-card" data-restaurant="Sakura Sushi Bar"> <img src="https://source.unsplash.com/random/200x200/?sushi" alt="Sakura Sushi Bar" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Sakura Sushi Bar</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.9 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 30-40 min </div> </div> </div> </div> <div class="restaurant-card" data-restaurant="Tokyo Ramen House"> <img src="https://source.unsplash.com/random/200x200/?ramen" alt="Tokyo Ramen House" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Tokyo Ramen House</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.7 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 25-35 min </div> </div> </div> </div> <div class="restaurant-card" data-restaurant="Bento Box Delights"> <img src="https://source.unsplash.com/random/200x200/?bento" alt="Bento Box Delights" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Bento Box Delights</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.6 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 20-30 min </div> </div> </div> </div> </div> </div> <div class="restaurants-section" id="mexican-restaurants"> <div class="selector-title">Popular Mexican spots near you</div> <div class="restaurant-list"> <div class="restaurant-card" data-restaurant="Taco Fiesta"> <img src="https://source.unsplash.com/random/200x200/?tacos" alt="Taco Fiesta" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Taco Fiesta</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.5 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 20-30 min </div> </div> </div> </div> <div class="restaurant-card" data-restaurant="Burrito Brothers"> <img src="https://source.unsplash.com/random/200x200/?burrito" alt="Burrito Brothers" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Burrito Brothers</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.7 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 25-35 min </div> </div> </div> </div> <div class="restaurant-card" data-restaurant="Guacamole Grill"> <img src="https://source.unsplash.com/random/200x200/?guacamole" alt="Guacamole Grill" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Guacamole Grill</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.4 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 30-40 min </div> </div> </div> </div> </div> </div> <div class="restaurants-section" id="indian-restaurants"> <div class="selector-title">Popular Indian spots near you</div> <div class="restaurant-list"> <div class="restaurant-card" data-restaurant="Taj Mahal Curry House"> <img src="https://source.unsplash.com/random/200x200/?curry" alt="Taj Mahal Curry House" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Taj Mahal Curry House</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.8 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 35-45 min </div> </div> </div> </div> <div class="restaurant-card" data-restaurant="Tandoori Express"> <img src="https://source.unsplash.com/random/200x200/?tandoori" alt="Tandoori Express" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Tandoori Express</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.6 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 25-35 min </div> </div> </div> </div> <div class="restaurant-card" data-restaurant="Masala Magic"> <img src="https://source.unsplash.com/random/200x200/?masala" alt="Masala Magic" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Masala Magic</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.7 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 30-40 min </div> </div> </div> </div> </div> </div> <div class="restaurants-section" id="thai-restaurants"> <div class="selector-title">Popular Thai spots near you</div> <div class="restaurant-list"> <div class="restaurant-card" data-restaurant="Bangkok Spice"> <img src="https://source.unsplash.com/random/200x200/?thai-food" alt="Bangkok Spice" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Bangkok Spice</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.7 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 30-40 min </div> </div> </div> </div> <div class="restaurant-card" data-restaurant="Pad Thai Paradise"> <img src="https://source.unsplash.com/random/200x200/?pad-thai" alt="Pad Thai Paradise" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Pad Thai Paradise</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.5 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 25-35 min </div> </div> </div> </div> <div class="restaurant-card" data-restaurant="Thai Orchid"> <img src="https://source.unsplash.com/random/200x200/?thai-restaurant" alt="Thai Orchid" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Thai Orchid</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.6 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 35-45 min </div> </div> </div> </div> </div> </div> <div class="restaurants-section" id="american-restaurants"> <div class="selector-title">Popular American spots near you</div> <div class="restaurant-list"> <div class="restaurant-card" data-restaurant="Burger Boulevard"> <img src="https://source.unsplash.com/random/200x200/?burger" alt="Burger Boulevard" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Burger Boulevard</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.6 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 20-30 min </div> </div> </div> </div> <div class="restaurant-card" data-restaurant="Crispy Fried Chicken"> <img src="https://source.unsplash.com/random/200x200/?fried-chicken" alt="Crispy Fried Chicken" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Crispy Fried Chicken</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.7 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 25-35 min </div> </div> </div> </div> <div class="restaurant-card" data-restaurant="Steak & Shake"> <img src="https://source.unsplash.com/random/200x200/?steak" alt="Steak & Shake" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Steak & Shake</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.5 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 30-40 min </div> </div> </div> </div> </div> </div> <div class="restaurants-section" id="chinese-restaurants"> <div class="selector-title">Popular Chinese spots near you</div> <div class="restaurant-list"> <div class="restaurant-card" data-restaurant="Golden Dragon"> <img src="https://source.unsplash.com/random/200x200/?chinese-food" alt="Golden Dragon" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Golden Dragon</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.7 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 25-35 min </div> </div> </div> </div> <div class="restaurant-card" data-restaurant="Wok & Roll"> <img src="https://source.unsplash.com/random/200x200/?wok" alt="Wok & Roll" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Wok & Roll</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.5 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 30-40 min </div> </div> </div> </div> <div class="restaurant-card" data-restaurant="Panda Express"> <img src="https://source.unsplash.com/random/200x200/?chinese-restaurant" alt="Panda Express" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Panda Express</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.3 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 20-30 min </div> </div> </div> </div> </div> </div> <div class="restaurants-section" id="healthy-restaurants"> <div class="selector-title">Popular Healthy spots near you</div> <div class="restaurant-list"> <div class="restaurant-card" data-restaurant="Fresh Greens"> <img src="https://source.unsplash.com/random/200x200/?salad" alt="Fresh Greens" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Fresh Greens</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.8 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 20-30 min </div> </div> </div> </div> <div class="restaurant-card" data-restaurant="Smoothie Haven"> <img src="https://source.unsplash.com/random/200x200/?smoothie" alt="Smoothie Haven" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Smoothie Haven</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.6 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 15-25 min </div> </div> </div> </div> <div class="restaurant-card" data-restaurant="Protein Power"> <img src="https://source.unsplash.com/random/200x200/?healthy-bowl" alt="Protein Power" class="restaurant-img"> <div class="restaurant-info"> <div class="restaurant-name">Protein Power</div> <div class="restaurant-details"> <div class="restaurant-rating"> <span class="rating-star">★</span> 4.7 </div> <div class="restaurant-time"> <span class="time-icon">⏱️</span> 25-35 min </div> </div> </div> </div> </div> </div> <div class="selected-items" id="selected-items"></div> <div class="cta-section"> <button class="order-button" id="order-button"> Place your order <span class="order-button-icon">🚀</span> </button> </div> </div> <div class="order-success" id="order-success"> <div class="loading-spinner" id="loading-spinner"></div> <div class="success-content" id="success-content" style="display: none;"> <div class="success-icon">✅</div> <div class="success-title">Order Confirmed!</div> <div class="success-message">Your delicious food is on its way.<br>Estimated delivery time: <span id="delivery-time">30-40 minutes</span></div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { let selectedCuisine = ''; let selectedRestaurant = ''; const cuisineCards = document.querySelectorAll('.cuisine-card'); const restaurantSections = document.querySelectorAll('.restaurants-section'); const restaurantCards = document.querySelectorAll('.restaurant-card'); const orderButton = document.getElementById('order-button'); const selectedItemsText = document.getElementById('selected-items'); const orderSuccess = document.getElementById('order-success'); const loadingSpinner = document.getElementById('loading-spinner'); const successContent = document.getElementById('success-content'); const deliveryTimeSpan = document.getElementById('delivery-time'); // Cuisine selection cuisineCards.forEach(card => { card.addEventListener('click', function() { const cuisine = this.getAttribute('data-cuisine'); // Remove selection from all cuisine cards cuisineCards.forEach(c => c.classList.remove('selected')); // Hide all restaurant sections restaurantSections.forEach(section => section.classList.remove('active')); // Clear selected restaurant restaurantCards.forEach(r => r.classList.remove('selected')); selectedRestaurant = ''; // Select this cuisine card this.classList.add('selected'); selectedCuisine = cuisine; // Show corresponding restaurant section document.getElementById(`${cuisine.toLowerCase()}-restaurants`).classList.add('active'); // Update selected items text updateSelectedItems(); // Create food emoji animation createEmojiAnimation(event, this.querySelector('.cuisine-icon').textContent); }); }); // Restaurant selection restaurantCards.forEach(card => { card.addEventListener('click', function() { const restaurant = this.getAttribute('data-restaurant'); // Clear previous selection const parentSection = this.closest('.restaurants-section'); const cardsInThisSection = parentSection.querySelectorAll('.restaurant-card'); cardsInThisSection.forEach(c => c.classList.remove('selected')); // Select this restaurant this.classList.add('selected'); selectedRestaurant = restaurant; // Show order button orderButton.classList.add('active'); // Update selected items text updateSelectedItems(); }); }); // Order button action orderButton.addEventListener('click', function() { if (selectedRestaurant) { // Show order success overlay with loading spinner orderSuccess.classList.add('show'); // Get delivery time from selected restaurant card const selectedRestaurantCard = document.querySelector('.restaurant-card.selected'); const deliveryTime = selectedRestaurantCard.querySelector('.restaurant-time').textContent.trim().replace('⏱️', '').trim(); deliveryTimeSpan.textContent = deliveryTime; // Simulate loading setTimeout(() => { loadingSpinner.style.display = 'none'; successContent.style.display = 'block'; // Auto-close after 3 seconds setTimeout(() => { resetSelections(); orderSuccess.classList.remove('show'); loadingSpinner.style.display = 'block'; successContent.style.display = 'none'; }, 3000); }, 1500); } }); // Update the selected items text function updateSelectedItems() { if (selectedCuisine && selectedRestaurant) {
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Melodify Genre Selector</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; background: linear-gradient(135deg, #0f0f1e, #191932); display: flex; justify-content: center; align-items: center; height: 100vh; color: #ffffff; overflow: hidden; width: 100%; } .container { width: 100%; max-width: 650px; padding: 20px; border-radius: 18px; background: rgba(10, 10, 20, 0.7); backdrop-filter: blur(20px); box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); position: relative; overflow: hidden; transition: all 0.5s ease; } .container::before { content: ""; position: absolute; top: -50%; left: -50%; width: 200%; height: 200%; background: radial-gradient(circle, rgba(75, 0, 130, 0.1) 0%, transparent 65%); animation: pulse 15s infinite alternate; z-index: -1; } @keyframes pulse { 0% { transform: translate(0, 0) scale(1); opacity: 0.3; } 100% { transform: translate(5%, 5%) scale(1.05); opacity: 0.5; } } .header { margin-bottom: 30px; position: relative; } .header h1 { font-size: 36px; font-weight: 800; margin-bottom: 10px; color: white; position: relative; display: inline-block; } .header h1::after { content: ""; position: absolute; bottom: -5px; left: 0; width: 60px; height: 4px; background: linear-gradient(90deg, #ff2a6d, #d300c5); border-radius: 2px; } .header p { color: rgba(255, 255, 255, 0.7); font-size: 16px; line-height: 1.5; } .select-container { position: relative; margin-bottom: 30px; } .select-label { display: block; margin-bottom: 12px; font-size: 18px; font-weight: 600; color: #ffffff; letter-spacing: 0.5px; } .custom-select { position: relative; } .select-selected { position: relative; padding: 18px 20px; background: rgba(30, 30, 50, 0.6); border: 2px solid rgba(255, 255, 255, 0.1); border-radius: 12px; cursor: pointer; font-size: 16px; display: flex; justify-content: space-between; align-items: center; transition: all 0.3s ease; color: white; overflow: hidden; } .select-selected:hover { border-color: rgba(255, 42, 109, 0.5); box-shadow: 0 0 15px rgba(255, 42, 109, 0.2); } .select-selected.active { border-color: #ff2a6d; box-shadow: 0 0 20px rgba(255, 42, 109, 0.3); border-radius: 12px 12px 0 0; } .select-selected::after { content: ""; width: 12px; height: 12px; border-right: 3px solid #ff2a6d; border-bottom: 3px solid #ff2a6d; transform: rotate(45deg); transition: transform 0.3s ease; display: block; } .select-selected.active::after { transform: rotate(-135deg); } .select-items { position: absolute; background: rgba(25, 25, 40, 0.95); border: 2px solid rgba(255, 42, 109, 0.3); border-top: none; top: 100%; left: 0; right: 0; z-index: 99; max-height: 0; overflow-y: auto; transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1); opacity: 0; border-radius: 0 0 12px 12px; scrollbar-width: thin; scrollbar-color: #ff2a6d rgba(255, 255, 255, 0.1); } .select-items::-webkit-scrollbar { width: 6px; } .select-items::-webkit-scrollbar-track { background: rgba(255, 255, 255, 0.05); border-radius: 3px; } .select-items::-webkit-scrollbar-thumb { background-color: rgba(255, 42, 109, 0.5); border-radius: 3px; } .select-items div { padding: 16px 20px; cursor: pointer; transition: all 0.2s ease; display: flex; align-items: center; position: relative; overflow: hidden; } .select-items div::before { content: ""; position: absolute; left: 0; top: 0; width: 4px; height: 100%; background: linear-gradient(to bottom, #ff2a6d, #d300c5); opacity: 0; transition: all 0.2s ease; } .select-items div:hover { background-color: rgba(255, 255, 255, 0.08); padding-left: 26px; } .select-items div:hover::before { opacity: 1; } .select-items.show { max-height: 300px; opacity: 1; } .genre-icon { width: 24px; height: 24px; margin-right: 15px; flex-shrink: 0; display: flex; align-items: center; justify-content: center; border-radius: 50%; background: rgba(255, 255, 255, 0.1); transition: all 0.3s ease; } .select-items div:hover .genre-icon { transform: scale(1.1); background: rgba(255, 42, 109, 0.2); } .genre-title { font-weight: 500; transition: all 0.2s ease; } .select-items div:hover .genre-title { color: #ff2a6d; } .selected-item { background-color: rgba(255, 42, 109, 0.1) !important; } .selected-item::before { opacity: 1 !important; } .selected-item .genre-title { color: #ff2a6d; font-weight: 600; } .now-playing { border-top: 1px solid rgba(255, 255, 255, 0.1); padding-top: 25px; display: flex; align-items: center; transition: all 0.4s ease; opacity: 0; transform: translateY(20px); } .now-playing.visible { opacity: 1; transform: translateY(0); } .album-art { width: 80px; height: 80px; border-radius: 10px; background-size: cover; background-position: center; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); position: relative; overflow: hidden; margin-right: 20px; flex-shrink: 0; } .album-art::after { content: ""; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(135deg, rgba(255, 42, 109, 0.3), rgba(0, 0, 0, 0)); z-index: 1; } .play-info { flex-grow: 1; overflow: hidden; } .play-title { font-size: 18px; font-weight: 600; margin-bottom: 8px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .play-artist { font-size: 14px; color: rgba(255, 255, 255, 0.7); margin-bottom: 12px; } .progress-container { width: 100%; height: 4px; background: rgba(255, 255, 255, 0.1); border-radius: 2px; overflow: hidden; position: relative; } .progress-bar { position: absolute; height: 100%; width: 35%; background: linear-gradient(90deg, #ff2a6d, #d300c5); border-radius: 2px; transition: width 0.2s ease; } .progress-bar::after { content: ""; position: absolute; right: 0; top: 50%; transform: translateY(-50%); width: 10px; height: 10px; border-radius: 50%; background: white; box-shadow: 0 0 10px rgba(255, 42, 109, 0.8); } .equalizer { display: flex; align-items: flex-end; height: 30px; gap: 3px; margin-left: 15px; } .eq-bar { width: 3px; background: #ff2a6d; border-radius: 1px; animation: equalize 1.2s steps(4, end) infinite; } .eq-bar:nth-child(1) { animation-delay: 0.2s; } .eq-bar:nth-child(2) { animation-delay: 0.4s; } .eq-bar:nth-child(3) { animation-delay: 0.1s; } .eq-bar:nth-child(4) { animation-delay: 0.3s; } @keyframes equalize { 0%, 100% { height: 4px; } 30% { height: 15px; } 60% { height: 10px; } 80% { height: 20px; } } .recommendation { margin-top: 25px; padding: 15px; border-radius: 12px; background: rgba(255, 255, 255, 0.05); display: none; border-left: 3px solid #ff2a6d; } .recommendation h3 { font-size: 15px; margin-bottom: 8px; color: rgba(255, 255, 255, 0.9); } .recommendation p { font-size: 14px; color: rgba(255, 255, 255, 0.7); } .glow-effect { position: absolute; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; background: radial-gradient(circle at var(--x) var(--y), rgba(255, 42, 109, 0.15) 0%, transparent 50%); opacity: 0; transition: opacity 0.3s ease; } @media (max-width: 600px) { .container { padding: 15px; max-width: 100%; } .header h1 { font-size: 28px; } .now-playing { flex-direction: column; align-items: flex-start; } .album-art { margin-right: 0; margin-bottom: 15px; width: 100%; height: 180px; } .equalizer { margin-left: 0; margin-top: 15px; } } .genre-color { display: inline-block; width: 100%; height: 100%; border-radius: 50%; } .hiphop { background: linear-gradient(45deg, #ff2a6d, #ff9e00); } .electronic { background: linear-gradient(45deg, #00f2fe, #4facfe); } .rock { background: linear-gradient(45deg, #f43b47, #453a94); } .jazz { background: linear-gradient(45deg, #2c3e50, #4ca1af); } .classical { background: linear-gradient(45deg, #734ae8, #01baef); } .pop { background: linear-gradient(45deg, #ee0979, #ff6a00); } .indie { background: linear-gradient(45deg, #3a1c71, #d76d77); } .rnb { background: linear-gradient(45deg, #8e2de2, #4a00e0); } </style> </head> <body> <div class="container"> <div class="glow-effect"></div> <div class="header"> <h1>Melodify</h1> <p>Discover new sounds and craft your perfect vibe with our curated music collections.</p> </div> <div class="select-container"> <label class="select-label">Select Genre</label> <div class="custom-select"> <div class="select-selected">Browse Genres</div> <div class="select-items"> <div data-value="hiphop" data-art="https://images.unsplash.com/photo-1571609803595-eab98eab81fb?q=80&w=300&auto=format"> <div class="genre-icon"><span class="genre-color hiphop"></span></div> <span class="genre-title">Hip-Hop & Trap</span> </div> <div data-value="electronic" data-art="https://images.unsplash.com/photo-1517230878791-4d28214057c2?q=80&w=300&auto=format"> <div class="genre-icon"><span class="genre-color electronic"></span></div> <span class="genre-title">Electronic & Dance</span> </div> <div data-value="rock" data-art="https://images.unsplash.com/photo-1498038432885-c6f3f1b912ee?q=80&w=300&auto=format"> <div class="genre-icon"><span class="genre-color rock"></span></div> <span class="genre-title">Rock & Alternative</span> </div> <div data-value="jazz" data-art="https://images.unsplash.com/photo-1507838153414-b4b713384a76?q=80&w=300&auto=format"> <div class="genre-icon"><span class="genre-color jazz"></span></div> <span class="genre-title">Jazz & Blues</span> </div> <div data-value="classical" data-art="https://images.unsplash.com/photo-1507924538820-ede94a04019d?q=80&w=300&auto=format"> <div class="genre-icon"><span class="genre-color classical"></span></div> <span class="genre-title">Classical & Ambient</span> </div> <div data-value="pop" data-art="https://images.unsplash.com/photo-1470225620780-dba8ba36b745?q=80&w=300&auto=format"> <div class="genre-icon"><span class="genre-color pop"></span></div> <span class="genre-title">Pop & Top 40</span> </div> <div data-value="indie" data-art="https://images.unsplash.com/photo-1514525253161-7a46d19cd819?q=80&w=300&auto=format"> <div class="genre-icon"><span class="genre-color indie"></span></div> <span class="genre-title">Indie & Alternative</span> </div> <div data-value="rnb" data-art="https://images.unsplash.com/photo-1493225457124-a3eb161ffa5f?q=80&w=300&auto=format"> <div class="genre-icon"><span class="genre-color rnb"></span></div> <span class="genre-title">R&B & Soul</span> </div> </div> </div> </div> <div class="now-playing"> <div class="album-art"></div> <div class="play-info"> <div class="play-title">Select a genre to start</div> <div class="play-artist">Choose your mood above</div> <div class="progress-container"> <div class="progress-bar"></div> </div> </div> <div class="equalizer"> <div class="eq-bar"></div> <div class="eq-bar"></div> <div class="eq-bar"></div> <div class="eq-bar"></div> </div> </div> <div class="recommendation" id="hiphop"> <h3>Weekly Picks: Hip-Hop & Trap</h3> <p>Smooth beats and lyrical flows from artists pushing the boundaries. Check out our "After Hours Trap" and "Classic Boom Bap" playlists.</p> </div> <div class="recommendation" id="electronic"> <h3>Weekly Picks: Electronic & Dance</h3> <p>From ambient soundscapes to heart-pounding house beats. Our "Night Drive" and "Future Bass Essentials" playlists are trending this week.</p> </div> <div class="recommendation" id="rock"> <h3>Weekly Picks: Rock & Alternative</h3> <p>Authentic guitar riffs and powerful vocals. Try our "Garage Rock Revival" and "Modern Rock Anthems" collections for your daily dose.</p> </div> <div class="recommendation" id="jazz"> <h3>Weekly Picks: Jazz & Blues</h3> <p>Smooth improvisations and soulful expressions. Our "Late Night Jazz" and "Blues Legends" playlists are perfect for unwinding.</p> </div> <div class="recommendation" id="classical"> <h3>Weekly Picks: Classical & Ambient</h3> <p>Timeless compositions and atmospheric textures. Explore our "Modern Classical" and "Focus & Concentration" curated collections.</p> </div> <div class="recommendation" id="pop"> <h3>Weekly Picks: Pop & Top 40</h3> <p>Catchy hooks and chart-topping hits. Our "Pop Rewind" and "Fresh Finds" playlists feature both new releases and recent classics.</p> </div> <div class="recommendation" id="indie"> <h3>Weekly Picks: Indie & Alternative</h3> <p>Authentic sounds from emerging artists. Check out our "Indie Discovery" and "Alternative Essentials" collections for fresh perspectives.</p> </div> <div class="recommendation" id="rnb"> <h3>Weekly Picks: R&B & Soul</h3> <p>Smooth vocals and soulful productions. Our "R&B After Dark" and "Neo Soul Sessions" playlists are perfect for setting the mood.</p> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const customSelect = document.querySelector('.custom-select'); const selectSelected = document.querySelector('.select-selected'); const selectItems = document.querySelector('.select-items'); const items = document.querySelectorAll('.select-items div'); const nowPlaying = document.querySelector('.now-playing'); const albumArt = document.querySelector('.album-art'); const playTitle = document.querySelector('.play-title'); const playArtist = document.querySelector('.play-artist'); const progressBar = document.querySelector('.progress-bar'); const recommendations = document.querySelectorAll('.recommendation'); const container = document.querySelector('.container'); const glowEffect = document.querySelector('.glow-effect'); const genreArtists = { 'hiphop': ['Kendrick Lamar', 'J. Cole', 'Travis Scott', 'Megan Thee Stallion'], 'electronic': ['Disclosure', 'Four Tet', 'Bonobo', 'Kaytranada'], 'rock': ['Tame Impala', 'The Black Keys', 'Arctic Monkeys', 'HAIM'], 'jazz': ['Kamasi Washington', 'Robert Glasper', 'Nubya Garcia', 'GoGo Penguin'], 'classical': ['Max Richter', 'Ólafur Arnalds', 'Nils Frahm', 'Joep Beving'], 'pop': ['Dua Lipa', 'The Weeknd', 'Billie Eilish', 'Harry Styles'], 'indie': ['Big Thief', 'Japanese Breakfast', 'Phoebe Bridgers', 'King Krule'], 'rnb': ['SZA', 'Daniel Caesar', 'H.E.R.', 'Giveon'] }; const genrePlaylists = { 'hiphop': ['Bars & Beats', 'Chill Hop Essentials', 'Trap Anthems', 'Hip-Hop Classics'], 'electronic': ['Dance Floor Fillers', 'Ambient Electronics', 'Deep House Journey', 'Bass Odyssey'], 'rock': ['Guitar Heroes', 'Indie Rock Essentials', 'Rock Classics', 'New Alternative'], 'jazz': ['Late Night Jazz', 'Modern Jazz Essentials', 'Jazz Fusion', 'Blues & Beyond'], 'classical': ['Peaceful Piano', 'Orchestral Essentials', 'Modern Classical', 'Focus Flow'], 'pop': ['Today\'s Hits', 'Pop Throwbacks', 'Sing-Along Anthems', 'Viral Hits'], 'indie': ['Indie Morning', 'Alternative Vibes', 'Indie Discoveries', 'Chill Indie'], 'rnb': ['Smooth R&B', 'Soul Revolutions', 'R&B Throwbacks', 'Neo Soul Essentials'] }; // Add mousemove effect for glow container.addEventListener('mousemove', function(e) { const rect = container.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; glowEffect.style.setProperty('--x', x + 'px'); glowEffect.style.setProperty('--y', y + 'px'); glowEffect.style.opacity = '1'; }); container.addEventListener('mouseleave', function() { glowEffect.style.opacity = '0'; }); // Toggle dropdown selectSelected.addEventListener('click', function(e) { e.stopPropagation(); this.classList.toggle('active'); selectItems.classList.toggle('show'); // Add subtle animation to items when opening if (selectItems.classList.contains('show')) { items.forEach((item, index) => { item.style.opacity = '0'; item.style.transform = 'translateY(10px)'; setTimeout(() => { item.style.transition = 'all 0.3s ease'; item.style.opacity = '1'; item.style.transform = 'translateY(0)'; }, 50 + (index * 30)); }); } }); // Handle item selection items.forEach(item => { item.addEventListener('click', function() { const selectedValue = this.getAttribute('data-value'); const artUrl = this.getAttribute('data-art'); const genreName = this.querySelector('.genre-title').textContent; // Update selected text selectSelected.innerHTML = genreName; selectSelected.classList.remove('active'); selectItems.classList.remove('show'); // Mark selected item document.querySelectorAll('.select-items div').forEach(el => { el.classList.remove('selected-item'); }); this.classList.add('selected-item'); // Show now playing with animation albumArt.style.backgroundImage = `url(${artUrl})`; // Random selection from arrays const randomArtist = genreArtists[selectedValue][Math.floor(Math.random() * genreArtists[selectedValue].length)]; const randomPlaylist = genrePlaylists[selectedValue][Math.floor(Math.random() * genrePlaylists[selectedValue].length)]; playTitle.textContent = randomPlaylist; playArtist.textContent = `Featuring ${randomArtist} and more`; // Reset and animate progress bar progressBar.style.width = '0%'; setTimeout(() => { progressBar.style.width = Math.floor(Math.random() * 70 + 20) + '%'; }, 300); nowPlaying.classList.add('visible'); // Show recommendation for selected genre recommendations.forEach(rec => { rec.style.display = 'none'; if (rec.id === selectedValue) { rec.style.display = 'block'; rec.style.animation = 'fadeIn 0.5s ease forwards'; } }); // Change container background subtly based on genre const genreColorMap = { 'hiphop': '135deg, rgba(255, 42, 109, 0.1), rgba(255, 158, 0, 0.1)', 'electronic': '135deg, rgba(0, 242, 254, 0.1), rgba(79, 172, 254, 0.1)', 'rock': '135deg, rgba(244, 59, 71, 0.1), rgba(69, 58, 148, 0.1)', 'jazz': '135deg, rgba(44, 62, 80, 0.1), rgba(76, 161, 175, 0.1)', 'classical': '135deg, rgba(115, 74, 232, 0.1), rgba(1, 186, 239, 0.1)', 'pop': '135deg, rgba(238, 9, 121, 0.1), rgba(255, 106, 0, 0.1)', 'indie': '135deg, rgba(58, 28, 113, 0.1), rgba(215, 109, 119, 0.1)', 'rnb': '135deg, rgba(142, 45, 226, 0.1), rgba(74, 0, 224, 0.1)' }; container.style.background = `linear-gradient(${genreColorMap[selectedValue]}), rgba(10, 10, 20, 0.7)`; }); }); // Close dropdown when clicking outside document.addEventListener('click', function() { selectSelected.classList.remove('active'); selectItems.classList.remove('show'); }); // Prevent closing when clicking inside dropdown selectItems.addEventListener('click', function(e) { e.stopPropagation(); }); // Animate equalizer bars const eqBars = document.querySelectorAll('.eq-bar'); eqBars.forEach(bar => { const randomHeight = Math.floor(Math.random() * 20) + 5; bar.style.height = `${randomHeight}px`; }); // Set max-height for select items based on container size function adjustSelectItemsHeight() { const containerHeight = container.offsetHeight; selectItems.style.maxHeight = `${containerHeight * 0.4}px`; } adjustSelectItemsHeight(); window.addEventListener('resize', adjustSelectItemsHeight); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>VigorVista Fitness</title> <style> :root { --primary-green: #2ecc71; --secondary-green: #27ae60; --primary-blue: #3498db; --secondary-blue: #2980b9; --light-green: #e8f8f5; --light-blue: #eaf2f8; --neutral-gray: #f5f7fa; --text-dark: #2c3e50; --text-medium: #7f8c8d; --error-red: #e74c3c; --success-color: #2ecc71; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; } body { background: linear-gradient(135deg, var(--light-blue), var(--light-green)); display: flex; justify-content: center; align-items: center; min-height: 100vh; color: var(--text-dark); padding: 20px; } .app-container { width: 100%; max-width: 650px; background-color: white; border-radius: 16px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); overflow: hidden; transform-style: preserve-3d; perspective: 1000px; } .app-header { padding: 24px; background: linear-gradient(120deg, var(--primary-green), var(--primary-blue)); color: white; position: relative; overflow: hidden; } .app-header h1 { font-size: 26px; margin-bottom: 4px; position: relative; z-index: 2; } .app-header p { font-size: 16px; opacity: 0.9; position: relative; z-index: 2; } .header-decoration { position: absolute; top: -10px; right: -10px; width: 120px; height: 120px; border-radius: 50%; background: rgba(255, 255, 255, 0.1); z-index: 1; } .header-decoration:nth-child(2) { width: 80px; height: 80px; top: 40px; right: 40px; } .app-body { padding: 24px; } .module-selector { position: relative; margin-bottom: 24px; } .select-wrapper { position: relative; user-select: none; } .select-label { display: block; margin-bottom: 8px; font-weight: 600; font-size: 14px; color: var(--text-medium); } .select-trigger { display: flex; justify-content: space-between; align-items: center; padding: 16px 20px; border: 2px solid #e1e8ed; border-radius: 12px; cursor: pointer; background-color: white; transition: all 0.2s ease; } .select-trigger.active { border-color: var(--primary-green); box-shadow: 0 0 0 3px rgba(46, 204, 113, 0.2); } .select-trigger:hover:not(.active) { border-color: #ccd6dd; background-color: var(--neutral-gray); } .select-value { font-weight: 500; display: flex; align-items: center; gap: 10px; } .select-value .icon { width: 24px; height: 24px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 14px; } .select-arrow { transition: transform 0.3s ease; } .select-trigger.active .select-arrow { transform: rotate(180deg); } .options-wrapper { position: absolute; top: calc(100% + 8px); left: 0; right: 0; background: white; border-radius: 12px; box-shadow: 0 5px 20px rgba(0, 0, 0, 0.1); opacity: 0; visibility: hidden; transform: translateY(-10px); z-index: 10; overflow: hidden; transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); } .options-wrapper.open { opacity: 1; visibility: visible; transform: translateY(0); } .options-group { padding: 12px 0; } .option-group-label { padding: 8px 20px; font-weight: 600; font-size: 12px; text-transform: uppercase; color: var(--text-medium); letter-spacing: 1px; } .option { padding: 12px 20px; cursor: pointer; display: flex; align-items: center; gap: 10px; transition: all 0.2s ease; } .option:hover { background-color: var(--light-green); } .option.selected { background-color: var(--light-green); color: var(--primary-green); font-weight: 500; } .option .icon { width: 24px; height: 24px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 14px; } .selected-module { margin-top: 32px; padding: 24px; border-radius: 12px; display: none; animation: fadeIn 0.5s ease forwards; position: relative; overflow: hidden; } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .module-header { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; } .module-header .icon { width: 42px; height: 42px; border-radius: 12px; display: flex; align-items: center; justify-content: center; font-size: 20px; color: white; } .module-content { margin-top: 20px; } .module-actions { margin-top: 24px; display: flex; gap: 12px; } .btn { padding: 12px 24px; border-radius: 10px; border: none; font-weight: 600; cursor: pointer; transition: all 0.2s ease; font-size: 14px; display: flex; align-items: center; justify-content: center; gap: 8px; } .btn-primary { background-color: var(--primary-green); color: white; } .btn-primary:hover { background-color: var(--secondary-green); transform: translateY(-2px); box-shadow: 0 4px 12px rgba(46, 204, 113, 0.2); } .btn-secondary { background-color: var(--neutral-gray); color: var(--text-dark); } .btn-secondary:hover { background-color: #e1e8ed; } .module-bg { position: absolute; top: 0; right: 0; bottom: 0; width: 40%; opacity: 0.07; background-repeat: no-repeat; background-position: center right; background-size: contain; } .metric-container { display: flex; gap: 12px; margin-top: 16px; } .metric-box { flex: 1; padding: 16px; border-radius: 10px; background-color: white; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); text-align: center; } .metric-value { font-size: 24px; font-weight: 700; margin: 8px 0; } .metric-label { font-size: 13px; color: var(--text-medium); } .workout-step { display: flex; gap: 16px; margin-bottom: 16px; align-items: flex-start; } .step-number { width: 28px; height: 28px; border-radius: 50%; background-color: var(--light-green); color: var(--primary-green); display: flex; align-items: center; justify-content: center; font-weight: 600; font-size: 14px; flex-shrink: 0; } .step-content h4 { margin-bottom: 4px; } .step-content p { color: var(--text-medium); font-size: 14px; line-height: 1.5; } /* Responsive styles */ @media (max-width: 500px) { .app-header h1 { font-size: 22px; } .app-header p { font-size: 14px; } .metric-container { flex-direction: column; } .module-actions { flex-direction: column; } .workout-step { flex-direction: column; gap: 8px; } .step-number { margin-bottom: 4px; } } /* Animations */ @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } @keyframes wave { 0% { transform: translateY(0); } 50% { transform: translateY(-5px); } 100% { transform: translateY(0); } } /* Loader animation */ .loader { display: inline-block; position: relative; width: 24px; height: 24px; } .loader:after { content: " "; display: block; border-radius: 50%; width: 24px; height: 24px; margin: 0; border: 3px solid white; border-color: white transparent white transparent; animation: loader 1.2s linear infinite; } @keyframes loader { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } /* Success animation */ .success-checkmark { display: none; width: 24px; height: 24px; } .success-checkmark.show { display: block; animation: scaleIn 0.3s ease-in-out forwards; } @keyframes scaleIn { 0% { transform: scale(0); } 80% { transform: scale(1.2); } 100% { transform: scale(1); } } </style> </head> <body> <div class="app-container"> <div class="app-header"> <h1>VigorVista Fitness</h1> <p>Personalize your wellness journey</p> <div class="header-decoration"></div> <div class="header-decoration"></div> </div> <div class="app-body"> <div class="module-selector"> <div class="select-wrapper"> <label class="select-label">SELECT YOUR FOCUS AREA</label> <div class="select-trigger" id="select-trigger"> <div class="select-value"> <span>Choose a fitness module</span> </div> <div class="select-arrow"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </div> </div> <div class="options-wrapper" id="options-wrapper"> <div class="options-group"> <div class="option-group-label">Workout Programs</div> <div class="option" data-type="workout" data-id="hiit"> <div class="icon" style="background-color: #FF5733;"> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="20 6 9 17 4 12"></polyline> </svg> </div> <span>HIIT Cardio Blast</span> </div> <div class="option" data-type="workout" data-id="strength"> <div class="icon" style="background-color: #3D589A;"> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M6 18h12"></path> <path d="M6 6h12"></path> <rect x="4" y="8" width="16" height="8" rx="1"></rect> </svg> </div> <span>Strength & Conditioning</span> </div> <div class="option" data-type="workout" data-id="yoga"> <div class="icon" style="background-color: #16A085;"> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M12 2L8 6 12 6z"></path> <path d="M12 2L16 6 12 6z"></path> <path d="M12 22V6"></path> <path d="M5 12H2l3 6 3-6H5Z"></path> <path d="M19 12h-3l3 6 3-6h-3Z"></path> </svg> </div> <span>Yoga & Flexibility</span> </div> </div> <div class="options-group"> <div class="option-group-label">Health Metrics</div> <div class="option" data-type="metric" data-id="sleep"> <div class="icon" style="background-color: #9B59B6;"> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2z"></path> <path d="M12 6v6l4 2"></path> </svg> </div> <span>Sleep Quality Tracker</span> </div> <div class="option" data-type="metric" data-id="nutrition"> <div class="icon" style="background-color: #F1C40F;"> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <circle cx="12" cy="12" r="10"></circle> <path d="m8 14 2.5-2.5c1.7-1.7 4.3-1.7 6 0"></path> <path d="M9 18h6"></path> </svg> </div> <span>Nutrition Planner</span> </div> <div class="option" data-type="metric" data-id="heart"> <div class="icon" style="background-color: #E74C3C;"> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M20.42 4.58a5.4 5.4 0 0 0-7.65 0l-.77.78-.77-.78a5.4 5.4 0 0 0-7.65 0C1.46 6.7 1.33 10.28 4 13l8 8 8-8c2.67-2.72 2.54-6.3.42-8.42z"></path> </svg> </div> <span>Heart Rate Zones</span> </div> </div> </div> </div> </div> <!-- HIIT Cardio Blast Module --> <div class="selected-module" id="hiit" style="background-color: #FFF4F2; border: 1px solid #FFE4DD;"> <div class="module-bg" style="background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"%23FF5733\" stroke-width=\"0.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 20V10\"/><path d=\"M12 20V4\"/><path d=\"M6 20v-6\"/></svg>');"></div> <div class="module-header"> <div class="icon" style="background-color: #FF5733;"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="20 6 9 17 4 12"></polyline> </svg> </div> <div> <h2>HIIT Cardio Blast</h2> <p>20-minute high-intensity interval training</p> </div> </div> <div class="module-content"> <div class="workout-step"> <div class="step-number">1</div> <div class="step-content"> <h4>Warm-up (3 mins)</h4> <p>Dynamic stretches and light jogging in place to prepare your cardiovascular system</p> </div> </div> <div class="workout-step"> <div class="step-number">2</div> <div class="step-content"> <h4>Circuit 1: Tabata Intervals (8 mins)</h4> <p>4 rounds of jumping jacks, mountain climbers, high knees, and burpees. 20 seconds work, 10 seconds rest.</p> </div> </div> <div class="workout-step"> <div class="step-number">3</div> <div class="step-content"> <h4>Active Recovery (2 mins)</h4> <p>Light marching in place, focused breathing, and core engagement</p> </div> </div> <div class="workout-step"> <div class="step-number">4</div> <div class="step-content"> <h4>Circuit 2: Power Moves (5 mins)</h4> <p>Jump squats, plank jacks, lateral bounds, and quick feet. 30 seconds work, 15 seconds rest.</p> </div> </div> <div class="workout-step"> <div class="step-number">5</div> <div class="step-content"> <h4>Cool Down (2 mins)</h4> <p>Progressive slowing of movements, deep breathing, and static stretches</p> </div> </div> </div> <div class="module-actions"> <button class="btn btn-primary" id="start-hiit"> <span class="btn-text">Begin Workout</span> <span class="loader" style="display: none;"></span> <svg class="success-checkmark" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"> <polyline points="20 6 9 17 4 12"></polyline> </svg> </button> <button class="btn btn-secondary" id="save-hiit">Save for Later</button> </div> </div> <!-- Strength & Conditioning Module --> <div class="selected-module" id="strength" style="background-color: #F0F5FF; border: 1px solid #E0EAFF;"> <div class="module-bg" style="background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"%233D589A\" stroke-width=\"0.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 18h12\"/><path d=\"M6 6h12\"/><rect x=\"4\" y=\"9\" width=\"16\" height=\"6\" rx=\"2\"/></svg>');"></div> <div class="module-header"> <div class="icon" style="background-color: #3D589A;"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M6 18h12"></path> <path d="M6 6h12"></path> <rect x="4" y="8" width="16" height="8" rx="1"></rect> </svg> </div> <div> <h2>Strength & Conditioning</h2> <p>35-minute full-body strength workout</p> </div> </div> <div class="module-content"> <div class="workout-step"> <div class="step-number">1</div> <div class="step-content"> <h4>Dynamic Warm-up (5 mins)</h4> <p>Joint mobilization and activation exercises to prepare muscles and joints</p> </div> </div> <div class="workout-step"> <div class="step-number">2</div> <div class="step-content"> <h4>Upper Body Strength (10 mins)</h4> <p>3 supersets of push-ups, bent-over rows, shoulder presses, and tricep dips. 12 reps each, minimal rest.</p> </div> </div> <div class="workout-step"> <div class="step-number">3</div> <div class="step-content"> <h4>Core Stabilization (5 mins)</h4> <p>Plank variations, hollow holds, and Russian twists. 45-second holds with 15-second transitions.</p> </div> </div> <div class="workout-step"> <div class="step-number">4</div> <div class="step-content"> <h4>Lower Body Power (10 mins)</h4> <p>3 circuits of goblet squats, walking lunges, Bulgarian split squats, and glute bridges. 10-15 reps each.</p> </div> </div> <div class="workout-step"> <div class="step-number">5</div> <div class="step-content"> <h4>Cooldown & Mobility (5 mins)</h4> <p>Static stretching and myofascial release focused on major muscle groups</p> </div> </div> </div> <div class="module-actions"> <button class="btn btn-primary" id="start-strength"> <span class="btn-text">Begin Workout</span> <span class="loader" style="display: none;"></span> <svg class="success-checkmark" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"> <polyline points="20 6 9 17 4 12"></polyline> </svg> </button> <button class="btn btn-secondary" id="save-strength">Save for Later</button> </div> </div> <!-- Yoga & Flexibility Module --> <div class="selected-module" id="yoga" style="background-color: #F0FFF8; border: 1px solid #D7F5EA;"> <div class="module-bg" style="background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"%2316A085\" stroke-width=\"0.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 22V6\"/><path d=\"M12 2L8 6 12 6z\"/><path d=\"M12 2L16 6 12 6z\"/><path d=\"M5 12H2l3 6 3-6H5Z\"/><path d=\"M19 12h-3l3 6 3-6h-3Z\"/></svg>');"></div> <div class="module-header"> <div class="icon" style="background-color: #16A085;"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M12 2L8 6 12 6z"></path> <path d="M12 2L16 6 12 6z"></path> <path d="M12 22V6"></path> <path d="M5 12H2l3 6 3-6H5Z"></path> <path d="M19 12h-3l3 6 3-6h-3Z"></path> </svg> </div> <div> <h2>Yoga & Flexibility</h2> <p>30-minute flow for mobility and mindfulness</p> </div> </div> <div class="module-content"> <div class="workout-step"> <div class="step-number">1</div> <div class="step-content"> <h4>Centering Practice (5 mins)</h4> <p>Seated meditation with breath awareness and body scanning techniques</p> </div> </div> <div class="workout-step"> <div class="step-number">2</div> <div class="step-content"> <h4>Sun Salutations (8 mins)</h4> <p>Two complete rounds of Surya Namaskar A and B to build heat and awareness</p> </div> </div> <div class="workout-step"> <div class="step-number">3</div> <div class="step-content"> <h4>Standing Series (8 mins)</h4> <p>Warrior sequence, balance poses, and gentle twists to improve stability and alignment</p> </div> </div> <div class="workout-step"> <div class="step-number">4</div> <div class="step-content"> <h4>Floor Series (6 mins)</h4> <p>Hip openers, forward folds, and gentle backbends for deep tissue release</p> </div> </div> <div class="workout-step"> <div class="step-number">5</div> <div class="step-content"> <h4>Savasana (3 mins)</h4> <p>Guided relaxation and integration of your practice with focused breathing</p> </div> </div> </div> <div class="module-actions"> <button class="btn btn-primary" id="start-yoga"> <span class="btn-text">Begin Practice</span> <span class="loader" style="display: none;"></span> <svg class="success-checkmark" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"> <polyline points="20 6 9 17 4 12"></polyline> </svg> </button> <button class="btn btn-secondary" id="save-yoga">Save for Later</button> </div> </div> <!-- Sleep Quality Tracker Module --> <div class="selected-module" id="sleep" style="background-color: #F8F1FE; border: 1px solid #EFE0FC;"> <div class="module-bg" style="background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"%239B59B6\" stroke-width=\"0.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2z\"/><path d=\"M12 6v6l4 2\"/></svg>');"></div> <div class="module-header"> <div class="icon" style="background-color: #9B59B6;"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2z"></path> <path d="M12 6v6l4 2"></path> </svg> </div> <div> <h2>Sleep Quality Tracker</h2> <p>Monitor and improve your sleep patterns</p> </div> </div> <div class="module-content"> <div class="metric-container"> <div class="metric-box"> <div class="metric-label">Total Sleep</div> <div class="metric-value">7h 24m</div> <div class="metric-label">+18m from avg</div> </div> <div class="metric-box"> <div class="metric-label">Sleep Quality</div> <div class="metric-value">83%</div> <div class="metric-label">+5% from avg</div> </div> <div class="metric-box"> <div class="metric-label">Deep Sleep</div> <div class="metric-value">1h 42m</div> <div class="metric-label">+12m from avg</div> </div> </div> <div class="workout-step" style="margin-top: 24px;"> <div class="step-number"> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#16A085" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M5.52 19c.64-2.2 1.84-3 3.22-3h6.52c1.38 0 2.58.8 3.22 3"></path> <circle cx="12" cy="10" r="3"></circle> <circle cx="12" cy="12" r="10"></circle> </svg> </div> <div class="step-content"> <h4>Personalized Sleep Analysis</h4> <p>Your sleep efficiency is excellent. Try to maintain consistent bedtimes to further improve your circadian rhythm.</p> </div> </div> </div> <div class="module-actions"> <button class="btn btn-primary" id="sleep-details"> <span class="btn-text">View Detailed Analysis</span> <span class="loader" style="display: none;"></span> <svg class="success-checkmark" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"> <polyline points="20 6 9 17 4 12"></polyline> </svg> </button> <button class="btn btn-secondary" id="sleep-settings">Track Tonight</button> </div> </div> <!-- Nutrition Planner Module --> <div class="selected-module" id="nutrition" style="background-color: #FFFCF0; border: 1px solid #FFF7D7;"> <div class="module-bg" style="background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"%23F1C40F\" stroke-width=\"0.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"m8
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> :root { --primary: #3a7bd5; --primary-light: #4b94ee; --primary-dark: #2a5aa0; --secondary: #fd746c; --secondary-light: #ff8a83; --text-dark: #2c3e50; --text-light: #7f8c8d; --success: #27ae60; --error: #e74c3c; --bg-light: #ecf0f1; --white: #ffffff; --border-radius: 8px; --shadow: 0 4px 12px rgba(0, 0, 0, 0.1); --transition: all 0.3s ease; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; } body { background: linear-gradient(135deg, var(--bg-light), #f9f9f9); color: var(--text-dark); display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; width: 100%; padding: 1.5rem; } .course-selector-container { width: 100%; max-width: 650px; background-color: var(--white); border-radius: var(--border-radius); box-shadow: var(--shadow); padding: 2rem; transition: var(--transition); } .logo { display: flex; align-items: center; margin-bottom: 1.5rem; } .logo-icon { width: 40px; height: 40px; background: linear-gradient(135deg, var(--primary), var(--primary-dark)); border-radius: 10px; display: flex; align-items: center; justify-content: center; margin-right: 0.75rem; color: white; font-weight: bold; font-size: 20px; } .logo-text { font-size: 20px; font-weight: 600; } h1 { font-size: 1.75rem; margin-bottom: 0.5rem; color: var(--text-dark); font-weight: 700; } .subheading { font-size: 1rem; margin-bottom: 2rem; color: var(--text-light); line-height: 1.5; } .form-group { margin-bottom: 1.5rem; position: relative; } label { display: block; margin-bottom: 0.5rem; font-weight: 600; font-size: 0.95rem; color: var(--text-dark); } .select-wrapper { position: relative; } .custom-select { appearance: none; width: 100%; padding: 0.875rem 1rem; font-size: 1rem; border: 2px solid #e2e8f0; border-radius: var(--border-radius); background-color: var(--white); color: var(--text-dark); cursor: pointer; transition: var(--transition); } .custom-select:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(58, 123, 213, 0.15); } .select-wrapper::after { content: "\25BC"; position: absolute; right: 16px; top: 50%; transform: translateY(-50%); pointer-events: none; color: var(--text-light); font-size: 12px; transition: var(--transition); } .select-wrapper:hover::after { color: var(--primary); } .form-helper { font-size: 0.75rem; margin-top: 0.5rem; color: var(--text-light); } .error-message { font-size: 0.8rem; color: var(--error); margin-top: 0.5rem; display: none; animation: fadeIn 0.3s ease; font-weight: 500; } .btn { padding: 0.875rem 1.5rem; background: linear-gradient(135deg, var(--primary), var(--primary-dark)); color: white; border: none; border-radius: var(--border-radius); font-size: 1rem; font-weight: 600; cursor: pointer; transition: var(--transition); width: 100%; margin-top: 1rem; position: relative; overflow: hidden; } .btn:hover { transform: translateY(-2px); box-shadow: 0 7px 14px rgba(58, 123, 213, 0.2); } .btn:active { transform: translateY(0); } .btn .ripple { position: absolute; border-radius: 50%; background-color: rgba(255, 255, 255, 0.5); transform: scale(0); animation: ripple 0.6s linear; } .course-category-group { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1rem; margin-bottom: 1.5rem; } .course-category { padding: 1rem; border: 2px solid #e2e8f0; border-radius: var(--border-radius); cursor: pointer; transition: var(--transition); position: relative; overflow: hidden; } .course-category:hover { border-color: var(--primary-light); transform: translateY(-2px); } .course-category.selected { border-color: var(--primary); background-color: rgba(58, 123, 213, 0.05); } .course-category-icon { font-size: 1.5rem; margin-bottom: 0.5rem; display: block; color: var(--primary); } .course-category-title { font-weight: 600; font-size: 0.95rem; margin-bottom: 0.25rem; } .course-category-desc { font-size: 0.8rem; color: var(--text-light); } .checkmark { position: absolute; top: 10px; right: 10px; width: 18px; height: 18px; border-radius: 50%; background: var(--primary); color: white; display: flex; align-items: center; justify-content: center; font-size: 10px; opacity: 0; transform: scale(0); transition: var(--transition); } .course-category.selected .checkmark { opacity: 1; transform: scale(1); } .success-message { padding: 1rem; background-color: rgba(39, 174, 96, 0.1); border-radius: var(--border-radius); display: none; align-items: center; margin-top: 1rem; animation: fadeIn 0.5s ease; } .success-icon { width: 24px; height: 24px; background-color: var(--success); border-radius: 50%; display: flex; align-items: center; justify-content: center; margin-right: 0.75rem; color: white; font-weight: bold; } .success-text { font-size: 0.9rem; color: var(--success); font-weight: 500; } .divider { height: 1px; background-color: #e2e8f0; margin: 2rem 0; position: relative; } .divider::after { content: "or"; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); background-color: white; padding: 0 1rem; color: var(--text-light); font-size: 0.9rem; } .recommended-courses { margin-top: 2rem; } .recommended-header { font-size: 1.1rem; font-weight: 600; margin-bottom: 1rem; color: var(--text-dark); } .course-card { padding: 1rem; border: 1px solid #e2e8f0; border-radius: var(--border-radius); margin-bottom: 0.75rem; transition: var(--transition); cursor: pointer; display: flex; align-items: center; } .course-card:hover { border-color: var(--primary-light); transform: translateX(5px); background-color: rgba(58, 123, 213, 0.03); } .course-icon { width: 40px; height: 40px; background: linear-gradient(135deg, var(--primary-light), var(--primary)); border-radius: 8px; margin-right: 1rem; display: flex; align-items: center; justify-content: center; color: white; font-size: 1.2rem; flex-shrink: 0; } .course-info { flex: 1; } .course-title { font-weight: 600; margin-bottom: 0.25rem; font-size: 0.95rem; } .course-meta { display: flex; align-items: center; font-size: 0.8rem; color: var(--text-light); } .course-duration { margin-right: 1rem; display: flex; align-items: center; } .course-duration::before { content: "⏱"; margin-right: 0.25rem; } .course-level { display: flex; align-items: center; } .course-level::before { content: "📊"; margin-right: 0.25rem; } .select-badge { font-size: 0.75rem; padding: 0.25rem 0.5rem; background-color: var(--primary); color: white; border-radius: 20px; margin-left: auto; font-weight: 600; flex-shrink: 0; opacity: 0; transform: translateX(-10px); transition: var(--transition); } .course-card:hover .select-badge { opacity: 1; transform: translateX(0); } @keyframes fadeIn { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } @keyframes ripple { to { transform: scale(4); opacity: 0; } } /* Responsive styles */ @media (max-width: 600px) { .course-category-group { grid-template-columns: 1fr; } .course-selector-container { padding: 1.5rem; } h1 { font-size: 1.5rem; } .course-card { flex-direction: column; align-items: flex-start; } .course-icon { margin-bottom: 0.5rem; margin-right: 0; } .course-meta { flex-direction: column; align-items: flex-start; } .course-duration { margin-bottom: 0.25rem; } .select-badge { margin-top: 0.5rem; margin-left: 0; } } </style> </head> <body> <div class="course-selector-container"> <div class="logo"> <div class="logo-icon">E+</div> <div class="logo-text">EduSelect</div> </div> <h1>Find your perfect course path</h1> <p class="subheading">Select your learning preferences and we'll recommend the best courses tailored to your needs.</p> <div class="course-category-group"> <div class="course-category" data-value="self-paced"> <span class="course-category-icon">🏃♂️</span> <div class="course-category-title">Self-Paced</div> <div class="course-category-desc">Learn at your own speed</div> <div class="checkmark">✓</div> </div> <div class="course-category" data-value="instructor-led"> <span class="course-category-icon">👨🏫</span> <div class="course-category-title">Instructor-Led</div> <div class="course-category-desc">Guided learning experience</div> <div class="checkmark">✓</div> </div> </div> <form id="courseForm"> <div class="form-group"> <label for="subject">Subject Area</label> <div class="select-wrapper"> <select id="subject" class="custom-select" required> <option value="" disabled selected>Select your subject</option> <option value="programming">Computer Science & Programming</option> <option value="data-science">Data Science & Analytics</option> <option value="business">Business & Management</option> <option value="design">UX/UI Design</option> <option value="languages">Languages</option> <option value="humanities">Arts & Humanities</option> </select> </div> <div class="form-helper">Choose your main area of interest</div> <div class="error-message" id="subject-error">Please select a subject to continue</div> </div> <div class="form-group"> <label for="level">Experience Level</label> <div class="select-wrapper"> <select id="level" class="custom-select" required> <option value="" disabled selected>Select your level</option> <option value="beginner">Beginner (No experience required)</option> <option value="intermediate">Intermediate (Some experience needed)</option> <option value="advanced">Advanced (Experienced learners)</option> </select> </div> <div class="form-helper">This helps us match content to your knowledge level</div> <div class="error-message" id="level-error">Please select your experience level</div> </div> <div class="form-group"> <label for="duration">Time Commitment</label> <div class="select-wrapper"> <select id="duration" class="custom-select" required> <option value="" disabled selected>Select time availability</option> <option value="short">Short courses (1-4 weeks)</option> <option value="medium">Medium length (1-3 months)</option> <option value="long">Comprehensive (3+ months)</option> <option value="flexible">Fully flexible</option> </select> </div> <div class="form-helper">How much time can you dedicate to learning?</div> <div class="error-message" id="duration-error">Please select your time availability</div> </div> <button type="submit" class="btn" id="findCoursesButton">Find My Courses</button> </form> <div class="success-message"> <div class="success-icon">✓</div> <div class="success-text">Perfect! We've found courses matching your criteria.</div> </div> <div class="divider"></div> <div class="recommended-courses"> <div class="recommended-header">Trending in Data Science</div> <div class="course-card" data-course-id="ds101"> <div class="course-icon">DS</div> <div class="course-info"> <div class="course-title">Python for Data Analysis</div> <div class="course-meta"> <div class="course-duration">8 weeks</div> <div class="course-level">Beginner</div> </div> </div> <span class="select-badge">Select</span> </div> <div class="course-card" data-course-id="ds203"> <div class="course-icon">ML</div> <div class="course-info"> <div class="course-title">Machine Learning Fundamentals</div> <div class="course-meta"> <div class="course-duration">12 weeks</div> <div class="course-level">Intermediate</div> </div> </div> <span class="select-badge">Select</span> </div> <div class="course-card" data-course-id="ds305"> <div class="course-icon">NN</div> <div class="course-info"> <div class="course-title">Neural Networks & Deep Learning</div> <div class="course-meta"> <div class="course-duration">10 weeks</div> <div class="course-level">Advanced</div> </div> </div> <span class="select-badge">Select</span> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Create ripple effect on button const btn = document.getElementById('findCoursesButton'); btn.addEventListener('mousedown', function(e) { const x = e.clientX - e.target.getBoundingClientRect().left; const y = e.clientY - e.target.getBoundingClientRect().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); }); // Handle course category selection const courseCategories = document.querySelectorAll('.course-category'); courseCategories.forEach(category => { category.addEventListener('click', function() { // Remove selected class from all categories courseCategories.forEach(c => c.classList.remove('selected')); // Add selected class to clicked category this.classList.add('selected'); }); }); // Form validation and submission const courseForm = document.getElementById('courseForm'); courseForm.addEventListener('submit', function(e) { e.preventDefault(); let isValid = true; // Validate subject const subject = document.getElementById('subject'); if (subject.value === "") { document.getElementById('subject-error').style.display = 'block'; isValid = false; } else { document.getElementById('subject-error').style.display = 'none'; } // Validate level const level = document.getElementById('level'); if (level.value === "") { document.getElementById('level-error').style.display = 'block'; isValid = false; } else { document.getElementById('level-error').style.display = 'none'; } // Validate duration const duration = document.getElementById('duration'); if (duration.value === "") { document.getElementById('duration-error').style.display = 'block'; isValid = false; } else { document.getElementById('duration-error').style.display = 'none'; } // If form is valid, show success message if (isValid) { document.querySelector('.success-message').style.display = 'flex'; // Update recommended courses based on selection const recommendedHeader = document.querySelector('.recommended-header'); if (subject.value === 'programming') { recommendedHeader.textContent = 'Recommended Programming Courses'; updateRecommendedCourses([ { id: 'prog101', icon: 'JS', title: 'JavaScript Essentials', duration: '6 weeks', level: 'Beginner' }, { id: 'prog202', icon: 'RCT', title: 'React Frontend Development', duration: '8 weeks', level: 'Intermediate' }, { id: 'prog304', icon: 'API', title: 'API Architecture & Design', duration: '5 weeks', level: 'Advanced' } ]); } else if (subject.value === 'data-science') { recommendedHeader.textContent = 'Recommended Data Science Courses'; updateRecommendedCourses([ { id: 'ds101', icon: 'PY', title: 'Python for Data Analysis', duration: '8 weeks', level: 'Beginner' }, { id: 'ds203', icon: 'ML', title: 'Machine Learning Fundamentals', duration: '12 weeks', level: 'Intermediate' }, { id: 'ds305', icon: 'NN', title: 'Neural Networks & Deep Learning', duration: '10 weeks', level: 'Advanced' } ]); } else if (subject.value === 'business') { recommendedHeader.textContent = 'Recommended Business Courses'; updateRecommendedCourses([ { id: 'bus101', icon: 'BZ', title: 'Business Strategy Fundamentals', duration: '4 weeks', level: 'Beginner' }, { id: 'bus202', icon: 'PM', title: 'Project Management Professional', duration: '10 weeks', level: 'Intermediate' }, { id: 'bus304', icon: 'LD', title: 'Leadership in Digital Transformation', duration: '6 weeks', level: 'Advanced' } ]); } else if (subject.value === 'design') { recommendedHeader.textContent = 'Recommended UX/UI Design Courses'; updateRecommendedCourses([ { id: 'des101', icon: 'UX', title: 'UX Design Principles', duration: '5 weeks', level: 'Beginner' }, { id: 'des202', icon: 'UI', title: 'UI Design Systems', duration: '8 weeks', level: 'Intermediate' }, { id: 'des304', icon: 'FG', title: 'Advanced Figma Prototyping', duration: '6 weeks', level: 'Advanced' } ]); } // Scroll to recommended courses document.querySelector('.recommended-courses').scrollIntoView({ behavior: 'smooth' }); } }); // Select course cards document.querySelectorAll('.course-card').forEach(card => { card.addEventListener('click', function() { // Display as selected this.style.borderColor = 'var(--primary)'; this.style.backgroundColor = 'rgba(58, 123, 213, 0.05)'; // Change badge text const badge = this.querySelector('.select-badge'); badge.style.opacity = '1'; badge.style.transform = 'translateX(0)'; badge.textContent = 'Selected'; badge.style.backgroundColor = 'var(--success)'; // Show toast notification showToast('Course added to your learning path!'); }); }); // Function to update recommended courses function updateRecommendedCourses(courses) { const recommendedCoursesContainer = document.querySelector('.recommended-courses'); // Remove existing course cards except the header const header = recommendedCoursesContainer.querySelector('.recommended-header'); recommendedCoursesContainer.innerHTML = ''; recommendedCoursesContainer.appendChild(header); // Add new course cards courses.forEach(course => { const courseCard = document.createElement('div'); courseCard.className = 'course-card'; courseCard.dataset.courseId = course.id; courseCard.innerHTML = ` <div class="course-icon">${course.icon}</div> <div class="course-info"> <div class="course-title">${course.title}</div> <div class="course-meta"> <div class="course-duration">${course.duration}</div> <div class="course-level">${course.level}</div> </div> </div> <span class="select-badge">Select</span> `; recommendedCoursesContainer.appendChild(courseCard); // Add click event to new card courseCard.addEventListener('click', function() { // Display as selected this.style.borderColor = 'var(--primary)'; this.style.backgroundColor = 'rgba(58, 123, 213, 0.05)'; // Change badge text const badge = this.querySelector('.select-badge'); badge.style.opacity = '1'; badge.style.transform = 'translateX(0)'; badge.textContent = 'Selected'; badge.style.backgroundColor = 'var(--success)'; // Show toast notification showToast('Course added to your learning path!'); }); }); } // Toast notification function function showToast(message) { // Create toast element if it doesn't exist let toast = document.querySelector('.toast'); if (!toast) { toast = document.createElement('div'); toast.className = 'toast'; toast.style.position = 'fixed'; toast.style.bottom = '20px'; toast.style.left = '50%'; toast.style.transform = 'translateX(-50%)'; toast.style.backgroundColor = 'var(--success)'; toast.style.color = 'white'; toast.style.padding = '0.75rem 1.5rem'; toast.style.borderRadius = '4px'; toast.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.15)'; toast.style.zIndex = '1000'; toast.style.opacity = '0'; toast.style.transition = 'opacity 0.3s ease'; document.body.appendChild(toast); } // Set message and show toast.textContent = message; toast.style.opacity = '1'; // Hide after 3 seconds setTimeout(() => { toast.style.opacity = '0'; }, 3000); } // Add focus styles to select boxes const selects = document.querySelectorAll('.custom-select'); selects.forEach(select => { select.addEventListener('focus', function() { this.parentNode.classList.add('focused'); }); select.addEventListener('blur', function() { this.parentNode.classList.remove('focused'); }); }); }); </script> </body> </html>
<html> <head> <style> @import url('https://fonts.googleapis.com/css2?family=Rajdhani:wght@300;400;500;600;700&family=Orbitron:wght@400;500;600;700;800;900&display=swap'); :root { --neon-blue: #00f8ff; --neon-pink: #ff00e4; --neon-purple: #9d00ff; --dark-bg: #0a0b14; --cyberpunk-yellow: #f3ff00; --grid-color: rgba(0, 248, 255, 0.15); --panel-bg: rgba(10, 11, 20, 0.85); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Rajdhani', sans-serif; } body { background-color: var(--dark-bg); display: flex; justify-content: center; align-items: center; min-height: 700px; width: 100%; overflow: hidden; color: white; background-image: radial-gradient(circle at 10% 20%, rgba(0, 248, 255, 0.1) 0%, transparent 40%), radial-gradient(circle at 90% 80%, rgba(255, 0, 228, 0.1) 0%, transparent 40%), linear-gradient(rgba(10, 11, 20, 0.95), rgba(10, 11, 20, 0.95)), repeating-linear-gradient(transparent, transparent 2px, var(--grid-color) 2px, var(--grid-color) 4px), repeating-linear-gradient(90deg, transparent, transparent 2px, var(--grid-color) 2px, var(--grid-color) 4px); background-attachment: fixed; } .container { width: 90%; max-width: 600px; height: 600px; padding: 25px; border-radius: 10px; position: relative; backdrop-filter: blur(5px); background: var(--panel-bg); box-shadow: 0 0 15px rgba(0, 248, 255, 0.2), 0 0 30px rgba(0, 248, 255, 0.1), inset 0 0 10px rgba(0, 248, 255, 0.05); border: 1px solid rgba(0, 248, 255, 0.3); overflow: hidden; } .container::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 2px; background: linear-gradient(90deg, transparent, var(--neon-blue), var(--neon-pink), transparent); z-index: 10; animation: scanline 4s linear infinite; } @keyframes scanline { 0% { transform: translateY(-2px); } 100% { transform: translateY(600px); } } .dashboard-header { margin-bottom: 30px; position: relative; padding-bottom: 10px; border-bottom: 1px solid rgba(0, 248, 255, 0.3); } .dashboard-header h1 { font-family: 'Orbitron', sans-serif; font-size: 2rem; font-weight: 700; color: white; text-transform: uppercase; letter-spacing: 2px; margin-bottom: 5px; text-shadow: 0 0 10px rgba(0, 248, 255, 0.7); } .dashboard-header p { font-size: 0.9rem; color: rgba(255, 255, 255, 0.7); font-weight: 300; } .status-indicator { position: absolute; top: 15px; right: 10px; display: flex; align-items: center; } .status-dot { width: 10px; height: 10px; border-radius: 50%; background-color: var(--cyberpunk-yellow); margin-right: 5px; animation: pulse 1.5s infinite; } @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(243, 255, 0, 0.7); } 70% { box-shadow: 0 0 0 5px rgba(243, 255, 0, 0); } 100% { box-shadow: 0 0 0 0 rgba(243, 255, 0, 0); } } .status-text { font-size: 0.8rem; color: var(--cyberpunk-yellow); font-weight: 600; text-transform: uppercase; } .select-group { margin-bottom: 25px; position: relative; } .select-group label { display: block; margin-bottom: 8px; font-weight: 500; font-size: 1rem; color: rgba(255, 255, 255, 0.9); letter-spacing: 1px; text-transform: uppercase; } .custom-select { position: relative; width: 100%; } .select-trigger { padding: 12px 20px; background: rgba(15, 20, 35, 0.7); border: 1px solid rgba(0, 248, 255, 0.4); color: white; border-radius: 6px; cursor: pointer; display: flex; justify-content: space-between; align-items: center; font-size: 1rem; font-weight: 500; transition: all 0.3s ease; box-shadow: 0 0 10px rgba(0, 248, 255, 0.1); } .select-trigger:hover { border-color: var(--neon-blue); box-shadow: 0 0 15px rgba(0, 248, 255, 0.3); } .select-trigger:active { transform: scale(0.98); } .select-trigger .arrow { position: relative; width: 12px; height: 12px; transition: transform 0.3s ease; } .select-trigger .arrow::before, .select-trigger .arrow::after { content: ''; position: absolute; width: 8px; height: 2px; background-color: var(--neon-blue); transition: all 0.3s ease; } .select-trigger .arrow::before { transform: rotate(45deg); left: 0; } .select-trigger .arrow::after { transform: rotate(-45deg); right: 0; } .custom-select.active .select-trigger .arrow::before { transform: rotate(-45deg); } .custom-select.active .select-trigger .arrow::after { transform: rotate(45deg); } .options { position: absolute; top: calc(100% + 8px); left: 0; width: 100%; background: rgba(15, 20, 35, 0.95); border: 1px solid rgba(0, 248, 255, 0.4); border-radius: 6px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3), 0 0 15px rgba(0, 248, 255, 0.2); z-index: 10; opacity: 0; transform: translateY(-10px); pointer-events: none; transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); max-height: 0; overflow-y: auto; } .custom-select.active .options { opacity: 1; transform: translateY(0); pointer-events: all; max-height: 200px; } .option { padding: 12px 20px; cursor: pointer; transition: all 0.2s ease; border-bottom: 1px solid rgba(0, 248, 255, 0.1); display: flex; align-items: center; justify-content: space-between; } .option:last-child { border-bottom: none; } .option:hover { background: rgba(0, 248, 255, 0.1); } .option.selected { color: var(--neon-blue); font-weight: 600; background: rgba(0, 248, 255, 0.05); } .option .option-icon { margin-right: 10px; font-size: 0.9em; opacity: 0.8; } .option .option-value { font-size: 0.8em; color: rgba(255, 255, 255, 0.6); margin-left: auto; } .apply-button { display: block; width: 100%; padding: 14px; margin-top: 30px; background: linear-gradient(90deg, var(--neon-blue), var(--neon-purple)); border: none; border-radius: 6px; color: white; font-weight: 600; font-size: 1rem; cursor: pointer; box-shadow: 0 0 15px rgba(0, 248, 255, 0.4), 0 5px 10px rgba(0, 0, 0, 0.2); letter-spacing: 1px; text-transform: uppercase; transition: all 0.3s ease; position: relative; overflow: hidden; } .apply-button:hover { box-shadow: 0 0 25px rgba(0, 248, 255, 0.6), 0 5px 15px rgba(0, 0, 0, 0.3); transform: translateY(-2px); } .apply-button:active { transform: translateY(0); box-shadow: 0 0 15px rgba(0, 248, 255, 0.4), 0 2px 5px rgba(0, 0, 0, 0.2); } .apply-button::before { content: ''; position: absolute; top: 0; left: -100%; width: 50%; height: 100%; background: linear-gradient( 90deg, transparent, rgba(255, 255, 255, 0.3), transparent ); transform: skewX(-25deg); } .apply-button:hover::before { animation: shine 1.5s; } @keyframes shine { 100% { left: 150%; } } .settings-preview { margin-top: 30px; background: rgba(15, 20, 35, 0.7); border: 1px solid rgba(0, 248, 255, 0.3); border-radius: 6px; padding: 15px; position: relative; overflow: hidden; } .settings-preview h3 { font-family: 'Orbitron', sans-serif; font-size: 1rem; margin-bottom: 15px; color: var(--neon-blue); text-transform: uppercase; letter-spacing: 1px; } .preview-item { display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid rgba(0, 248, 255, 0.1); } .preview-item:last-child { border-bottom: none; } .preview-item .setting-name { color: rgba(255, 255, 255, 0.8); } .preview-item .setting-value { color: var(--cyberpunk-yellow); font-weight: 600; } .glitch-effect { animation: glitch 2s linear infinite; animation-play-state: paused; } .container:hover .glitch-effect { animation-play-state: running; } @keyframes glitch { 0% { transform: translate(0); } 1% { transform: translate(-3px, 1px); filter: hue-rotate(90deg); } 2% { transform: translate(0); } 3% { transform: translate(3px, -1px); filter: hue-rotate(180deg); } 4% { transform: translate(0); } 94% { transform: translate(0); } 95% { transform: translate(-3px, 1px); filter: hue-rotate(90deg); } 96% { transform: translate(0); } 97% { transform: translate(3px, -1px); filter: hue-rotate(180deg); } 98% { transform: translate(0); } } /* Responsive adjustments */ @media (max-width: 600px) { .container { padding: 15px; width: 95%; height: auto; min-height: 580px; } .dashboard-header h1 { font-size: 1.5rem; } .apply-button { padding: 12px; } } </style> </head> <body> <div class="container"> <div class="dashboard-header"> <h1 class="glitch-effect">NeoVerse Control Hub</h1> <p>Adjust your gaming parameters for optimal performance</p> <div class="status-indicator"> <div class="status-dot"></div> <span class="status-text">LIVE</span> </div> </div> <div class="select-group"> <label for="graphics-preset">Graphics Preset</label> <div class="custom-select" id="graphics-preset"> <div class="select-trigger"> <span class="selected">Ultra (Ray Tracing)</span> <div class="arrow"></div> </div> <div class="options"> <div class="option" data-value="low">Low <span class="option-value">60+ FPS</span></div> <div class="option" data-value="medium">Medium <span class="option-value">50-60 FPS</span></div> <div class="option" data-value="high">High <span class="option-value">40-50 FPS</span></div> <div class="option selected" data-value="ultra">Ultra (Ray Tracing) <span class="option-value">30-40 FPS</span></div> <div class="option" data-value="psycho">PSYCHO <span class="option-value">20-30 FPS</span></div> </div> </div> </div> <div class="select-group"> <label for="difficulty">Difficulty Mode</label> <div class="custom-select" id="difficulty"> <div class="select-trigger"> <span class="selected">Netrunner (Normal)</span> <div class="arrow"></div> </div> <div class="options"> <div class="option" data-value="easy">Street Kid (Easy) <span class="option-value">+25% HP</span></div> <div class="option selected" data-value="normal">Netrunner (Normal) <span class="option-value">Standard</span></div> <div class="option" data-value="hard">Mercenary (Hard) <span class="option-value">-25% Resources</span></div> <div class="option" data-value="nightmare">Chrome Psycho (Nightmare) <span class="option-value">One-hit kills</span></div> </div> </div> </div> <div class="select-group"> <label for="control-scheme">Control Scheme</label> <div class="custom-select" id="control-scheme"> <div class="select-trigger"> <span class="selected">Aggressive (Fast Response)</span> <div class="arrow"></div> </div> <div class="options"> <div class="option" data-value="precision">Precision <span class="option-value">Low sensitivity</span></div> <div class="option" data-value="balanced">Balanced <span class="option-value">Medium sensitivity</span></div> <div class="option selected" data-value="aggressive">Aggressive <span class="option-value">Fast response</span></div> <div class="option" data-value="custom">Custom <span class="option-value">User defined</span></div> </div> </div> </div> <div class="settings-preview"> <h3>Current Config</h3> <div class="preview-item"> <div class="setting-name">Graphics</div> <div class="setting-value" id="graphics-value">Ultra (Ray Tracing)</div> </div> <div class="preview-item"> <div class="setting-name">Difficulty</div> <div class="setting-value" id="difficulty-value">Netrunner (Normal)</div> </div> <div class="preview-item"> <div class="setting-name">Controls</div> <div class="setting-value" id="controls-value">Aggressive (Fast Response)</div> </div> </div> <button class="apply-button">Apply Settings</button> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Select elements const selectContainers = document.querySelectorAll('.custom-select'); // Set up each custom select selectContainers.forEach(container => { const trigger = container.querySelector('.select-trigger'); const options = container.querySelector('.options'); const optionItems = container.querySelectorAll('.option'); const selectedText = trigger.querySelector('.selected'); // Toggle options display trigger.addEventListener('click', () => { // Close all other selects selectContainers.forEach(otherContainer => { if (otherContainer !== container) { otherContainer.classList.remove('active'); } }); container.classList.toggle('active'); // Add glitch effect when opening if (container.classList.contains('active')) { trigger.classList.add('glitch-effect'); setTimeout(() => { trigger.classList.remove('glitch-effect'); }, 500); } }); // Handle option selection optionItems.forEach(option => { option.addEventListener('click', () => { // Remove selected class from all options optionItems.forEach(item => item.classList.remove('selected')); // Add selected class to clicked option option.classList.add('selected'); // Update trigger text selectedText.textContent = option.textContent.split(' ')[0] + ' ' + option.textContent.split(' ')[1]; // Update preview value const selectId = container.id; const previewElement = document.getElementById(`${selectId}-value`); if (previewElement) { previewElement.textContent = option.textContent.split(' (')[0] + ' (' + option.textContent.split(' (')[1]; } // Close dropdown container.classList.remove('active'); // Animate selection with glitch effect selectedText.classList.add('glitch-effect'); setTimeout(() => { selectedText.classList.remove('glitch-effect'); }, 500); }); }); }); // Close select when clicking outside document.addEventListener('click', (e) => { selectContainers.forEach(container => { if (!container.contains(e.target)) { container.classList.remove('active'); } }); }); // Apply button effect const applyButton = document.querySelector('.apply-button'); applyButton.addEventListener('click', () => { // Visual feedback for apply button applyButton.textContent = 'UPDATING...'; // Glitch effect on previews const previewValues = document.querySelectorAll('.setting-value'); previewValues.forEach(value => { value.classList.add('glitch-effect'); }); // Return to original state after delay setTimeout(() => { applyButton.textContent = 'APPLY SETTINGS'; previewValues.forEach(value => { value.classList.remove('glitch-effect'); }); // Show success effect document.querySelector('.container').style.boxShadow = '0 0 30px rgba(0, 248, 255, 0.4)'; setTimeout(() => { document.querySelector('.container').style.boxShadow = ''; }, 500); }, 1500); }); }); </script> </body> </html>
<html> <head> <style> * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { display: flex; justify-content: center; align-items: center; min-height: 100vh; background-color: #f9f9fb; padding: 20px; } .survey-container { width: 100%; max-width: 650px; background-color: white; border-radius: 12px; box-shadow: 0 8px 30px rgba(0, 0, 0, 0.06); padding: 30px; position: relative; overflow: hidden; } .survey-progress { position: absolute; top: 0; left: 0; height: 4px; background: linear-gradient(90deg, #6e56cf, #a891f5); width: 0; transition: width 0.8s cubic-bezier(0.16, 1, 0.3, 1); } .survey-header { margin-bottom: 30px; } .survey-title { color: #333; font-size: 24px; font-weight: 600; margin-bottom: 8px; position: relative; } .survey-subtitle { color: #666; font-size: 14px; line-height: 1.5; } .question-container { margin-bottom: 40px; } .question { font-size: 16px; font-weight: 500; color: #333; margin-bottom: 16px; } .required { color: #d0535f; margin-left: 4px; } .select-wrapper { position: relative; margin-bottom: 25px; } .custom-select { position: relative; width: 100%; height: 50px; border-radius: 8px; border: 2px solid #e5e7eb; background-color: white; padding: 0 16px; cursor: pointer; user-select: none; transition: all 0.2s ease; display: flex; align-items: center; justify-content: space-between; } .custom-select:hover { border-color: #d0d5dd; } .custom-select.open { border-color: #6e56cf; box-shadow: 0 0 0 3px rgba(110, 86, 207, 0.15); } .select-text { color: #666; font-size: 14px; } .select-text.selected { color: #333; } .select-icon { width: 12px; height: 12px; display: flex; align-items: center; justify-content: center; transition: transform 0.3s ease; } .select-icon svg { width: 100%; height: 100%; } .custom-select.open .select-icon { transform: rotate(180deg); } .options-container { position: absolute; top: calc(100% + 5px); left: 0; width: 100%; max-height: 0; overflow: hidden; background-color: white; border-radius: 8px; box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1); z-index: 10; opacity: 0; transform: translateY(-10px); transition: max-height 0.3s ease, opacity 0.3s ease, transform 0.3s ease; } .options-container.open { max-height: 250px; opacity: 1; transform: translateY(0); } .option { padding: 12px 16px; font-size: 14px; color: #333; cursor: pointer; transition: all 0.2s ease; } .option:hover { background-color: #f5f3ff; } .option.selected { background-color: #f0ebff; color: #6e56cf; font-weight: 500; } .nav-buttons { display: flex; justify-content: space-between; margin-top: 20px; } .btn { border: none; padding: 10px 22px; border-radius: 6px; font-size: 14px; font-weight: 500; cursor: pointer; transition: all 0.2s ease; } .btn-primary { background-color: #6e56cf; color: white; } .btn-primary:hover { background-color: #5d45be; } .btn-primary:disabled { background-color: #b5b0d3; cursor: not-allowed; } .btn-secondary { background-color: #f5f5f7; color: #666; } .btn-secondary:hover { background-color: #eaeaec; } .step-indicator { display: flex; justify-content: center; margin-top: 30px; } .step { width: 8px; height: 8px; border-radius: 50%; background-color: #e0e0e0; margin: 0 5px; transition: all 0.3s ease; } .step.active { background-color: #6e56cf; transform: scale(1.2); } .thank-you { text-align: center; padding: 40px 0; display: none; } .thank-you-icon { width: 80px; height: 80px; background-color: #f0ebff; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 20px; } .thank-you-icon svg { width: 40px; height: 40px; color: #6e56cf; } .thank-you-title { font-size: 24px; color: #333; margin-bottom: 10px; } .thank-you-text { color: #666; line-height: 1.6; margin-bottom: 30px; max-width: 400px; margin-left: auto; margin-right: auto; } .restart-btn { display: inline-flex; align-items: center; color: #6e56cf; font-weight: 500; cursor: pointer; } .restart-btn svg { margin-right: 6px; width: 16px; height: 16px; } @media (max-width: 600px) { .survey-container { padding: 20px; border-radius: 8px; } .survey-title { font-size: 20px; } .nav-buttons { flex-direction: column-reverse; gap: 10px; } .btn { width: 100%; } } /* Animation for option selection */ @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } .pulse-animation { animation: pulse 0.3s ease; } </style> </head> <body> <div class="survey-container"> <div class="survey-progress" id="progressBar"></div> <div class="survey-form"> <div class="survey-header"> <h1 class="survey-title">Product Experience Survey</h1> <p class="survey-subtitle">Your feedback helps us shape the future of our products. This survey will only take 2 minutes to complete.</p> </div> <div class="question-container" id="question1"> <p class="question">How did you discover our product?<span class="required">*</span></p> <div class="select-wrapper"> <div class="custom-select" id="select1"> <span class="select-text">Select an option</span> <div class="select-icon"> <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M6 9L12 15L18 9" stroke="#666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </div> </div> <div class="options-container" id="options1"> <div class="option" data-value="search">Search engine (Google, Bing, etc.)</div> <div class="option" data-value="social">Social media (Instagram, Twitter, etc.)</div> <div class="option" data-value="friend">Friend or colleague recommendation</div> <div class="option" data-value="blog">Blog or publication</div> <div class="option" data-value="ads">Online advertisement</div> <div class="option" data-value="other">Other</div> </div> </div> </div> <div class="question-container" id="question2" style="display: none;"> <p class="question">How long have you been using our product?<span class="required">*</span></p> <div class="select-wrapper"> <div class="custom-select" id="select2"> <span class="select-text">Select an option</span> <div class="select-icon"> <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M6 9L12 15L18 9" stroke="#666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </div> </div> <div class="options-container" id="options2"> <div class="option" data-value="less-than-month">Less than a month</div> <div class="option" data-value="1-3-months">1-3 months</div> <div class="option" data-value="4-6-months">4-6 months</div> <div class="option" data-value="7-12-months">7-12 months</div> <div class="option" data-value="1-2-years">1-2 years</div> <div class="option" data-value="more-than-2-years">More than 2 years</div> </div> </div> </div> <div class="question-container" id="question3" style="display: none;"> <p class="question">How satisfied are you with the product's user interface?<span class="required">*</span></p> <div class="select-wrapper"> <div class="custom-select" id="select3"> <span class="select-text">Select an option</span> <div class="select-icon"> <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M6 9L12 15L18 9" stroke="#666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </div> </div> <div class="options-container" id="options3"> <div class="option" data-value="very-satisfied">Very satisfied</div> <div class="option" data-value="satisfied">Satisfied</div> <div class="option" data-value="neutral">Neutral</div> <div class="option" data-value="dissatisfied">Dissatisfied</div> <div class="option" data-value="very-dissatisfied">Very dissatisfied</div> </div> </div> </div> <div class="question-container" id="question4" style="display: none;"> <p class="question">What feature would you most like us to improve?<span class="required">*</span></p> <div class="select-wrapper"> <div class="custom-select" id="select4"> <span class="select-text">Select an option</span> <div class="select-icon"> <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M6 9L12 15L18 9" stroke="#666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </div> </div> <div class="options-container" id="options4"> <div class="option" data-value="speed">Performance speed</div> <div class="option" data-value="ui">User interface</div> <div class="option" data-value="features">Feature set</div> <div class="option" data-value="integration">Third-party integrations</div> <div class="option" data-value="pricing">Pricing</div> <div class="option" data-value="support">Customer support</div> </div> </div> </div> <div class="nav-buttons"> <button class="btn btn-secondary" id="prevBtn" style="display: none;">Previous</button> <button class="btn btn-primary" id="nextBtn" disabled>Next</button> </div> <div class="step-indicator"> <div class="step active"></div> <div class="step"></div> <div class="step"></div> <div class="step"></div> </div> </div> <div class="thank-you" id="thankYou"> <div class="thank-you-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"> <path d="M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z"/> </svg> </div> <h2 class="thank-you-title">Thank you for your feedback!</h2> <p class="thank-you-text">Your responses will help us improve our product. We appreciate your time and insights.</p> <div class="restart-btn" id="restartBtn"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"> <path d="M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"/> </svg> Take survey again </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Select elements const selects = document.querySelectorAll('.custom-select'); const nextBtn = document.getElementById('nextBtn'); const prevBtn = document.getElementById('prevBtn'); const progressBar = document.getElementById('progressBar'); const steps = document.querySelectorAll('.step'); const thankYou = document.getElementById('thankYou'); const restartBtn = document.getElementById('restartBtn'); const surveyForm = document.querySelector('.survey-form'); let currentQuestion = 1; const totalQuestions = 4; let responses = {}; // Update progress bar function updateProgress() { const progress = ((currentQuestion - 1) / totalQuestions) * 100; progressBar.style.width = `${progress}%`; } // Handle select box functionality selects.forEach(select => { const selectId = select.id; const questionNumber = selectId.replace('select', ''); const optionsContainer = document.getElementById(`options${questionNumber}`); const options = optionsContainer.querySelectorAll('.option'); const selectText = select.querySelector('.select-text'); // Toggle options when select is clicked select.addEventListener('click', function() { const isOpen = optionsContainer.classList.contains('open'); // Close all open selects first document.querySelectorAll('.options-container.open').forEach(container => { container.classList.remove('open'); }); document.querySelectorAll('.custom-select.open').forEach(sel => { sel.classList.remove('open'); }); if (!isOpen) { optionsContainer.classList.add('open'); select.classList.add('open'); } }); // Handle option selection options.forEach(option => { option.addEventListener('click', function() { const value = this.getAttribute('data-value'); const text = this.textContent; // Add pulse animation this.classList.add('pulse-animation'); setTimeout(() => { this.classList.remove('pulse-animation'); }, 300); // Update select text selectText.textContent = text; selectText.classList.add('selected'); // Mark option as selected options.forEach(opt => opt.classList.remove('selected')); this.classList.add('selected'); // Close options optionsContainer.classList.remove('open'); select.classList.remove('open'); // Store response responses[`question${questionNumber}`] = { value: value, text: text }; // Enable next button if response is set if (currentQuestion === parseInt(questionNumber)) { nextBtn.disabled = false; } }); }); }); // Close options if clicked outside document.addEventListener('click', function(e) { if (!e.target.closest('.custom-select') && !e.target.closest('.options-container')) { document.querySelectorAll('.options-container.open').forEach(container => { container.classList.remove('open'); }); document.querySelectorAll('.custom-select.open').forEach(select => { select.classList.remove('open'); }); } }); // Handle next button nextBtn.addEventListener('click', function() { if (currentQuestion < totalQuestions) { // Hide current question document.getElementById(`question${currentQuestion}`).style.display = 'none'; // Show next question currentQuestion++; document.getElementById(`question${currentQuestion}`).style.display = 'block'; // Update progress updateProgress(); // Update steps steps.forEach((step, index) => { step.classList.toggle('active', index < currentQuestion); }); // Show previous button prevBtn.style.display = 'block'; // Disable next button until an option is selected nextBtn.disabled = !responses[`question${currentQuestion}`]; // Change button text for last question if (currentQuestion === totalQuestions) { nextBtn.textContent = 'Submit'; } } else { // Submit form surveyForm.style.display = 'none'; thankYou.style.display = 'block'; progressBar.style.width = '100%'; } }); // Handle previous button prevBtn.addEventListener('click', function() { if (currentQuestion > 1) { // Hide current question document.getElementById(`question${currentQuestion}`).style.display = 'none'; // Show previous question currentQuestion--; document.getElementById(`question${currentQuestion}`).style.display = 'block'; // Update progress updateProgress(); // Update steps steps.forEach((step, index) => { step.classList.toggle('active', index < currentQuestion); }); // Hide previous button if on first question if (currentQuestion === 1) { prevBtn.style.display = 'none'; } // Enable next button since we already have a response for this question nextBtn.disabled = false; // Reset button text nextBtn.textContent = 'Next'; } }); // Handle restart button restartBtn.addEventListener('click', function() { // Reset form responses = {}; currentQuestion = 1; // Show first question, hide others for (let i = 1; i <= totalQuestions; i++) { document.getElementById(`question${i}`).style.display = i === 1 ? 'block' : 'none'; // Reset select texts const selectText = document.querySelector(`#select${i} .select-text`); selectText.textContent = 'Select an option'; selectText.classList.remove('selected'); // Reset selected options document.querySelectorAll(`#options${i} .option`).forEach(option => { option.classList.remove('selected'); }); } // Reset buttons nextBtn.disabled = true; nextBtn.textContent = 'Next'; prevBtn.style.display = 'none'; // Reset progress progressBar.style.width = '0'; // Reset steps steps.forEach((step, index) => { step.classList.toggle('active', index === 0); }); // Hide thank you, show form thankYou.style.display = 'none'; surveyForm.style.display = 'block'; }); // Initial progress update updateProgress(); }); </script> </body> </html>