Buttons are a fundamental element of user interfaces, guiding users through actions and decisions. Group buttons, in particular, offer a streamlined way to present multiple options in a cohesive manner.
In this article, we will explore ten exemplary group button designs that enhance usability and aesthetics. These examples will inspire you to create intuitive and visually appealing interfaces.
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. Its intuitive, responsive canvas ensures pixel-perfect designs every time, making it a favorite among professionals.
Ready to create stunning group buttons effortlessly? 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
Unlock the power of Subframe and design pixel-perfect UIs with ease. Whether you're crafting Group Buttons or entire interfaces, Subframe's drag-and-drop editor ensures efficiency and precision.
Start creating stunning designs immediately. Sign up for free and elevate your UI game today!
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Enterprise Data Dashboard</title> <style> :root { --primary: #3a86ff; --primary-light: #80b0ff; --secondary: #ff006e; --success: #38b000; --warning: #ffbe0b; --danger: #ff5400; --neutral: #8d99ae; --dark: #2b2d42; --light: #f8f9fa; --shadow: rgba(0, 0, 0, 0.1); --shadow-hover: rgba(0, 0, 0, 0.15); --transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; } body { background-color: #f3f4f6; color: var(--dark); display: flex; flex-direction: column; align-items: center; justify-content: flex-start; min-height: 100vh; padding: 20px; overflow-x: hidden; } .dashboard-container { width: 100%; max-width: 680px; background: white; border-radius: 16px; box-shadow: 0 4px 20px var(--shadow); padding: 24px; margin-bottom: 24px; } .dashboard-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 24px; } .dashboard-title { font-size: 1.75rem; font-weight: 700; color: var(--dark); } .refresh-btn { background: transparent; border: none; color: var(--primary); cursor: pointer; display: flex; align-items: center; font-size: 0.875rem; font-weight: 600; transition: var(--transition); } .refresh-btn:hover { color: var(--primary-light); } .refresh-btn svg { margin-right: 8px; } .filter-section { margin-bottom: 24px; } .filter-title { font-size: 1.1rem; font-weight: 600; margin-bottom: 12px; color: var(--dark); } .filter-groups { display: flex; flex-wrap: wrap; gap: 16px; margin-bottom: 24px; } .filter-group { display: flex; flex-direction: column; gap: 10px; } .filter-group-label { font-size: 0.875rem; font-weight: 600; color: var(--dark); } .btn-group { display: flex; flex-wrap: wrap; background-color: #f3f4f6; border-radius: 8px; overflow: hidden; position: relative; box-shadow: 0 2px 5px var(--shadow); } .btn-filter { padding: 10px 16px; background: transparent; border: none; font-size: 0.875rem; font-weight: 500; color: var(--dark); cursor: pointer; transition: var(--transition); position: relative; z-index: 2; flex: 1; min-width: 80px; outline: none; white-space: nowrap; } .btn-filter:hover { color: var(--primary); } .btn-filter.active { color: white; } .btn-filter:focus-visible { box-shadow: 0 0 0 2px var(--primary-light); } .btn-filter.active::before { content: ''; position: absolute; inset: 0; z-index: -1; animation: activateBtn 0.3s cubic-bezier(0.34, 1.56, 0.64, 1) forwards; } @keyframes activateBtn { 0% { transform: scale(0.5); opacity: 0; } 100% { transform: scale(1); opacity: 1; } } .time-filter .btn-filter.active::before { background-color: var(--primary); } .category-filter .btn-filter.active::before { background-color: var(--secondary); } .status-filter .btn-filter.active::before { background-color: var(--warning); } .data-view { position: relative; overflow: hidden; border-radius: 12px; box-shadow: 0 2px 8px var(--shadow); margin-bottom: 24px; } .data-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 16px; padding: 20px 0; } .data-card { background: white; border-radius: 8px; padding: 16px; box-shadow: 0 2px 8px var(--shadow); transition: var(--transition); cursor: pointer; position: relative; overflow: hidden; } .data-card:hover { transform: translateY(-5px); box-shadow: 0 8px 16px var(--shadow-hover); } .data-card::before { content: ''; position: absolute; top: 0; left: 0; width: 4px; height: 100%; } .data-card.sales::before { background-color: var(--primary); } .data-card.marketing::before { background-color: var(--secondary); } .data-card.operations::before { background-color: var(--success); } .data-card.finance::before { background-color: var(--warning); } .data-card-title { font-size: 0.875rem; font-weight: 600; color: var(--neutral); margin-bottom: 8px; } .data-card-value { font-size: 1.5rem; font-weight: 700; color: var(--dark); } .data-card-change { display: inline-flex; align-items: center; font-size: 0.75rem; font-weight: 600; margin-top: 8px; padding: 2px 6px; border-radius: 4px; } .data-card-change.positive { color: var(--success); background-color: rgba(56, 176, 0, 0.1); } .data-card-change.negative { color: var(--danger); background-color: rgba(255, 84, 0, 0.1); } .data-card-change svg { margin-right: 4px; } .summary-section { background: white; border-radius: 12px; padding: 20px; box-shadow: 0 2px 8px var(--shadow); } .summary-title { font-size: 1.1rem; font-weight: 600; margin-bottom: 16px; color: var(--dark); } .summary-stats { display: flex; flex-wrap: wrap; gap: 16px; margin-bottom: 16px; } .stat-item { flex: 1; min-width: 120px; padding: 12px; background-color: #f3f4f6; border-radius: 8px; } .stat-label { font-size: 0.75rem; font-weight: 500; color: var(--neutral); margin-bottom: 4px; } .stat-value { font-size: 1.25rem; font-weight: 700; color: var(--dark); } .applied-filters { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; margin-bottom: 24px; } .filter-tag { display: inline-flex; align-items: center; background-color: #f3f4f6; border-radius: 20px; padding: 6px 12px; font-size: 0.8125rem; font-weight: 500; color: var(--dark); transition: var(--transition); } .filter-tag span { margin-right: 6px; } .filter-tag.time { background-color: rgba(58, 134, 255, 0.1); color: var(--primary); } .filter-tag.category { background-color: rgba(255, 0, 110, 0.1); color: var(--secondary); } .filter-tag.status { background-color: rgba(255, 190, 11, 0.1); color: var(--warning); } .filter-tag button { background: transparent; border: none; display: flex; align-items: center; justify-content: center; cursor: pointer; color: currentColor; opacity: 0.7; transition: var(--transition); } .filter-tag button:hover { opacity: 1; } .visualization { width: 100%; height: 160px; margin-top: 12px; position: relative; overflow: hidden; } .bars-container { display: flex; height: 100%; width: 100%; align-items: flex-end; justify-content: space-between; padding-bottom: 24px; } .bar { flex: 1; margin: 0 4px; background-color: var(--primary-light); border-radius: 4px 4px 0 0; min-height: 4px; transition: height 1s cubic-bezier(0.34, 1.56, 0.64, 1); position: relative; } .bar::before { content: attr(data-value); position: absolute; bottom: -20px; left: 50%; transform: translateX(-50%); font-size: 0.75rem; color: var(--neutral); } .bar:nth-child(odd) { background-color: var(--primary); } .bar:hover { background-color: var(--secondary); } .axis-line { position: absolute; bottom: 24px; left: 0; width: 100%; height: 1px; background-color: #e5e7eb; } @media (max-width: 580px) { .dashboard-container { padding: 16px; } .dashboard-title { font-size: 1.5rem; } .filter-groups { flex-direction: column; gap: 20px; } .data-grid { grid-template-columns: 1fr; } .summary-stats { flex-direction: column; } .btn-group { flex-wrap: nowrap; overflow-x: auto; padding: 4px; } .btn-filter { font-size: 0.8125rem; padding: 8px 12px; flex: 0 0 auto; } } /* Pill slider animation */ @keyframes slide { from { opacity: 0; transform: translateX(-10px); } to { opacity: 1; transform: translateX(0); } } /* Shimmer loading effect */ .shimmer-loading { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient( 90deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0) ); background-size: 200% 100%; animation: shimmer 1.5s infinite; pointer-events: none; opacity: 0; transition: opacity 0.3s ease; } @keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } } .updating .shimmer-loading { opacity: 1; } /* Custom scrollbar */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: #f1f1f1; border-radius: 4px; } ::-webkit-scrollbar-thumb { background: var(--neutral); border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: var(--primary); } </style> </head> <body> <div class="dashboard-container"> <div class="dashboard-header"> <h1 class="dashboard-title">Performance Analytics</h1> <button class="refresh-btn" id="refreshData"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M2 12C2 16.4183 5.58172 20 10 20C14.4183 20 18 16.4183 18 12C18 7.58172 14.4183 4 10 4" stroke="currentColor" stroke-width="2" stroke-linecap="round"/> <path d="M2 6H6V10" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> Refresh Data </button> </div> <div class="filter-section"> <h2 class="filter-title">Data Segmentation</h2> <div class="filter-groups"> <div class="filter-group time-filter"> <label class="filter-group-label">Time Period</label> <div class="btn-group" data-filter-group="time"> <button class="btn-filter active" data-value="today">Today</button> <button class="btn-filter" data-value="week">This Week</button> <button class="btn-filter" data-value="month">This Month</button> <button class="btn-filter" data-value="quarter">This Quarter</button> </div> </div> <div class="filter-group category-filter"> <label class="filter-group-label">Business Category</label> <div class="btn-group" data-filter-group="category"> <button class="btn-filter active" data-value="all">All</button> <button class="btn-filter" data-value="sales">Sales</button> <button class="btn-filter" data-value="marketing">Marketing</button> <button class="btn-filter" data-value="operations">Operations</button> <button class="btn-filter" data-value="finance">Finance</button> </div> </div> <div class="filter-group status-filter"> <label class="filter-group-label">Performance Status</label> <div class="btn-group" data-filter-group="status"> <button class="btn-filter active" data-value="all">All</button> <button class="btn-filter" data-value="exceeding">Exceeding</button> <button class="btn-filter" data-value="meeting">Meeting</button> <button class="btn-filter" data-value="below">Below Target</button> </div> </div> </div> <div class="applied-filters" id="appliedFilters"> <div class="filter-tag time"> <span>Today</span> <button aria-label="Remove filter"> <svg width="12" height="12" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M18 6L6 18M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </button> </div> <div class="filter-tag category"> <span>All Categories</span> <button aria-label="Remove filter"> <svg width="12" height="12" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M18 6L6 18M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </button> </div> <div class="filter-tag status"> <span>All Statuses</span> <button aria-label="Remove filter"> <svg width="12" height="12" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M18 6L6 18M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </button> </div> </div> </div> <div class="data-view" id="dataView"> <div class="shimmer-loading"></div> <div class="data-grid"> <div class="data-card sales"> <div class="data-card-title">Revenue</div> <div class="data-card-value">$42,850</div> <div class="data-card-change positive"> <svg width="12" height="12" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12 20V4M12 4L5 11M12 4L19 11" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> +12.5% </div> </div> <div class="data-card marketing"> <div class="data-card-title">Conversion Rate</div> <div class="data-card-value">3.8%</div> <div class="data-card-change positive"> <svg width="12" height="12" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12 20V4M12 4L5 11M12 4L19 11" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> +0.5% </div> </div> <div class="data-card operations"> <div class="data-card-title">Customer Satisfaction</div> <div class="data-card-value">94%</div> <div class="data-card-change positive"> <svg width="12" height="12" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12 20V4M12 4L5 11M12 4L19 11" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> +2% </div> </div> <div class="data-card finance"> <div class="data-card-title">Avg Order Value</div> <div class="data-card-value">$128</div> <div class="data-card-change negative"> <svg width="12" height="12" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12 4V20M12 20L5 13M12 20L19 13" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> -3.2% </div> </div> </div> </div> <div class="summary-section"> <h2 class="summary-title">Performance Trends</h2> <div class="summary-stats"> <div class="stat-item"> <div class="stat-label">Highest Performing</div> <div class="stat-value">Revenue</div> </div> <div class="stat-item"> <div class="stat-label">Needs Attention</div> <div class="stat-value">Order Value</div> </div> <div class="stat-item"> <div class="stat-label">Growth Velocity</div> <div class="stat-value">+7.3%</div> </div> </div> <div class="visualization"> <div class="axis-line"></div> <div class="bars-container"> <div class="bar" style="height: 70%" data-value="Mon"></div> <div class="bar" style="height: 45%" data-value="Tue"></div> <div class="bar" style="height: 60%" data-value="Wed"></div> <div class="bar" style="height: 80%" data-value="Thu"></div> <div class="bar" style="height: 65%" data-value="Fri"></div> <div class="bar" style="height: 40%" data-value="Sat"></div> <div class="bar" style="height: 30%" data-value="Sun"></div> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Filter button functionality const filterGroups = document.querySelectorAll('.btn-group'); const appliedFiltersContainer = document.getElementById('appliedFilters'); const dataView = document.getElementById('dataView'); const refreshBtn = document.getElementById('refreshData'); // Initialize applied filters const appliedFilters = { time: 'today', category: 'all', status: 'all' }; // Sample data for dynamic updates const dataOptions = { sales: [ { title: 'Revenue', value: '$42,850', change: '+12.5%', direction: 'positive' }, { title: 'Revenue', value: '$138,420', change: '+8.3%', direction: 'positive' }, { title: 'Revenue', value: '$547,620', change: '+5.7%', direction: 'positive' }, { title: 'Revenue', value: '$1.2M', change: '+3.1%', direction: 'positive' } ], marketing: [ { title: 'Conversion Rate', value: '3.8%', change: '+0.5%', direction: 'positive' }, { title: 'Conversion Rate', value: '4.2%', change: '+0.7%', direction: 'positive' }, { title: 'Conversion Rate', value: '3.9%', change: '-0.3%', direction: 'negative' }, { title: 'Conversion Rate', value: '4.1%', change: '+0.2%', direction: 'positive' } ], operations: [ { title: 'Customer Satisfaction', value: '94%', change: '+2%', direction: 'positive' }, { title: 'Customer Satisfaction', value: '92%', change: '-1%', direction: 'negative' }, { title: 'Customer Satisfaction', value: '91%', change: '-2%', direction: 'negative' }, { title: 'Customer Satisfaction', value: '95%', change: '+4%', direction: 'positive' } ], finance: [ { title: 'Avg Order Value', value: '$128', change: '-3.2%', direction: 'negative' }, { title: 'Avg Order Value', value: '$135', change: '+1.5%', direction: 'positive' }, { title: 'Avg Order Value', value: '$142', change: '+5.2%', direction: 'positive' }, { title: 'Avg Order Value', value: '$131', change: '-7.7%', direction: 'negative' } ] }; // Initialize visualization updateVisualization(); // Handle filter button clicks filterGroups.forEach(group => { const buttons = group.querySelectorAll('.btn-filter'); const filterType = group.dataset.filterGroup; buttons.forEach(btn => { btn.addEventListener('click', function() { // Remove active class from all buttons in this group buttons.forEach(b => b.classList.remove('active')); // Add active class to clicked button this.classList.add('active'); // Update applied filters appliedFilters[filterType] = this.dataset.value; // Update UI updateAppliedFiltersUI(); updateDataView(); }); }); }); // Refresh data refreshBtn.addEventListener('click', function() { dataView.classList.add('updating'); setTimeout(() => { updateDataView(true); updateVisualization(true); setTimeout(() => { dataView.classList.remove('updating'); }, 600); }, 600); }); // Update applied filters UI function updateAppliedFiltersUI() { // Clear current applied filters appliedFiltersContainer.innerHTML = ''; // Time period tag const timeBtn = document.querySelector(`.time-filter .btn-filter[data-value="${appliedFilters.time}"]`); const timeTag = createFilterTag('time', timeBtn.textContent, 'time'); appliedFiltersContainer.appendChild(timeTag); // Category tag const categoryBtn = document.querySelector(`.category-filter .btn-filter[data-value="${appliedFilters.category}"]`); const categoryLabel = appliedFilters.category === 'all' ? 'All Categories' : categoryBtn.textContent; const categoryTag = createFilterTag('category', categoryLabel, 'category'); appliedFiltersContainer.appendChild(categoryTag); // Status tag const statusBtn = document.querySelector(`.status-filter .btn-filter[data-value="${appliedFilters.status}"]`); const statusLabel = appliedFilters.status === 'all' ? 'All Statuses' : statusBtn.textContent; const statusTag = createFilterTag('status', statusLabel, 'status'); appliedFiltersContainer.appendChild(statusTag); } // Create filter tag element function createFilterTag(type, text, filterClass) { const tag = document.createElement('div'); tag.className = `filter-tag ${filterClass}`; tag.style.animation = 'slide 0.3s forwards'; const span = document.createElement('span'); span.textContent = text; const button = document.createElement('button'); button.setAttribute('aria-label', 'Remove filter'); button.innerHTML = ` <svg width="12" height="12" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M18 6L6 18M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> `; // Reset filter when clicking the tag's remove button button.addEventListener('click', function() { const defaultBtn = document.querySelector(`.${type}-filter .btn-filter[data-value="all"]`) || document.querySelector(`.${type}-filter .btn-filter:first-child`); if (defaultBtn) { defaultBtn.click(); } }); tag.appendChild(span); tag.appendChild(button); return tag; } // Update data view based on filters function updateDataView(isRefresh = false) { // Get time period index (today: 0, week: 1, month: 2, quarter: 3) const timeIndex = ['today', 'week', 'month', 'quarter'].indexOf(appliedFilters.time); // Update data cards const dataGrid = document.querySelector('.data-grid'); // Clear current data cards if refreshing if (isRefresh) { dataGrid.innerHTML = ''; // Get categories to display based on filter let categories = ['sales', 'marketing', 'operations', 'finance']; if (appliedFilters.category !== 'all') { categories = [appliedFilters.category]; } // Create cards for each category categories.forEach(category => { const data = dataOptions[category][timeIndex]; const card = document.createElement('div'); card.className = `data-card ${category}`; card.innerHTML = ` <div class="data-card-title">${data.title}</div> <div class="data-card-value">${data.value}</div> <div class="data-card-change ${data.direction}"> <svg width="12" height="12" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="${data.direction === 'positive' ? 'M12 20V4M12 4L5 11M12 4L19 11' : 'M12 4V20M12 20L5 13M12 20L19 13'}" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> ${data.change} </div> `; dataGrid.appendChild(card); }); } } // Update visualization function updateVisualization(isRefresh = false) { const bars = document.querySelectorAll('.bar'); if (isRefresh) { // Generate random heights for the bars bars.forEach(bar => { const randomHeight = Math.floor(Math.random() * 70) + 20; // Between 20% and 90% bar.style.height = `${randomHeight}%`; // Apply animation bar.style.transition = 'height 1s cubic-bezier(0.34, 1.56, 0.64, 1)'; }); } } // Add hover effects to data cards const dataCards = document.querySelectorAll('.data-card'); dataCards.forEach(card => { card.addEventListener('mouseenter', function() { this.style.transform = 'translateY(-5px)'; this.style.boxShadow = '0 8px 16px var(--shadow-hover)'; }); card.addEventListener('mouseleave', function() { this.style.transform = 'translateY(0)'; this.style.boxShadow = '0 2px 8px var(--shadow)'; }); }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>E-Commerce Category Selector</title> <style> :root { --color-primary: #FF6B6B; --color-secondary: #4ECDC4; --color-accent1: #FFE66D; --color-accent2: #7971EA; --color-accent3: #FF8C42; --color-dark: #292F36; --color-light: #F7F9FC; --shadow-soft: 0 8px 20px rgba(0, 0, 0, 0.05); --shadow-pressed: 0 4px 10px rgba(0, 0, 0, 0.08); --transition-speed: 0.3s; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Poppins', sans-serif; } body { background-color: var(--color-light); display: flex; justify-content: center; align-items: center; min-height: 100vh; padding: 20px; overflow-x: hidden; } .container { width: 100%; max-width: 700px; padding: 2rem; border-radius: 18px; box-shadow: var(--shadow-soft); background-color: white; } h1 { font-size: 2rem; font-weight: 700; color: var(--color-dark); margin-bottom: 1.5rem; text-align: center; position: relative; } h1::after { content: ''; position: absolute; bottom: -10px; left: 50%; transform: translateX(-50%); width: 80px; height: 4px; background: linear-gradient(90deg, var(--color-primary), var(--color-secondary)); border-radius: 2px; } .subtitle { text-align: center; color: #666; margin-bottom: 2rem; font-size: 1rem; } .category-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 1rem; margin-bottom: 2rem; } .category-btn { position: relative; background: white; border: none; border-radius: 12px; padding: 1.2rem 0.5rem; font-weight: 600; font-size: 0.9rem; text-transform: uppercase; letter-spacing: 0.5px; color: var(--color-dark); cursor: pointer; box-shadow: var(--shadow-soft); transition: all var(--transition-speed) ease; overflow: hidden; display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100px; } .category-btn::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(45deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.4)); opacity: 0; transition: opacity var(--transition-speed) ease; } .category-btn:hover { transform: translateY(-5px); box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1); } .category-btn:hover::before { opacity: 1; } .category-btn:active { transform: translateY(-2px); box-shadow: var(--shadow-pressed); } .category-btn.active { color: white; } .category-btn i { font-size: 1.5rem; margin-bottom: 0.5rem; transition: transform 0.3s ease; } .category-btn:hover i { transform: scale(1.2); } .btn-1 { background: linear-gradient(135deg, var(--color-primary), #FF8585); } .btn-2 { background: linear-gradient(135deg, var(--color-secondary), #6FDFDA); } .btn-3 { background: linear-gradient(135deg, var(--color-accent1), #FFF0A0); } .btn-4 { background: linear-gradient(135deg, var(--color-accent2), #9C96F2); } .btn-5 { background: linear-gradient(135deg, var(--color-accent3), #FFAA70); } .btn-6 { background: linear-gradient(135deg, #50C878, #A0E7B1); } .category-btn.active { box-shadow: inset 0 4px 8px rgba(0, 0, 0, 0.2); transform: translateY(-2px); } .products-container { overflow: hidden; height: 200px; border-radius: 12px; margin-top: 1rem; position: relative; } .products { display: none; padding: 1.5rem; border-radius: 12px; background-color: var(--color-light); box-shadow: inset 0 2px 5px rgba(0, 0, 0, 0.05); height: 100%; opacity: 0; transform: translateY(20px); transition: opacity 0.3s ease, transform 0.3s ease; overflow-y: auto; } .products.active { display: block; opacity: 1; transform: translateY(0); } .product-item { display: flex; align-items: center; padding: 0.8rem; margin-bottom: 0.5rem; background: white; border-radius: 8px; box-shadow: var(--shadow-soft); transition: transform 0.2s ease; } .product-item:hover { transform: translateX(5px); } .product-icon { width: 40px; height: 40px; display: flex; align-items: center; justify-content: center; border-radius: 8px; margin-right: 0.8rem; color: white; } .product-name { font-weight: 600; font-size: 0.9rem; } .product-price { margin-left: auto; font-weight: 700; color: var(--color-dark); } .selection-info { text-align: center; margin-top: 1.5rem; padding: 1rem; background: linear-gradient(to right, rgba(255, 107, 107, 0.1), rgba(78, 205, 196, 0.1)); border-radius: 10px; font-weight: 500; color: var(--color-dark); opacity: 0; transform: translateY(10px); transition: all 0.3s ease; } .selection-info.show { opacity: 1; transform: translateY(0); } .pulse { animation: pulse 0.6s ease-in-out; } @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } @media (max-width: 600px) { .category-grid { grid-template-columns: repeat(2, 1fr); } h1 { font-size: 1.5rem; } .container { padding: 1.5rem; } } /* Custom scrollbar */ .products::-webkit-scrollbar { width: 6px; } .products::-webkit-scrollbar-track { background: rgba(0, 0, 0, 0.05); border-radius: 10px; } .products::-webkit-scrollbar-thumb { background: rgba(0, 0, 0, 0.2); border-radius: 10px; } .products::-webkit-scrollbar-thumb:hover { background: rgba(0, 0, 0, 0.3); } /* Loading indicator */ .loading-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin: 0 2px; background-color: var(--color-dark); animation: loading 1.4s infinite ease-in-out both; } .loading-dot:nth-child(1) { animation-delay: -0.32s; } .loading-dot:nth-child(2) { animation-delay: -0.16s; } @keyframes loading { 0%, 80%, 100% { transform: scale(0); } 40% { transform: scale(1); } } </style> </head> <body> <div class="container"> <h1>Shop by Category</h1> <p class="subtitle">Explore our curated collections for every need</p> <div class="category-grid"> <button class="category-btn btn-1" data-category="electronics"> <i class="fas fa-laptop"></i> Electronics </button> <button class="category-btn btn-2" data-category="fashion"> <i class="fas fa-tshirt"></i> Fashion </button> <button class="category-btn btn-3" data-category="home"> <i class="fas fa-home"></i> Home </button> <button class="category-btn btn-4" data-category="beauty"> <i class="fas fa-spa"></i> Beauty </button> <button class="category-btn btn-5" data-category="sports"> <i class="fas fa-running"></i> Sports </button> <button class="category-btn btn-6" data-category="books"> <i class="fas fa-book"></i> Books </button> </div> <div class="products-container"> <div class="products" data-products="electronics"> <div class="product-item"> <div class="product-icon" style="background-color: #FF6B6B;"> <i class="fas fa-mobile-alt"></i> </div> <span class="product-name">Pixel 7 Pro - Latest Model</span> <span class="product-price">$899</span> </div> <div class="product-item"> <div class="product-icon" style="background-color: #FF6B6B;"> <i class="fas fa-laptop"></i> </div> <span class="product-name">MacBook Air M2 Chip</span> <span class="product-price">$1,199</span> </div> <div class="product-item"> <div class="product-icon" style="background-color: #FF6B6B;"> <i class="fas fa-headphones"></i> </div> <span class="product-name">Sony WH-1000XM5</span> <span class="product-price">$349</span> </div> </div> <div class="products" data-products="fashion"> <div class="product-item"> <div class="product-icon" style="background-color: #4ECDC4;"> <i class="fas fa-tshirt"></i> </div> <span class="product-name">Organic Cotton T-Shirt</span> <span class="product-price">$35</span> </div> <div class="product-item"> <div class="product-icon" style="background-color: #4ECDC4;"> <i class="fas fa-shoe-prints"></i> </div> <span class="product-name">Recycled Sneakers</span> <span class="product-price">$89</span> </div> <div class="product-item"> <div class="product-icon" style="background-color: #4ECDC4;"> <i class="fas fa-glasses"></i> </div> <span class="product-name">Sustainable Sunglasses</span> <span class="product-price">$120</span> </div> </div> <div class="products" data-products="home"> <div class="product-item"> <div class="product-icon" style="background-color: #FFE66D;"> <i class="fas fa-couch"></i> </div> <span class="product-name">Modular Sofa Set</span> <span class="product-price">$899</span> </div> <div class="product-item"> <div class="product-icon" style="background-color: #FFE66D;"> <i class="fas fa-blender"></i> </div> <span class="product-name">High-Power Blender</span> <span class="product-price">$119</span> </div> <div class="product-item"> <div class="product-icon" style="background-color: #FFE66D;"> <i class="fas fa-bed"></i> </div> <span class="product-name">Organic Bedding Set</span> <span class="product-price">$149</span> </div> </div> <div class="products" data-products="beauty"> <div class="product-item"> <div class="product-icon" style="background-color: #7971EA;"> <i class="fas fa-pump-soap"></i> </div> <span class="product-name">Hydrating Serum</span> <span class="product-price">$48</span> </div> <div class="product-item"> <div class="product-icon" style="background-color: #7971EA;"> <i class="fas fa-magic"></i> </div> <span class="product-name">Vegan Makeup Brush Set</span> <span class="product-price">$65</span> </div> <div class="product-item"> <div class="product-icon" style="background-color: #7971EA;"> <i class="fas fa-eye"></i> </div> <span class="product-name">Waterproof Mascara</span> <span class="product-price">$24</span> </div> </div> <div class="products" data-products="sports"> <div class="product-item"> <div class="product-icon" style="background-color: #FF8C42;"> <i class="fas fa-bicycle"></i> </div> <span class="product-name">Carbon Road Bike</span> <span class="product-price">$1,499</span> </div> <div class="product-item"> <div class="product-icon" style="background-color: #FF8C42;"> <i class="fas fa-dumbbell"></i> </div> <span class="product-name">Adjustable Dumbbells</span> <span class="product-price">$249</span> </div> <div class="product-item"> <div class="product-icon" style="background-color: #FF8C42;"> <i class="fas fa-hiking"></i> </div> <span class="product-name">Waterproof Hiking Boots</span> <span class="product-price">$129</span> </div> </div> <div class="products" data-products="books"> <div class="product-item"> <div class="product-icon" style="background-color: #50C878;"> <i class="fas fa-book"></i> </div> <span class="product-name">Tomorrow, and Tomorrow</span> <span class="product-price">$22</span> </div> <div class="product-item"> <div class="product-icon" style="background-color: #50C878;"> <i class="fas fa-headphones-alt"></i> </div> <span class="product-name">Audible Premium Plus</span> <span class="product-price">$15/mo</span> </div> <div class="product-item"> <div class="product-icon" style="background-color: #50C878;"> <i class="fas fa-book-open"></i> </div> <span class="product-name">Atomic Habits</span> <span class="product-price">$18</span> </div> </div> </div> <div class="selection-info"> Select a category to see relevant products </div> </div> <script src="https://kit.fontawesome.com/a076d05399.js" crossorigin="anonymous"></script> <script> document.addEventListener('DOMContentLoaded', function() { // Fallback for Font Awesome if CDN fails setTimeout(() => { if (!document.querySelector('.fas')) { const icons = document.querySelectorAll('[class*="fas fa-"]'); icons.forEach(icon => { const iconName = icon.className.split('fas fa-')[1]; icon.textContent = getIconFallback(iconName); icon.style.fontFamily = 'sans-serif'; icon.style.fontSize = '0.8rem'; }); } }, 1000); const categoryButtons = document.querySelectorAll('.category-btn'); const products = document.querySelectorAll('.products'); const selectionInfo = document.querySelector('.selection-info'); // Show selection info by default selectionInfo.classList.add('show'); categoryButtons.forEach(button => { button.addEventListener('click', function() { const category = this.getAttribute('data-category'); // Apply button active state categoryButtons.forEach(btn => btn.classList.remove('active')); this.classList.add('active'); this.classList.add('pulse'); // Hide all products first products.forEach(p => p.classList.remove('active')); // Show loading indicator selectionInfo.innerHTML = ` <div>Loading ${category} products <div class="loading-dot"></div> <div class="loading-dot"></div> <div class="loading-dot"></div> </div> `; selectionInfo.classList.add('show'); // Simulate loading delay setTimeout(() => { // Show the matching products const matchingProducts = document.querySelector(`.products[data-products="${category}"]`); matchingProducts.classList.add('active'); // Update selection info selectionInfo.innerHTML = `Browsing <strong>${capitalizeFirstLetter(category)}</strong> collection`; }, 600); // Remove pulse animation after it finishes setTimeout(() => { this.classList.remove('pulse'); }, 600); }); }); // Add hover effects to product items const productItems = document.querySelectorAll('.product-item'); productItems.forEach(item => { item.addEventListener('mouseenter', function() { this.style.backgroundColor = '#f9f9f9'; }); item.addEventListener('mouseleave', function() { this.style.backgroundColor = 'white'; }); item.addEventListener('click', function() { this.style.transform = 'translateX(10px)'; setTimeout(() => { this.style.transform = 'translateX(5px)'; }, 300); }); }); // Helper function to capitalize first letter function capitalizeFirstLetter(string) { return string.charAt(0).toUpperCase() + string.slice(1); } // Icon fallbacks if Font Awesome fails to load function getIconFallback(iconName) { const icons = { 'laptop': '💻', 'tshirt': '👕', 'home': '🏠', 'spa': '💅', 'running': '🏃', 'book': '📚', 'mobile-alt': '📱', 'headphones': '🎧', 'shoe-prints': '👟', 'glasses': '👓', 'couch': '🛋️', 'blender': '🍹', 'bed': '🛏️', 'pump-soap': '🧴', 'magic': '✨', 'eye': '👁️', 'bicycle': '🚲', 'dumbbell': '🏋️', 'hiking': '🥾', 'headphones-alt': '🎧', 'book-open': '📖' }; return icons[iconName] || '•'; } }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Social Media Content Filter</title> <style> :root { --primary: #6c5ce7; --secondary: #fd79a8; --tertiary: #00b894; --quaternary: #fdcb6e; --quinary: #e17055; --senary: #0984e3; --black: #2d3436; --white: #ffffff; --background: #f9f9f9; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Poppins', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; } body { background-color: var(--background); display: flex; flex-direction: column; align-items: center; justify-content: flex-start; min-height: 100vh; padding: 2rem 1rem; overflow-x: hidden; } .container { max-width: 700px; width: 100%; display: flex; flex-direction: column; align-items: center; gap: 2rem; } .header { text-align: center; margin-bottom: 1rem; position: relative; } .header h1 { font-size: 2.2rem; color: var(--black); margin-bottom: 0.5rem; background: linear-gradient(45deg, var(--primary), var(--secondary)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; position: relative; } .header p { font-size: 1rem; color: #666; max-width: 500px; line-height: 1.5; } .filter-container { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.8rem; max-width: 600px; width: 100%; padding: 1rem; border-radius: 15px; background: rgba(255, 255, 255, 0.8); backdrop-filter: blur(10px); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.05); position: relative; } .filter-container::before { content: ''; position: absolute; top: -5px; left: -5px; right: -5px; bottom: -5px; background: linear-gradient(45deg, var(--primary), var(--secondary), var(--tertiary), var(--quaternary)); border-radius: 20px; z-index: -1; opacity: 0.5; } .filter-btn { padding: 0.8rem 1.2rem; border-radius: 50px; border: none; font-size: 0.9rem; font-weight: 600; color: var(--white); cursor: pointer; transition: all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55); position: relative; overflow: hidden; display: flex; align-items: center; gap: 0.5rem; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1); } .filter-btn i { font-size: 1.1rem; } .filter-btn::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.2); transition: all 0.4s ease-in-out; } .filter-btn:hover::before { left: 100%; } .filter-btn:active { transform: scale(0.95); } .filter-btn:focus { outline: none; } .filter-btn.active { transform: translateY(-5px); box-shadow: 0 8px 15px rgba(0, 0, 0, 0.15); } .filter-btn:nth-child(1) { background: var(--primary); } .filter-btn:nth-child(2) { background: var(--secondary); } .filter-btn:nth-child(3) { background: var(--tertiary); } .filter-btn:nth-child(4) { background: var(--quaternary); } .filter-btn:nth-child(5) { background: var(--quinary); } .filter-btn:nth-child(6) { background: var(--senary); } .filter-btn:nth-child(7) { background: var(--primary); } .filter-btn:nth-child(8) { background: var(--secondary); } .posts-container { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 1.5rem; width: 100%; max-width: 650px; } .post { background: var(--white); border-radius: 15px; padding: 1.2rem; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.08); transition: all 0.4s ease; opacity: 0; transform: translateY(20px); animation: fadeIn 0.6s forwards; position: relative; overflow: hidden; } .post.hidden { display: none; } .post-category { position: absolute; top: 10px; right: 10px; padding: 0.2rem 0.6rem; border-radius: 20px; font-size: 0.7rem; font-weight: 600; color: var(--white); } .post.gaming .post-category { background: var(--primary); } .post.fashion .post-category { background: var(--secondary); } .post.foodie .post-category { background: var(--tertiary); } .post.travel .post-category { background: var(--quaternary); } .post.music .post-category { background: var(--quinary); } .post.tech .post-category { background: var(--senary); } .post-content h3 { font-size: 1.1rem; margin-bottom: 0.5rem; color: var(--black); } .post-content p { font-size: 0.9rem; line-height: 1.5; color: #666; } .post-img { width: 100%; height: 150px; border-radius: 10px; object-fit: cover; margin-bottom: 1rem; transition: transform 0.3s ease; } .post:hover .post-img { transform: scale(1.03); } .post-interactions { display: flex; justify-content: space-between; margin-top: 1rem; padding-top: 0.8rem; border-top: 1px solid #eee; } .post-interactions button { background: none; border: none; color: #777; font-size: 0.9rem; cursor: pointer; display: flex; align-items: center; gap: 0.3rem; transition: color 0.3s ease; } .post-interactions button:hover { color: var(--primary); } .post-interactions button i { font-size: 1rem; } .filter-info { margin-top: 1.5rem; padding: 0.8rem 1.2rem; background: rgba(255, 255, 255, 0.9); border-radius: 10px; text-align: center; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05); transition: all 0.3s ease; display: none; } .filter-info.active { display: block; animation: slideDown 0.4s forwards; } .filter-info p { font-size: 0.9rem; color: #555; } .filter-reset { margin-top: 1rem; padding: 0.6rem 1.2rem; background: var(--black); color: var(--white); border: none; border-radius: 30px; font-size: 0.85rem; font-weight: 600; cursor: pointer; transition: all 0.3s ease; display: none; } .filter-reset.active { display: inline-block; animation: bounceIn 0.5s forwards; } .filter-reset:hover { transform: translateY(-2px); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1); } .emoji-indicator { position: absolute; font-size: 1.5rem; pointer-events: none; opacity: 0; transform: translate(-50%, -50%); z-index: 100; } @keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } @keyframes slideDown { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } @keyframes bounceIn { 0% { transform: scale(0.8); opacity: 0; } 50% { transform: scale(1.05); } 100% { transform: scale(1); opacity: 1; } } @keyframes emojiFloat { 0% { transform: translate(-50%, -50%) scale(0.8); opacity: 0; } 50% { transform: translate(-50%, -120%) scale(1.2); opacity: 1; } 100% { transform: translate(-50%, -180%) scale(0.8); opacity: 0; } } /* Responsive adjustments */ @media (max-width: 600px) { .header h1 { font-size: 1.8rem; } .header p { font-size: 0.9rem; } .filter-btn { padding: 0.6rem 1rem; font-size: 0.8rem; } .posts-container { grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 1rem; } .post-content h3 { font-size: 1rem; } .post-content p { font-size: 0.85rem; } } @media (max-width: 400px) { .posts-container { grid-template-columns: 1fr; } } /* Fun blob background */ .blob { position: fixed; width: 500px; height: 500px; background: linear-gradient( 45deg, rgba(108, 92, 231, 0.1), rgba(253, 121, 168, 0.1) ); border-radius: 50%; filter: blur(80px); z-index: -1; animation: blobAnimation 15s infinite alternate ease-in-out; } .blob2 { right: -100px; top: -100px; background: linear-gradient( 45deg, rgba(0, 184, 148, 0.1), rgba(253, 203, 110, 0.1) ); animation-delay: -5s; } @keyframes blobAnimation { 0% { transform: translate(0, 0) scale(1); } 50% { transform: translate(100px, 50px) scale(1.2); } 100% { transform: translate(50px, 100px) scale(0.8); } } </style> </head> <body> <div class="blob"></div> <div class="blob blob2"></div> <div class="container"> <div class="header"> <h1>VibeFilter</h1> <p>Find exactly what you're into! Choose a category to see posts that match your current mood.</p> </div> <div class="filter-container"> <button class="filter-btn" data-category="gaming"> <i>🎮</i> Gaming </button> <button class="filter-btn" data-category="fashion"> <i>👗</i> Fashion </button> <button class="filter-btn" data-category="foodie"> <i>🍕</i> Foodie </button> <button class="filter-btn" data-category="travel"> <i>✈️</i> Travel </button> <button class="filter-btn" data-category="music"> <i>🎵</i> Music </button> <button class="filter-btn" data-category="tech"> <i>📱</i> Tech </button> <button class="filter-btn" data-category="all"> <i>✨</i> All Vibes </button> </div> <div class="filter-info"> <p>Showing posts from <span id="category-name">all categories</span></p> <button class="filter-reset">Reset Filter</button> </div> <div class="posts-container"> <!-- Gaming Posts --> <div class="post gaming"> <span class="post-category">Gaming</span> <img src="https://images.unsplash.com/photo-1542751371-adc38448a05e?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=80" alt="Gaming post" class="post-img"> <div class="post-content"> <h3>Elden Ring's hidden secrets finally revealed!</h3> <p>Found the secret path to the underground boss that everyone's been searching for...</p> </div> <div class="post-interactions"> <button><i>❤️</i> 247</button> <button><i>💬</i> 38</button> <button><i>🔄</i> 12</button> </div> </div> <div class="post gaming"> <span class="post-category">Gaming</span> <img src="https://images.unsplash.com/photo-1593305841991-05c297ba4575?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=80" alt="Gaming post" class="post-img"> <div class="post-content"> <h3>My Minecraft castle took 30 days to build</h3> <p>Every block placed by hand in survival mode. Check out the throne room!</p> </div> <div class="post-interactions"> <button><i>❤️</i> 189</button> <button><i>💬</i> 42</button> <button><i>🔄</i> 23</button> </div> </div> <!-- Fashion Posts --> <div class="post fashion"> <span class="post-category">Fashion</span> <img src="https://images.unsplash.com/photo-1483985988355-763728e1935b?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=80" alt="Fashion post" class="post-img"> <div class="post-content"> <h3>Y2K is officially back and I'm living for it</h3> <p>Butterfly clips, low-rise jeans, and tiny bags are my entire personality now...</p> </div> <div class="post-interactions"> <button><i>❤️</i> 423</button> <button><i>💬</i> 56</button> <button><i>🔄</i> 78</button> </div> </div> <div class="post fashion"> <span class="post-category">Fashion</span> <img src="https://images.unsplash.com/photo-1509631179647-0177331693ae?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=80" alt="Fashion post" class="post-img"> <div class="post-content"> <h3>Thrifted my entire outfit for under $25</h3> <p>Vintage leather jacket, mom jeans, and these platform boots were such a steal!</p> </div> <div class="post-interactions"> <button><i>❤️</i> 376</button> <button><i>💬</i> 42</button> <button><i>🔄</i> 31</button> </div> </div> <!-- Foodie Posts --> <div class="post foodie"> <span class="post-category">Foodie</span> <img src="https://images.unsplash.com/photo-1565299624946-b28f40a0ae38?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=80" alt="Foodie post" class="post-img"> <div class="post-content"> <h3>Made this Detroit-style pizza from scratch!</h3> <p>That crispy cheese edge is pure magic. Took 3 attempts to get it right...</p> </div> <div class="post-interactions"> <button><i>❤️</i> 512</button> <button><i>💬</i> 89</button> <button><i>🔄</i> 43</button> </div> </div> <div class="post foodie"> <span class="post-category">Foodie</span> <img src="https://images.unsplash.com/photo-1563729784474-d77dbb933a9e?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=80" alt="Foodie post" class="post-img"> <div class="post-content"> <h3>Found the best hidden ramen spot downtown</h3> <p>They only make 50 bowls a day and the broth simmers for 48 hours straight...</p> </div> <div class="post-interactions"> <button><i>❤️</i> 287</button> <button><i>💬</i> 63</button> <button><i>🔄</i> 29</button> </div> </div> <!-- Travel Posts --> <div class="post travel"> <span class="post-category">Travel</span> <img src="https://images.unsplash.com/photo-1502791451862-7bd8c1df43a7?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=80" alt="Travel post" class="post-img"> <div class="post-content"> <h3>Santorini sunset was worth every penny</h3> <p>Hiked to this spot away from the crowds. Just me and this incredible view...</p> </div> <div class="post-interactions"> <button><i>❤️</i> 789</button> <button><i>💬</i> 124</button> <button><i>🔄</i> 97</button> </div> </div> <div class="post travel"> <span class="post-category">Travel</span> <img src="https://images.unsplash.com/photo-1476514525535-07fb3b4ae5f1?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=80" alt="Travel post" class="post-img"> <div class="post-content"> <h3>Roadtripping through national parks for a month</h3> <p>Converted my SUV into a mini camper. Yellowstone was the highlight so far!</p> </div> <div class="post-interactions"> <button><i>❤️</i> 643</button> <button><i>💬</i> 87</button> <button><i>🔄</i> 52</button> </div> </div> <!-- Music Posts --> <div class="post music"> <span class="post-category">Music</span> <img src="https://images.unsplash.com/photo-1511671782779-c97d3d27a1d4?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=80" alt="Music post" class="post-img"> <div class="post-content"> <h3>Found this indie band with only 500 listeners</h3> <p>Their lyrics are so raw and the guitar work is unbelievable. Listen before they blow up!</p> </div> <div class="post-interactions"> <button><i>❤️</i> 321</button> <button><i>💬</i> 48</button> <button><i>🔄</i> 64</button> </div> </div> <div class="post music"> <span class="post-category">Music</span> <img src="https://images.unsplash.com/photo-1514320291840-2e0a9bf2a9ae?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=80" alt="Music post" class="post-img"> <div class="post-content"> <h3>My vinyl collection just hit 200 albums</h3> <p>Finally found that rare Bowie pressing I've been hunting for years!</p> </div> <div class="post-interactions"> <button><i>❤️</i> 278</button> <button><i>💬</i> 39</button> <button><i>🔄</i> 18</button> </div> </div> <!-- Tech Posts --> <div class="post tech"> <span class="post-category">Tech</span> <img src="https://images.unsplash.com/photo-1550745165-9bc0b252726f?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=80" alt="Tech post" class="post-img"> <div class="post-content"> <h3>Finally completed my perfect WFH setup</h3> <p>Ultrawide monitor, mechanical keyboard, and the cable management took hours...</p> </div> <div class="post-interactions"> <button><i>❤️</i> 453</button> <button><i>💬</i> 76</button> <button><i>🔄</i> 42</button> </div> </div> <div class="post tech"> <span class="post-category">Tech</span> <img src="https://images.unsplash.com/photo-1591405351990-4726e331f141?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=80" alt="Tech post" class="post-img"> <div class="post-content"> <h3>Coded my first AI project this weekend</h3> <p>It's an app that identifies plants from photos. GitHub link in comments!</p> </div> <div class="post-interactions"> <button><i>❤️</i> 389</button> <button><i>💬</i> 93</button> <button><i>🔄</i> 67</button> </div> </div> </div> </div> <div class="emoji-indicator">✨</div> <script> document.addEventListener('DOMContentLoaded', function() { const filterBtns = document.querySelectorAll('.filter-btn'); const posts = document.querySelectorAll('.post'); const filterInfo = document.querySelector('.filter-info'); const filterReset = document.querySelector('.filter-reset'); const categoryName = document.getElementById('category-name'); const emojiIndicator = document.querySelector('.emoji-indicator'); // Stagger animation for initial post load posts.forEach((post, index) => { post.style.animationDelay = `${index * 0.1}s`; }); // Show emoji animation when filter button is clicked function showEmojiAnimation(emoji, x, y) { emojiIndicator.textContent = emoji; emojiIndicator.style.left = `${x}px`; emojiIndicator.style.top = `${y}px`; emojiIndicator.style.animation = 'emojiFloat 0.8s forwards'; setTimeout(() => { emojiIndicator.style.animation = ''; }, 800); } // Filter posts based on category filterBtns.forEach(btn => { btn.addEventListener('click', function(e) { const category = this.getAttribute('data-category'); const btnEmoji = this.querySelector('i').textContent; // Show emoji animation const rect = this.getBoundingClientRect(); const x = rect.left + rect.width / 2; const y = rect.top + rect.height / 2; showEmojiAnimation(btnEmoji, x, y); // Reset active state for all buttons filterBtns.forEach(btn => btn.classList.remove('active')); // Set active state for clicked button this.classList.add('active'); // Update filter info filterInfo.classList.add('active'); filterReset.classList.add('active'); if (category === 'all') { categoryName.textContent = 'all categories'; posts.forEach(post => { post.classList.remove('hidden'); post.style.animation = 'fadeIn 0.5s forwards'; }); } else { categoryName.textContent = `the ${category} category`; posts.forEach(post => { if (post.classList.contains(category)) { post.classList.remove('hidden'); post.style.animation = 'fadeIn 0.5s forwards'; } else { post.classList.add('hidden'); } }); } }); }); // Reset filter filterReset.addEventListener('click', function() { filterBtns.forEach(btn => btn.classList.remove('active')); filterInfo.classList.remove('active'); filterReset.classList.remove('active'); posts.forEach(post => { post.classList.remove('hidden'); post.style.animation = 'fadeIn 0.5s forwards'; }); // Show all emoji animation const rect = this.getBoundingClientRect(); const x = rect.left + rect.width / 2; const y = rect.top + rect.height / 2; showEmojiAnimation('✨', x, y); }); // Make interaction buttons functional const interactionBtns = document.querySelectorAll('.post-interactions button'); interactionBtns.forEach(btn => { btn.addEventListener('click', function() { const currentCount = parseInt(this.textContent.match(/\d+/)[0]); const newCount = currentCount + 1; const emoji = this.querySelector('i').textContent; this.innerHTML = `<i>${emoji}</i> ${newCount}`; // Quick animation this.style.transform = 'scale(1.2)'; setTimeout(() => { this.style.transform = 'scale(1)'; }, 200); // Show emoji animation const rect = this.getBoundingClientRect(); const x = rect.left + rect.width / 2; const y = rect.top + rect.height / 2; showEmojiAnimation(emoji, x, y); }); }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Wanderlust Booking Platform</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Poppins', sans-serif; } @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap'); body { background: linear-gradient(135deg, #f6f9fc, #e3eeff); display: flex; justify-content: center; align-items: center; min-height: 700px; overflow: hidden; padding: 20px; } .container { width: 100%; max-width: 650px; border-radius: 24px; background-color: rgba(255, 255, 255, 0.9); backdrop-filter: blur(10px); box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.15); padding: 35px; position: relative; overflow: hidden; transition: all 0.3s ease; } .container::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 8px; background: linear-gradient(90deg, #FF6B6B, #FFD166, #06D6A0, #118AB2); z-index: 2; } .pattern-bg { position: absolute; width: 100%; height: 100%; top: 0; left: 0; background-image: radial-gradient(circle at 10% 20%, rgba(255, 107, 107, 0.05) 0%, transparent 20%), radial-gradient(circle at 80% 30%, rgba(6, 214, 160, 0.05) 0%, transparent 20%), radial-gradient(circle at 40% 70%, rgba(17, 138, 178, 0.05) 0%, transparent 20%), radial-gradient(circle at 90% 90%, rgba(255, 209, 102, 0.05) 0%, transparent 20%); z-index: -1; opacity: 0.7; } h1 { font-size: 28px; font-weight: 700; color: #073B4C; margin-bottom: 10px; position: relative; } .subtitle { font-size: 16px; color: #555; margin-bottom: 30px; } .trip-type-container { display: flex; flex-direction: column; gap: 25px; margin-bottom: 35px; } .section-title { font-size: 18px; font-weight: 600; color: #073B4C; margin-bottom: 5px; } .button-group { display: flex; flex-wrap: wrap; gap: 15px; } .trip-button { flex: 1; min-width: 140px; position: relative; height: 110px; border-radius: 16px; display: flex; flex-direction: column; align-items: center; justify-content: center; cursor: pointer; border: none; background-size: 200% 200%; padding: 15px; transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275); transform-style: preserve-3d; overflow: hidden; } .trip-button::after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.1); border-radius: 16px; transform: translateZ(-1px); transition: all 0.3s ease; opacity: 0; } .trip-button:hover { transform: translateY(-3px) scale(1.02); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.12); } .trip-button:hover::after { opacity: 1; } .trip-button:active { transform: translateY(2px) scale(0.98); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1); } .trip-button.selected { transform: translateY(-3px); box-shadow: 0 12px 24px rgba(0, 0, 0, 0.15); } .flights { background: linear-gradient(135deg, #118AB2, #073B4C); color: white; } .hotels { background: linear-gradient(135deg, #06D6A0, #079A74); color: white; } .cars { background: linear-gradient(135deg, #FFD166, #F8A100); color: white; } .experiences { background: linear-gradient(135deg, #FF6B6B, #BF0F30); color: white; } .icon { font-size: 28px; margin-bottom: 10px; transition: transform 0.5s ease; } .trip-button:hover .icon { transform: translateY(-5px); } .trip-button.selected .icon { animation: pulse 1.5s infinite; } @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.1); } 100% { transform: scale(1); } } .button-text { font-weight: 500; font-size: 15px; text-align: center; } .selected-badge { position: absolute; top: 10px; right: 10px; background: rgba(255, 255, 255, 0.9); color: #073B4C; border-radius: 50%; width: 22px; height: 22px; display: flex; align-items: center; justify-content: center; font-size: 12px; opacity: 0; transform: scale(0); transition: all 0.3s ease; } .trip-button.selected .selected-badge { opacity: 1; transform: scale(1); } .search-section { margin-top: 15px; } .destination-input { position: relative; display: flex; align-items: center; background: #f6f9fc; border-radius: 12px; padding: 5px; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.05); margin-bottom: 25px; } .destination-icon { padding: 10px; color: #073B4C; font-size: 20px; } input { flex: 1; border: none; background: transparent; padding: 15px 10px; font-size: 16px; color: #333; outline: none; } input::placeholder { color: #999; } .explore-btn { background: linear-gradient(90deg, #118AB2, #073B4C); color: white; border: none; border-radius: 12px; padding: 16px 30px; font-size: 16px; font-weight: 600; cursor: pointer; transition: all 0.3s ease; width: 100%; box-shadow: 0 4px 15px rgba(17, 138, 178, 0.3); } .explore-btn:hover { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(17, 138, 178, 0.4); } .explore-btn:active { transform: translateY(1px); } @media (max-width: 600px) { .container { padding: 25px 20px; } .button-group { flex-direction: column; gap: 12px; } .trip-button { height: 90px; min-width: auto; width: 100%; } h1 { font-size: 24px; } .subtitle { font-size: 14px; margin-bottom: 20px; } } .floating-elements { position: absolute; width: 100%; height: 100%; top: 0; left: 0; pointer-events: none; z-index: -1; } .float-element { position: absolute; opacity: 0.1; border-radius: 50%; filter: blur(1px); animation: float 15s infinite linear; } @keyframes float { 0% { transform: translateY(0) rotate(0deg); } 50% { transform: translateY(-20px) rotate(180deg); } 100% { transform: translateY(0) rotate(360deg); } } </style> </head> <body> <div class="container"> <div class="pattern-bg"></div> <div class="floating-elements"> <div class="float-element" style="background: #FF6B6B; width: 15px; height: 15px; top: 20%; left: 85%; animation-duration: 20s;"></div> <div class="float-element" style="background: #06D6A0; width: 20px; height: 20px; top: 70%; left: 15%; animation-duration: 18s;"></div> <div class="float-element" style="background: #118AB2; width: 18px; height: 18px; top: 40%; left: 80%; animation-duration: 25s;"></div> <div class="float-element" style="background: #FFD166; width: 12px; height: 12px; top: 85%; left: 70%; animation-duration: 22s;"></div> </div> <h1>Discover Your Next Adventure</h1> <p class="subtitle">Select your journey type and explore endless possibilities</p> <div class="trip-type-container"> <div class="section-title">How would you like to travel?</div> <div class="button-group"> <button class="trip-button flights" data-type="flights"> <div class="icon">✈️</div> <div class="button-text">Flights</div> <div class="selected-badge">✓</div> </button> <button class="trip-button hotels" data-type="hotels"> <div class="icon">🏨</div> <div class="button-text">Hotels</div> <div class="selected-badge">✓</div> </button> <button class="trip-button cars" data-type="cars"> <div class="icon">🚗</div> <div class="button-text">Car Rentals</div> <div class="selected-badge">✓</div> </button> <button class="trip-button experiences" data-type="experiences"> <div class="icon">🌄</div> <div class="button-text">Experiences</div> <div class="selected-badge">✓</div> </button> </div> </div> <div class="search-section"> <div class="destination-input"> <div class="destination-icon">🔍</div> <input type="text" placeholder="Where do you want to go?" id="destination"> </div> <button class="explore-btn">Find Your Adventure</button> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const tripButtons = document.querySelectorAll('.trip-button'); const selectedOptions = {}; // Add click event to trip type buttons tripButtons.forEach(button => { button.addEventListener('click', function() { const tripType = this.getAttribute('data-type'); // Toggle selected state this.classList.toggle('selected'); // Update selected options if (this.classList.contains('selected')) { selectedOptions[tripType] = true; // Add subtle bounce animation this.animate([ { transform: 'scale(1)' }, { transform: 'scale(1.05)' }, { transform: 'scale(1)' } ], { duration: 400, easing: 'cubic-bezier(0.175, 0.885, 0.32, 1.275)' }); } else { delete selectedOptions[tripType]; } updateButtonStates(); }); // Add hover effects button.addEventListener('mouseenter', function() { const icon = this.querySelector('.icon'); icon.animate([ { transform: 'translateY(0)' }, { transform: 'translateY(-5px)' }, { transform: 'translateY(0)' } ], { duration: 800, easing: 'ease-in-out' }); }); }); // Explore button interaction const exploreBtn = document.querySelector('.explore-btn'); exploreBtn.addEventListener('click', function() { // Get selected trip types const selectedTypes = Object.keys(selectedOptions); // Get destination const destination = document.getElementById('destination').value; if (selectedTypes.length === 0) { // Create a notification if no trip type is selected showNotification('Please select at least one trip type'); return; } if (!destination) { // Create a notification if no destination is entered showNotification('Please enter a destination'); return; } // Show success message (in a real app, this would submit the form) showNotification(`Searching for ${selectedTypes.join(', ')} in ${destination}`, 'success'); // Add success animation to the button this.classList.add('success'); setTimeout(() => { this.classList.remove('success'); }, 2000); }); // Function to update button states function updateButtonStates() { tripButtons.forEach(button => { const type = button.getAttribute('data-type'); const isSelected = selectedOptions[type] ? true : false; if (isSelected) { button.setAttribute('aria-pressed', 'true'); } else { button.setAttribute('aria-pressed', 'false'); } }); } // Function to show notifications function showNotification(message, type = 'error') { // Create notification element const notification = document.createElement('div'); notification.className = `notification ${type}`; notification.textContent = message; notification.style.position = 'fixed'; notification.style.bottom = '20px'; notification.style.left = '50%'; notification.style.transform = 'translateX(-50%)'; notification.style.backgroundColor = type === 'error' ? '#FF6B6B' : '#06D6A0'; notification.style.color = 'white'; notification.style.padding = '12px 20px'; notification.style.borderRadius = '8px'; notification.style.boxShadow = '0 4px 12px rgba(0,0,0,0.15)'; notification.style.zIndex = '1000'; notification.style.opacity = '0'; notification.style.transition = 'opacity 0.3s ease'; // Add to body document.body.appendChild(notification); // Animate in setTimeout(() => { notification.style.opacity = '1'; }, 10); // Remove after delay setTimeout(() => { notification.style.opacity = '0'; setTimeout(() => { document.body.removeChild(notification); }, 300); }, 3000); } // Simulate selecting the Flights button by default setTimeout(() => { tripButtons[0].click(); }, 500); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Academic Course Navigator</title> <style> @import url('https://fonts.googleapis.com/css2?family=Libre+Baskerville:ital,wght@0,400;0,700;1,400&family=Lora:ital,wght@0,400;0,500;0,600;0,700;1,400&display=swap'); * { margin: 0; padding: 0; box-sizing: border-box; } :root { --primary: #3a5a75; --primary-light: #4e7296; --secondary: #be8c60; --secondary-light: #daa980; --neutral-dark: #2c3e50; --neutral-medium: #6c7b8a; --neutral-light: #ecf0f1; --white: #ffffff; --border-radius: 4px; --transition-speed: 0.3s; --shadow: 0 2px 8px rgba(44, 62, 80, 0.1); --shadow-hover: 0 4px 12px rgba(44, 62, 80, 0.15); } body { font-family: 'Lora', serif; background-color: var(--neutral-light); color: var(--neutral-dark); display: flex; justify-content: center; align-items: center; min-height: 100vh; padding: 20px; } .education-portal { width: 100%; max-width: 700px; background-color: var(--white); border-radius: 8px; box-shadow: var(--shadow); overflow: hidden; display: flex; flex-direction: column; position: relative; } .portal-header { background-color: var(--primary); padding: 24px 30px; position: relative; overflow: hidden; } .portal-title { font-family: 'Libre Baskerville', serif; color: var(--white); font-size: 1.8rem; font-weight: 700; margin-bottom: 8px; position: relative; z-index: 2; } .portal-subtitle { font-family: 'Lora', serif; color: rgba(255, 255, 255, 0.85); font-size: 0.95rem; font-style: italic; position: relative; z-index: 2; } .portal-pattern { position: absolute; top: 0; right: 0; width: 180px; height: 100%; background: linear-gradient(135deg, transparent 25%, rgba(255, 255, 255, 0.05) 25%, rgba(255, 255, 255, 0.05) 50%, transparent 50%, transparent 75%, rgba(255, 255, 255, 0.05) 75%); background-size: 20px 20px; opacity: 0.3; } .subject-navigation { display: flex; padding: 0 30px; border-bottom: 1px solid rgba(108, 123, 138, 0.2); overflow-x: auto; scrollbar-width: none; background-color: var(--white); position: sticky; top: 0; z-index: 10; } .subject-navigation::-webkit-scrollbar { display: none; } .subject-btn { font-family: 'Libre Baskerville', serif; font-size: 0.9rem; color: var(--neutral-medium); padding: 18px 0; margin-right: 24px; background: none; border: none; cursor: pointer; position: relative; white-space: nowrap; transition: color var(--transition-speed); } .subject-btn:hover { color: var(--primary); } .subject-btn.active { color: var(--primary); font-weight: 700; } .subject-btn::after { content: ''; position: absolute; bottom: 0; left: 0; width: 0; height: 3px; background-color: var(--primary); transition: width var(--transition-speed) ease-in-out; } .subject-btn.active::after { width: 100%; } .subject-btn:focus { outline: none; } .module-container { padding: 30px; display: none; opacity: 0; transform: translateY(10px); transition: opacity var(--transition-speed), transform var(--transition-speed); } .module-container.active { display: block; opacity: 1; transform: translateY(0); } .module-wrapper { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 16px; margin-top: 16px; } .module-card { background-color: var(--neutral-light); border-radius: var(--border-radius); overflow: hidden; transition: transform var(--transition-speed), box-shadow var(--transition-speed); cursor: pointer; position: relative; } .module-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-hover); } .module-card:hover .module-progress-bar .fill { animation: pulse 1.5s infinite; } @keyframes pulse { 0% { opacity: 0.7; } 50% { opacity: 1; } 100% { opacity: 0.7; } } .module-header { padding: 16px; position: relative; } .module-number { font-family: 'Libre Baskerville', serif; font-size: 0.75rem; font-weight: 400; color: var(--primary); margin-bottom: 5px; } .module-title { font-family: 'Libre Baskerville', serif; font-size: 1rem; font-weight: 700; color: var(--neutral-dark); margin-bottom: 10px; } .module-desc { font-size: 0.85rem; color: var(--neutral-medium); line-height: 1.4; margin-bottom: 12px; } .module-progress { display: flex; align-items: center; justify-content: space-between; font-size: 0.75rem; color: var(--neutral-medium); } .module-progress-bar { height: 4px; background-color: rgba(0, 0, 0, 0.05); width: 100%; margin-top: 8px; border-radius: 2px; overflow: hidden; } .module-progress-bar .fill { height: 100%; background-color: var(--secondary); border-radius: 2px; transition: width 0.5s ease-out; } .module-marker { width: 24px; height: 24px; position: absolute; top: 12px; right: 12px; border-radius: 50%; display: flex; align-items: center; justify-content: center; } .module-marker.new { background-color: rgba(62, 142, 208, 0.1); } .module-marker.new::before { content: 'NEW'; font-size: 0.6rem; font-weight: 700; color: var(--primary); } .module-marker.completed { background-color: rgba(39, 174, 96, 0.1); } .module-marker.completed::before { content: '✓'; font-size: 0.8rem; font-weight: 700; color: #27ae60; } .no-modules { text-align: center; padding: 40px 0; color: var(--neutral-medium); font-style: italic; } .welcome-message { padding: 40px 30px; text-align: center; display: flex; flex-direction: column; align-items: center; justify-content: center; } .welcome-title { font-family: 'Libre Baskerville', serif; font-size: 1.5rem; margin-bottom: 16px; color: var(--primary); } .welcome-text { font-size: 1rem; line-height: 1.6; max-width: 480px; margin-bottom: 24px; color: var(--neutral-medium); } .welcome-icon { width: 100px; height: 100px; margin-bottom: 20px; display: flex; align-items: center; justify-content: center; background-color: rgba(62, 142, 208, 0.1); border-radius: 50%; } .welcome-icon svg { width: 50px; height: 50px; fill: var(--primary); } .get-started-btn { background-color: var(--primary); color: white; border: none; padding: 12px 24px; border-radius: var(--border-radius); font-family: 'Lora', serif; font-size: 0.9rem; cursor: pointer; transition: background-color var(--transition-speed); margin-top: 10px; } .get-started-btn:hover { background-color: var(--primary-light); } @media (max-width: 600px) { .portal-header { padding: 20px; } .portal-title { font-size: 1.5rem; } .subject-navigation { padding: 0 20px; } .subject-btn { padding: 15px 0; margin-right: 18px; font-size: 0.85rem; } .module-container { padding: 20px; } .module-wrapper { grid-template-columns: 1fr; } } /* Tooltip styles */ .tooltip { position: absolute; background-color: var(--neutral-dark); color: white; padding: 6px 12px; border-radius: 4px; font-size: 0.75rem; bottom: -30px; left: 50%; transform: translateX(-50%); opacity: 0; visibility: hidden; transition: opacity 0.2s, visibility 0.2s; z-index: 100; pointer-events: none; white-space: nowrap; } .tooltip::before { content: ''; position: absolute; top: -5px; left: 50%; transform: translateX(-50%); border-width: 0 5px 5px 5px; border-style: solid; border-color: transparent transparent var(--neutral-dark) transparent; } .module-card:hover .tooltip { opacity: 1; visibility: visible; bottom: -36px; } </style> </head> <body> <div class="education-portal"> <div class="portal-header"> <h1 class="portal-title">Cambridge Academic Portal</h1> <p class="portal-subtitle">A gateway to knowledge across disciplines</p> <div class="portal-pattern"></div> </div> <div class="subject-navigation"> <button class="subject-btn active" data-subject="mathematics">Mathematics</button> <button class="subject-btn" data-subject="literature">Literature</button> <button class="subject-btn" data-subject="sciences">Natural Sciences</button> <button class="subject-btn" data-subject="history">History & Classics</button> <button class="subject-btn" data-subject="philosophy">Philosophy</button> <button class="subject-btn" data-subject="languages">Languages</button> </div> <div id="welcome-screen" class="welcome-message"> <div class="welcome-icon"> <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <path d="M12 3L1 9L5 11.18V17.18L12 21L19 17.18V11.18L21 10.09V17H23V9L12 3ZM18.82 9L12 12.72L5.18 9L12 5.28L18.82 9ZM17 15.99L12 18.72L7 15.99V12.27L12 15L17 12.27V15.99Z"/> </svg> </div> <h2 class="welcome-title">Welcome to Your Academic Journey</h2> <p class="welcome-text">Explore our curated modules across various disciplines. Track your progress, discover new content, and deepen your understanding through our carefully structured learning paths.</p> <button class="get-started-btn">Begin Exploring</button> </div> <div id="mathematics" class="module-container active"> <div class="module-wrapper"> <div class="module-card"> <div class="module-header"> <div class="module-number">Module 1</div> <h3 class="module-title">Foundations of Calculus</h3> <p class="module-desc">Explore limits, continuity, and the fundamental theorem of calculus.</p> <div class="module-progress"> <span>Progress: 75%</span> </div> <div class="module-progress-bar"> <div class="fill" style="width: 75%"></div> </div> </div> <div class="tooltip">Continue where you left off</div> </div> <div class="module-card"> <div class="module-header"> <div class="module-number">Module 2</div> <h3 class="module-title">Linear Algebra</h3> <p class="module-desc">Vector spaces, linear transformations, and eigenvalue problems.</p> <div class="module-progress"> <span>Progress: 30%</span> </div> <div class="module-progress-bar"> <div class="fill" style="width: 30%"></div> </div> </div> <div class="tooltip">Continue where you left off</div> </div> <div class="module-card"> <div class="module-header"> <div class="module-number">Module 3</div> <h3 class="module-title">Number Theory</h3> <p class="module-desc">Prime numbers, congruences, and Diophantine equations.</p> <div class="module-progress"> <span>Progress: 0%</span> </div> <div class="module-progress-bar"> <div class="fill" style="width: 0%"></div> </div> <div class="module-marker new"></div> </div> <div class="tooltip">Start this module</div> </div> <div class="module-card"> <div class="module-header"> <div class="module-number">Module 4</div> <h3 class="module-title">Differential Equations</h3> <p class="module-desc">Solving ODEs, PDEs, and applications in physics.</p> <div class="module-progress"> <span>Completed</span> </div> <div class="module-progress-bar"> <div class="fill" style="width: 100%"></div> </div> <div class="module-marker completed"></div> </div> <div class="tooltip">Review completed module</div> </div> </div> </div> <div id="literature" class="module-container"> <div class="module-wrapper"> <div class="module-card"> <div class="module-header"> <div class="module-number">Module 1</div> <h3 class="module-title">Victorian Literature</h3> <p class="module-desc">Dickens, Eliot, and the social context of 19th century fiction.</p> <div class="module-progress"> <span>Progress: 50%</span> </div> <div class="module-progress-bar"> <div class="fill" style="width: 50%"></div> </div> </div> <div class="tooltip">Continue where you left off</div> </div> <div class="module-card"> <div class="module-header"> <div class="module-number">Module 2</div> <h3 class="module-title">Modernist Poetry</h3> <p class="module-desc">Eliot, Pound, and the revolution in poetic form.</p> <div class="module-progress"> <span>Progress: 20%</span> </div> <div class="module-progress-bar"> <div class="fill" style="width: 20%"></div> </div> </div> <div class="tooltip">Continue where you left off</div> </div> <div class="module-card"> <div class="module-header"> <div class="module-number">Module 3</div> <h3 class="module-title">Shakespeare's Tragedies</h3> <p class="module-desc">Critical analysis of Hamlet, Macbeth, and King Lear.</p> <div class="module-progress"> <span>Completed</span> </div> <div class="module-progress-bar"> <div class="fill" style="width: 100%"></div> </div> <div class="module-marker completed"></div> </div> <div class="tooltip">Review completed module</div> </div> </div> </div> <div id="sciences" class="module-container"> <div class="module-wrapper"> <div class="module-card"> <div class="module-header"> <div class="module-number">Module 1</div> <h3 class="module-title">Quantum Mechanics</h3> <p class="module-desc">Wave functions, Schrödinger equation, and quantum phenomena.</p> <div class="module-progress"> <span>Progress: 65%</span> </div> <div class="module-progress-bar"> <div class="fill" style="width: 65%"></div> </div> </div> <div class="tooltip">Continue where you left off</div> </div> <div class="module-card"> <div class="module-header"> <div class="module-number">Module 2</div> <h3 class="module-title">Evolutionary Biology</h3> <p class="module-desc">Natural selection, genetics, and the modern synthesis.</p> <div class="module-progress"> <span>Progress: 90%</span> </div> <div class="module-progress-bar"> <div class="fill" style="width: 90%"></div> </div> </div> <div class="tooltip">Complete this module</div> </div> <div class="module-card"> <div class="module-header"> <div class="module-number">Module 3</div> <h3 class="module-title">Organic Chemistry</h3> <p class="module-desc">Carbon compounds, reactions, and laboratory techniques.</p> <div class="module-progress"> <span>Progress: 0%</span> </div> <div class="module-progress-bar"> <div class="fill" style="width: 0%"></div> </div> <div class="module-marker new"></div> </div> <div class="tooltip">Start this module</div> </div> </div> </div> <div id="history" class="module-container"> <div class="module-wrapper"> <div class="module-card"> <div class="module-header"> <div class="module-number">Module 1</div> <h3 class="module-title">Ancient Rome</h3> <p class="module-desc">The Republic, the Empire, and Roman cultural legacy.</p> <div class="module-progress"> <span>Progress: 80%</span> </div> <div class="module-progress-bar"> <div class="fill" style="width: 80%"></div> </div> </div> <div class="tooltip">Continue where you left off</div> </div> <div class="module-card"> <div class="module-header"> <div class="module-number">Module 2</div> <h3 class="module-title">Medieval Europe</h3> <p class="module-desc">Feudalism, the Church, and urban life from 500-1500 CE.</p> <div class="module-progress"> <span>Progress: 25%</span> </div> <div class="module-progress-bar"> <div class="fill" style="width: 25%"></div> </div> </div> <div class="tooltip">Continue where you left off</div> </div> </div> </div> <div id="philosophy" class="module-container"> <div class="module-wrapper"> <div class="module-card"> <div class="module-header"> <div class="module-number">Module 1</div> <h3 class="module-title">Ancient Philosophy</h3> <p class="module-desc">Socrates, Plato, Aristotle, and the foundations of Western thought.</p> <div class="module-progress"> <span>Completed</span> </div> <div class="module-progress-bar"> <div class="fill" style="width: 100%"></div> </div> <div class="module-marker completed"></div> </div> <div class="tooltip">Review completed module</div> </div> <div class="module-card"> <div class="module-header"> <div class="module-number">Module 2</div> <h3 class="module-title">Ethics</h3> <p class="module-desc">Normative theories, metaethics, and applied ethical problems.</p> <div class="module-progress"> <span>Progress: 45%</span> </div> <div class="module-progress-bar"> <div class="fill" style="width: 45%"></div> </div> </div> <div class="tooltip">Continue where you left off</div> </div> <div class="module-card"> <div class="module-header"> <div class="module-number">Module 3</div> <h3 class="module-title">Logic</h3> <p class="module-desc">Formal systems, propositional and predicate calculus.</p> <div class="module-progress"> <span>Progress: 0%</span> </div> <div class="module-progress-bar"> <div class="fill" style="width: 0%"></div> </div> <div class="module-marker new"></div> </div> <div class="tooltip">Start this module</div> </div> </div> </div> <div id="languages" class="module-container"> <div class="module-wrapper"> <div class="module-card"> <div class="module-header"> <div class="module-number">Module 1</div> <h3 class="module-title">Latin: Foundations</h3> <p class="module-desc">Grammar, vocabulary, and reading Classical texts.</p> <div class="module-progress"> <span>Progress: 70%</span> </div> <div class="module-progress-bar"> <div class="fill" style="width: 70%"></div> </div> </div> <div class="tooltip">Continue where you left off</div> </div> <div class="module-card"> <div class="module-header"> <div class="module-number">Module 2</div> <h3 class="module-title">Ancient Greek</h3> <p class="module-desc">Alphabet, grammar, and Homer's Iliad in the original.</p> <div class="module-progress"> <span>Progress: 35%</span> </div> <div class="module-progress-bar"> <div class="fill" style="width: 35%"></div> </div> </div> <div class="tooltip">Continue where you left off</div> </div> <div class="module-card"> <div class="module-header"> <div class="module-number">Module 3</div> <h3 class="module-title">Sanskrit</h3> <p class="module-desc">Devanagari script, vocabulary, and early philosophical texts.</p> <div class="module-progress"> <span>Progress: 0%</span> </div> <div class="module-progress-bar"> <div class="fill" style="width: 0%"></div> </div> <div class="module-marker new"></div> </div> <div class="tooltip">Start this module</div> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Variables const subjectButtons = document.querySelectorAll('.subject-btn'); const moduleContainers = document.querySelectorAll('.module-container'); const welcomeScreen = document.getElementById('welcome-screen'); const getStartedBtn = document.querySelector('.get-started-btn'); // Hide welcome screen and show Mathematics modules on startup setTimeout(() => { welcomeScreen.style.display = 'none'; document.getElementById('mathematics').classList.add('active'); }, 1500); // Get Started button click getStartedBtn.addEventListener('click', function() { welcomeScreen.style.display = 'none'; document.getElementById('mathematics').classList.add('active'); }); // Subject button click handling subjectButtons.forEach(button => { button.addEventListener('click', function() { // Remove active class from all buttons subjectButtons.forEach(btn => { btn.classList.remove('active'); }); // Add active class to clicked button this.classList.add('active'); // Hide all module containers moduleContainers.forEach(container => { container.classList.remove('active'); }); // Show corresponding module container const subject = this.getAttribute('data-subject'); const targetContainer = document.getElementById(subject); // Hide welcome screen if visible welcomeScreen.style.display = 'none'; // Delay showing new container slightly for animation setTimeout(() => { targetContainer.classList.add('active'); }, 50); }); }); // Module card click handling const moduleCards = document.querySelectorAll('.module-card'); moduleCards.forEach(card => { card.addEventListener('click', function() { // Add pulse animation to the clicked card this.classList.add('pulse'); // Remove pulse class after animation completes setTimeout(() => { this.classList.remove('pulse'); }, 300); // Find progress bar of clicked module const progressBar = this.querySelector('.fill'); const progressText = this.querySelector('.module-progress span'); const isCompleted = progressBar.style.width === '100%'; const isNew = progressBar.style.width === '0%'; // If not completed, increment progress slightly if (!isCompleted && !isNew) { const currentWidth = parseInt(progressBar.style.width, 10); const newWidth = Math.min(currentWidth + 5, 100); progressBar.style.width = newWidth + '%'; // Update progress text if (newWidth === 100) { progressText.textContent = 'Completed'; // Add completed marker if (!this.querySelector('.module-marker.completed')) { const marker = document.createElement('div'); marker.className = 'module-marker completed'; this.querySelector('.module-header').appendChild(marker); // Remove new marker if exists const newMarker = this.querySelector('.module-marker.new'); if (newMarker) newMarker.remove(); } } else { progressText.textContent = `Progress: ${newWidth}%`; } } else if (isNew) { // Start the module progressBar.style.width = '5%'; progressText.textContent = 'Progress: 5%'; // Remove new marker const newMarker = this.querySelector('.module-marker.new'); if (newMarker) newMarker.remove(); } }); }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Admin Control Panel</title> <style> :root { --bg-dark: #121418; --bg-panel: #1a1d23; --text-primary: #ffffff; --text-secondary: #9ba4b4; --accent-blue: #00b8ff; --accent-purple: #a359ff; --accent-green: #00ff9d; --accent-red: #ff5370; --transition-speed: 0.3s; --border-radius: 12px; } * { 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 { background-color: var(--bg-dark); color: var(--text-primary); height: 100vh; display: flex; flex-direction: column; justify-content: center; align-items: center; overflow: hidden; } .container { width: 700px; max-width: 100%; height: 700px; max-height: 100%; background-color: var(--bg-panel); border-radius: var(--border-radius); box-shadow: 0 15px 35px rgba(0, 0, 0, 0.3); display: flex; flex-direction: column; padding: 24px; position: relative; overflow: hidden; } .container::after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: radial-gradient(circle at top right, rgba(163, 89, 255, 0.05), transparent 60%), radial-gradient(circle at bottom left, rgba(0, 184, 255, 0.05), transparent 60%); pointer-events: none; } .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 32px; } .header h1 { font-size: 28px; font-weight: 700; background: linear-gradient(to right, var(--accent-blue), var(--accent-purple)); -webkit-background-clip: text; background-clip: text; color: transparent; letter-spacing: -0.5px; } .user-profile { display: flex; align-items: center; gap: 12px; } .avatar { width: 42px; height: 42px; border-radius: 50%; background: linear-gradient(135deg, var(--accent-blue), var(--accent-purple)); display: flex; align-items: center; justify-content: center; font-weight: 700; color: var(--text-primary); font-size: 16px; } .user-info { display: flex; flex-direction: column; } .user-name { font-weight: 600; font-size: 15px; } .user-role { color: var(--text-secondary); font-size: 13px; } .control-groups { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 24px; margin-bottom: 24px; } .control-group { background-color: rgba(26, 29, 35, 0.7); border-radius: var(--border-radius); border: 1px solid rgba(255, 255, 255, 0.05); padding: 20px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); transition: transform var(--transition-speed), box-shadow var(--transition-speed); } .control-group:hover { transform: translateY(-4px); box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15); } .group-header { display: flex; align-items: center; margin-bottom: 16px; } .group-icon { width: 36px; height: 36px; display: flex; align-items: center; justify-content: center; border-radius: 8px; margin-right: 12px; } .security .group-icon { background-color: rgba(163, 89, 255, 0.15); color: var(--accent-purple); } .performance .group-icon { background-color: rgba(0, 184, 255, 0.15); color: var(--accent-blue); } .notifications .group-icon { background-color: rgba(0, 255, 157, 0.15); color: var(--accent-green); } .data .group-icon { background-color: rgba(255, 83, 112, 0.15); color: var(--accent-red); } .group-title { font-size: 18px; font-weight: 600; } .toggle-buttons { display: flex; flex-direction: column; gap: 12px; } .toggle-button { display: flex; align-items: center; justify-content: space-between; padding: 12px 16px; background-color: rgba(16, 18, 22, 0.5); border-radius: 10px; cursor: pointer; transition: background-color var(--transition-speed); border: 1px solid rgba(255, 255, 255, 0.03); } .toggle-button:hover { background-color: rgba(26, 29, 35, 0.7); } .toggle-button:focus-visible { outline: 2px solid var(--accent-blue); outline-offset: 1px; } .toggle-button.keyboard-focus { outline: 2px solid var(--accent-blue); outline-offset: 1px; } .toggle-label { font-size: 14px; font-weight: 500; } .toggle-description { color: var(--text-secondary); font-size: 12px; margin-top: 2px; } .toggle-switch { position: relative; width: 46px; height: 24px; border-radius: 24px; background-color: rgba(255, 255, 255, 0.1); transition: background-color var(--transition-speed); } .toggle-switch::after { content: ''; position: absolute; width: 18px; height: 18px; border-radius: 50%; background-color: var(--text-primary); top: 3px; left: 3px; transition: transform var(--transition-speed), background-color var(--transition-speed); } .toggle-button[aria-checked="true"] .toggle-switch { background-color: var(--accent-blue); } .security .toggle-button[aria-checked="true"] .toggle-switch { background-color: var(--accent-purple); } .performance .toggle-button[aria-checked="true"] .toggle-switch { background-color: var(--accent-blue); } .notifications .toggle-button[aria-checked="true"] .toggle-switch { background-color: var(--accent-green); } .data .toggle-button[aria-checked="true"] .toggle-switch { background-color: var(--accent-red); } .toggle-button[aria-checked="true"] .toggle-switch::after { transform: translateX(22px); } .status-bar { margin-top: auto; display: flex; align-items: center; justify-content: space-between; padding: 16px 20px; background-color: rgba(16, 18, 22, 0.5); border-radius: var(--border-radius); border: 1px solid rgba(255, 255, 255, 0.05); } .status-indicator { display: flex; align-items: center; gap: 8px; } .status-dot { width: 10px; height: 10px; border-radius: 50%; background-color: var(--accent-green); position: relative; display: inline-block; } .status-dot::after { content: ''; position: absolute; width: 10px; height: 10px; border-radius: 50%; background-color: var(--accent-green); animation: pulse 1.5s infinite; } @keyframes pulse { 0% { transform: scale(1); opacity: 0.7; } 70% { transform: scale(2); opacity: 0; } 100% { transform: scale(1); opacity: 0; } } .status-text { font-size: 14px; color: var(--text-secondary); } .system-metrics { display: flex; gap: 16px; } .metric { display: flex; align-items: center; gap: 8px; } .metric-value { font-size: 14px; font-weight: 600; } .metric-label { font-size: 13px; color: var(--text-secondary); } .tooltip { position: fixed; background-color: rgba(26, 29, 35, 0.95); padding: 8px 12px; border-radius: 6px; font-size: 13px; pointer-events: none; opacity: 0; transition: opacity 0.2s; z-index: 1000; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); border: 1px solid rgba(255, 255, 255, 0.1); max-width: 250px; } @media (max-width: 700px) { .container { height: auto; min-height: 100vh; border-radius: 0; } .control-groups { grid-template-columns: 1fr; } .header { flex-direction: column; align-items: flex-start; gap: 16px; } .status-bar { flex-direction: column; align-items: flex-start; gap: 12px; } .system-metrics { width: 100%; justify-content: space-between; } } </style> </head> <body> <div class="container"> <div class="header"> <h1>System Control Hub</h1> <div class="user-profile"> <div class="avatar">AM</div> <div class="user-info"> <span class="user-name">Admin Mode</span> <span class="user-role">System Administrator</span> </div> </div> </div> <div class="control-groups"> <div class="control-group security"> <div class="group-header"> <div class="group-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect> <path d="M7 11V7a5 5 0 0 1 10 0v4"></path> </svg> </div> <h2 class="group-title">Security</h2> </div> <div class="toggle-buttons"> <div class="toggle-button" role="switch" aria-checked="true" tabindex="0" data-tooltip="Enable two-factor authentication for all admin accounts"> <div class="toggle-info"> <div class="toggle-label">Two-Factor Auth</div> <div class="toggle-description">Require 2FA for admin logins</div> </div> <div class="toggle-switch"></div> </div> <div class="toggle-button" role="switch" aria-checked="false" tabindex="0" data-tooltip="Auto-lock inactive sessions after the timeout period"> <div class="toggle-info"> <div class="toggle-label">Auto-Lock Sessions</div> <div class="toggle-description">Lock after 10 min inactivity</div> </div> <div class="toggle-switch"></div> </div> <div class="toggle-button" role="switch" aria-checked="true" tabindex="0" data-tooltip="Block suspicious login attempts based on IP geolocation and behavior patterns"> <div class="toggle-info"> <div class="toggle-label">Intrusion Detection</div> <div class="toggle-description">Block suspicious activity</div> </div> <div class="toggle-switch"></div> </div> </div> </div> <div class="control-group performance"> <div class="group-header"> <div class="group-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M22 12h-4l-3 9L9 3l-3 9H2"></path> </svg> </div> <h2 class="group-title">Performance</h2> </div> <div class="toggle-buttons"> <div class="toggle-button" role="switch" aria-checked="true" tabindex="0" data-tooltip="Utilize edge caching to improve load times by 60%"> <div class="toggle-info"> <div class="toggle-label">Edge Caching</div> <div class="toggle-description">Optimize content delivery</div> </div> <div class="toggle-switch"></div> </div> <div class="toggle-button" role="switch" aria-checked="false" tabindex="0" data-tooltip="Automatically scale resources based on current system load"> <div class="toggle-info"> <div class="toggle-label">Auto-Scaling</div> <div class="toggle-description">Scale resources on demand</div> </div> <div class="toggle-switch"></div> </div> <div class="toggle-button" role="switch" aria-checked="true" tabindex="0" data-tooltip="Compress API responses to reduce bandwidth usage"> <div class="toggle-info"> <div class="toggle-label">API Compression</div> <div class="toggle-description">Reduce network payload</div> </div> <div class="toggle-switch"></div> </div> </div> </div> <div class="control-group notifications"> <div class="group-header"> <div class="group-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"></path> <path d="M13.73 21a2 2 0 0 1-3.46 0"></path> </svg> </div> <h2 class="group-title">Notifications</h2> </div> <div class="toggle-buttons"> <div class="toggle-button" role="switch" aria-checked="true" tabindex="0" data-tooltip="Receive critical alerts via SMS and email"> <div class="toggle-info"> <div class="toggle-label">Critical Alerts</div> <div class="toggle-description">Security & downtime events</div> </div> <div class="toggle-switch"></div> </div> <div class="toggle-button" role="switch" aria-checked="false" tabindex="0" data-tooltip="Receive weekly system performance reports"> <div class="toggle-info"> <div class="toggle-label">Performance Reports</div> <div class="toggle-description">Weekly summary emails</div> </div> <div class="toggle-switch"></div> </div> <div class="toggle-button" role="switch" aria-checked="true" tabindex="0" data-tooltip="Get notifications about new admin login sessions"> <div class="toggle-info"> <div class="toggle-label">Login Alerts</div> <div class="toggle-description">New session notifications</div> </div> <div class="toggle-switch"></div> </div> </div> </div> <div class="control-group data"> <div class="group-header"> <div class="group-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <ellipse cx="12" cy="5" rx="9" ry="3"></ellipse> <path d="M21 12c0 1.66-4 3-9 3s-9-1.34-9-3"></path> <path d="M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"></path> </svg> </div> <h2 class="group-title">Data Management</h2> </div> <div class="toggle-buttons"> <div class="toggle-button" role="switch" aria-checked="true" tabindex="0" data-tooltip="Automatically backup system data every 24 hours"> <div class="toggle-info"> <div class="toggle-label">Auto Backups</div> <div class="toggle-description">Daily secure snapshots</div> </div> <div class="toggle-switch"></div> </div> <div class="toggle-button" role="switch" aria-checked="false" tabindex="0" data-tooltip="Encrypt all stored data with AES-256 encryption"> <div class="toggle-info"> <div class="toggle-label">Data Encryption</div> <div class="toggle-description">AES-256 for stored data</div> </div> <div class="toggle-switch"></div> </div> <div class="toggle-button" role="switch" aria-checked="true" tabindex="0" data-tooltip="Keep detailed logs of all system operations"> <div class="toggle-info"> <div class="toggle-label">Audit Logging</div> <div class="toggle-description">Track all system changes</div> </div> <div class="toggle-switch"></div> </div> </div> </div> </div> <div class="status-bar"> <div class="status-indicator"> <span class="status-dot"></span> <span class="status-text">All systems operational</span> </div> <div class="system-metrics"> <div class="metric"> <span class="metric-value">93%</span> <span class="metric-label">Uptime</span> </div> <div class="metric"> <span class="metric-value">42ms</span> <span class="metric-label">Latency</span> </div> <div class="metric"> <span class="metric-value">26%</span> <span class="metric-label">CPU</span> </div> </div> </div> </div> <div class="tooltip" id="tooltip"></div> <script> document.addEventListener('DOMContentLoaded', () => { // Toggle buttons functionality const toggleButtons = document.querySelectorAll('.toggle-button'); toggleButtons.forEach(button => { button.addEventListener('click', () => { const isChecked = button.getAttribute('aria-checked') === 'true'; button.setAttribute('aria-checked', !isChecked); // Add a ripple effect on click const ripple = document.createElement('span'); ripple.classList.add('ripple'); button.appendChild(ripple); setTimeout(() => { ripple.remove(); }, 600); }); // Keyboard support for toggle buttons button.addEventListener('keydown', (e) => { if (e.key === ' ' || e.key === 'Enter') { e.preventDefault(); button.click(); } }); // Focus handling for keyboard navigation button.addEventListener('focus', () => { if (!button.classList.contains('mouse-focus')) { button.classList.add('keyboard-focus'); } }); button.addEventListener('blur', () => { button.classList.remove('keyboard-focus'); button.classList.remove('mouse-focus'); }); button.addEventListener('mousedown', () => { button.classList.add('mouse-focus'); }); }); // Tooltip functionality const tooltip = document.getElementById('tooltip'); const tooltipElements = document.querySelectorAll('[data-tooltip]'); tooltipElements.forEach(element => { element.addEventListener('mouseenter', (e) => { const tooltipText = element.getAttribute('data-tooltip'); tooltip.textContent = tooltipText; tooltip.style.opacity = '1'; // Position the tooltip const rect = element.getBoundingClientRect(); tooltip.style.left = `${rect.left + (rect.width / 2) - (tooltip.offsetWidth / 2)}px`; tooltip.style.top = `${rect.top - tooltip.offsetHeight - 8}px`; // Handle tooltip going out of viewport const tooltipRect = tooltip.getBoundingClientRect(); if (tooltipRect.left < 0) { tooltip.style.left = '10px'; } else if (tooltipRect.right > window.innerWidth) { tooltip.style.left = `${window.innerWidth - tooltipRect.width - 10}px`; } if (tooltipRect.top < 0) { tooltip.style.top = `${rect.bottom + 8}px`; } }); element.addEventListener('mouseleave', () => { tooltip.style.opacity = '0'; }); }); // Simulate system metrics updating function updateMetrics() { const uptimeValue = document.querySelector('.metric:nth-child(1) .metric-value'); const latencyValue = document.querySelector('.metric:nth-child(2) .metric-value'); const cpuValue = document.querySelector('.metric:nth-child(3) .metric-value'); // Randomly update values const currentUptime = parseInt(uptimeValue.textContent); const currentLatency = parseInt(latencyValue.textContent); const currentCpu = parseInt(cpuValue.textContent); const newUptime = Math.max(90, Math.min(99, currentUptime + (Math.random() > 0.5 ? 1 : -1))); const newLatency = Math.max(30, Math.min(60, currentLatency + Math.floor(Math.random() * 5) - 2)); const newCpu = Math.max(15, Math.min(35, currentCpu + Math.floor(Math.random() * 5) - 2)); uptimeValue.textContent = `${newUptime}%`; latencyValue.textContent = `${newLatency}ms`; cpuValue.textContent = `${newCpu}%`; } // Update metrics every 5 seconds setInterval(updateMetrics, 5000); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Soundwave - Genre Selector</title> <style> :root { --primary: #6200ea; --primary-light: #9d46ff; --secondary: #00e5ff; --tertiary: #ff0166; --success: #00c853; --jazz: #ffab00; --rock: #d50000; --pop: #ff4081; --classical: #651fff; --electronic: #00b0ff; --indie: #00bfa5; --chill: #3949ab; --party: #e91e63; --focus: #455a64; --dark: #121212; --light: #f5f5f5; --text: #e0e0e0; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Montserrat', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; } body { background: linear-gradient(135deg, var(--dark), #1a1a1a); height: 100vh; display: flex; justify-content: center; align-items: center; color: var(--text); overflow: hidden; } .container { width: 100%; max-width: 650px; padding: 2rem; border-radius: 20px; background: rgba(18, 18, 18, 0.7); backdrop-filter: blur(10px); box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); position: relative; overflow: hidden; } .container::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 5px; background: linear-gradient(90deg, var(--primary), var(--tertiary), var(--secondary)); z-index: 2; } .backdrop-pattern { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-image: radial-gradient(circle at 10% 20%, rgba(98, 0, 234, 0.1) 0%, transparent 20%), radial-gradient(circle at 90% 80%, rgba(255, 1, 102, 0.1) 0%, transparent 20%), radial-gradient(circle at 50% 50%, rgba(0, 229, 255, 0.05) 0%, transparent 30%); opacity: 0.7; z-index: -1; } h1 { font-size: 2.5rem; margin-bottom: 0.5rem; font-weight: 800; background: linear-gradient(90deg, var(--primary-light), var(--secondary)); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; letter-spacing: -0.02em; } p.tagline { font-size: 1rem; margin-bottom: 2rem; color: rgba(224, 224, 224, 0.7); font-weight: 400; } .section-header { font-size: 1.1rem; font-weight: 600; margin-bottom: 1rem; color: var(--text); display: flex; align-items: center; } .section-header svg { margin-right: 8px; fill: currentColor; } .button-group { display: flex; flex-wrap: wrap; gap: 12px; margin-bottom: 2rem; } .toggle-button { padding: 12px 18px; border-radius: 12px; background: rgba(255, 255, 255, 0.07); color: var(--text); border: none; font-size: 0.95rem; font-weight: 600; cursor: pointer; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); display: flex; align-items: center; position: relative; overflow: hidden; } .toggle-button svg { margin-right: 8px; transition: transform 0.3s ease; } .toggle-button:hover { background: rgba(255, 255, 255, 0.12); transform: translateY(-2px); } .toggle-button.active { color: #fff; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); } .toggle-button.active::before { content: ''; position: absolute; left: 0; top: 0; width: 100%; height: 100%; z-index: -1; opacity: 0.8; } .toggle-button.active svg { transform: scale(1.2); fill: white; } /* Genre Colors */ .toggle-button[data-genre="jazz"].active { background: var(--jazz); } .toggle-button[data-genre="rock"].active { background: var(--rock); } .toggle-button[data-genre="pop"].active { background: var(--pop); } .toggle-button[data-genre="classical"].active { background: var(--classical); } .toggle-button[data-genre="electronic"].active { background: var(--electronic); } .toggle-button[data-genre="indie"].active { background: var(--indie); } /* Mood Colors */ .toggle-button[data-mood="chill"].active { background: var(--chill); } .toggle-button[data-mood="party"].active { background: var(--party); } .toggle-button[data-mood="focus"].active { background: var(--focus); } .toggle-button[data-mood="workout"].active { background: var(--success); } /* Current selection display */ .now-playing { background: rgba(255, 255, 255, 0.03); border-radius: 16px; padding: 1.2rem; margin-top: 1.5rem; position: relative; overflow: hidden; } .now-playing-label { font-size: 0.8rem; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 0.5rem; color: rgba(224, 224, 224, 0.6); display: flex; align-items: center; } .now-playing-label svg { margin-right: 6px; animation: pulse 1.5s infinite; } .selection-display { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; } .selection-chip { padding: 6px 12px; border-radius: 30px; font-size: 0.9rem; font-weight: 600; display: flex; align-items: center; margin-right: 8px; color: white; animation: fadeIn 0.3s ease-out; position: relative; overflow: hidden; } .selection-chip::before { content: ''; position: absolute; width: 100%; height: 100%; top: 0; left: 0; background: linear-gradient(to right, rgba(255,255,255,0.1), rgba(255,255,255,0)); transform: skewX(-15deg) translateX(-100%); transition: transform 0.5s; } .selection-chip:hover::before { transform: skewX(-15deg) translateX(100%); } .selection-chip svg { margin-right: 6px; } #genreChips .selection-chip[data-genre="jazz"] { background: var(--jazz); } #genreChips .selection-chip[data-genre="rock"] { background: var(--rock); } #genreChips .selection-chip[data-genre="pop"] { background: var(--pop); } #genreChips .selection-chip[data-genre="classical"] { background: var(--classical); } #genreChips .selection-chip[data-genre="electronic"] { background: var(--electronic); } #genreChips .selection-chip[data-genre="indie"] { background: var(--indie); } #moodChips .selection-chip[data-mood="chill"] { background: var(--chill); } #moodChips .selection-chip[data-mood="party"] { background: var(--party); } #moodChips .selection-chip[data-mood="focus"] { background: var(--focus); } #moodChips .selection-chip[data-mood="workout"] { background: var(--success); } .visualizer { height: 30px; display: flex; align-items: flex-end; justify-content: center; gap: 3px; margin-top: 1rem; } .bar { width: 4px; height: 100%; background: var(--primary-light); border-radius: 2px; animation: visualize 0.5s infinite alternate; } .bar:nth-child(1) { animation-delay: 0.1s; } .bar:nth-child(2) { animation-delay: 0.2s; background: var(--secondary); } .bar:nth-child(3) { animation-delay: 0.3s; } .bar:nth-child(4) { animation-delay: 0.4s; background: var(--tertiary); } .bar:nth-child(5) { animation-delay: 0.5s; } .bar:nth-child(6) { animation-delay: 0.1s; background: var(--secondary); } .bar:nth-child(7) { animation-delay: 0.2s; } .customize-row { margin-top: 1rem; display: flex; justify-content: space-between; align-items: center; } .start-button { padding: 12px 24px; background: linear-gradient(90deg, var(--primary), var(--primary-light)); border: none; border-radius: 30px; color: white; font-weight: 600; font-size: 1rem; cursor: pointer; transition: all 0.3s ease; display: flex; align-items: center; box-shadow: 0 4px 15px rgba(98, 0, 234, 0.3); } .start-button svg { margin-right: 8px; } .start-button:hover { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(98, 0, 234, 0.4); } .start-button:active { transform: translateY(0); } @keyframes pulse { 0% { opacity: 0.5; } 50% { opacity: 1; } 100% { opacity: 0.5; } } @keyframes visualize { 0% { height: 15%; } 100% { height: 100%; } } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } @media (max-width: 600px) { .container { padding: 1.5rem; width: 95%; } h1 { font-size: 2rem; } .toggle-button { padding: 10px 14px; font-size: 0.9rem; } .selection-chip { font-size: 0.8rem; padding: 5px 10px; } } </style> </head> <body> <div class="container"> <div class="backdrop-pattern"></div> <h1>Soundwave</h1> <p class="tagline">Discover your perfect sonic atmosphere by mixing genres and moods.</p> <div class="section-header"> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="currentColor"> <path d="M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z"/> </svg> Select Genres </div> <div class="button-group genre-buttons"> <button class="toggle-button" data-genre="jazz"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> <path d="M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z"/> </svg> Jazz </button> <button class="toggle-button" data-genre="rock"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> <path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/> </svg> Rock </button> <button class="toggle-button" data-genre="pop"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> <path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/> </svg> Pop </button> <button class="toggle-button" data-genre="classical"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> <path d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3V5h18v14zM8 15c0-1.66 1.34-3 3-3 .35 0 .69.07 1 .18V6h5v2h-3v7.03c-.02 1.64-1.35 2.97-3 2.97-1.66 0-3-1.34-3-3z"/> </svg> Classical </button> <button class="toggle-button" data-genre="electronic"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> <path d="M7 18h2V6H7v12zm4 4h2V2h-2v20zm-8-8h2v-4H3v4zm12 4h2V6h-2v12zm4-8v4h2v-4h-2z"/> </svg> Electronic </button> <button class="toggle-button" data-genre="indie"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> <path d="M19 7h-8v6h8V7zm2-4H3c-1.1 0-2 .9-2 2v14c0 1.1.9 1.98 2 1.98h18c1.1 0 2-.88 2-1.98V5c0-1.1-.9-2-2-2zm0 16.01H3V4.98h18v14.03z"/> </svg> Indie </button> </div> <div class="section-header"> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="currentColor"> <path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/> </svg> Select Moods </div> <div class="button-group mood-buttons"> <button class="toggle-button" data-mood="chill"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> <path d="M13.5 5.5c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zM9.8 8.9L7 23h2.1l1.8-8 2.1 2v6h2v-7.5l-2.1-2 .6-3C14.8 12 16.8 13 19 13v-2c-1.9 0-3.5-1-4.3-2.4l-1-1.6c-.4-.6-1-1-1.7-1-.3 0-.5.1-.8.1L6 8.3V13h2V9.6l1.8-.7"/> </svg> Chill </button> <button class="toggle-button" data-mood="party"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> <path d="M21 6h-7.59l3.29-3.29L16 2l-4 4-4-4-.71.71L10.59 6H3v2h18V6zm-3 5H6v2h12v-2zm-4 5H6v2h8v-2z"/> </svg> Party </button> <button class="toggle-button" data-mood="focus"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-1-13h2v6h-2zm0 8h2v2h-2z"/> </svg> Focus </button> <button class="toggle-button" data-mood="workout"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> <path d="M20.57 14.86L22 13.43 20.57 12 17 15.57 8.43 7 12 3.43 10.57 2 9.14 3.43 7.71 2 5.57 4.14 4.14 2.71 2.71 4.14l1.43 1.43L2 7.71l1.43 1.43L2 10.57 3.43 12 7 8.43 15.57 17 12 20.57 13.43 22l1.43-1.43L16.29 22l2.14-2.14 1.43 1.43 1.43-1.43-1.43-1.43L22 16.29z"/> </svg> Workout </button> </div> <div class="now-playing"> <div class="now-playing-label"> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="currentColor"> <circle cx="12" cy="12" r="8"/> </svg> Your Current Mix </div> <div class="selection-display"> <div id="genreChips" class="selection-display"></div> <div id="moodChips" class="selection-display"></div> </div> <div class="visualizer"> <div class="bar"></div> <div class="bar"></div> <div class="bar"></div> <div class="bar"></div> <div class="bar"></div> <div class="bar"></div> <div class="bar"></div> </div> <div class="customize-row"> <button class="start-button"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> <path d="M8 5v14l11-7z"/> </svg> Start Listening </button> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const genreButtons = document.querySelectorAll('.toggle-button[data-genre]'); const moodButtons = document.querySelectorAll('.toggle-button[data-mood]'); const genreChips = document.getElementById('genreChips'); const moodChips = document.getElementById('moodChips'); const startButton = document.querySelector('.start-button'); const visualizer = document.querySelector('.visualizer'); // Hide visualizer initially visualizer.style.display = 'none'; // Genre button listeners genreButtons.forEach(button => { button.addEventListener('click', function() { this.classList.toggle('active'); updateSelectionDisplay(); }); }); // Mood button listeners moodButtons.forEach(button => { button.addEventListener('click', function() { this.classList.toggle('active'); updateSelectionDisplay(); }); }); // Start button listener startButton.addEventListener('click', function() { // Check if at least one genre and one mood are selected const hasGenre = document.querySelectorAll('.toggle-button[data-genre].active').length > 0; const hasMood = document.querySelectorAll('.toggle-button[data-mood].active').length > 0; if (hasGenre && hasMood) { this.innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> <path d="M6 19h4V5H6v14zm8-14v14h4V5h-4z"/> </svg> Pause `; // Show visualizer visualizer.style.display = 'flex'; // Add animation to bars document.querySelectorAll('.bar').forEach(bar => { const randomHeight = Math.floor(Math.random() * 100) + '%'; bar.style.height = randomHeight; }); } else { alert('Please select at least one genre and one mood to start listening.'); } }); // Function to update selection display function updateSelectionDisplay() { // Clear current chips genreChips.innerHTML = ''; moodChips.innerHTML = ''; // Add genre chips document.querySelectorAll('.toggle-button[data-genre].active').forEach(button => { const genre = button.getAttribute('data-genre'); const icon = button.querySelector('svg').cloneNode(true); const chip = document.createElement('div'); chip.className = 'selection-chip'; chip.setAttribute('data-genre', genre); chip.appendChild(icon); chip.appendChild(document.createTextNode(button.textContent.trim())); genreChips.appendChild(chip); }); // Add mood chips document.querySelectorAll('.toggle-button[data-mood].active').forEach(button => { const mood = button.getAttribute('data-mood'); const icon = button.querySelector('svg').cloneNode(true); const chip = document.createElement('div'); chip.className = 'selection-chip'; chip.setAttribute('data-mood', mood); chip.appendChild(icon); chip.appendChild(document.createTextNode(button.textContent.trim())); moodChips.appendChild(chip); }); } // Automatically animate bars when visualizer is shown setInterval(() => { if (visualizer.style.display === 'flex') { document.querySelectorAll('.bar').forEach(bar => { const randomHeight = Math.floor(Math.random() * 100) + '%'; bar.style.height = randomHeight; }); } }, 500); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Smart Home Interface</title> <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: 700px; background: #080b14; color: #ffffff; overflow: hidden; } .container { width: 100%; max-width: 650px; height: 650px; display: flex; flex-direction: column; justify-content: space-between; padding: 2rem; background: linear-gradient(135deg, rgba(16, 20, 30, 0.8), rgba(8, 11, 18, 0.95)); border-radius: 25px; box-shadow: 0 20px 50px rgba(0, 0, 0, 0.5); backdrop-filter: blur(10px); position: relative; } .container::before { content: ''; position: absolute; top: -2px; left: -2px; right: -2px; bottom: -2px; background: linear-gradient(45deg, #2d3747, transparent, #1a2333); border-radius: 25px; z-index: -1; } .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.5rem; } .title { font-size: 1.8rem; font-weight: 700; background: linear-gradient(90deg, #e0e0e0, #a4b0be); -webkit-background-clip: text; background-clip: text; color: transparent; letter-spacing: 0.05em; } .status { display: flex; align-items: center; gap: 0.5rem; } .status-dot { width: 10px; height: 10px; background-color: #4cd137; border-radius: 50%; box-shadow: 0 0 10px #4cd137; animation: pulse 2s infinite; } .status-text { font-size: 0.9rem; color: #a4b0be; } .navigation { display: flex; justify-content: space-between; margin-bottom: 2rem; padding-bottom: 1rem; border-bottom: 1px solid rgba(164, 176, 190, 0.2); } .nav-button { background: none; border: none; color: #a4b0be; font-size: 1rem; font-weight: 600; padding: 0.8rem 1rem; border-radius: 10px; cursor: pointer; transition: all 0.3s ease; position: relative; overflow: hidden; } .nav-button::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(45deg, rgba(68, 160, 255, 0.1), rgba(122, 89, 232, 0.1)); border-radius: 10px; transform: scaleX(0); transform-origin: left; transition: transform 0.3s ease; } .nav-button:hover { color: #ffffff; } .nav-button:hover::before { transform: scaleX(1); } .nav-button.active { color: #ffffff; background: linear-gradient(45deg, rgba(68, 160, 255, 0.2), rgba(122, 89, 232, 0.2)); box-shadow: 0 0 15px rgba(68, 160, 255, 0.2); } .content { flex-grow: 1; transition: opacity 0.5s ease; } .panel { display: none; height: 100%; flex-direction: column; gap: 1.5rem; opacity: 0; transform: translateY(10px); transition: opacity 0.5s ease, transform 0.5s ease; } .panel.active { display: flex; opacity: 1; transform: translateY(0); } .control-group { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 1rem; } .control-button { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 0.5rem; background: rgba(26, 35, 51, 0.7); border: 1px solid rgba(164, 176, 190, 0.1); border-radius: 15px; padding: 1.2rem 0.8rem; cursor: pointer; transition: all 0.3s ease; position: relative; overflow: hidden; min-height: 120px; } .control-button:hover { background: rgba(41, 52, 73, 0.8); transform: translateY(-5px); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); } .control-button.active { background: linear-gradient(135deg, rgba(68, 160, 255, 0.3), rgba(122, 89, 232, 0.3)); border-color: rgba(164, 176, 190, 0.3); box-shadow: 0 0 20px rgba(68, 160, 255, 0.2); } .control-icon { font-size: 1.8rem; color: #a4b0be; transition: all 0.3s ease; } .control-button:hover .control-icon, .control-button.active .control-icon { color: #ffffff; transform: scale(1.1); } .control-label { font-size: 0.9rem; font-weight: 600; color: #a4b0be; transition: color 0.3s ease; } .control-button:hover .control-label, .control-button.active .control-label { color: #ffffff; } .control-status { font-size: 0.75rem; color: #7a8699; transition: color 0.3s ease; } .control-button:hover .control-status, .control-button.active .control-status { color: #d1dbed; } .section-title { font-size: 1.1rem; color: #a4b0be; margin-top: 0.5rem; margin-bottom: 0.2rem; display: flex; align-items: center; gap: 0.5rem; } .slider-wrapper { padding: 0.5rem 0; } .slider-container { display: flex; align-items: center; gap: 1rem; } .slider { -webkit-appearance: none; width: 100%; height: 6px; background: rgba(26, 35, 51, 0.7); border-radius: 5px; outline: none; cursor: pointer; } .slider::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 20px; height: 20px; background: #44a0ff; border-radius: 50%; cursor: pointer; box-shadow: 0 0 10px rgba(68, 160, 255, 0.7); transition: all 0.2s ease; } .slider::-webkit-slider-thumb:hover { transform: scale(1.1); box-shadow: 0 0 15px rgba(68, 160, 255, 0.9); } .slider-value { font-size: 1rem; color: #ffffff; width: 40px; text-align: center; } .scenes-container { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 1rem; } .scene-card { background: rgba(26, 35, 51, 0.7); border: 1px solid rgba(164, 176, 190, 0.1); border-radius: 15px; padding: 1.2rem; cursor: pointer; transition: all 0.3s ease; position: relative; overflow: hidden; display: flex; flex-direction: column; align-items: center; gap: 0.5rem; } .scene-card:hover { background: rgba(41, 52, 73, 0.8); transform: translateY(-5px); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); } .scene-icon { font-size: 2rem; color: #a4b0be; transition: all 0.3s ease; } .scene-card:hover .scene-icon { color: #ffffff; transform: scale(1.1); } .scene-title { font-size: 0.9rem; font-weight: 600; color: #a4b0be; transition: color 0.3s ease; text-align: center; } .scene-card:hover .scene-title { color: #ffffff; } .notification { display: flex; align-items: center; gap: 1rem; background: rgba(26, 35, 51, 0.7); border-radius: 10px; padding: 1rem; margin-top: auto; border-left: 3px solid #44a0ff; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); transform: translateY(100px); opacity: 0; transition: all 0.5s ease; } .notification.show { transform: translateY(0); opacity: 1; } .notification-icon { font-size: 1.5rem; color: #44a0ff; } .notification-content { flex: 1; } .notification-title { font-size: 0.9rem; font-weight: 600; color: #ffffff; margin-bottom: 0.2rem; } .notification-message { font-size: 0.8rem; color: #a4b0be; } .voice-control { display: flex; align-items: center; justify-content: center; margin-top: 1rem; gap: 0.5rem; opacity: 0.7; transition: opacity 0.3s ease; } .voice-control:hover { opacity: 1; } .voice-button { width: 40px; height: 40px; border-radius: 50%; background: linear-gradient(45deg, #44a0ff, #7a59e8); display: flex; align-items: center; justify-content: center; cursor: pointer; box-shadow: 0 0 15px rgba(68, 160, 255, 0.3); transition: all 0.3s ease; } .voice-button:hover { transform: scale(1.1); box-shadow: 0 0 20px rgba(68, 160, 255, 0.5); } .voice-waves { display: flex; align-items: center; gap: 3px; height: 20px; } .voice-wave { width: 3px; height: 100%; background-color: #a4b0be; border-radius: 3px; animation: waveAnimation 1s infinite; opacity: 0; } .voice-active .voice-wave { opacity: 1; } .voice-wave:nth-child(1) { animation-delay: 0.1s; height: 30%; } .voice-wave:nth-child(2) { animation-delay: 0.2s; height: 60%; } .voice-wave:nth-child(3) { animation-delay: 0.3s; height: 80%; } .voice-wave:nth-child(4) { animation-delay: 0.4s; height: 40%; } .voice-wave:nth-child(5) { animation-delay: 0.5s; height: 20%; } @keyframes waveAnimation { 0%, 100% { transform: scaleY(1); } 50% { transform: scaleY(2); } } @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(76, 209, 55, 0.7); } 70% { box-shadow: 0 0 0 5px rgba(76, 209, 55, 0); } 100% { box-shadow: 0 0 0 0 rgba(76, 209, 55, 0); } } .btn-floating { position: absolute; bottom: 2rem; right: 2rem; width: 50px; height: 50px; border-radius: 50%; background: linear-gradient(45deg, #44a0ff, #7a59e8); display: flex; align-items: center; justify-content: center; cursor: pointer; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); transition: all 0.3s ease; color: white; font-size: 1.5rem; } .btn-floating:hover { transform: scale(1.1) rotate(90deg); box-shadow: 0 5px 25px rgba(68, 160, 255, 0.5); } @media (max-width: 600px) { .container { padding: 1.5rem; height: 100%; } .title { font-size: 1.5rem; } .nav-button { font-size: 0.9rem; padding: 0.6rem 0.8rem; } .control-group { grid-template-columns: repeat(2, 1fr); } .scenes-container { grid-template-columns: repeat(2, 1fr); } } </style> </head> <body> <div class="container"> <div class="header"> <h1 class="title">Nexus Home</h1> <div class="status"> <div class="status-dot"></div> <div class="status-text">System Online</div> </div> </div> <div class="navigation"> <button class="nav-button active" data-panel="lighting">Lighting</button> <button class="nav-button" data-panel="climate">Climate</button> <button class="nav-button" data-panel="security">Security</button> <button class="nav-button" data-panel="scenes">Scenes</button> </div> <div class="content"> <div class="panel active" id="lighting"> <div class="section-title"> <i class="control-icon">☀️</i> Main Rooms </div> <div class="control-group"> <div class="control-button" data-system="lighting" data-item="living"> <i class="control-icon">💡</i> <div class="control-label">Living Room</div> <div class="control-status">Off</div> </div> <div class="control-button" data-system="lighting" data-item="kitchen"> <i class="control-icon">🍳</i> <div class="control-label">Kitchen</div> <div class="control-status">Off</div> </div> <div class="control-button" data-system="lighting" data-item="bedroom"> <i class="control-icon">🛏️</i> <div class="control-label">Bedroom</div> <div class="control-status">Off</div> </div> <div class="control-button" data-system="lighting" data-item="bathroom"> <i class="control-icon">🚿</i> <div class="control-label">Bathroom</div> <div class="control-status">Off</div> </div> </div> <div class="section-title">Brightness</div> <div class="slider-wrapper"> <div class="slider-container"> <input type="range" min="0" max="100" value="60" class="slider" id="brightness-slider"> <div class="slider-value" id="brightness-value">60%</div> </div> </div> <div class="section-title">Color Temperature</div> <div class="slider-wrapper"> <div class="slider-container"> <input type="range" min="2700" max="6500" value="4000" class="slider" id="temperature-slider"> <div class="slider-value" id="temperature-value">4000K</div> </div> </div> </div> <div class="panel" id="climate"> <div class="section-title"> <i class="control-icon">🌡️</i> Temperature Control </div> <div class="control-group"> <div class="control-button" data-system="climate" data-item="living"> <i class="control-icon">🛋️</i> <div class="control-label">Living Room</div> <div class="control-status">21°C</div> </div> <div class="control-button" data-system="climate" data-item="kitchen"> <i class="control-icon">🍳</i> <div class="control-label">Kitchen</div> <div class="control-status">22°C</div> </div> <div class="control-button" data-system="climate" data-item="bedroom"> <i class="control-icon">🛏️</i> <div class="control-label">Bedroom</div> <div class="control-status">20°C</div> </div> </div> <div class="section-title">Set Temperature</div> <div class="slider-wrapper"> <div class="slider-container"> <input type="range" min="16" max="30" value="21" class="slider" id="temperature-control-slider"> <div class="slider-value" id="temperature-control-value">21°C</div> </div> </div> <div class="section-title">Fan Speed</div> <div class="slider-wrapper"> <div class="slider-container"> <input type="range" min="0" max="5" value="2" class="slider" id="fan-slider"> <div class="slider-value" id="fan-value">2</div> </div> </div> <div class="section-title">Modes</div> <div class="control-group"> <div class="control-button" data-system="climate-mode" data-item="auto"> <i class="control-icon">🔄</i> <div class="control-label">Auto</div> </div> <div class="control-button" data-system="climate-mode" data-item="cool"> <i class="control-icon">❄️</i> <div class="control-label">Cool</div> </div> <div class="control-button" data-system="climate-mode" data-item="heat"> <i class="control-icon">🔥</i> <div class="control-label">Heat</div> </div> <div class="control-button" data-system="climate-mode" data-item="eco"> <i class="control-icon">🌱</i> <div class="control-label">Eco</div> </div> </div> </div> <div class="panel" id="security"> <div class="section-title"> <i class="control-icon">🔒</i> Security System </div> <div class="control-group"> <div class="control-button" data-system="security" data-item="arm-home"> <i class="control-icon">🏠</i> <div class="control-label">Arm Home</div> <div class="control-status">Inactive</div> </div> <div class="control-button" data-system="security" data-item="arm-away"> <i class="control-icon">✈️</i> <div class="control-label">Arm Away</div> <div class="control-status">Inactive</div> </div> <div class="control-button" data-system="security" data-item="disarm"> <i class="control-icon">🔓</i> <div class="control-label">Disarm</div> <div class="control-status">Active</div> </div> </div> <div class="section-title"> <i class="control-icon">📹</i> Cameras </div> <div class="control-group"> <div class="control-button" data-system="camera" data-item="front-door"> <i class="control-icon">🚪</i> <div class="control-label">Front Door</div> <div class="control-status">Online</div> </div> <div class="control-button" data-system="camera" data-item="back-yard"> <i class="control-icon">🌳</i> <div class="control-label">Back Yard</div> <div class="control-status">Online</div> </div> <div class="control-button" data-system="camera" data-item="garage"> <i class="control-icon">🚗</i> <div class="control-label">Garage</div> <div class="control-status">Online</div> </div> </div> <div class="section-title"> <i class="control-icon">🚨</i> Alerts </div> <div class="notification"> <div class="notification-icon">ℹ️</div> <div class="notification-content"> <div class="notification-title">All Systems Nominal</div> <div class="notification-message">No security alerts detected in the last 24 hours</div> </div> </div> </div> <div class="panel" id="scenes"> <div class="section-title"> <i class="control-icon">🎬</i> Quick Scenes </div> <div class="scenes-container"> <div class="scene-card" data-scene="morning"> <i class="scene-icon">🌅</i> <div class="scene-title">Morning Routine</div> </div> <div class="scene-card" data-scene="evening"> <i class="scene-icon">🌆</i> <div class="scene-title">Evening Mode</div> </div> <div class="scene-card" data-scene="movie"> <i class="scene-icon">🎬</i> <div class="scene-title">Movie Night</div> </div> <div class="scene-card" data-scene="away"> <i class="scene-icon">🏃♂️</i> <div class="scene-title">Away Mode</div> </div> <div class="scene-card" data-scene="sleep"> <i class="scene-icon">🌙</i> <div class="scene-title">Sleep Time</div> </div> <div class="scene-card" data-scene="party"> <i class="scene-icon">🎉</i> <div class="scene-title">Party Mode</div> </div> </div> <div class="section-title"> <i class="control-icon">🔊</i> Voice Command </div> <div class="voice-control"> <div class="voice-button"> <i class="control-icon">🎤</i> </div> <div class="voice-waves"> <div class="voice-wave"></div> <div class="voice-wave"></div> <div class="voice-wave"></div> <div class="voice-wave"></div> <div class="voice-wave"></div> </div> </div> </div> </div> <div class="btn-floating"> <i class="control-icon">+</i> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Panel Navigation const navButtons = document.querySelectorAll('.nav-button'); const panels = document.querySelectorAll('.panel'); navButtons.forEach(button => { button.addEventListener('click', function() { const panelId = this.getAttribute('data-panel'); // Remove active class from all buttons and panels navButtons.forEach(btn => btn.classList.remove('active')); panels.forEach(panel => panel.classList.remove('active')); // Add active class to clicked button and corresponding panel this.classList.add('active'); document.getElementById(panelId).classList.add('active'); }); }); // Control Buttons const controlButtons = document.querySelectorAll('.control-button'); controlButtons.forEach(button => { button.addEventListener('click', function() { const system = this.getAttribute('data-system'); const item = this.getAttribute('data-item'); // Toggle active state this.classList.toggle('active'); // Update status text based on system type const statusElement = this.querySelector('.control-status'); if (statusElement) { if (system === 'lighting') { statusElement.textContent = this.classList.contains('active') ? 'On' : 'Off'; } else if (system === 'security') { if (item === 'arm-home' || item === 'arm-away') { if (this.classList.contains('active')) { // Deactivate other security options document.querySelectorAll('[data-system="security"]').forEach(secBtn => { if (secBtn !== this) { secBtn.classList.remove('active'); secBtn.querySelector('.control-status').textContent = 'Inactive'; } }); statusElement.textContent = 'Active'; showNotification('Security System', `${item === 'arm-home' ? 'Home' : 'Away'} mode activated`); } else { statusElement.textContent = 'Inactive'; } } else if (item === 'disarm') { if (this.classList.contains('active')) { // Deactivate other security options document.querySelectorAll('[data-system="security"]').forEach(secBtn => { if (secBtn !== this) { secBtn.classList.remove('active'); secBtn.querySelector('.control-status').textContent = 'Inactive'; } }); statusElement.textContent = 'Active'; showNotification('Security System', 'System disarmed'); } else { statusElement.textContent = 'Inactive'; } } } else if (system === 'climate-mode') { if (this.classList.contains('active')) { // Deactivate other climate modes document.querySelectorAll('[data-system="climate-mode"]').forEach(modeBtn => { if (modeBtn !== this) { modeBtn.classList.remove('active'); } }); showNotification('Climate Control', `${item.charAt(0).toUpperCase() + item.slice(1)} mode activated`); } } } }); }); // Scene Cards const sceneCards = document.querySelectorAll('.scene-card'); sceneCards.forEach(card => { card.addEventListener('click', function() { const scene = this.getAttribute('data-scene'); // Visual feedback for clicked scene this.style.transform = 'scale(0.95)'; setTimeout(() => { this.style.transform = ''; }, 200); // Show notification for the activated scene showNotification('Scene Activated', getSceneDescription(scene)); }); }); // Voice control button const voiceButton = document.querySelector('.voice-button'); const voiceControl = document.querySelector('.voice-control'); voiceButton.addEventListener('click', function() { voiceControl.classList.toggle('voice-active'); if (voiceControl.classList.contains('voice-active')) { showNotification('Voice Control', 'Listening for commands...'); // Simulate voice command after 3 seconds setTimeout(() => { voiceControl.classList.remove('voice-active'); showNotification('Voice Command', 'Turning on living room lights'); // Activate living room lights const livingRoomLight = document.querySelector('[data-system="lighting"][data-item="living"]'); if (livingRoomLight && !livingRoomLight.classList.contains('active')) { livingRoomLight.click(); } }, 3000); } }); // Slider functionality const brightnessSlider = document.getElementById('brightness-slider'); const brightnessValue = document.getElementById('brightness-value'); brightnessSlider.addEventListener('input', function() { brightnessValue.textContent = this.value + '%'; }); const temperatureSlider = document.getElementById('temperature-slider'); const temperatureValue = document.getElementById('temperature-value'); temperatureSlider.addEventListener('input', function() { temperatureValue.textContent = this.value + 'K'; }); const temperatureControlSlider = document.getElementById('temperature-control-slider'); const temperatureControlValue = document.getElementById('temperature-control-value'); temperatureControlSlider.addEventListener('input', function() { temperatureControlValue.textContent = this.value + '°C'; }); const fanSlider = document.getElementById('fan-slider'); const fanValue = document.getElementById('fan-value'); fanSlider.addEventListener('input', function() { fanValue.textContent = this.value; }); // Floating button const btnFloating = document.querySelector('.btn-floating'); btnFloating.addEventListener('click', function() { showNotification('Quick Actions', 'Personalize your quick access buttons'); }); // Helper function to show notifications function showNotification(title, message) { const notification = document.querySelector('.notification'); const notificationTitle = notification.querySelector('.notification-title'); const notificationMessage = notification.querySelector('.notification-message'); notificationTitle.textContent = title; notificationMessage.textContent = message; notification.classList.add('show'); // Hide notification after 4 seconds setTimeout(() => { notification.classList.remove('show'); }, 4000); } // Helper function to get scene descriptions function getSceneDescription(scene) { const descriptions = { 'morning': 'Gradually increasing lights, raising blinds, and warming up temperature to 22°C', 'evening': 'Dimming lights to 40%, setting temperature to 21°C, and locking all doors', 'movie': 'Dimming living room lights to 10%, turning on bias lighting, and activating surround sound', 'away': 'Turning off all lights, setting temperature to eco mode, and arming security system', 'sleep': 'Turning off all lights except hallway night lights, lowering temperature to 19°C', 'party': 'Dynamic lighting patterns, adjusting temperature to 23°C, and enabling enhanced audio mode' }; return descriptions[scene] || 'Scene activated successfully'; } }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Gaming Dashboard</title> <style> :root { --primary: #1c1e26; --secondary: #ff2d55; --accent1: #00ffff; --accent2: #6622cc; --text: #ffffff; --inactive: #45475a; --hover-glow: 0 0 25px var(--accent1); --active-glow: 0 0 20px var(--secondary); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', 'Roboto', Arial, sans-serif; } body { background: linear-gradient(135deg, #121218 0%, #232336 100%); color: var(--text); height: 100vh; display: flex; flex-direction: column; justify-content: center; align-items: center; overflow: hidden; position: relative; } .container { width: 650px; height: 650px; display: flex; flex-direction: column; position: relative; z-index: 1; } .grid-background { position: absolute; width: 100%; height: 100%; background: linear-gradient(to right, rgba(255,255,255,0.03) 1px, transparent 1px), linear-gradient(to bottom, rgba(255,255,255,0.03) 1px, transparent 1px); background-size: 20px 20px; z-index: -1; transform: perspective(500px) rotateX(30deg); opacity: 0.5; } .dashboard-title { text-align: center; margin-bottom: 20px; font-size: 2.5rem; font-weight: 800; letter-spacing: 2px; text-transform: uppercase; text-shadow: 0 0 10px var(--accent1); color: var(--text); position: relative; z-index: 2; animation: pulse 2s infinite alternate; } .dashboard-title::after { content: ''; position: absolute; bottom: -10px; left: 50%; width: 150px; height: 3px; background: linear-gradient(90deg, transparent, var(--accent1), transparent); transform: translateX(-50%); } .mode-container { display: flex; flex-wrap: wrap; gap: 20px; justify-content: center; perspective: 1000px; margin-bottom: 30px; } .mode-btn { width: 180px; height: 120px; background: rgba(28, 30, 38, 0.85); border: 2px solid var(--inactive); border-radius: 12px; color: var(--text); font-size: 1.1rem; font-weight: 600; cursor: pointer; position: relative; overflow: hidden; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 15px; transition: all 0.3s ease-out; box-shadow: 0 5px 15px rgba(0,0,0,0.3); transform-style: preserve-3d; text-align: center; } .mode-btn::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(45deg, transparent, rgba(255,255,255,0.1), transparent); z-index: -1; transform: translateY(-100%) rotate(45deg); transition: transform 0.6s ease; } .mode-btn:hover::before { transform: translateY(100%) rotate(45deg); } .mode-btn:hover { border-color: var(--accent1); transform: translateY(-5px) translateZ(10px); box-shadow: var(--hover-glow); } .mode-btn.active { border-color: var(--secondary); box-shadow: var(--active-glow); background: linear-gradient(135deg, rgba(102, 34, 204, 0.3), rgba(28, 30, 38, 0.9)); } .mode-btn.disabled { opacity: 0.5; cursor: not-allowed; transform: none; box-shadow: none; } .mode-btn .icon { font-size: 2rem; margin-bottom: 8px; } .mode-btn .label { font-size: 0.9rem; font-weight: 500; } .mode-btn .locked { position: absolute; top: 10px; right: 10px; color: var(--secondary); font-size: 1.2rem; } .settings-container { margin-top: 20px; background: rgba(28, 30, 38, 0.7); border-radius: 16px; border: 1px solid var(--accent2); padding: 20px; width: 100%; max-width: 600px; backdrop-filter: blur(10px); } .settings-title { font-size: 1.4rem; font-weight: 600; margin-bottom: 15px; color: var(--accent1); display: flex; align-items: center; gap: 10px; } .settings-title i { font-size: 1.2rem; } .setting { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; position: relative; } .setting label { font-size: 1rem; font-weight: 500; } .toggle-wrapper { position: relative; width: 60px; height: 30px; } .toggle { position: absolute; left: 0; top: 0; opacity: 0; width: 100%; height: 100%; z-index: 2; cursor: pointer; } .toggle + .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: var(--inactive); transition: .4s; border-radius: 34px; } .toggle + .slider:before { position: absolute; content: ""; height: 22px; width: 22px; left: 4px; bottom: 4px; background-color: white; transition: .4s; border-radius: 50%; } .toggle:checked + .slider { background-color: var(--accent2); } .toggle:checked + .slider:before { transform: translateX(30px); } .range-wrapper { position: relative; width: 200px; } .range { -webkit-appearance: none; width: 100%; height: 6px; background: var(--inactive); border-radius: 5px; outline: none; } .range::-webkit-slider-thumb { -webkit-appearance: none; width: 18px; height: 18px; border-radius: 50%; background: var(--accent1); cursor: pointer; box-shadow: 0 0 10px rgba(0, 255, 255, 0.5); transition: all 0.2s; } .range::-webkit-slider-thumb:hover { transform: scale(1.2); } .start-btn { position: relative; display: block; margin: 30px auto 0; width: 200px; height: 60px; background: linear-gradient(45deg, var(--accent2), var(--secondary)); border: none; border-radius: 30px; color: white; font-size: 1.3rem; font-weight: 700; text-transform: uppercase; letter-spacing: 2px; cursor: pointer; overflow: hidden; transition: all 0.3s; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); z-index: 1; } .start-btn::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(45deg, var(--accent1), var(--accent2)); opacity: 0; transition: opacity 0.3s ease; z-index: -1; } .start-btn:hover::before { opacity: 1; } .start-btn:hover { transform: translateY(-3px); box-shadow: 0 10px 25px rgba(0, 0, 0, 0.4); } .start-btn:active { transform: translateY(1px); } .particles { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: -2; overflow: hidden; } .particle { position: absolute; width: 3px; height: 3px; background-color: rgba(255, 255, 255, 0.2); border-radius: 50%; } /* Animations */ @keyframes pulse { 0% { text-shadow: 0 0 10px var(--accent1); } 100% { text-shadow: 0 0 20px var(--accent1), 0 0 30px var(--accent1); } } @keyframes glowEffect { 0% { box-shadow: 0 0 5px var(--accent1); } 50% { box-shadow: 0 0 20px var(--accent1); } 100% { box-shadow: 0 0 5px var(--accent1); } } .notification { position: fixed; top: 20px; left: 50%; transform: translateX(-50%) translateY(-100px); background: rgba(0, 0, 0, 0.8); color: white; padding: 15px 25px; border-radius: 8px; border-left: 4px solid var(--accent1); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); z-index: 1000; transition: transform 0.3s ease; } .notification.show { transform: translateX(-50%) translateY(0); } @media (max-width: 700px) { .container { width: 95%; height: auto; padding: 20px 10px; } .dashboard-title { font-size: 1.8rem; } .mode-container { gap: 10px; } .mode-btn { width: 140px; height: 100px; font-size: 0.9rem; } .settings-container { padding: 15px; } .setting label { font-size: 0.9rem; } .range-wrapper { width: 150px; } .start-btn { width: 170px; height: 50px; font-size: 1.1rem; } } </style> </head> <body> <div class="particles" id="particles"></div> <div class="grid-background"></div> <div class="container"> <h1 class="dashboard-title">NeoVerse Arena</h1> <div class="mode-container"> <button class="mode-btn" data-mode="campaign"> <div class="icon">🏆</div> <div class="label">Campaign Mode</div> </button> <button class="mode-btn" data-mode="pvp"> <div class="icon">⚔️</div> <div class="label">PvP Arena</div> </button> <button class="mode-btn" data-mode="survival"> <div class="icon">🔄</div> <div class="label">Endless Survival</div> </button> <button class="mode-btn disabled" data-mode="raid"> <div class="icon">🔥</div> <div class="label">Guild Raids</div> <div class="locked">🔒</div> </button> <button class="mode-btn" data-mode="training"> <div class="icon">🎯</div> <div class="label">Training Grounds</div> </button> <button class="mode-btn disabled" data-mode="tournament"> <div class="icon">🏅</div> <div class="label">Weekly Tournament</div> <div class="locked">🔒</div> </button> </div> <div class="settings-container"> <h2 class="settings-title">⚙️ Game Settings</h2> <div class="setting"> <label>HDR Lighting</label> <div class="toggle-wrapper"> <input type="checkbox" class="toggle" id="hdr"> <span class="slider"></span> </div> </div> <div class="setting"> <label>Dynamic Weather</label> <div class="toggle-wrapper"> <input type="checkbox" class="toggle" id="weather" checked> <span class="slider"></span> </div> </div> <div class="setting"> <label>Difficulty</label> <div class="range-wrapper"> <input type="range" min="1" max="5" value="3" class="range" id="difficulty"> </div> </div> <div class="setting"> <label>Graphics Quality</label> <div class="range-wrapper"> <input type="range" min="1" max="5" value="4" class="range" id="graphics"> </div> </div> <div class="setting"> <label>Voice Chat</label> <div class="toggle-wrapper"> <input type="checkbox" class="toggle" id="voice"> <span class="slider"></span> </div> </div> </div> <button class="start-btn" id="startGame">LAUNCH</button> </div> <div class="notification" id="notification"></div> <script> // Initialize particles function createParticles() { const particlesContainer = document.getElementById('particles'); const particleCount = 50; for (let i = 0; i < particleCount; i++) { const particle = document.createElement('div'); particle.classList.add('particle'); // Random position const posX = Math.random() * 100; const posY = Math.random() * 100; // Random size const size = Math.random() * 2 + 1; // Set styles particle.style.left = `${posX}%`; particle.style.top = `${posY}%`; particle.style.width = `${size}px`; particle.style.height = `${size}px`; // Random animation const duration = Math.random() * 20 + 10; const delay = Math.random() * 5; particle.style.animation = `floatUp ${duration}s linear ${delay}s infinite`; particlesContainer.appendChild(particle); } } // Game mode selection const modeButtons = document.querySelectorAll('.mode-btn:not(.disabled)'); let selectedMode = null; modeButtons.forEach(button => { button.addEventListener('click', () => { // Remove active class from all buttons modeButtons.forEach(btn => btn.classList.remove('active')); // Add active class to clicked button button.classList.add('active'); selectedMode = button.getAttribute('data-mode'); // Show notification showNotification(`${button.querySelector('.label').textContent} selected`); }); }); // Handle disabled buttons const disabledButtons = document.querySelectorAll('.mode-btn.disabled'); disabledButtons.forEach(button => { button.addEventListener('click', () => { const modeName = button.querySelector('.label').textContent; showNotification(`${modeName} is locked! Complete campaign to unlock.`); }); }); // Start game button const startBtn = document.getElementById('startGame'); startBtn.addEventListener('click', () => { if (!selectedMode) { showNotification('Please select a game mode first!'); return; } const difficulty = document.getElementById('difficulty').value; const graphics = document.getElementById('graphics').value; const hdr = document.getElementById('hdr').checked; const weather = document.getElementById('weather').checked; const voice = document.getElementById('voice').checked; let settingsText = `Launching ${getModeName(selectedMode)} with Difficulty: ${difficulty}, Graphics: ${graphics}`; showNotification(settingsText); // Add launch animation startBtn.innerHTML = 'LAUNCHING...'; startBtn.style.animation = 'glowEffect 1.5s infinite'; setTimeout(() => { startBtn.innerHTML = 'LAUNCH'; startBtn.style.animation = ''; }, 3000); }); // Helper function to get mode name function getModeName(mode) { const modeMap = { 'campaign': 'Campaign Mode', 'pvp': 'PvP Arena', 'survival': 'Endless Survival', 'training': 'Training Grounds', 'raid': 'Guild Raids', 'tournament': 'Weekly Tournament' }; return modeMap[mode] || mode; } // Notification system function showNotification(message) { const notification = document.getElementById('notification'); notification.textContent = message; notification.classList.add('show'); setTimeout(() => { notification.classList.remove('show'); }, 3000); } // Button hover sound effect simulation const buttons = document.querySelectorAll('button'); buttons.forEach(button => { button.addEventListener('mouseenter', () => { if (!button.classList.contains('disabled')) { // Create subtle button animation on hover button.style.transition = 'transform 0.2s ease'; button.style.transform = button.classList.contains('start-btn') ? 'translateY(-3px)' : 'translateY(-5px) translateZ(10px)'; } }); button.addEventListener('mouseleave', () => { if (!button.classList.contains('disabled')) { button.style.transform = 'translateY(0) translateZ(0)'; } }); }); // Setting sliders visual update const rangeInputs = document.querySelectorAll('.range'); rangeInputs.forEach(input => { input.addEventListener('input', function() { const value = this.value; const max = this.max; const percent = (value / max) * 100; this.style.background = `linear-gradient(90deg, var(--accent1) ${percent}%, var(--inactive) ${percent}%)`; }); // Initialize slider background const value = input.value; const max = input.max; const percent = (value / max) * 100; input.style.background = `linear-gradient(90deg, var(--accent1) ${percent}%, var(--inactive) ${percent}%)`; }); // Add CSS keyframes dynamically for particles const style = document.createElement('style'); style.textContent = ` @keyframes floatUp { 0% { transform: translateY(100vh) translateX(0); opacity: 0.7; } 100% { transform: translateY(-100vh) translateX(calc(sin(var(--random-angle)) * 50px)); opacity: 0; } } `; document.head.appendChild(style); // Initialize particles on load window.addEventListener('load', createParticles); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; } body { display: flex; justify-content: center; align-items: center; min-height: 700px; background: linear-gradient(135deg, #1a2639, #0d1117); color: #fff; padding: 20px; overflow: hidden; } .app-container { width: 100%; max-width: 660px; background-color: rgba(26, 32, 44, 0.95); border-radius: 24px; padding: 30px; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); position: relative; overflow: hidden; display: flex; flex-direction: column; } .app-background { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: -1; opacity: 0.1; background-image: radial-gradient(circle at 20% 30%, rgba(255, 80, 80, 0.7) 0%, transparent 30%), radial-gradient(circle at 80% 70%, rgba(80, 200, 255, 0.5) 0%, transparent 40%); } .app-header { margin-bottom: 25px; position: relative; } .app-title { font-size: 28px; font-weight: 800; background: linear-gradient(90deg, #FF6B6B, #FFE66D); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; margin-bottom: 10px; letter-spacing: -0.5px; } .app-subtitle { color: rgba(255, 255, 255, 0.7); font-size: 16px; line-height: 1.5; margin-bottom: 5px; } .live-indicator { display: flex; align-items: center; gap: 8px; color: #4CFF5E; font-size: 14px; font-weight: 600; margin-top: 15px; } .pulse-dot { width: 10px; height: 10px; background-color: #4CFF5E; border-radius: 50%; position: relative; } .pulse-dot::after { content: ''; position: absolute; width: 100%; height: 100%; background-color: inherit; border-radius: 50%; z-index: -1; animation: pulse 2s infinite; } .activity-selector { display: flex; gap: 15px; margin-bottom: 30px; position: relative; } .activity-button { flex: 1; background: rgba(255, 255, 255, 0.08); border-radius: 16px; padding: 18px 15px; border: none; cursor: pointer; color: rgba(255, 255, 255, 0.6); font-weight: 600; font-size: 15px; transition: all 0.3s ease; position: relative; overflow: hidden; display: flex; flex-direction: column; align-items: center; gap: 12px; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); } .activity-button:hover { transform: translateY(-3px); background: rgba(255, 255, 255, 0.12); } .activity-button.active { color: white; background: rgba(255, 255, 255, 0.15); box-shadow: 0 6px 20px rgba(0, 0, 0, 0.2); } .activity-button.active::before { content: ''; position: absolute; bottom: 0; left: 0; width: 100%; height: 4px; background: currentColor; animation: slideIn 0.4s ease forwards; } .activity-button .icon { width: 48px; height: 48px; display: flex; align-items: center; justify-content: center; border-radius: 12px; position: relative; z-index: 2; color: white; } .activity-button .icon svg { width: 24px; height: 24px; stroke-width: 2.5; transition: all 0.3s ease; } .activity-button.active .icon svg { transform: scale(1.1); } .activity-button:nth-child(1) { color: rgba(255, 107, 107, 0.8); } .activity-button:nth-child(1).active { color: #FF6B6B; } .activity-button:nth-child(1) .icon { background: linear-gradient(135deg, #FF6B6B, #FF5252); } .activity-button:nth-child(2) { color: rgba(67, 206, 162, 0.8); } .activity-button:nth-child(2).active { color: #43CEA2; } .activity-button:nth-child(2) .icon { background: linear-gradient(135deg, #43CEA2, #185a9d); } .activity-button:nth-child(3) { color: rgba(80, 200, 255, 0.8); } .activity-button:nth-child(3).active { color: #50c8ff; } .activity-button:nth-child(3) .icon { background: linear-gradient(135deg, #50c8ff, #0082c8); } .activity-button .activity-name { font-weight: 700; letter-spacing: 0.5px; text-transform: uppercase; font-size: 14px; transition: all 0.3s ease; } .activity-button .activity-details { font-size: 12px; opacity: 0.7; text-align: center; transition: all 0.3s ease; line-height: 1.4; } .activity-button.active .activity-name { transform: scale(1.05); } .stats-container { background: rgba(255, 255, 255, 0.08); border-radius: 20px; padding: 25px; display: grid; grid-template-columns: repeat(2, 1fr); gap: 20px; margin-bottom: 25px; transition: all 0.4s ease; opacity: 0; transform: translateY(10px); } .stats-container.visible { opacity: 1; transform: translateY(0); } .stat-card { display: flex; flex-direction: column; gap: 8px; } .stat-label { font-size: 13px; font-weight: 500; color: rgba(255, 255, 255, 0.6); } .stat-value { font-size: 24px; font-weight: 700; color: white; } .stat-unit { font-size: 14px; opacity: 0.6; margin-left: 2px; } .action-container { display: flex; gap: 15px; margin-top: auto; } .action-button { flex: 1; padding: 16px; border-radius: 16px; background: none; border: 2px solid rgba(255, 255, 255, 0.2); color: white; font-weight: 600; font-size: 15px; cursor: pointer; transition: all 0.3s ease; display: flex; justify-content: center; align-items: center; gap: 8px; } .action-button svg { width: 18px; height: 18px; } .action-button.primary { background: linear-gradient(135deg, #FF6B6B, #FF8E53); border: none; box-shadow: 0 10px 20px rgba(255, 107, 107, 0.3); } .action-button:hover { transform: translateY(-3px); } .action-button.primary:hover { box-shadow: 0 15px 25px rgba(255, 107, 107, 0.4); } @keyframes pulse { 0% { transform: scale(1); opacity: 0.8; } 70% { transform: scale(2.5); opacity: 0; } 100% { transform: scale(1); opacity: 0; } } @keyframes slideIn { from { transform: scaleX(0); } to { transform: scaleX(1); } } /* Ripple effect */ .ripple { position: absolute; border-radius: 50%; background-color: rgba(255, 255, 255, 0.2); transform: scale(0); animation: rippleAnim 0.6s linear; } @keyframes rippleAnim { to { transform: scale(4); opacity: 0; } } @media (max-width: 600px) { .app-container { padding: 20px; } .activity-selector { flex-direction: column; } .stats-container { grid-template-columns: 1fr; } .action-container { flex-direction: column; } } </style> </head> <body> <div class="app-container"> <div class="app-background"></div> <div class="app-header"> <h1 class="app-title">PulseTrack Pro</h1> <p class="app-subtitle">Track your workout metrics across multiple activities with precision.</p> <div class="live-indicator" id="live-indicator" style="display: none;"> <div class="pulse-dot"></div> <span>LIVE TRACKING</span> </div> </div> <div class="activity-selector"> <button class="activity-button active" data-activity="running"> <div class="icon"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" d="M15.55 5.55a1 1 0 0 1 1.41 0 9 9 0 0 1 0 12.73 1 1 0 0 1-1.41 0 7 7 0 0 0 0-9.9 1 1 0 0 1 0-1.41Z" /> <path stroke-linecap="round" stroke-linejoin="round" d="M11.48 3.499a1 1 0 0 1 1.414 0l2.098 2.098a1 1 0 0 1 0 1.415l-7.04 7.04a.5.5 0 0 1-.707 0l-4.97-4.97a.5.5 0 0 1 0-.707l1.06-1.06a.5.5 0 0 1 .707 0l3.54 3.54a.5.5 0 0 0 .707 0l3.98-3.98a1 1 0 0 1 0-1.414Z" /> </svg> </div> <div class="activity-name">Running</div> <div class="activity-details">Track pace, distance & calories</div> </button> <button class="activity-button" data-activity="cycling"> <div class="icon"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <circle cx="5.5" cy="17.5" r="3.5" /> <circle cx="18.5" cy="17.5" r="3.5" /> <path stroke-linecap="round" stroke-linejoin="round" d="M7.5 14.5 9 7 14.5 9l3 3" /> <path stroke-linecap="round" stroke-linejoin="round" d="M5.5 9.5h4l2 5h6.5" /> </svg> </div> <div class="activity-name">Cycling</div> <div class="activity-details">Monitor speed, RPM & elevation</div> </button> <button class="activity-button" data-activity="swimming"> <div class="icon"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 9 5 5m0 0 4-4M5 5l4 4M4 14c.618 0 1.468.301 2.5.773C7.527 15.242 8.375 15.5 9 15.5c.625 0 1.472-.258 2.5-.727 1.032-.472 1.882-.773 2.5-.773s1.468.301 2.5.773c1.028.469 1.875.727 2.5.727.625 0 1.472-.258 2.5-.727 1.032-.472 1.882-.773 2.5-.773" /> <path stroke-linecap="round" stroke-linejoin="round" d="M4 18c.618 0 1.468.301 2.5.773 1.028.469 1.875.727 2.5.727.625 0 1.472-.258 2.5-.727 1.032-.472 1.882-.773 2.5-.773s1.468.301 2.5.773c1.028.469 1.875.727 2.5.727.625 0 1.472-.258 2.5-.727 1.032-.472 1.882-.773 2.5-.773" /> </svg> </div> <div class="activity-name">Swimming</div> <div class="activity-details">Count laps, strokes & efficiency</div> </button> </div> <div class="stats-container visible" id="stats-container"> <div class="stat-card"> <div class="stat-label">Distance</div> <div class="stat-value">5.2<span class="stat-unit">km</span></div> </div> <div class="stat-card"> <div class="stat-label">Pace</div> <div class="stat-value">4:42<span class="stat-unit">min/km</span></div> </div> <div class="stat-card"> <div class="stat-label">Calories</div> <div class="stat-value">342<span class="stat-unit">kcal</span></div> </div> <div class="stat-card"> <div class="stat-label">Heart Rate</div> <div class="stat-value">152<span class="stat-unit">bpm</span></div> </div> </div> <div class="action-container"> <button class="action-button"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" d="M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 0 1 1.37.49l1.296 2.247a1.125 1.125 0 0 1-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 0 1 0 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 0 1-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 0 1-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 0 1-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 0 1-1.369-.49l-1.297-2.247a1.125 1.125 0 0 1 .26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 0 1 0-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 0 1-.26-1.43l1.297-2.247a1.125 1.125 0 0 1 1.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281Z" /> <path stroke-linecap="round" stroke-linejoin="round" d="M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z" /> </svg> Settings </button> <button class="action-button primary" id="start-button"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" d="M5.25 5.653c0-.856.917-1.398 1.667-.986l11.54 6.348a1.125 1.125 0 0 1 0 1.971l-11.54 6.347c-.75.413-1.667-.13-1.667-.986V5.653Z" /> </svg> Start Tracking </button> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const activityButtons = document.querySelectorAll('.activity-button'); const statsContainer = document.getElementById('stats-container'); const startButton = document.getElementById('start-button'); const liveIndicator = document.getElementById('live-indicator'); let isTracking = false; // Activity data const activityData = { running: { distance: '5.2<span class="stat-unit">km</span>', pace: '4:42<span class="stat-unit">min/km</span>', calories: '342<span class="stat-unit">kcal</span>', heartRate: '152<span class="stat-unit">bpm</span>' }, cycling: { distance: '18.7<span class="stat-unit">km</span>', pace: '24.3<span class="stat-unit">km/h</span>', calories: '487<span class="stat-unit">kcal</span>', heartRate: '138<span class="stat-unit">bpm</span>' }, swimming: { distance: '1.2<span class="stat-unit">km</span>', pace: '1:48<span class="stat-unit">min/100m</span>', calories: '274<span class="stat-unit">kcal</span>', heartRate: '124<span class="stat-unit">bpm</span>' } }; // Add ripple effect to buttons function createRipple(event) { const button = event.currentTarget; const circle = document.createElement('span'); const diameter = Math.max(button.clientWidth, button.clientHeight); const radius = diameter / 2; circle.style.width = circle.style.height = `${diameter}px`; circle.style.left = `${event.clientX - button.getBoundingClientRect().left - radius}px`; circle.style.top = `${event.clientY - button.getBoundingClientRect().top - radius}px`; circle.classList.add('ripple'); const ripple = button.querySelector('.ripple'); if (ripple) { ripple.remove(); } button.appendChild(circle); } // Activity switching activityButtons.forEach(button => { button.addEventListener('click', function(e) { createRipple(e); // Remove active class from all buttons activityButtons.forEach(btn => btn.classList.remove('active')); // Add active class to clicked button this.classList.add('active'); // Update stats based on activity const activity = this.dataset.activity; updateStats(activity); // Animate stats container statsContainer.classList.remove('visible'); setTimeout(() => { statsContainer.classList.add('visible'); }, 100); }); }); // Update stats based on activity function updateStats(activity) { const data = activityData[activity]; const statCards = document.querySelectorAll('.stat-card'); // Update values statCards[0].querySelector('.stat-value').innerHTML = data.distance; statCards[1].querySelector('.stat-value').innerHTML = data.pace; statCards[2].querySelector('.stat-value').innerHTML = data.calories; statCards[3].querySelector('.stat-value').innerHTML = data.heartRate; // Update labels based on activity if (activity === 'cycling') { statCards[1].querySelector('.stat-label').textContent = 'Speed'; } else if (activity === 'swimming') { statCards[1].querySelector('.stat-label').textContent = 'Pace'; } else { statCards[1].querySelector('.stat-label').textContent = 'Pace'; } } // Start/Stop tracking startButton.addEventListener('click', function(e) { createRipple(e); isTracking = !isTracking; if (isTracking) { this.innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" d="M15.75 5.25v13.5m-7.5-13.5v13.5" /> </svg> Stop Tracking `; this.style.background = 'linear-gradient(135deg, #FF5252, #FF6B6B)'; liveIndicator.style.display = 'flex'; // Simulating live tracking with random stat updates startLiveUpdates(); } else { this.innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" d="M5.25 5.653c0-.856.917-1.398 1.667-.986l11.54 6.348a1.125 1.125 0 0 1 0 1.971l-11.54 6.347c-.75.413-1.667-.13-1.667-.986V5.653Z" /> </svg> Start Tracking `; this.style.background = 'linear-gradient(135deg, #FF6B6B, #FF8E53)'; liveIndicator.style.display = 'none'; // Stop live updates stopLiveUpdates(); } }); // Apply ripple effect to all buttons const buttons = document.querySelectorAll('button'); buttons.forEach(button => { button.addEventListener('click', createRipple); }); // Live stat updates simulation let updateInterval; function startLiveUpdates() { const activeActivity = document.querySelector('.activity-button.active').dataset.activity; const statValues = document.querySelectorAll('.stat-value'); updateInterval = setInterval(() => { // Update heart rate with random fluctuation const currentHeartRate = parseInt(statValues[3].textContent); const newHeartRate = currentHeartRate + (Math.random() > 0.5 ? 1 : -1); statValues[3].innerHTML = `${newHeartRate}<span class="stat-unit">bpm</span>`; // Update calories (always increasing) const currentCalories = parseInt(statValues[2].textContent); const newCalories = currentCalories + 1; statValues[2].innerHTML = `${newCalories}<span class="stat-unit">kcal</span>`; // Update distance (always increasing) const distanceEl = statValues[0].textContent; const currentDistance = parseFloat(distanceEl); const distanceUnit = activeActivity === 'swimming' ? 'km' : 'km'; const newDistance = (currentDistance + 0.01).toFixed(2); statValues[0].innerHTML = `${newDistance}<span class="stat-unit">${distanceUnit}</span>`; }, 2000); } function stopLiveUpdates() { clearInterval(updateInterval); } }); </script> </body> </html>