Creating a visually appealing and functional user interface can be a daunting task. With Subframe, you can effortlessly design stunning UIs using a drag-and-drop visual editor and beautifully crafted components.
In this article, we will explore 10 panel examples that showcase the versatility and power of Subframe. These examples will inspire you to build your own production-ready interfaces in minutes.
CODE1
Here's the code:
CODETEXT1
CODE2
Here's the code:
CODETEXT2
CODE3
Here's the code:
CODETEXT3
CODE4
Here's the code:
CODETEXT4
CODE5
Here's the code:
CODETEXT5
Subframe's drag-and-drop interface and intuitive, responsive canvas make it easy to create pixel-perfect UIs every time. Loved by designers and developers alike, Subframe ensures your designs are both stunning and functional.
Start for free and experience the magic of effortless UI design today!
CODE6
Here's the code:
CODETEXT6
CODE7
Here's the code:
CODETEXT7
CODE8
Here's the code:
CODETEXT8
CODE9
Here's the code:
CODETEXT9
CODE10
Here's the code:
CODETEXT10
Ready to revolutionize your UI design process? With Subframe, you can create pixel-perfect interfaces effortlessly and efficiently. Our drag-and-drop editor and beautifully crafted components make designing a breeze.
Don't wait to experience the magic of Subframe. Start for free and begin creating stunning UIs immediately!
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> :root { --primary: #2a2d3e; --secondary: #1f1f2c; --accent: #6366f1; --text-primary: #ffffff; --text-secondary: #a0aec0; --success: #10b981; --warning: #f59e0b; --danger: #ef4444; --shadow: 0 4px 6px rgba(0, 0, 0, 0.1); --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; } body { background-color: var(--secondary); color: var(--text-primary); width: 100%; height: 100vh; display: flex; justify-content: center; align-items: center; overflow: hidden; } .dashboard-container { width: 700px; height: 700px; background-color: var(--primary); border-radius: 12px; box-shadow: var(--shadow); display: flex; flex-direction: column; overflow: hidden; } .header { display: flex; justify-content: space-between; align-items: center; padding: 1.5rem; border-bottom: 1px solid rgba(255, 255, 255, 0.1); } .header h1 { font-size: 1.5rem; font-weight: 600; } .user-profile { display: flex; align-items: center; gap: 0.75rem; cursor: pointer; } .user-avatar { width: 36px; height: 36px; border-radius: 50%; background: linear-gradient(135deg, var(--accent), #8b5cf6); display: flex; align-items: center; justify-content: center; font-weight: 700; color: white; position: relative; } .user-avatar::after { content: ""; position: absolute; right: 0; bottom: 0; width: 10px; height: 10px; background-color: var(--success); border-radius: 50%; border: 2px solid var(--primary); } .user-info span { display: block; } .user-name { font-weight: 600; font-size: 0.875rem; } .user-role { font-size: 0.75rem; color: var(--text-secondary); } .tabs { display: flex; padding: 0 1rem; border-bottom: 1px solid rgba(255, 255, 255, 0.1); overflow-x: auto; scrollbar-width: none; } .tabs::-webkit-scrollbar { display: none; } .tab { padding: 1rem 1.25rem; font-size: 0.875rem; font-weight: 500; color: var(--text-secondary); cursor: pointer; position: relative; white-space: nowrap; transition: var(--transition); } .tab.active { color: var(--text-primary); } .tab.active::after { content: ""; position: absolute; bottom: 0; left: 0; right: 0; height: 2px; background-color: var(--accent); border-radius: 2px 2px 0 0; } .tab:hover:not(.active) { color: var(--text-primary); background-color: rgba(255, 255, 255, 0.05); } .dashboard-content { flex: 1; padding: 1.5rem; overflow-y: auto; display: grid; grid-template-columns: repeat(2, 1fr); grid-template-rows: auto auto; gap: 1.25rem; } .panel { background-color: rgba(255, 255, 255, 0.05); border-radius: 8px; padding: 1.25rem; box-shadow: var(--shadow); transition: var(--transition); position: relative; overflow: hidden; } .panel:hover { transform: translateY(-2px); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15); } .panel-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; } .panel-title { font-weight: 600; font-size: 0.875rem; color: var(--text-secondary); } .panel-actions { display: flex; gap: 0.5rem; } .panel-action { width: 24px; height: 24px; border-radius: 4px; display: flex; align-items: center; justify-content: center; cursor: pointer; background-color: rgba(255, 255, 255, 0.1); transition: var(--transition); } .panel-action:hover { background-color: rgba(255, 255, 255, 0.2); } .panel-body { height: calc(100% - 40px); display: flex; flex-direction: column; } .metric { margin-bottom: 0.5rem; } .metric-value { font-size: 1.75rem; font-weight: 700; margin-bottom: 0.25rem; } .metric-trend { display: flex; align-items: center; font-size: 0.75rem; } .trend-positive { color: var(--success); } .trend-negative { color: var(--danger); } .trend-icon { margin-right: 0.25rem; } .panel.revenue-panel { grid-column: 1; grid-row: 1; } .panel.users-panel { grid-column: 2; grid-row: 1; } .panel.performance-panel { grid-column: 1 / span 2; grid-row: 2; } .chart-container { flex: 1; display: flex; align-items: center; justify-content: center; position: relative; } .revenue-chart, .users-chart, .performance-chart { width: 100%; height: 100%; position: relative; } .chart-legend { display: flex; gap: 1rem; margin-top: 1rem; font-size: 0.75rem; } .legend-item { display: flex; align-items: center; gap: 0.5rem; } .legend-color { width: 12px; height: 12px; border-radius: 2px; } .resizer { position: absolute; bottom: 0; right: 0; width: 12px; height: 12px; cursor: nwse-resize; background: linear-gradient(135deg, transparent 50%, var(--accent) 50%); border-radius: 0 0 4px 0; opacity: 0; transition: opacity 0.2s; } .panel:hover .resizer { opacity: 1; } .kpi-cards { display: flex; gap: 0.75rem; margin-bottom: 1rem; } .kpi-card { flex: 1; padding: 0.75rem; background-color: rgba(255, 255, 255, 0.07); border-radius: 6px; transition: var(--transition); } .kpi-card:hover { background-color: rgba(255, 255, 255, 0.1); } .kpi-title { font-size: 0.75rem; color: var(--text-secondary); margin-bottom: 0.25rem; } .kpi-value { font-size: 1.25rem; font-weight: 600; } .notification-badge { position: relative; } .notification-badge::after { content: "3"; position: absolute; top: -5px; right: -5px; width: 16px; height: 16px; background-color: var(--danger); border-radius: 50%; font-size: 0.625rem; display: flex; align-items: center; justify-content: center; } @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } .realtime-indicator { width: 8px; height: 8px; background-color: var(--success); border-radius: 50%; display: inline-block; margin-right: 6px; animation: pulse 2s infinite; } /* Responsive adjustments */ @media (max-width: 600px) { .dashboard-content { grid-template-columns: 1fr; grid-template-rows: auto auto auto; } .panel.revenue-panel, .panel.users-panel, .panel.performance-panel { grid-column: 1; } .panel.revenue-panel { grid-row: 1; } .panel.users-panel { grid-row: 2; } .panel.performance-panel { grid-row: 3; } .header h1 { font-size: 1.25rem; } .kpi-cards { flex-direction: column; gap: 0.5rem; } } </style> </head> <body> <div class="dashboard-container"> <div class="header"> <h1>Executive Dashboard</h1> <div class="user-profile"> <div class="user-avatar">JD</div> <div class="user-info"> <span class="user-name">Jane Doe</span> <span class="user-role">Chief Executive Officer</span> </div> </div> </div> <div class="tabs"> <div class="tab active" data-tab="overview">Overview</div> <div class="tab" data-tab="financial">Financial</div> <div class="tab" data-tab="customers">Customers</div> <div class="tab" data-tab="operations">Operations</div> <div class="tab" data-tab="marketing">Marketing</div> <div class="tab notification-badge" data-tab="alerts">Alerts</div> </div> <div class="dashboard-content"> <div class="panel revenue-panel"> <div class="panel-header"> <div class="panel-title">Revenue Metrics</div> <div class="panel-actions"> <div class="panel-action" title="Download report"> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg> </div> <div class="panel-action" title="More options"> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="1"></circle><circle cx="12" cy="5" r="1"></circle><circle cx="12" cy="19" r="1"></circle></svg> </div> </div> </div> <div class="panel-body"> <div class="metric"> <div class="metric-value">$8.4M</div> <div class="metric-trend trend-positive"> <span class="trend-icon">▲</span> 14.2% vs last quarter </div> </div> <div class="chart-container revenue-chart" id="revenue-chart"></div> </div> <div class="resizer" data-panel="revenue"></div> </div> <div class="panel users-panel"> <div class="panel-header"> <div class="panel-title">User Acquisition</div> <div class="panel-actions"> <div class="panel-action" title="Download report"> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg> </div> <div class="panel-action" title="More options"> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="1"></circle><circle cx="12" cy="5" r="1"></circle><circle cx="12" cy="19" r="1"></circle></svg> </div> </div> </div> <div class="panel-body"> <div class="metric"> <div class="metric-value">124,568</div> <div class="metric-trend trend-positive"> <span class="trend-icon">▲</span> 7.3% vs last month </div> </div> <div class="chart-container users-chart" id="users-chart"></div> </div> <div class="resizer" data-panel="users"></div> </div> <div class="panel performance-panel"> <div class="panel-header"> <div class="panel-title"> <span class="realtime-indicator"></span> Operational Performance </div> <div class="panel-actions"> <div class="panel-action" title="Download report"> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg> </div> <div class="panel-action" title="More options"> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="1"></circle><circle cx="12" cy="5" r="1"></circle><circle cx="12" cy="19" r="1"></circle></svg> </div> </div> </div> <div class="panel-body"> <div class="kpi-cards"> <div class="kpi-card"> <div class="kpi-title">Avg. Order Value</div> <div class="kpi-value">$67.20</div> </div> <div class="kpi-card"> <div class="kpi-title">Conversion Rate</div> <div class="kpi-value">3.42%</div> </div> <div class="kpi-card"> <div class="kpi-title">Customer Retention</div> <div class="kpi-value">84.5%</div> </div> <div class="kpi-card"> <div class="kpi-title">Profit Margin</div> <div class="kpi-value">27.3%</div> </div> </div> <div class="chart-container performance-chart" id="performance-chart"></div> <div class="chart-legend"> <div class="legend-item"> <span class="legend-color" style="background-color: var(--accent)"></span> <span>Product A</span> </div> <div class="legend-item"> <span class="legend-color" style="background-color: var(--success)"></span> <span>Product B</span> </div> <div class="legend-item"> <span class="legend-color" style="background-color: var(--warning)"></span> <span>Product C</span> </div> </div> </div> <div class="resizer" data-panel="performance"></div> </div> </div> </div> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <script> document.addEventListener('DOMContentLoaded', function() { // Tab functionality const tabs = document.querySelectorAll('.tab'); tabs.forEach(tab => { tab.addEventListener('click', () => { tabs.forEach(t => t.classList.remove('active')); tab.classList.add('active'); // Here you would normally load different content based on tab // For this demo we'll just show a simple animation const panels = document.querySelectorAll('.panel'); panels.forEach(panel => { panel.style.opacity = 0.5; setTimeout(() => { panel.style.opacity = 1; }, 300); }); }); }); // Panel resize functionality const resizers = document.querySelectorAll('.resizer'); resizers.forEach(resizer => { resizer.addEventListener('mousedown', initResize); }); function initResize(e) { e.preventDefault(); const panel = e.target.closest('.panel'); const startX = e.clientX; const startY = e.clientY; const startWidth = parseInt(getComputedStyle(panel).width, 10); const startHeight = parseInt(getComputedStyle(panel).height, 10); document.addEventListener('mousemove', resize); document.addEventListener('mouseup', stopResize); function resize(e) { panel.style.width = (startWidth + e.clientX - startX) + 'px'; panel.style.height = (startHeight + e.clientY - startY) + 'px'; } function stopResize() { document.removeEventListener('mousemove', resize); document.removeEventListener('mouseup', stopResize); } } // Create charts if (typeof Chart !== 'undefined') { // Revenue Chart const revenueCtx = document.createElement('canvas'); document.getElementById('revenue-chart').appendChild(revenueCtx); new Chart(revenueCtx, { type: 'line', data: { labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'], datasets: [{ label: 'Revenue ($M)', data: [5.2, 6.1, 7.3, 7.9, 8.0, 8.4], backgroundColor: 'rgba(99, 102, 241, 0.2)', borderColor: 'rgba(99, 102, 241, 1)', borderWidth: 2, tension: 0.4, pointBackgroundColor: 'rgba(99, 102, 241, 1)', pointRadius: 3 }] }, options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false }, tooltip: { mode: 'index', intersect: false, backgroundColor: 'rgba(42, 45, 62, 0.9)', titleColor: '#fff', bodyColor: '#fff', borderColor: 'rgba(99, 102, 241, 0.5)', borderWidth: 1 } }, scales: { y: { beginAtZero: false, grid: { color: 'rgba(255, 255, 255, 0.05)' }, ticks: { color: 'rgba(160, 174, 192, 1)' } }, x: { grid: { display: false }, ticks: { color: 'rgba(160, 174, 192, 1)' } } } } }); // Users Chart const usersCtx = document.createElement('canvas'); document.getElementById('users-chart').appendChild(usersCtx); new Chart(usersCtx, { type: 'bar', data: { labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'], datasets: [{ label: 'New Users', data: [89500, 95200, 102300, 110500, 115700, 124568], backgroundColor: 'rgba(16, 185, 129, 0.7)', borderRadius: 4 }] }, options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false }, tooltip: { mode: 'index', intersect: false, backgroundColor: 'rgba(42, 45, 62, 0.9)', titleColor: '#fff', bodyColor: '#fff', callbacks: { label: function(context) { return 'Users: ' + context.parsed.y.toLocaleString(); } } } }, scales: { y: { beginAtZero: false, grid: { color: 'rgba(255, 255, 255, 0.05)' }, ticks: { color: 'rgba(160, 174, 192, 1)', callback: function(value) { return value / 1000 + 'K'; } } }, x: { grid: { display: false }, ticks: { color: 'rgba(160, 174, 192, 1)' } } } } }); // Performance Chart const performanceCtx = document.createElement('canvas'); document.getElementById('performance-chart').appendChild(performanceCtx); new Chart(performanceCtx, { type: 'line', data: { labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'], datasets: [ { label: 'Product A', data: [42, 49, 52, 58, 65, 63], borderColor: 'rgba(99, 102, 241, 1)', backgroundColor: 'rgba(99, 102, 241, 0.1)', tension: 0.3, fill: true }, { label: 'Product B', data: [30, 38, 45, 50, 47, 60], borderColor: 'rgba(16, 185, 129, 1)', backgroundColor: 'rgba(16, 185, 129, 0.1)', tension: 0.3, fill: true }, { label: 'Product C', data: [20, 22, 25, 30, 40, 35], borderColor: 'rgba(245, 158, 11, 1)', backgroundColor: 'rgba(245, 158, 11, 0.1)', tension: 0.3, fill: true } ] }, options: { responsive: true, maintainAspectRatio: false, interaction: { mode: 'index', intersect: false }, plugins: { legend: { display: false }, tooltip: { backgroundColor: 'rgba(42, 45, 62, 0.9)', titleColor: '#fff', bodyColor: '#fff', usePointStyle: true } }, scales: { y: { beginAtZero: true, grid: { color: 'rgba(255, 255, 255, 0.05)' }, ticks: { color: 'rgba(160, 174, 192, 1)' } }, x: { grid: { display: false }, ticks: { color: 'rgba(160, 174, 192, 1)' } } } } }); } // Add hover effect for KPI cards const kpiCards = document.querySelectorAll('.kpi-card'); kpiCards.forEach(card => { card.addEventListener('mouseenter', () => { card.style.transform = 'translateY(-5px)'; }); card.addEventListener('mouseleave', () => { card.style.transform = 'translateY(0)'; }); }); // Animate numbers on load const metrics = document.querySelectorAll('.metric-value'); metrics.forEach(metric => { const finalValue = metric.textContent; const isCurrency = finalValue.includes('$'); const isPercentage = finalValue.includes('%'); let startValue = 0; if (isCurrency) { startValue = '$0'; } else if (isPercentage) { startValue = '0%'; } else { startValue = '0'; } metric.textContent = startValue; const duration = 1500; const startTime = performance.now(); function updateNumber(currentTime) { const elapsedTime = currentTime - startTime; const progress = Math.min(elapsedTime / duration, 1); if (isCurrency) { const rawValue = parseFloat(finalValue.replace('$', '').replace('M', '')); const currentValue = (progress * rawValue).toFixed(1); metric.textContent = `$${currentValue}M`; } else if (isPercentage) { const rawValue = parseFloat(finalValue.replace('%', '')); const currentValue = (progress * rawValue).toFixed(1); metric.textContent = `${currentValue}%`; } else { const rawValue = parseInt(finalValue.replace(/,/g, '')); const currentValue = Math.round(progress * rawValue); metric.textContent = currentValue.toLocaleString(); } if (progress < 1) { requestAnimationFrame(updateNumber); } } requestAnimationFrame(updateNumber); }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> :root { --primary: #e57373; --primary-light: #ffa4a2; --primary-dark: #af4448; --secondary: #ffd54f; --text: #37474f; --text-light: #78909c; --bg: #fff9f0; --white: #ffffff; --shadow: 0 10px 20px rgba(0, 0, 0, 0.1); --transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Poppins', sans-serif; } body { background-color: var(--bg); color: var(--text); height: 100%; width: 100%; display: flex; justify-content: center; align-items: center; overflow-x: hidden; } .container { width: 100%; max-width: 700px; height: 700px; padding: 20px; overflow-y: auto; overflow-x: hidden; position: relative; scroll-behavior: smooth; } .container::-webkit-scrollbar { width: 6px; } .container::-webkit-scrollbar-track { background: var(--white); border-radius: 10px; } .container::-webkit-scrollbar-thumb { background: var(--primary-light); border-radius: 10px; } .product-panel { background-color: var(--white); border-radius: 16px; box-shadow: var(--shadow); overflow: hidden; position: relative; transition: var(--transition); transform-style: preserve-3d; margin-bottom: 20px; } .product-header { position: relative; overflow: hidden; height: 360px; } .product-badge { position: absolute; top: 20px; left: -40px; background-color: var(--secondary); color: var(--text); font-weight: 600; padding: 6px 40px; transform: rotate(-45deg); z-index: 10; font-size: 12px; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); } .image-gallery { height: 100%; width: 500%; display: flex; transition: transform 0.5s ease-in-out; } .product-image { width: 20%; height: 100%; object-fit: cover; transition: var(--transition); } .gallery-nav { position: absolute; bottom: 15px; left: 0; right: 0; display: flex; justify-content: center; gap: 10px; } .gallery-dot { width: 12px; height: 12px; border-radius: 50%; background-color: rgba(255, 255, 255, 0.5); cursor: pointer; transition: var(--transition); } .gallery-dot.active { background-color: var(--white); transform: scale(1.2); } .quick-view { position: absolute; top: 20px; right: 20px; display: flex; flex-direction: column; gap: 10px; } .view-btn { width: 40px; height: 40px; border-radius: 50%; background-color: var(--white); display: flex; justify-content: center; align-items: center; cursor: pointer; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); transition: var(--transition); } .view-btn:hover { transform: translateY(-3px); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.15); background-color: var(--primary-light); color: var(--white); } .view-btn i { font-size: 18px; } .product-content { padding: 25px; } .product-title { font-size: 24px; font-weight: 600; margin-bottom: 10px; color: var(--text); } .product-subtitle { font-size: 14px; color: var(--text-light); margin-bottom: 20px; } .product-price-container { display: flex; align-items: center; margin-bottom: 20px; } .product-price { font-size: 28px; font-weight: 700; color: var(--primary-dark); margin-right: 12px; } .product-old-price { font-size: 18px; color: var(--text-light); text-decoration: line-through; } .product-savings { margin-left: 15px; background-color: var(--primary-light); color: var(--white); padding: 4px 10px; border-radius: 4px; font-size: 12px; font-weight: 600; } .product-rating { display: flex; align-items: center; margin-bottom: 20px; } .stars { color: var(--secondary); margin-right: 10px; } .review-count { color: var(--text-light); font-size: 14px; } .product-actions { display: flex; gap: 15px; margin-top: 25px; } .quantity-selector { display: flex; align-items: center; border: 1px solid #e0e0e0; border-radius: 8px; overflow: hidden; } .quantity-btn { width: 40px; height: 46px; background-color: #f5f5f5; border: none; font-size: 18px; cursor: pointer; transition: var(--transition); } .quantity-btn:hover { background-color: #e0e0e0; } .quantity-input { width: 50px; height: 46px; border: none; text-align: center; font-size: 16px; font-weight: 500; } .add-to-cart { flex-grow: 1; height: 46px; background-color: var(--primary); color: var(--white); border: none; border-radius: 8px; font-size: 16px; font-weight: 600; cursor: pointer; transition: var(--transition); display: flex; justify-content: center; align-items: center; gap: 10px; position: relative; overflow: hidden; } .add-to-cart:hover { background-color: var(--primary-dark); transform: translateY(-3px); box-shadow: 0 5px 15px rgba(229, 115, 115, 0.4); } .add-to-cart::before { content: ''; position: absolute; top: 50%; left: 50%; width: 0; height: 0; background-color: rgba(255, 255, 255, 0.2); border-radius: 50%; transform: translate(-50%, -50%); transition: width 0.6s, height 0.6s; } .add-to-cart:hover::before { width: 300px; height: 300px; } .add-to-cart span { z-index: 2; } .add-to-cart i { z-index: 2; } .wishlist-btn { width: 46px; height: 46px; border-radius: 8px; background-color: #f5f5f5; border: 1px solid #e0e0e0; display: flex; justify-content: center; align-items: center; cursor: pointer; transition: var(--transition); color: var(--text-light); } .wishlist-btn:hover, .wishlist-btn.active { background-color: #ffebee; border-color: var(--primary-light); color: var(--primary); transform: translateY(-3px); box-shadow: 0 5px 15px rgba(229, 115, 115, 0.2); } .wishlist-btn.active i::before { content: "\f004"; /* Solid heart */ } .product-tabs { margin-top: 30px; border-top: 1px solid #e0e0e0; padding-top: 20px; } .tabs-header { display: flex; border-bottom: 1px solid #e0e0e0; margin-bottom: 20px; } .tab { padding: 10px 20px; cursor: pointer; font-weight: 500; color: var(--text-light); position: relative; transition: var(--transition); } .tab::after { content: ''; position: absolute; bottom: -1px; left: 0; width: 0; height: 2px; background-color: var(--primary); transition: var(--transition); } .tab.active { color: var(--primary); } .tab.active::after { width: 100%; } .tab-content { display: none; animation: fadeIn 0.5s ease-in-out; } .tab-content.active { display: block; } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .feature-item { display: flex; align-items: center; margin-bottom: 12px; } .feature-item i { color: var(--primary); margin-right: 10px; font-size: 14px; } .expanded-desc { overflow: hidden; max-height: 0; transition: max-height 0.5s ease; } .read-more { display: inline-block; color: var(--primary); cursor: pointer; font-weight: 500; margin-top: 10px; transition: var(--transition); } .read-more:hover { color: var(--primary-dark); text-decoration: underline; } .read-more i { margin-left: 5px; transition: transform 0.3s ease; } .read-more.expanded i { transform: rotate(180deg); } .color-options { display: flex; gap: 10px; margin-top: 20px; } .color-option { width: 30px; height: 30px; border-radius: 50%; cursor: pointer; position: relative; transition: var(--transition); } .color-option::after { content: ''; position: absolute; top: -4px; left: -4px; right: -4px; bottom: -4px; border: 2px solid transparent; border-radius: 50%; transition: var(--transition); } .color-option.active::after { border-color: var(--primary); } .color-option:hover { transform: scale(1.1); } .related-products { padding: 30px 20px; background-color: var(--white); border-radius: 16px; box-shadow: var(--shadow); } .section-title { font-size: 20px; font-weight: 600; margin-bottom: 20px; color: var(--text); display: flex; align-items: center; } .section-title::before { content: ''; width: 4px; height: 20px; background-color: var(--primary); margin-right: 10px; border-radius: 2px; } .product-card-container { display: flex; gap: 20px; overflow-x: auto; padding-bottom: 15px; scroll-behavior: smooth; -ms-overflow-style: none; scrollbar-width: none; } .product-card-container::-webkit-scrollbar { display: none; } .product-card { min-width: 180px; background-color: var(--bg); border-radius: 12px; overflow: hidden; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.05); transition: var(--transition); } .product-card:hover { transform: translateY(-5px); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1); } .product-card-img { height: 140px; width: 100%; object-fit: cover; } .product-card-content { padding: 12px; } .product-card-title { font-size: 14px; font-weight: 500; margin-bottom: 5px; color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .product-card-price { font-size: 16px; font-weight: 600; color: var(--primary-dark); } .scroll-nav { display: flex; justify-content: center; gap: 10px; margin-top: 15px; } .scroll-btn { width: 36px; height: 36px; border-radius: 50%; background-color: var(--white); border: 1px solid #e0e0e0; display: flex; justify-content: center; align-items: center; cursor: pointer; transition: var(--transition); } .scroll-btn:hover { background-color: var(--primary-light); color: var(--white); border-color: var(--primary-light); } .availability { display: flex; align-items: center; margin-top: 15px; font-size: 14px; } .in-stock { color: #66bb6a; display: flex; align-items: center; } .delivery-info { margin-left: 20px; color: var(--text-light); display: flex; align-items: center; } .availability i { margin-right: 5px; } .pattern-bg { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-image: radial-gradient(var(--primary-light) 1px, transparent 1px), radial-gradient(var(--primary-light) 1px, transparent 1px); background-size: 20px 20px; background-position: 0 0, 10px 10px; opacity: 0.1; z-index: -1; } /* Responsive styles */ @media (max-width: 600px) { .product-header { height: 280px; } .product-title { font-size: 20px; } .product-price { font-size: 24px; } .product-actions { flex-direction: column; } .quantity-selector { width: 100%; } .add-to-cart { width: 100%; } .wishlist-btn { position: absolute; top: 15px; right: 15px; } .tabs-header { overflow-x: auto; white-space: nowrap; padding-bottom: 5px; } .tab { padding: 10px 15px; } } /* Animation effects */ @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } .pulse { animation: pulse 2s infinite; } .product-image.zoom { transform: scale(1.1); } .floating-animation { animation: floating 3s ease-in-out infinite; } @keyframes floating { 0% { transform: translateY(0px); } 50% { transform: translateY(-10px); } 100% { transform: translateY(0px); } } .toast { position: fixed; bottom: 30px; left: 50%; transform: translateX(-50%); background-color: #333; color: white; padding: 12px 24px; border-radius: 8px; font-size: 14px; font-weight: 500; opacity: 0; visibility: hidden; transition: opacity 0.3s, visibility 0.3s; z-index: 1000; } .toast.show { opacity: 1; visibility: visible; } /* 3D effect for product card */ .product-card { perspective: 1000px; } .product-card-inner { position: relative; width: 100%; height: 100%; transition: transform 0.6s; transform-style: preserve-3d; } /* Animated progress bar */ .progress-container { margin-top: 15px; width: 100%; height: 6px; background-color: #f5f5f5; border-radius: 10px; overflow: hidden; } .progress-bar { height: 100%; width: 70%; background: linear-gradient(90deg, var(--primary-light), var(--primary)); border-radius: 10px; position: relative; } .progress-bar::after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.4), transparent); animation: shimmer 1.5s infinite; } @keyframes shimmer { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } } .stock-text { font-size: 12px; color: var(--text-light); margin-top: 5px; text-align: center; } </style> <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap" rel="stylesheet"> </head> <body> <div class="container"> <div class="pattern-bg"></div> <div class="product-panel"> <div class="product-badge">LIMITED EDITION</div> <div class="product-header"> <div class="image-gallery"> <img src="https://images.unsplash.com/photo-1585386959984-a4a9d49e1f90?ixlib=rb-1.2.1&auto=format&fit=crop&w=1000&q=80" alt="Cozy Tranquility Chair - Main View" class="product-image"> <img src="https://images.unsplash.com/photo-1567538096630-e0c55bd6374c?ixlib=rb-1.2.1&auto=format&fit=crop&w=1000&q=80" alt="Cozy Tranquility Chair - Side View" class="product-image"> <img src="https://images.unsplash.com/photo-1598300042247-d088f8ab3a91?ixlib=rb-1.2.1&auto=format&fit=crop&w=1000&q=80" alt="Cozy Tranquility Chair - Detail View" class="product-image"> <img src="https://images.unsplash.com/photo-1524758631624-e2822e304c36?ixlib=rb-1.2.1&auto=format&fit=crop&w=1000&q=80" alt="Cozy Tranquility Chair - Room View" class="product-image"> <img src="https://images.unsplash.com/photo-1493663284031-b7e3aefcae8e?ixlib=rb-1.2.1&auto=format&fit=crop&w=1000&q=80" alt="Cozy Tranquility Chair - Material View" class="product-image"> </div> <div class="gallery-nav"> <div class="gallery-dot active" data-index="0"></div> <div class="gallery-dot" data-index="1"></div> <div class="gallery-dot" data-index="2"></div> <div class="gallery-dot" data-index="3"></div> <div class="gallery-dot" data-index="4"></div> </div> <div class="quick-view"> <div class="view-btn" title="Zoom"> <i class="fas fa-search-plus"></i> </div> <div class="view-btn" title="360° View"> <i class="fas fa-sync-alt"></i> </div> </div> </div> <div class="product-content"> <h1 class="product-title">Cozy Tranquility Accent Chair</h1> <p class="product-subtitle">Handcrafted comfort with sustainable materials</p> <div class="product-price-container"> <div class="product-price">$349.99</div> <div class="product-old-price">$429.99</div> <div class="product-savings">Save 19%</div> </div> <div class="product-rating"> <div class="stars"> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star"></i> <i class="fas fa-star-half-alt"></i> </div> <div class="review-count">4.7 (328 reviews)</div> </div> <div class="color-options"> <div class="color-option active" style="background-color: #e57373;" data-color="Soft Rose" title="Soft Rose"></div> <div class="color-option" style="background-color: #b0bec5;" data-color="Cloud Gray" title="Cloud Gray"></div> <div class="color-option" style="background-color: #90a4ae;" data-color="Dusty Blue" title="Dusty Blue"></div> <div class="color-option" style="background-color: #bcaaa4;" data-color="Warm Taupe" title="Warm Taupe"></div> </div> <div class="availability"> <div class="in-stock"><i class="fas fa-check-circle"></i> In Stock</div> <div class="delivery-info"><i class="fas fa-truck"></i> Free delivery in 3-5 days</div> </div> <div class="progress-container"> <div class="progress-bar"></div> </div> <div class="stock-text">70% of stock sold - Hurry, only 12 left!</div> <div class="product-actions"> <div class="quantity-selector"> <button class="quantity-btn minus-btn">-</button> <input type="text" class="quantity-input" value="1" readonly> <button class="quantity-btn plus-btn">+</button> </div> <button class="add-to-cart"> <i class="fas fa-shopping-cart"></i> <span>Add to Cart</span> </button> <button class="wishlist-btn"> <i class="far fa-heart"></i> </button> </div> <div class="product-tabs"> <div class="tabs-header"> <div class="tab active" data-tab="description">Description</div> <div class="tab" data-tab="features">Features</div> <div class="tab" data-tab="dimensions">Dimensions</div> <div class="tab" data-tab="reviews">Reviews</div> </div> <div class="tab-content active" id="description"> <p>The Cozy Tranquility Accent Chair blends modern design with exceptional comfort, creating a statement piece that elevates any living space. Its thoughtfully curved silhouette offers perfect lumbar support while the plush cushioning invites you to sink in and relax.</p> <div class="expanded-desc"> <p>Upholstered in premium stain-resistant fabric, this chair combines practicality with luxury. The solid wood frame ensures durability, while the handcrafted details showcase superior craftsmanship.</p> <p>Perfect for reading corners, living rooms, or bedroom retreats, this versatile chair adapts to any interior style from minimalist to eclectic. Each chair undergoes rigorous quality testing to ensure it meets our standards for comfort and longevity.</p> </div> <div class="read-more">Read More <i class="fas fa-chevron-down"></i></div> </div> <div class="tab-content" id="features"> <div class="feature-item"> <i class="fas fa-check"></i> <span>Premium stain-resistant fabric upholstery</span> </div> <div class="feature-item"> <i class="fas fa-check"></i> <span>Solid wood frame and legs with natural finish</span> </div> <div class="feature-item"> <i class="fas fa-check"></i> <span>High-density foam cushioning for lasting comfort</span> </div> <div class="feature-item"> <i class="fas fa-check"></i> <span>Ergonomic design with lumbar support</span> </div> <div class="feature-item"> <i class="fas fa-check"></i> <span>Easy assembly with included tools</span> </div> <div class="feature-item"> <i class="fas fa-check"></i> <span>Sustainably sourced materials</span> </div> </div> <div class="tab-content" id="dimensions"> <p><strong>Overall Dimensions:</strong><br> Width: 30" (76 cm)<br> Depth: 33" (84 cm)<br> Height: 34" (86 cm)</p> <p><strong>Seat Dimensions:</strong><br> Width: 22" (56 cm)<br> Depth: 21" (53 cm)<br> Height from floor: 18" (46 cm)</p> <p><strong>Arm Height:</strong> 24" (61 cm) from floor</p> <p><strong>Weight Capacity:</strong> 300 lbs (136 kg)</p> <p><strong>Product Weight:</strong> 32 lbs (14.5 kg)</p> </div> <div class="tab-content" id="reviews"> <p>Based on 328 verified customer reviews:</p> <div class="feature-item"> <i class="fas fa-star"></i> <span>Comfort: 4.8/5</span> </div> <div class="feature-item"> <i class="fas fa-star"></i> <span>Quality: 4.7/5</span> </div> <div class="feature-item"> <i class="fas fa-star"></i> <span>Value: 4.5/5</span> </div> <div class="feature-item"> <i class="fas fa-star"></i> <span>Style: 4.9/5</span> </div> <p style="margin-top: 10px;">97% of customers would recommend this product.</p> </div> </div> </div> </div> <div class="related-products"> <h2 class="section-title">Complete Your Space</h2> <div class="product-card-container"> <div class="product-card"> <img src="https://images.unsplash.com/photo-1550226891-ef816aed4a98?ixlib=rb-1.2.1&auto=format&fit=crop&w=1000&q=80" alt="Harmony Coffee Table" class="product-card-img"> <div class="product-card-content"> <h3 class="product-card-title">Harmony Coffee Table</h3> <div class="product-card-price">$229.99</div> </div> </div> <div class="product-card"> <img src="https://images.unsplash.com/photo-1540638349517-3abd5afc5847?ixlib=rb-1.2.1&auto=format&fit=crop&w=1000&q=80" alt="Serene Floor Lamp" class="product-card-img"> <div class="product-card-content"> <h3 class="product-card-title">Serene Floor Lamp</h3> <div class="product-card-price">$149.99</div> </div> </div> <div class="product-card"> <img src="https://images.unsplash.com/photo-1600494603989-9650cf6dad51?ixlib=rb-1.2.1&auto=format&fit=crop&w=1000&q=80" alt="Plush Throw Pillows" class="product-card-img"> <div class="product-card-content"> <h3 class="product-card-title">Plush Throw Pillows (Set of 2)</h3> <div class="product-card-price">$59.99</div> </div> </div> <div class="product-card"> <img src="https://images.unsplash.com/photo-1616486338812-3dadae4b4ace?ixlib=rb-1.2.1&auto=format&fit=crop&w=1000&q=80" alt="Artisan Area Rug" class="product-card-img"> <div class="product-card-content"> <h3 class="product-card-title">Artisan Area Rug 5'x7'</h3> <div class="product-card-price">$189.99</div> </div> </div> </div> <div class="scroll-nav"> <div class="scroll-btn scroll-left"><i class="fas fa-chevron-left"></i></div> <div class="scroll-btn scroll-right"><i class="fas fa-chevron-right"></i></div> </div> </div> <div class="toast">Added to cart successfully!</div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Image gallery navigation const galleryDots = document.querySelectorAll('.gallery-dot'); const imageGallery = document.querySelector('.image-gallery'); galleryDots.forEach(dot => { dot.addEventListener('click', function() { const index = this.getAttribute('data-index'); imageGallery.style.transform = `translateX(-${index * 20}%)`; // Update active dot galleryDots.forEach(d => d.classList.remove('active')); this.classList.add('active'); }); }); // Quantity selector const minusBtn = document.querySelector('.minus-btn'); const plusBtn = document.querySelector('.plus-btn'); const quantityInput = document.querySelector('.quantity-input'); minusBtn.addEventListener('click', function() { let value = parseInt(quantityInput.value); if (value > 1) { quantityInput.value = value - 1; } }); plusBtn.addEventListener('click', function() { let value = parseInt(quantityInput.value); quantityInput.value = value + 1; }); // Read more functionality const readMore = document.querySelector('.read-more'); const expandedDesc = document.querySelector('.expanded-desc'); readMore.addEventListener('click', function() { this.classList.toggle('expanded'); if (this.classList.contains('expanded')) { expandedDesc.style.maxHeight = expandedDesc.scrollHeight + 'px'; this.innerHTML = 'Read Less <i class="fas fa-chevron-up"></i>'; } else { expandedDesc.style.maxHeight = '0'; this.innerHTML = 'Read More <i class="fas fa-chevron-down"></i>'; } }); // Tab navigation const tabs = document.querySelectorAll('.tab'); const tabContents = document.querySelectorAll('.tab-content'); tabs.forEach(tab => { tab.addEventListener('click', function() { const targetTab = this.getAttribute('data-tab'); // Update active tab tabs.forEach(t => t.classList.remove('active')); this.classList.add('active'); // Show relevant content tabContents.forEach(content => { content.classList.remove('active'); if (content.id === targetTab) { content.classList.add('active'); } }); }); }); // Color selector const colorOptions = document.querySelectorAll('.color-option'); colorOptions.forEach(option => { option.addEventListener('click', function() { colorOptions.forEach(o => o.classList.remove('active')); this.classList.add('active'); // Display toast with selected color const colorName = this.getAttribute('data-color'); showToast(`Selected color: ${colorName}`); }); }); // Wishlist button const wishlistBtn = document.querySelector('.wishlist-btn'); wishlistBtn.addEventListener('click', function() { this.classList.toggle('active'); if (this.classList.contains('active')) { showToast('Added to wishlist!'); } else { showToast('Removed from wishlist'); } }); // Add to cart animation const addToCart = document.querySelector('.add-to-cart'); addToCart.addEventListener('click', function() { this.classList.add('pulse'); showToast('Added to cart successfully!'); setTimeout(() => { this.classList.remove('pulse'); }, 1000); }); // Quick view buttons const viewBtns = document.querySelectorAll('.view-btn'); const productImages = document.querySelectorAll('.product-image');
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Patient Information Panel</title> <style> :root { --primary: #2c6e9b; --primary-light: #4a99c9; --secondary: #3da687; --secondary-light: #65c6a8; --accent: #f0f5ff; --gray-100: #f8f9fa; --gray-200: #e9ecef; --gray-300: #dee2e6; --gray-400: #ced4da; --gray-500: #adb5bd; --gray-600: #6c757d; --gray-700: #495057; --gray-800: #343a40; --gray-900: #212529; --alert: #cb6e6e; --alert-light: #ffe5e5; --warning: #e7c260; --warning-light: #fff8e5; --radius-sm: 4px; --radius-md: 8px; --radius-lg: 16px; --shadow-sm: 0 2px 4px rgba(0,0,0,0.05); --shadow-md: 0 4px 8px rgba(0,0,0,0.1); --shadow-lg: 0 8px 16px rgba(0,0,0,0.1); --transition: all 0.2s ease-in-out; } * { 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(--gray-100); color: var(--gray-800); min-height: 100vh; display: flex; justify-content: center; align-items: center; padding: 1rem; } .container { width: 100%; max-width: 700px; height: 700px; background: white; border-radius: var(--radius-lg); box-shadow: var(--shadow-lg); overflow: hidden; display: flex; flex-direction: column; } .header { background: linear-gradient(135deg, var(--primary), var(--secondary)); color: white; padding: 1.5rem; position: relative; overflow: hidden; } .header::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: repeating-linear-gradient( 45deg, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.05) 10px, transparent 10px, transparent 20px ); } .header h1 { font-size: 1.75rem; margin-bottom: 0.5rem; font-weight: 600; position: relative; z-index: 1; } .header-stats { display: flex; gap: 1.5rem; position: relative; z-index: 1; } .header-stat { display: flex; align-items: center; gap: 0.5rem; } .header-stat .icon { font-size: 1.25rem; } .header-stat .label { font-size: 0.875rem; opacity: 0.8; } .header-stat .value { font-weight: 600; } .patient-brief { display: flex; margin-top: 1rem; gap: 1.5rem; position: relative; z-index: 1; } .avatar { width: 64px; height: 64px; border-radius: 50%; background-color: white; display: flex; align-items: center; justify-content: center; font-size: 1.75rem; font-weight: bold; color: var(--primary); box-shadow: var(--shadow-sm); } .patient-info { flex: 1; } .patient-name { font-size: 1.25rem; font-weight: 600; margin-bottom: 0.25rem; } .patient-details { display: flex; flex-wrap: wrap; gap: 1rem 2rem; font-size: 0.875rem; } .patient-detail { display: flex; align-items: center; gap: 0.5rem; } .patient-detail .icon { opacity: 0.8; } .badge { display: inline-flex; align-items: center; padding: 0.125rem 0.5rem; font-size: 0.75rem; font-weight: 600; border-radius: 100px; margin-left: 0.5rem; } .badge-alert { background-color: var(--alert-light); color: var(--alert); } .badge-warning { background-color: var(--warning-light); color: var(--warning); } .badge .icon { margin-right: 0.25rem; font-size: 0.75rem; } .tabs { display: flex; border-bottom: 1px solid var(--gray-200); position: relative; } .tab { padding: 1rem 1.5rem; font-weight: 500; color: var(--gray-600); cursor: pointer; position: relative; transition: var(--transition); } .tab:hover { color: var(--primary); } .tab.active { color: var(--primary); } .tab-indicator { position: absolute; bottom: 0; left: 0; height: 3px; background-color: var(--primary); transition: var(--transition); } .content { flex: 1; padding: 1.5rem; overflow-y: auto; } .filters { display: flex; gap: 0.5rem; margin-bottom: 1.5rem; flex-wrap: wrap; } .filter { padding: 0.5rem 1rem; background-color: var(--gray-100); border-radius: var(--radius-md); font-size: 0.875rem; cursor: pointer; transition: var(--transition); border: 1px solid transparent; } .filter:hover { background-color: var(--gray-200); } .filter.active { background-color: var(--primary-light); color: white; } .search-bar { position: relative; margin-bottom: 1.5rem; } .search-bar input { width: 100%; padding: 0.75rem 1rem 0.75rem 2.5rem; border-radius: var(--radius-md); border: 1px solid var(--gray-300); font-size: 0.875rem; transition: var(--transition); } .search-bar input:focus { outline: none; border-color: var(--primary-light); box-shadow: 0 0 0 3px rgba(74, 153, 201, 0.2); } .search-bar .icon { position: absolute; left: 1rem; top: 50%; transform: translateY(-50%); color: var(--gray-500); font-size: 1rem; } .timeline { position: relative; padding-left: 2rem; } .timeline::before { content: ''; position: absolute; top: 0; left: 0.625rem; width: 2px; height: 100%; background-color: var(--gray-200); } .timeline-item { position: relative; margin-bottom: 1.5rem; animation: fadeIn 0.5s ease forwards; opacity: 0; } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .timeline-item:nth-child(1) { animation-delay: 0.1s; } .timeline-item:nth-child(2) { animation-delay: 0.2s; } .timeline-item:nth-child(3) { animation-delay: 0.3s; } .timeline-item:nth-child(4) { animation-delay: 0.4s; } .timeline-item:nth-child(5) { animation-delay: 0.5s; } .timeline-marker { position: absolute; top: 0; left: -2rem; width: 1.25rem; height: 1.25rem; border-radius: 50%; background-color: white; border: 2px solid var(--gray-300); z-index: 1; display: flex; align-items: center; justify-content: center; font-size: 0.75rem; color: var(--gray-600); transition: var(--transition); } .timeline-item:hover .timeline-marker { background-color: var(--primary-light); border-color: var(--primary-light); color: white; transform: scale(1.2); } .timeline-content { background-color: white; border-radius: var(--radius-md); padding: 1rem; box-shadow: var(--shadow-sm); border: 1px solid var(--gray-200); transition: var(--transition); } .timeline-item:hover .timeline-content { box-shadow: var(--shadow-md); border-color: var(--primary-light); transform: translateX(5px); } .timeline-header { display: flex; justify-content: space-between; margin-bottom: 0.5rem; font-size: 0.875rem; } .timeline-title { font-weight: 600; color: var(--gray-800); } .timeline-date { color: var(--gray-600); font-size: 0.75rem; } .timeline-body { font-size: 0.875rem; color: var(--gray-700); margin-bottom: 0.5rem; } .timeline-footer { display: flex; justify-content: space-between; align-items: center; } .timeline-tags { display: flex; gap: 0.5rem; } .timeline-tag { font-size: 0.75rem; padding: 0.25rem 0.5rem; border-radius: var(--radius-sm); background-color: var(--gray-100); color: var(--gray-700); } .timeline-tag.critical { background-color: var(--alert-light); color: var(--alert); } .timeline-tag.medication { background-color: var(--primary-light); color: white; } .timeline-tag.procedure { background-color: var(--secondary-light); color: white; } .timeline-doctor { font-size: 0.75rem; color: var(--gray-600); display: flex; align-items: center; gap: 0.25rem; } .loading { display: none; justify-content: center; align-items: center; height: 100px; } .spinner { width: 40px; height: 40px; border: 3px solid var(--gray-200); border-top-color: var(--primary); border-radius: 50%; animation: spin 1s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } .empty-state { display: none; text-align: center; padding: 3rem 1rem; color: var(--gray-600); } .empty-state .icon { font-size: 3rem; margin-bottom: 1rem; color: var(--gray-400); } .empty-state h3 { font-size: 1.25rem; margin-bottom: 0.5rem; color: var(--gray-700); } .empty-state p { font-size: 0.875rem; max-width: 300px; margin: 0 auto; } /* Vitals section styles */ .vitals-section { display: flex; flex-wrap: wrap; gap: 1rem; margin-bottom: 1.5rem; } .vital-card { flex: 1; min-width: calc(50% - 0.5rem); background-color: white; padding: 1rem; border-radius: var(--radius-md); box-shadow: var(--shadow-sm); border: 1px solid var(--gray-200); transition: var(--transition); } .vital-card:hover { box-shadow: var(--shadow-md); transform: translateY(-5px); } .vital-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.5rem; } .vital-title { font-size: 0.75rem; color: var(--gray-600); font-weight: 500; } .vital-icon { font-size: 1rem; color: var(--primary); } .vital-value { font-size: 1.5rem; font-weight: 600; color: var(--gray-800); } .vital-meta { display: flex; align-items: center; gap: 0.5rem; font-size: 0.75rem; margin-top: 0.25rem; } .vital-trend { display: flex; align-items: center; gap: 0.25rem; } .vital-trend.up { color: var(--alert); } .vital-trend.down { color: var(--secondary); } .vital-trend.stable { color: var(--gray-600); } .vital-range { color: var(--gray-500); } /* Responsive styling */ @media (max-width: 600px) { .header { padding: 1rem; } .patient-brief { flex-direction: column; gap: 1rem; } .header-stats { flex-wrap: wrap; gap: 1rem; } .tab { padding: 0.75rem 1rem; font-size: 0.875rem; } .content { padding: 1rem; } .vital-card { min-width: 100%; } } /* Animation for tabs */ @keyframes fadeTabContent { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .tab-content { animation: fadeTabContent 0.3s ease-out forwards; } /* Tooltip styling */ .tooltip { position: absolute; background-color: var(--gray-800); color: white; padding: 0.5rem 0.75rem; border-radius: var(--radius-sm); font-size: 0.75rem; pointer-events: none; z-index: 100; opacity: 0; transition: opacity 0.2s ease; max-width: 200px; box-shadow: var(--shadow-md); } .tooltip::before { content: ''; position: absolute; border: 5px solid transparent; border-bottom-color: var(--gray-800); top: -10px; left: 50%; transform: translateX(-50%); } /* Medication list styles */ .medication-list { display: none; } .medication-card { background-color: white; border-radius: var(--radius-md); padding: 1rem; margin-bottom: 1rem; box-shadow: var(--shadow-sm); border: 1px solid var(--gray-200); transition: var(--transition); } .medication-card:hover { box-shadow: var(--shadow-md); border-color: var(--primary-light); } .medication-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 0.5rem; } .medication-name { font-weight: 600; font-size: 0.925rem; color: var(--gray-800); } .medication-dose { font-size: 0.75rem; color: var(--gray-700); margin-top: 0.25rem; } .medication-schedule { display: flex; align-items: center; gap: 0.5rem; font-size: 0.75rem; color: var(--gray-600); margin-top: 0.5rem; } .schedule-dot { width: 8px; height: 8px; border-radius: 50%; background-color: var(--primary-light); } .medication-info { display: flex; justify-content: space-between; font-size: 0.75rem; color: var(--gray-600); margin-top: 0.5rem; padding-top: 0.5rem; border-top: 1px solid var(--gray-200); } .medication-prescribed { display: flex; align-items: center; gap: 0.25rem; } .medication-until { display: flex; align-items: center; gap: 0.25rem; } /* Allergies & notes section */ .allergies-section { display: none; } .notes-section { background-color: var(--accent); border-radius: var(--radius-md); padding: 1rem; margin-bottom: 1.5rem; border-left: 3px solid var(--primary); } .notes-section h3 { font-size: 0.875rem; color: var(--primary); margin-bottom: 0.5rem; display: flex; align-items: center; gap: 0.5rem; } .notes-content { font-size: 0.875rem; color: var(--gray-700); line-height: 1.5; } .allergies-list { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-top: 1rem; } .allergy-item { background-color: var(--alert-light); color: var(--alert); padding: 0.5rem 0.75rem; border-radius: var(--radius-md); font-size: 0.75rem; font-weight: 500; display: flex; align-items: center; gap: 0.5rem; } .allergy-item .icon { font-size: 0.875rem; } /* Progress indicator */ .progress-indicator { height: 4px; background-color: var(--gray-200); position: relative; margin-bottom: 1.5rem; border-radius: 2px; overflow: hidden; } .progress-bar { position: absolute; top: 0; left: 0; height: 100%; background-color: var(--primary); transition: width 0.3s ease; } /* Controls */ .controls { padding: 1rem 1.5rem; border-top: 1px solid var(--gray-200); display: flex; justify-content: space-between; align-items: center; } .control-btn { padding: 0.5rem 1rem; border-radius: var(--radius-md); font-size: 0.875rem; font-weight: 500; cursor: pointer; transition: var(--transition); display: flex; align-items: center; gap: 0.5rem; } .control-btn.primary { background-color: var(--primary); color: white; border: none; } .control-btn.primary:hover { background-color: var(--primary-light); } .control-btn.secondary { background-color: white; color: var(--gray-700); border: 1px solid var(--gray-300); } .control-btn.secondary:hover { background-color: var(--gray-100); } .control-pills { display: flex; align-items: center; gap: 0.25rem; } .control-pill { width: 8px; height: 8px; border-radius: 50%; background-color: var(--gray-300); transition: var(--transition); } .control-pill.active { background-color: var(--primary); width: 16px; border-radius: 4px; } </style> </head> <body> <div class="container"> <div class="header"> <h1>Patient Dashboard</h1> <div class="header-stats"> <div class="header-stat"> <span class="icon">📅</span> <div> <div class="label">Last Visit</div> <div class="value">Oct 14, 2023</div> </div> </div> <div class="header-stat"> <span class="icon">🩺</span> <div> <div class="label">Primary Doctor</div> <div class="value">Dr. Michaels</div> </div> </div> <div class="header-stat"> <span class="icon">📋</span> <div> <div class="label">Medical Record</div> <div class="value">#PAT-78623</div> </div> </div> </div> <div class="patient-brief"> <div class="avatar">SJ</div> <div class="patient-info"> <h2 class="patient-name">Sarah Johnson <span class="badge badge-alert"><i class="icon">⚠️</i> Allergies</span></h2> <div class="patient-details"> <div class="patient-detail"> <span class="icon">📆</span> <span>42 years (07/23/1981)</span> </div> <div class="patient-detail"> <span class="icon">📍</span> <span>Female, 165cm, 68kg</span> </div> <div class="patient-detail"> <span class="icon">📱</span> <span>(555) 123-4567</span> </div> <div class="patient-detail"> <span class="icon">📧</span> <span>[email protected]</span> </div> </div> </div> </div> </div> <div class="tabs"> <div class="tab active" data-tab="history">Medical History</div> <div class="tab" data-tab="medications">Medications</div> <div class="tab" data-tab="allergies">Allergies & Notes</div> <div class="tab" data-tab="vitals">Vital Signs</div> <div class="tab-indicator"></div> </div> <div class="content"> <!-- Medical History Tab --> <div class="tab-content active" id="history-content"> <div class="search-bar"> <span class="icon">🔍</span> <input type="text" placeholder="Search medical history..." id="history-search"> </div> <div class="filters"> <div class="filter active" data-filter="all">All Records</div> <div class="filter" data-filter="visits">Visits</div> <div class="filter" data-filter="tests">Lab Tests</div> <div class="filter" data-filter="procedures">Procedures</div> <div class="filter" data-filter="critical">Critical Events</div> </div> <div class="timeline"> <div class="timeline-item" data-type="visits"> <div class="timeline-marker">👨⚕️</div> <div class="timeline-content"> <div class="timeline-header"> <div class="timeline-title">Annual Physical Examination</div> <div class="timeline-date">Oct 14, 2023</div> </div> <div class="timeline-body"> Routine checkup showed all vital signs within normal range. Blood pressure slightly elevated at 135/85 mmHg. Patient reports occasional headaches and disrupted sleep patterns. </div> <div class="timeline-footer"> <div class="timeline-tags"> <span class="timeline-tag">Physical Exam</span> </div> <div class="timeline-doctor"> <span class="icon">👨⚕️</span> <span>Dr. Michaels</span> </div> </div> </div> </div> <div class="timeline-item" data-type="tests"> <div class="timeline-marker">🧪</div> <div class="timeline-content"> <div class="timeline-header"> <div class="timeline-title">Comprehensive Blood Panel</div> <div class="timeline-date">Oct 10, 2023</div> </div> <div class="timeline-body"> CBC results normal. Cholesterol slightly elevated (215 mg/dL). Vitamin D levels low at 22 ng/mL. Recommendation for vitamin D supplementation and dietary changes. </div> <div class="timeline-footer"> <div class="timeline-tags"> <span class="timeline-tag">Blood Work</span> </div> <div class="timeline-doctor"> <span class="icon">🧪</span> <span>Lab Central</span> </div> </div> </div> </div> <div class="timeline-item" data-type="procedures"> <div class="timeline-marker">💊</div> <div class="timeline-content"> <div class="timeline-header"> <div class="timeline-title">Medication Adjustment</div> <div class="timeline-date">Sep 5, 2023</div> </div> <div class="timeline-body"> Amlodipine dosage increased from 5mg to 10mg daily due to persistent elevated blood pressure. Patient advised to monitor BP at home and report any side effects. </div> <div class="timeline-footer"> <div class="timeline-tags"> <span class="timeline-tag medication">Medication Change</span> </div> <div class="timeline-doctor"> <span class="icon">👨⚕️</span> <span>Dr. Michaels</span> </div> </div> </div> </div> <div class="timeline-item" data-type="procedures"> <div class="timeline-marker">🔬</div> <div class="timeline-content"> <div class="timeline-header"> <div class="timeline-title">Diagnostic Imaging</div> <div class="timeline-date">Aug 27, 2023</div> </div> <div class="timeline-body"> MRI of the lumbar spine shows mild disc bulging at L4-L5 without significant nerve compression. Conservative treatment recommended including physical therapy. </div> <div class="timeline-footer"> <div class="timeline-tags"> <span class="timeline-tag procedure">MRI Scan</span> </div> <div class="timeline-doctor"> <span class="icon">🏥</span> <span>Riverside Imaging</span> </div> </div> </div> </div> <div class="timeline-item" data-type="critical"> <div class="timeline-marker">⚡</div> <div class="timeline-content"> <div class="timeline-header"> <div class="timeline-title">Allergic Reaction</div> <div class="timeline-date">Jun 12, 2023</div> </div> <div class="timeline-body"> Severe allergic reaction to amoxicillin. Presented with hives, facial swelling, and difficulty breathing. Treated with epinephrine and steroids. Added to allergy list. </div> <div class="timeline-footer"> <div class="timeline-tags"> <span class="timeline-tag critical">Critical Event</span> </div> <div class="timeline-doctor"> <span class="icon">🏥</span> <span>ER - Dr. Williams</span> </div> </div> </div> </div> </div> <div class="loading"> <div class="spinner"></div> </div> <div class="empty-state"> <div class="icon">📂</div> <h3>No records found</h3> <p>Try adjusting your search or filters to find what you're looking for.</p> </div> </div> <!-- Medications Tab --> <div class="tab-content" id="medications-content"> <div class="medication-list"> <div class="medication-card"> <div class="medication-header"> <div> <div class="medication-name">Amlodipine</div> <div class="medication-dose">10mg tablet</div> </div> <div class="badge badge-warning">Active</div> </div> <div class="medication-schedule"> <span class="schedule-dot"></span> <span>Take 1 tablet by mouth every day in the morning</span> </div> <div class="medication-info"> <div class="medication-prescribed"> <span class="icon">👨⚕️</span> <span>Prescribed by Dr. Michaels</span> </div> <div class="medication-until"> <span class="icon">📅</span> <span>Until Dec 5, 2023</span> </div> </div> </div> <div class="medication-card"> <div class="medication-header"> <div> <div class="medication-name">Vitamin D3</div> <div class="medication-dose">2000 IU capsule</div> </div> <div class="badge badge-warning">Active</div> </div> <div class="medication-schedule"> <span class="schedule-dot"></span> <span>Take 1 capsule by mouth daily with food</span> </div> <div class="medication-info"> <div class="medication-prescribed"> <span class="icon">👨⚕️</span> <span>Prescribed by Dr. Michaels</span> </div> <div class="medication-until"> <span class="icon">📅</span> <span>Ongoing</span> </div> </div> </div> <div class="medication-card"> <div class="medication-header"> <div> <div class="medication-name">Ibuprofen</div> <div class="medication-dose">400mg tablet</div> </div> <div class="badge badge-warning">As Needed</div> </div> <div class="medication-schedule"> <span class="schedule-dot"></span> <span>Take 1-2 tablets every 6 hours as needed for pain</span> </div> <div class="medication-info"> <div class="medication-prescribed"> <span class="icon">👨⚕️</span> <span>Prescribed by Dr. Michaels</span> </div> <div class="medication-until"> <span class="icon">📅</span> <span>As needed</span> </div> </div> </div> <div class="medication-card"> <div class="medication-header"> <div> <div class="medication-name">Simvastatin</div> <div class="medication-dose">20mg tablet</div> </div> <div class="badge badge-warning">Active</div> </div> <div class="medication-schedule"> <span class="schedule-dot"></span> <span>Take 1 tablet by mouth at bedtime</span> </div> <div class="medication-info"> <div class="medication-prescribed"> <span class="icon">👨⚕️</span> <span>Prescribed by Dr. Michaels</span> </div> <div class="medication-until"> <span class="icon">📅</span> <span>Until Jan 15, 2024</span> </div> </div> </div> </div> <div class="progress-indicator"> <div class="progress-bar" style="width: 45%;"></div> </div> <div class="notes-section"> <h3><span class="icon">📝</span> Medication Notes</h3> <div class="notes-content"> Patient reports occasional dizziness when taking amlodipine. Recommended to take at bedtime rather than morning to mitigate side effects. Will reassess efficacy in 4 weeks. </div> </div> </div> <!-- Allergies & Notes Tab --> <div class="tab-content" id="allergies-content"> <div class="allergies-section"> <div class="notes-section"> <h3><span class="icon">⚠️</span> Allergies</h3> <div class="notes-content"> Patient has multiple documented allergies with varying severity. The reaction to amoxicillin was severe and required emergency care. Patient wears a medical alert bracelet. </div> <div class="allergies-list"> <div class="allergy-item"> <span class="icon">🔴</span> <span>Amoxicillin (Severe)</span> </div> <div class="allergy-item"> <span class="icon">🟠</span> <span>Sulfa Drugs (Moderate)</span> </div> <div class="allergy-item"> <span class="icon">🟡</span> <span>Latex (Mil
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Financial Portfolio Tracker</title> <style> @import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@400;500;600&family=Inter:wght@300;400;500;600&display=swap'); :root { --navy: #1a2a3a; --dark-navy: #121e2a; --gray: #e0e0e0; --light-gray: #f5f5f5; --accent: #3b82f6; --accent-hover: #2563eb; --green: #10b981; --red: #ef4444; --text: #333; --text-light: #666; --border: #ddd; --shadow: rgba(0, 0, 0, 0.05); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Inter', sans-serif; background-color: var(--light-gray); color: var(--text); line-height: 1.5; height: 700px; width: 700px; overflow: hidden; } .container { display: grid; grid-template-rows: auto 1fr; height: 100%; width: 100%; max-width: 700px; max-height: 700px; margin: 0 auto; padding: 16px; background-color: white; box-shadow: 0 4px 12px var(--shadow); border-radius: 12px; overflow: hidden; } header { display: flex; justify-content: space-between; align-items: center; padding-bottom: 16px; border-bottom: 1px solid var(--border); margin-bottom: 16px; } h1 { font-family: 'Cormorant Garamond', serif; font-weight: 600; font-size: 24px; color: var(--navy); } .toggle-group { display: flex; gap: 2px; background-color: var(--light-gray); padding: 2px; border-radius: 6px; } .toggle-btn { background: none; border: none; padding: 4px 12px; font-size: 12px; font-weight: 500; color: var(--text-light); border-radius: 4px; cursor: pointer; transition: all 0.2s ease; } .toggle-btn.active { background-color: white; color: var(--navy); box-shadow: 0 1px 3px var(--shadow); } .main { display: grid; grid-template-rows: auto 1fr; overflow: hidden; } .summary { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 16px; } .summary-card { background-color: var(--light-gray); padding: 12px; border-radius: 8px; transition: transform 0.2s ease, box-shadow 0.2s ease; } .summary-card:hover { transform: translateY(-2px); box-shadow: 0 4px 8px var(--shadow); } .card-label { font-size: 12px; color: var(--text-light); margin-bottom: 4px; } .card-value { font-size: 18px; font-weight: 600; color: var(--navy); } .change { font-size: 12px; font-weight: 500; display: flex; align-items: center; gap: 4px; } .positive { color: var(--green); } .negative { color: var(--red); } .content { display: grid; grid-template-columns: 1fr 280px; gap: 16px; overflow: hidden; } .chart-container { background-color: white; border: 1px solid var(--border); border-radius: 8px; padding: 16px; position: relative; overflow: hidden; } .chart-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; } .chart-title { font-size: 14px; font-weight: 600; color: var(--navy); } .chart-controls { display: flex; gap: 8px; } .control-btn { background: none; border: 1px solid var(--border); padding: 4px 8px; font-size: 11px; border-radius: 4px; cursor: pointer; transition: all 0.15s ease; } .control-btn:hover { background-color: var(--light-gray); } .control-btn.active { background-color: var(--navy); color: white; border-color: var(--navy); } .chart { height: 200px; width: 100%; position: relative; } .tooltip { position: absolute; background-color: var(--dark-navy); color: white; padding: 8px 12px; border-radius: 4px; font-size: 12px; pointer-events: none; opacity: 0; transition: opacity 0.2s ease; z-index: 10; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15); } .sidebar { display: flex; flex-direction: column; gap: 16px; overflow-y: auto; } .widget { background-color: white; border: 1px solid var(--border); border-radius: 8px; padding: 16px; } .widget-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; } .widget-title { font-size: 14px; font-weight: 600; color: var(--navy); } .view-all { font-size: 12px; color: var(--accent); cursor: pointer; transition: color 0.15s ease; } .view-all:hover { color: var(--accent-hover); text-decoration: underline; } .asset-list { display: flex; flex-direction: column; gap: 8px; } .asset-item { display: flex; justify-content: space-between; align-items: center; padding: 8px; border-radius: 6px; cursor: pointer; transition: background-color 0.15s ease; } .asset-item:hover { background-color: var(--light-gray); } .asset-info { display: flex; align-items: center; gap: 8px; } .asset-icon { width: 24px; height: 24px; background-color: var(--light-gray); border-radius: 50%; display: flex; justify-content: center; align-items: center; font-size: 12px; font-weight: 600; color: var(--navy); } .asset-details { display: flex; flex-direction: column; } .asset-name { font-size: 13px; font-weight: 500; } .asset-type { font-size: 11px; color: var(--text-light); } .asset-data { display: flex; flex-direction: column; align-items: flex-end; } .asset-value { font-size: 13px; font-weight: 500; } /* Alert widget */ .alerts { display: flex; flex-direction: column; gap: 8px; } .alert-item { display: flex; align-items: center; gap: 8px; padding: 8px; border-radius: 6px; background-color: rgba(59, 130, 246, 0.1); border-left: 3px solid var(--accent); } .alert-icon { color: var(--accent); font-size: 16px; } .alert-text { font-size: 12px; color: var(--text); } /* Animation for chart loading */ @keyframes pulse { 0% { opacity: 0.6; } 50% { opacity: 0.8; } 100% { opacity: 0.6; } } .loading { animation: pulse 1.5s infinite; background-color: #f0f0f0; border-radius: 4px; } /* Responsive adjustments */ @media (max-width: 600px) { .container { padding: 12px; border-radius: 0; } .summary { grid-template-columns: repeat(2, 1fr); } .content { grid-template-columns: 1fr; } } /* Custom toggle switch */ .switch-container { display: flex; align-items: center; gap: 8px; } .switch-label { font-size: 12px; color: var(--text-light); } .switch { position: relative; display: inline-block; width: 36px; height: 20px; } .switch input { opacity: 0; width: 0; height: 0; } .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; transition: .3s; border-radius: 20px; } .slider:before { position: absolute; content: ""; height: 16px; width: 16px; left: 2px; bottom: 2px; background-color: white; transition: .3s; border-radius: 50%; } input:checked + .slider { background-color: var(--accent); } input:checked + .slider:before { transform: translateX(16px); } /* Progress bar styling */ .allocation-item { margin-bottom: 8px; } .allocation-header { display: flex; justify-content: space-between; margin-bottom: 4px; } .allocation-name { font-size: 12px; color: var(--text); } .allocation-percent { font-size: 12px; font-weight: 500; } .progress-bar { height: 6px; background-color: var(--light-gray); border-radius: 3px; overflow: hidden; } .progress { height: 100%; border-radius: 3px; transition: width 1s ease-in-out; } .stocks { background-color: var(--accent); } .bonds { background-color: var(--green); } .cash { background-color: var(--text-light); } .alternatives { background-color: #9333ea; } </style> </head> <body> <div class="container"> <header> <h1>Meridian Portfolio</h1> <div class="toggle-group"> <button class="toggle-btn active" data-period="day">1D</button> <button class="toggle-btn" data-period="week">1W</button> <button class="toggle-btn" data-period="month">1M</button> <button class="toggle-btn" data-period="year">1Y</button> <button class="toggle-btn" data-period="all">All</button> </div> </header> <div class="main"> <div class="summary"> <div class="summary-card"> <div class="card-label">Portfolio Value</div> <div class="card-value">$547,892</div> <div class="change positive"> <span>↑</span> 1.8% today </div> </div> <div class="summary-card"> <div class="card-label">Day's Change</div> <div class="card-value">+$9,742</div> <div class="change positive"> <span>↑</span> 3.2% gain </div> </div> <div class="summary-card"> <div class="card-label">YTD Return</div> <div class="card-value">+12.6%</div> <div class="change positive"> <span>↑</span> 4.3% vs S&P </div> </div> <div class="summary-card"> <div class="card-label">Dividend Yield</div> <div class="card-value">2.8%</div> <div class="change"> $3,842 annually </div> </div> </div> <div class="content"> <div class="chart-container"> <div class="chart-header"> <div class="chart-title">Performance Overview</div> <div class="chart-controls"> <button class="control-btn active" data-view="value">Value</button> <button class="control-btn" data-view="growth">Growth %</button> <div class="switch-container"> <span class="switch-label">Compare</span> <label class="switch"> <input type="checkbox" id="benchmark-toggle"> <span class="slider"></span> </label> </div> </div> </div> <div class="chart" id="performance-chart"> <!-- Chart will be drawn here with JS --> </div> <div class="tooltip" id="chart-tooltip"></div> </div> <div class="sidebar"> <div class="widget"> <div class="widget-header"> <div class="widget-title">Top Holdings</div> <div class="view-all">View all</div> </div> <div class="asset-list"> <div class="asset-item"> <div class="asset-info"> <div class="asset-icon">A</div> <div class="asset-details"> <div class="asset-name">Apple Inc.</div> <div class="asset-type">Technology | 72 shares</div> </div> </div> <div class="asset-data"> <div class="asset-value">$12,744</div> <div class="change positive">+2.1%</div> </div> </div> <div class="asset-item"> <div class="asset-info"> <div class="asset-icon">M</div> <div class="asset-details"> <div class="asset-name">Microsoft Corp.</div> <div class="asset-type">Technology | 48 shares</div> </div> </div> <div class="asset-data"> <div class="asset-value">$17,280</div> <div class="change positive">+1.4%</div> </div> </div> <div class="asset-item"> <div class="asset-info"> <div class="asset-icon">V</div> <div class="asset-details"> <div class="asset-name">Vanguard S&P 500 ETF</div> <div class="asset-type">ETF | 95 shares</div> </div> </div> <div class="asset-data"> <div class="asset-value">$38,760</div> <div class="change positive">+0.8%</div> </div> </div> <div class="asset-item"> <div class="asset-info"> <div class="asset-icon">J</div> <div class="asset-details"> <div class="asset-name">JPMorgan Chase</div> <div class="asset-type">Financial | 120 shares</div> </div> </div> <div class="asset-data"> <div class="asset-value">$19,560</div> <div class="change negative">-0.4%</div> </div> </div> </div> </div> <div class="widget"> <div class="widget-header"> <div class="widget-title">Asset Allocation</div> <div class="view-all">Rebalance</div> </div> <div class="allocation"> <div class="allocation-item"> <div class="allocation-header"> <div class="allocation-name">Equities</div> <div class="allocation-percent">62%</div> </div> <div class="progress-bar"> <div class="progress stocks" style="width: 62%"></div> </div> </div> <div class="allocation-item"> <div class="allocation-header"> <div class="allocation-name">Fixed Income</div> <div class="allocation-percent">24%</div> </div> <div class="progress-bar"> <div class="progress bonds" style="width: 24%"></div> </div> </div> <div class="allocation-item"> <div class="allocation-header"> <div class="allocation-name">Cash & Equivalents</div> <div class="allocation-percent">8%</div> </div> <div class="progress-bar"> <div class="progress cash" style="width: 8%"></div> </div> </div> <div class="allocation-item"> <div class="allocation-header"> <div class="allocation-name">Alternative Investments</div> <div class="allocation-percent">6%</div> </div> <div class="progress-bar"> <div class="progress alternatives" style="width: 6%"></div> </div> </div> </div> </div> <div class="widget"> <div class="widget-header"> <div class="widget-title">Market Alerts</div> <div class="view-all">Settings</div> </div> <div class="alerts"> <div class="alert-item"> <div class="alert-icon">↗</div> <div class="alert-text">TSLA exceeded your price target of $242. Consider rebalancing.</div> </div> <div class="alert-item"> <div class="alert-icon">!</div> <div class="alert-text">Fed meeting tomorrow. Market volatility expected.</div> </div> <div class="alert-item"> <div class="alert-icon">↘</div> <div class="alert-text">Bond yields dropping below 3%. Consider locking in rates.</div> </div> </div> </div> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Toggle buttons for time period const toggleBtns = document.querySelectorAll('.toggle-btn'); toggleBtns.forEach(btn => { btn.addEventListener('click', function() { toggleBtns.forEach(b => b.classList.remove('active')); this.classList.add('active'); updateChart(this.getAttribute('data-period')); }); }); // Toggle buttons for chart view const controlBtns = document.querySelectorAll('.control-btn'); controlBtns.forEach(btn => { btn.addEventListener('click', function() { controlBtns.forEach(b => b.classList.remove('active')); this.classList.add('active'); updateChartView(this.getAttribute('data-view')); }); }); // Benchmark toggle const benchmarkToggle = document.getElementById('benchmark-toggle'); benchmarkToggle.addEventListener('change', function() { toggleBenchmark(this.checked); }); // Asset items hover effect const assetItems = document.querySelectorAll('.asset-item'); assetItems.forEach(item => { item.addEventListener('mouseenter', function() { this.style.backgroundColor = 'var(--light-gray)'; }); item.addEventListener('mouseleave', function() { this.style.backgroundColor = ''; }); }); // Initialize the chart drawChart('day'); // Animation for asset allocation bars animateProgressBars(); }); // Function to draw the chart function drawChart(period) { const chartEl = document.getElementById('performance-chart'); // Clear previous chart chartEl.innerHTML = ''; // Sample data based on time period const data = getChartData(period); // Create SVG element const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); svg.setAttribute('width', '100%'); svg.setAttribute('height', '100%'); svg.setAttribute('viewBox', '0 0 600 200'); // Create gradient for area fill const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs'); const gradient = document.createElementNS('http://www.w3.org/2000/svg', 'linearGradient'); gradient.setAttribute('id', 'areaGradient'); gradient.setAttribute('x1', '0%'); gradient.setAttribute('y1', '0%'); gradient.setAttribute('x2', '0%'); gradient.setAttribute('y2', '100%'); const stop1 = document.createElementNS('http://www.w3.org/2000/svg', 'stop'); stop1.setAttribute('offset', '0%'); stop1.setAttribute('stop-color', 'rgba(59, 130, 246, 0.4)'); const stop2 = document.createElementNS('http://www.w3.org/2000/svg', 'stop'); stop2.setAttribute('offset', '100%'); stop2.setAttribute('stop-color', 'rgba(59, 130, 246, 0.05)'); gradient.appendChild(stop1); gradient.appendChild(stop2); defs.appendChild(gradient); svg.appendChild(defs); // Generate path data const xStep = 600 / (data.length - 1); const maxValue = Math.max(...data); const minValue = Math.min(...data); const yScale = 180 / (maxValue - minValue); // Create line path let linePath = `M 0 ${200 - (data[0] - minValue) * yScale}`; for (let i = 1; i < data.length; i++) { linePath += ` L ${i * xStep} ${200 - (data[i] - minValue) * yScale}`; } const line = document.createElementNS('http://www.w3.org/2000/svg', 'path'); line.setAttribute('d', linePath); line.setAttribute('fill', 'none'); line.setAttribute('stroke', '#3b82f6'); line.setAttribute('stroke-width', '2'); line.setAttribute('stroke-linejoin', 'round'); // Create area path (line + bottom border) let areaPath = linePath; areaPath += ` L ${(data.length - 1) * xStep} 200 L 0 200 Z`; const area = document.createElementNS('http://www.w3.org/2000/svg', 'path'); area.setAttribute('d', areaPath); area.setAttribute('fill', 'url(#areaGradient)'); // Add grid lines const grid = document.createElementNS('http://www.w3.org/2000/svg', 'g'); grid.setAttribute('stroke', '#e0e0e0'); grid.setAttribute('stroke-dasharray', '2,2'); for (let i = 0; i < 5; i++) { const gridLine = document.createElementNS('http://www.w3.org/2000/svg', 'line'); gridLine.setAttribute('x1', '0'); gridLine.setAttribute('y1', 40 * i + 20); gridLine.setAttribute('x2', '600'); gridLine.setAttribute('y2', 40 * i + 20); grid.appendChild(gridLine); } // Add data points for interaction const points = document.createElementNS('http://www.w3.org/2000/svg', 'g'); for (let i = 0; i < data.length; i++) { const point = document.createElementNS('http://www.w3.org/2000/svg', 'circle'); point.setAttribute('cx', i * xStep); point.setAttribute('cy', 200 - (data[i] - minValue) * yScale); point.setAttribute('r', '4'); point.setAttribute('fill', 'white'); point.setAttribute('stroke', '#3b82f6'); point.setAttribute('stroke-width', '2'); point.setAttribute('opacity', '0'); point.setAttribute('data-value', data[i]); point.setAttribute('data-index', i); points.appendChild(point); } // Append all elements to SVG svg.appendChild(grid); svg.appendChild(area); svg.appendChild(line); svg.appendChild(points); // Append SVG to chart container chartEl.appendChild(svg); // Add interaction const tooltip = document.getElementById('chart-tooltip'); svg.addEventListener('mousemove', function(e) { const svgRect = svg.getBoundingClientRect(); const x = e.clientX - svgRect.left; const pointIndex = Math.round(x / xStep); if (pointIndex >= 0 && pointIndex < data.length) { const point = points.children[pointIndex]; const value = point.getAttribute('data-value'); const cx = point.getAttribute('cx'); const cy = point.getAttribute('cy'); // Show tooltip tooltip.style.opacity = '1'; tooltip.style.left = `${parseInt(cx) + svgRect.left}px`; tooltip.style.top = `${parseInt(cy) + svgRect.top - 40}px`; // Format date based on period let date; if (period === 'day') { date = `${9 + Math.floor(pointIndex / 6)}:${(pointIndex % 6) * 10 || '00'} ${pointIndex < 36 ? 'AM' : 'PM'}`; } else if (period === 'week') { const days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; date = days[pointIndex % 7]; } else if (period === 'month') { date = `Oct ${pointIndex + 1}`; } else { const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; date = months[pointIndex % 12]; } tooltip.innerHTML = ` <div>${date}</div> <div style="font-weight: 600;">$${Number(value).toLocaleString()}</div> `; // Highlight current point Array.from(points.children).forEach(p => p.setAttribute('opacity', '0')); point.setAttribute('opacity', '1'); } }); svg.addEventListener('mouseout', function() { tooltip.style.opacity = '0'; Array.from(points.children).forEach(p => p.setAttribute('opacity', '0')); }); } // Function to get chart data based on period function getChartData(period) { const baseValue = 547892; let data = []; if (period === 'day') { // Generate 24 hours of data (10-minute intervals) for (let i = 0; i < 72; i++) { const time = i / 72; // 0 to 1 representing the day const noise = (Math.random() - 0.5) * 0.01; // Small random fluctuation // Morning rise, midday plateau, afternoon movement let value; if (i < 24) { // Morning value = baseValue * (1 + 0.005 * Math.sin(time * Math.PI) + noise); } else if (i < 48) { // Midday value = baseValue * (1.005 + noise); } else { // Afternoon value = baseValue * (1.005 + 0.008 * Math.sin((time - 0.5) * Math.PI) + noise); } data.push(Math.round(value)); } } else if (period === 'week') { // Generate 7 days of data for (let i = 0; i < 7; i++) { const dayFactor = Math.sin(i / 7 * Math.PI * 2); const value = baseValue * (1 + 0.018 * dayFactor + (Math.random() - 0.5) * 0.01); data.push(Math.round(value)); } } else if (period === 'month') { // Generate 30 days of data for (let i = 0; i < 31; i++) { // General uptrend with some volatility const trend = i / 31 * 0.03; // 3% increase over the month const volatility = (Math.random() - 0.5) * 0.02; // Daily fluctuation const value = baseValue * (1 + trend + volatility); data.push(Math.round(value)); } } else if (period === 'year') { // Generate 12 months of data for (let i = 0; i < 12; i++) { // More pronounced trend with seasonal effects const trend = i / 12 * 0.13; // 13% annual growth const seasonal = 0.02 * Math.sin(i / 12 * Math.PI * 2); // Seasonal effect const random = (Math.random() - 0.5) * 0.03; // Monthly randomness const value = baseValue * (1 + trend + seasonal + random); data.push(Math.round(value)); } } else { // all time // Generate 5 years of data (60 months) for (let i = 0; i < 60; i++) { // Long-term growth with a few market cycles const trend = i / 60 * 0.6; // 60% growth over 5 years const cycle = 0.1 * Math.sin(i / 15 * Math.PI); // Market cycles const random = (Math.random() - 0.5) * 0.04; // Random noise const value = baseValue * (0.7 + trend + cycle + random); // Start at 70% of current value data.push(Math.round(value)); } } return data; } // Update chart when time period changes function updateChart(period) { drawChart(period); } // Update chart view (value or growth %) function updateChartView(view) { // This would update the chart to show either absolute values or percentage growth console.log(`Chart view changed to ${view}`); // In a real implementation, this would redraw the chart with different data } // Toggle benchmark comparison function toggleBenchmark(checked) { console.log(`Benchmark comparison ${checked ? 'enabled' : 'disabled'}`); // In a real implementation, this would add/remove benchmark line from chart } // Animate progress bars on load function animateProgressBars() { const progressBars = document.querySelectorAll('.progress'); progressBars.forEach(bar => { const width = bar.style.width; bar.style.width = '0'; setTimeout(() => { bar.style.width = width; }, 300); }); } </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Media Content Control Panel</title> <style> :root { --primary: #6200ee; --primary-light: #985eff; --secondary: #03dac6; --danger: #cf6679; --warning: #ff9800; --success: #4caf50; --background: #121212; --surface: #1e1e1e; --surface-light: #2d2d2d; --text: #ffffff; --text-secondary: rgba(255, 255, 255, 0.7); --border-radius: 12px; --transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { background-color: var(--background); color: var(--text); display: flex; justify-content: center; align-items: center; min-height: 100vh; overflow-x: hidden; padding: 20px; } .panel-container { width: 100%; max-width: 700px; max-height: 700px; overflow: hidden; background-color: var(--surface); border-radius: var(--border-radius); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4); display: flex; flex-direction: column; } .panel-header { padding: 20px; background-color: var(--surface); display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid rgba(255, 255, 255, 0.1); position: relative; } .panel-header h1 { font-size: 1.5rem; font-weight: 600; } .panel-search { position: relative; margin: 0 20px; } .panel-search input { background-color: var(--surface-light); border: none; border-radius: 24px; padding: 10px 40px 10px 20px; color: var(--text); width: 100%; font-size: 0.9rem; transition: var(--transition); } .panel-search input:focus { outline: none; box-shadow: 0 0 0 2px var(--primary-light); } .panel-search i { position: absolute; right: 15px; top: 50%; transform: translateY(-50%); color: var(--text-secondary); } .tabs { display: flex; border-bottom: 1px solid rgba(255, 255, 255, 0.1); overflow-x: auto; scrollbar-width: none; } .tabs::-webkit-scrollbar { display: none; } .tab { padding: 15px 20px; background: transparent; border: none; color: var(--text-secondary); font-size: 0.9rem; font-weight: 500; cursor: pointer; transition: var(--transition); position: relative; white-space: nowrap; } .tab:hover { color: var(--text); } .tab.active { color: var(--primary); } .tab.active::after { content: ''; position: absolute; bottom: 0; left: 0; width: 100%; height: 3px; background-color: var(--primary); border-top-left-radius: 3px; border-top-right-radius: 3px; } .content-area { flex: 1; overflow-y: auto; padding: 20px; display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 20px; scrollbar-width: thin; scrollbar-color: var(--primary) var(--surface-light); } .content-area::-webkit-scrollbar { width: 8px; } .content-area::-webkit-scrollbar-track { background: var(--surface-light); } .content-area::-webkit-scrollbar-thumb { background-color: var(--primary); border-radius: 4px; } .media-card { background-color: var(--surface-light); border-radius: var(--border-radius); overflow: hidden; position: relative; transition: var(--transition); cursor: pointer; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); } .media-card:hover { transform: translateY(-5px); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3); } .media-thumbnail { position: relative; padding-top: 56.25%; /* 16:9 aspect ratio */ background-color: var(--surface); overflow: hidden; } .media-thumbnail img { position: absolute; top: 0; left: 0; width: 100%; height: 100%; object-fit: cover; transition: var(--transition); } .media-card:hover .media-thumbnail img { transform: scale(1.05); } .media-info { padding: 12px; } .media-title { font-size: 0.95rem; font-weight: 500; margin-bottom: 5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .media-meta { display: flex; justify-content: space-between; align-items: center; margin-top: 8px; font-size: 0.8rem; color: var(--text-secondary); } .media-type { display: inline-block; padding: 3px 8px; border-radius: 12px; font-size: 0.7rem; font-weight: 500; text-transform: uppercase; } .media-type.video { background-color: rgba(98, 0, 238, 0.2); color: var(--primary-light); } .media-type.image { background-color: rgba(3, 218, 198, 0.2); color: var(--secondary); } .media-type.audio { background-color: rgba(255, 152, 0, 0.2); color: var(--warning); } .media-type.document { background-color: rgba(76, 175, 80, 0.2); color: var(--success); } .media-actions { position: absolute; top: 8px; right: 8px; opacity: 0; transition: var(--transition); display: flex; gap: 5px; } .media-card:hover .media-actions { opacity: 1; } .action-btn { width: 30px; height: 30px; border-radius: 50%; background-color: rgba(30, 30, 30, 0.7); backdrop-filter: blur(4px); display: flex; align-items: center; justify-content: center; color: var(--text); border: none; cursor: pointer; transition: var(--transition); } .action-btn:hover { background-color: var(--primary); transform: scale(1.1); } .action-btn i { font-size: 0.85rem; } .loading-indicator { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(30, 30, 30, 0.8); display: flex; align-items: center; justify-content: center; z-index: 10; opacity: 0; visibility: hidden; transition: var(--transition); } .spinner { width: 40px; height: 40px; border: 3px solid transparent; border-top-color: var(--primary); border-radius: 50%; animation: spin 1s linear infinite; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .upload-area { position: fixed; bottom: 30px; right: 30px; z-index: 100; } .upload-button { width: 56px; height: 56px; border-radius: 50%; background-color: var(--primary); color: white; display: flex; align-items: center; justify-content: center; box-shadow: 0 4px 10px rgba(98, 0, 238, 0.4); cursor: pointer; transition: var(--transition); border: none; } .upload-button:hover { background-color: var(--primary-light); transform: translateY(-3px); box-shadow: 0 6px 14px rgba(98, 0, 238, 0.5); } .upload-options { position: absolute; bottom: 70px; right: 0; display: flex; flex-direction: column; gap: 10px; opacity: 0; transform: translateY(10px); visibility: hidden; transition: var(--transition); } .upload-options.show { opacity: 1; transform: translateY(0); visibility: visible; } .upload-option { display: flex; align-items: center; gap: 10px; background-color: var(--surface); padding: 8px 16px; border-radius: 30px; color: var(--text); font-size: 0.9rem; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3); cursor: pointer; transition: var(--transition); } .upload-option:hover { background-color: var(--surface-light); transform: translateX(-5px); } .upload-option i { width: 24px; height: 24px; display: flex; align-items: center; justify-content: center; border-radius: 50%; } .upload-option:nth-child(1) i { background-color: rgba(98, 0, 238, 0.2); color: var(--primary-light); } .upload-option:nth-child(2) i { background-color: rgba(3, 218, 198, 0.2); color: var(--secondary); } .upload-option:nth-child(3) i { background-color: rgba(255, 152, 0, 0.2); color: var(--warning); } .upload-option:nth-child(4) i { background-color: rgba(76, 175, 80, 0.2); color: var(--success); } .panel-footer { padding: 15px 20px; display: flex; justify-content: space-between; align-items: center; border-top: 1px solid rgba(255, 255, 255, 0.1); background-color: var(--surface); } .storage-indicator { display: flex; align-items: center; gap: 10px; } .storage-bar { width: 100px; height: 6px; background-color: var(--surface-light); border-radius: 3px; overflow: hidden; } .storage-fill { height: 100%; width: 70%; background-color: var(--secondary); border-radius: 3px; } .storage-text { font-size: 0.8rem; color: var(--text-secondary); } .toggle { position: relative; display: inline-block; width: 44px; height: 24px; } .toggle input { opacity: 0; width: 0; height: 0; } .toggle-slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: var(--surface-light); transition: .4s; border-radius: 24px; } .toggle-slider:before { position: absolute; content: ""; height: 18px; width: 18px; left: 3px; bottom: 3px; background-color: white; transition: .4s; border-radius: 50%; } input:checked + .toggle-slider { background-color: var(--primary); } input:checked + .toggle-slider:before { transform: translateX(20px); } .auto-publish { display: flex; align-items: center; gap: 10px; } .auto-publish-text { font-size: 0.85rem; } .context-menu { position: absolute; background-color: var(--surface); border-radius: 8px; box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3); padding: 8px 0; z-index: 1000; opacity: 0; visibility: hidden; transform: scale(0.9); transform-origin: top right; transition: all 0.2s ease; } .context-menu.show { opacity: 1; visibility: visible; transform: scale(1); } .context-menu-item { padding: 8px 16px; display: flex; align-items: center; gap: 10px; color: var(--text); cursor: pointer; transition: var(--transition); } .context-menu-item:hover { background-color: var(--surface-light); } .context-menu-item i { font-size: 0.9rem; color: var(--text-secondary); } .context-menu-item.danger { color: var(--danger); } .context-menu-item.danger i { color: var(--danger); } .context-menu-divider { height: 1px; background-color: rgba(255, 255, 255, 0.1); margin: 5px 0; } .toast { position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%) translateY(100px); background-color: var(--surface); padding: 12px 20px; border-radius: 8px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); color: var(--text); display: flex; align-items: center; gap: 10px; opacity: 0; transition: all 0.3s ease; z-index: 1000; } .toast.show { transform: translateX(-50%) translateY(0); opacity: 1; } .toast i { font-size: 1.2rem; } .toast i.success { color: var(--success); } .toast i.error { color: var(--danger); } .toast i.warning { color: var(--warning); } .empty-state { display: none; flex-direction: column; align-items: center; justify-content: center; padding: 40px; text-align: center; } .empty-state i { font-size: 3rem; color: var(--primary-light); margin-bottom: 20px; } .empty-state h3 { margin-bottom: 10px; font-weight: 500; } .empty-state p { color: var(--text-secondary); max-width: 300px; margin-bottom: 25px; } .empty-state button { background-color: var(--primary); color: white; border: none; padding: 10px 20px; border-radius: 4px; font-weight: 500; cursor: pointer; transition: var(--transition); } .empty-state button:hover { background-color: var(--primary-light); } @media (max-width: 580px) { .panel-header { flex-direction: column; gap: 15px; align-items: flex-start; } .panel-search { width: 100%; margin: 0; } .content-area { grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); } .panel-footer { flex-direction: column; gap: 15px; align-items: flex-start; } } /* Animation keyframes */ @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } @keyframes slideInUp { from { transform: translateY(20px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } .media-card { animation: slideInUp 0.3s ease forwards; animation-delay: calc(var(--animation-order) * 0.05s); opacity: 0; } .pulse { animation: pulse 1s infinite; } </style> </head> <body> <div class="panel-container"> <div class="panel-header"> <h1>Media Content Hub</h1> <div class="panel-search"> <input type="text" id="search-input" placeholder="Search media files..."> <i class="fas fa-search"></i> </div> </div> <div class="tabs"> <button class="tab active" data-tab="all">All Media</button> <button class="tab" data-tab="video">Videos</button> <button class="tab" data-tab="image">Images</button> <button class="tab" data-tab="audio">Audio</button> <button class="tab" data-tab="document">Documents</button> <button class="tab" data-tab="recent">Recently Added</button> <button class="tab" data-tab="favorites">Favorites</button> </div> <div class="content-area" id="media-container"> <!-- Media cards will be loaded here --> </div> <div class="empty-state" id="empty-state"> <i class="fas fa-photo-video"></i> <h3>No media found</h3> <p>Upload your first piece of media to get started or try a different filter.</p> <button id="upload-first-btn">Upload Media</button> </div> <div class="loading-indicator" id="loading-indicator"> <div class="spinner"></div> </div> <div class="panel-footer"> <div class="storage-indicator"> <div class="storage-bar"> <div class="storage-fill"></div> </div> <span class="storage-text">7.2 GB / 10 GB used</span> </div> <div class="auto-publish"> <span class="auto-publish-text">Auto-publish</span> <label class="toggle"> <input type="checkbox" id="auto-publish-toggle"> <span class="toggle-slider"></span> </label> </div> </div> </div> <div class="upload-area"> <div class="upload-options" id="upload-options"> <div class="upload-option" data-type="video"> <i class="fas fa-video"></i> <span>Video</span> </div> <div class="upload-option" data-type="image"> <i class="fas fa-image"></i> <span>Image</span> </div> <div class="upload-option" data-type="audio"> <i class="fas fa-headphones"></i> <span>Audio</span> </div> <div class="upload-option" data-type="document"> <i class="fas fa-file-alt"></i> <span>Document</span> </div> </div> <button class="upload-button" id="upload-button"> <i class="fas fa-plus"></i> </button> </div> <div class="context-menu" id="context-menu"> <div class="context-menu-item"> <i class="fas fa-edit"></i> <span>Edit</span> </div> <div class="context-menu-item"> <i class="fas fa-star"></i> <span>Add to favorites</span> </div> <div class="context-menu-item"> <i class="fas fa-share-alt"></i> <span>Share</span> </div> <div class="context-menu-item"> <i class="fas fa-download"></i> <span>Download</span> </div> <div class="context-menu-divider"></div> <div class="context-menu-item danger"> <i class="fas fa-trash-alt"></i> <span>Delete</span> </div> </div> <div class="toast" id="toast"> <i class="fas fa-check-circle success" id="toast-icon"></i> <span id="toast-message">Media successfully uploaded!</span> </div> <!-- Font Awesome --> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css"> <script> // Sample media data const mediaData = [ { id: 1, title: "Q4 Sales Presentation Video", type: "video", thumbnail: "https://images.unsplash.com/photo-1530953291-2ec8ece8b3d7?auto=format&fit=crop&w=400&h=250", date: "2023-10-15", size: "24.5 MB", duration: "5:32", favorite: true }, { id: 2, title: "Brand Launch Campaign Banner", type: "image", thumbnail: "https://images.unsplash.com/photo-1601813211761-9a1c2757704c?auto=format&fit=crop&w=400&h=250", date: "2023-10-10", size: "3.2 MB", dimension: "1920×1080", favorite: false }, { id: 3, title: "New Product Feature Overview", type: "video", thumbnail: "https://images.unsplash.com/photo-1581291518857-4e27b48ff24e?auto=format&fit=crop&w=400&h=250", date: "2023-10-08", size: "18.7 MB", duration: "3:48", favorite: false }, { id: 4, title: "Customer Interview Recording", type: "audio", thumbnail: "https://images.unsplash.com/photo-1571330735066-03aaa9429d89?auto=format&fit=crop&w=400&h=250", date: "2023-10-05", size: "8.3 MB", duration: "15:22", favorite: true }, { id: 5, title: "eCommerce Platform Wireframes", type: "image", thumbnail: "https://images.unsplash.com/photo-1511467687858-23d96c32e4ae?auto=format&fit=crop&w=400&h=250", date: "2023-10-01", size: "2.8 MB", dimension: "1440×900", favorite: false }, { id: 6, title: "Quarterly Business Report", type: "document", thumbnail: "https://images.unsplash.com/photo-1542744173-8e7e53415bb0?auto=format&fit=crop&w=400&h=250", date: "2023-09-28", size: "1.5 MB", pages: "24", favorite: false }, { id: 7, title: "Team Meeting Notes", type: "document", thumbnail: "https://images.unsplash.com/photo-1450101499163-c8848c66ca85?auto=format&fit=crop&w=400&h=250", date: "2023-09-25", size: "0.8 MB", pages: "12", favorite: false }, { id: 8, title: "Social Media Campaign Assets", type: "image", thumbnail: "https://images.unsplash.com/photo-1563986768609-322da13575f3?auto=format&fit=crop&w=400&h=250", date: "2023-09-20", size: "5.1 MB", dimension: "2400×1350", favorite: true }, { id: 9, title: "Product Demo Walkthrough", type: "video", thumbnail: "https://images.unsplash.com/photo-1536240478700-b869070f9279?auto=format&fit=crop&w=400&h=250", date: "2023-10-17", size: "32.6 MB", duration: "7:15", favorite: true }, { id: 10, title: "Marketing Podcast Episode", type: "audio", thumbnail: "https://images.unsplash.com/photo-1590602847861-f357a9332bbc?auto=format&fit=crop&w=400&h=250", date: "2023-09-15", size: "12.4 MB", duration: "28:16", favorite: false }, { id: 11, title: "Brand Style Guide 2023", type: "document", thumbnail: "https://images.unsplash.com/photo-1572044162444-ad60f128bdea?auto=format&fit=crop&w=400&h=250", date: "2023-09-10", size: "3.7 MB", pages: "32", favorite: true }, { id: 12, title: "Customer Testimonial Video", type: "video", thumbnail: "https://images.unsplash.com/photo-1573164574572-cb89e39749b4?auto=format&fit=crop&w=400&h=250", date: "2023-09-08", size: "28.9 MB", duration: "4:52", favorite: false } ]; document.addEventListener('DOMContentLoaded', function() { const mediaContainer = document.getElementById('media-container'); const emptyState = document.getElementById('empty-state'); const loadingIndicator = document.getElementById('loading-indicator'); const uploadButton = document.getElementById('upload-button'); const uploadOptions = document.getElementById('upload-options'); const tabs = document.querySelectorAll('.tab'); const contextMenu = document.getElementById('context-menu'); const toast = document.getElementById('toast'); const searchInput = document.getElementById('search-input'); const uploadFirstBtn = document.getElementById('upload-first-btn'); // Initialize media display showLoading(); setTimeout(() => { renderMedia(mediaData); hideLoading(); }, 1000); // Tab click handler tabs.forEach(tab => { tab.addEventListener('click', () => { tabs.forEach(t => t.classList.remove('active')); tab.classList.add('active'); const tabType = tab.dataset.tab; showLoading(); setTimeout(() => { if (tabType === 'all') { renderMedia(mediaData); } else if (tabType === 'recent') { const sortedData = [...mediaData].sort((a, b) => new Date(b.date) - new Date(a.date)); renderMedia(sortedData.slice(0, 6)); } else if (tabType === 'favorites') { const filteredData = mediaData.filter(item => item.favorite); renderMedia(filteredData); } else { const filteredData = mediaData.filter(item => item.type === tabType); renderMedia(filteredData); } hideLoading(); }, 800); }); }); // Upload button toggle uploadButton.addEventListener('click', () => { uploadOptions.classList.toggle('show'); }); // Upload option click handler const uploadOptionItems = document.querySelectorAll('.upload-option'); uploadOptionItems.forEach(option => { option.addEventListener('click', () => { const mediaType = option.dataset.type; uploadOptions.classList.remove('show'); simulateUpload(mediaType); }); }); // Upload first button uploadFirstBtn.addEventListener('click', () => { uploadOptions.classList.add('show'); }); // Close context menu on click outside document.addEventListener('click', (e) => { if (!contextMenu.contains(e.target) && !e.target.classList.contains('action-btn')) { contextMenu.classList.remove('show'); } // Close upload options if clicked outside if (!uploadOptions.contains(e.target) && !uploadButton.contains(e.target)) { uploadOptions.classList.remove('show'); } }); // Search functionality searchInput.addEventListener('input', (e) => { const searchTerm = e.target.value.toLowerCase(); if (searchTerm.length > 0) { const filteredData = mediaData.filter(item => item.title.toLowerCase().includes(searchTerm)); renderMedia(filteredData); } else { renderMedia(mediaData); } }); // Escape key to close menus document.addEventListener('keydown', (e) => { if (e.key === 'Escape') { contextMenu.classList.remove('show'); uploadOptions.classList.remove('show'); } }); // Function to render media items function renderMedia(data) { mediaContainer.innerHTML = ''; if (data.length === 0) { mediaContainer.style.display = 'none'; emptyState.style.display = 'flex'; return; } mediaContainer.style.display = 'grid'; emptyState.style.display = 'none'; data.forEach((item, index) => { const mediaCard = document.createElement('div'); mediaCard.className = 'media-card'; mediaCard.style.setProperty('--animation-order', index); // Determine what to display as meta info based on type let metaInfo = ''; if (item.type === 'video' || item.type === 'audio') { metaInfo = `<span>${item.duration}</span>`; } else if (item.type === 'image') { metaInfo = `<span>${item.dimension}</span>`; } else if (item.type === 'document') { metaInfo = `<span>${item.pages} pages</span>`; } mediaCard.innerHTML = ` <div class="media-thumbnail"> <img src="${item.thumbnail}" alt="${item.title}"> </div> <div class="media-info"> <div class="media-title">${item.title}</div> <span class="media-type ${item.type}">${item.type}</span> <div class="media-meta"> ${metaInfo} <span>${item.size}</span> </div> </div> <div class="media-actions"> <button class="action-btn edit-btn" data-id="${item.id}"> <i class="fas fa-pencil-alt"></i> </button> <button class="action-btn more-btn" data-id="${item.id}"> <i class="fas fa-ellipsis-v"></i> </button> </div> `; mediaContainer.appendChild(mediaCard); // Context menu for more options const moreBtn = mediaCard.querySelector('.more-btn'); moreBtn.addEventListener('click', (e) => { e.stopPropagation(); const rect = moreBtn.getBoundingClientRect(); contextMenu.style.top = `${rect.top}px`; contextMenu.style.left = `${rect.left - contextMenu.offsetWidth + 20}px`; contextMenu.classList.add('show'); // Make sure context menu stays within viewport const menuRect = contextMenu.getBoundingClientRect(); if (menuRect.right > window.innerWidth) { contextMenu.style.left = `${window.innerWidth - menuRect.width - 10}px`; } if (menuRect.bottom > window.innerHeight) { contextMenu.style.top = `${rect.top - menuRect.height - 10}px`; } }); // Media card click handler mediaCard.addEventListener('click', () => { showToast(`Opening ${item.title}`, 'info'); }); }); // Add context menu item click handlers const contextMenuItems = document.querySelectorAll('.context-menu-item'); contextMenuItems.forEach(item => { item.addEventListener('click', () => { const action = item.querySelector('span').textContent.toLowerCase(); contextMenu.classList.remove('show'); showToast(`${action.charAt(0).toUpperCase() + action.slice(1)} action triggered`, action.includes('delete') ? 'error' : 'success'); }); }); } // Show loading indicator function showLoading() { loadingIndicator.style.opacity = '1'; loadingIndicator.style.visibility = 'visible'; } // Hide loading indicator function hideLoading() { loadingIndicator.style.opacity = '0'; loadingIndicator.style.visibility = 'hidden'; } // Show toast message function showToast(message, type = 'success') { const toastMessage = document.getElementById('toast-message'); const toastIcon = document.getElementById('toast-icon'); toastMessage.textContent = message; // Set icon and class based on type toastIcon.className = ''; if (type === 'success') { toastIcon.className = 'fas fa-check-circle success'; } else if (type === 'error') { toastIcon.className = 'fas fa-exclamation-circle error'; } else if (type === 'warning') { toastIcon.className = 'fas fa-exclamation-triangle warning'; } else if (type === 'info') { toastIcon.className = 'fas fa-info-circle success'; } toast.classList.add('show'); setTimeout(() => { toast.classList.remove('show'); }, 3000); } // Simulate media upload function simulateUpload(type) { showLoading(); setTimeout(() => { hideLoading();
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Social Media Insights Panel</title> <style> @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap'); @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } @keyframes float { 0% { transform: translateY(0px); } 50% { transform: translateY(-8px); } 100% { transform: translateY(0px); } } @keyframes rotate { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } @keyframes gradientAnimation { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Poppins', sans-serif; } :root { --primary: #3c55fa; --secondary: #ff3a6e; --accent: #00d3b8; --yellow: #ffcc00; --light: #f9f9ff; --dark: #1a1a2e; --shadow: 0 10px 30px rgba(0, 0, 0, 0.08); } body { background-color: var(--light); color: var(--dark); max-width: 100%; overflow-x: hidden; height: 100vh; } .dashboard { display: grid; grid-template-rows: auto 1fr; width: 100%; height: 100%; padding: 1.5rem; background-color: var(--light); overflow-y: auto; transition: all 0.3s ease; } .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 2rem; animation: fadeIn 0.6s ease forwards; } .title { font-weight: 700; font-size: 1.8rem; background: linear-gradient(90deg, var(--primary), var(--secondary)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; position: relative; } .title::after { content: ''; position: absolute; bottom: -5px; left: 0; width: 70%; height: 3px; background: linear-gradient(90deg, var(--primary), var(--secondary)); border-radius: 10px; } .time-filter { display: flex; gap: 0.5rem; } .time-btn { padding: 0.5rem 1rem; border: none; border-radius: 20px; background-color: rgba(255, 255, 255, 0.5); color: var(--dark); font-weight: 500; cursor: pointer; transition: all 0.3s ease; } .time-btn:hover { transform: translateY(-2px); box-shadow: var(--shadow); } .time-btn.active { background-color: var(--primary); color: white; } .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: auto auto; gap: 1.5rem; height: calc(100% - 3rem); } .card { background-color: white; border-radius: 16px; padding: 1.5rem; box-shadow: var(--shadow); overflow: hidden; position: relative; transition: all 0.3s ease; animation: fadeIn 0.6s ease forwards; animation-fill-mode: both; } .card:nth-child(1) { animation-delay: 0.1s; } .card:nth-child(2) { animation-delay: 0.2s; } .card:nth-child(3) { animation-delay: 0.3s; } .card:nth-child(4) { animation-delay: 0.4s; } .card:nth-child(5) { animation-delay: 0.5s; } .card:hover { transform: translateY(-5px); box-shadow: 0 15px 30px rgba(0, 0, 0, 0.12); } .card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; } .card-title { font-weight: 600; color: var(--dark); font-size: 1.2rem; } .platform-icon { width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; font-size: 1.2rem; } .instagram { background: linear-gradient(45deg, #833AB4, #FD1D1D, #FCAF45); } .twitter { background-color: #1DA1F2; } .tiktok { background: linear-gradient(90deg, #000000, #69C9D0, #EE1D52); } .facebook { background-color: #4267B2; } .linkedin { background-color: #0077B5; } .stats-container { display: flex; flex-wrap: wrap; gap: 1rem; margin-bottom: 1rem; } .stat { flex: 1; min-width: 100px; padding: 0.8rem; background-color: rgba(240, 242, 255, 0.7); border-radius: 12px; text-align: center; transition: all 0.3s ease; } .stat:hover { background-color: rgba(60, 85, 250, 0.1); transform: scale(1.05); } .stat-value { font-weight: 700; font-size: 1.5rem; margin-bottom: 0.2rem; color: var(--primary); } .stat-label { font-size: 0.8rem; color: #666; } .insights { grid-column: span 2; display: grid; grid-template-rows: auto 1fr; } .chart-container { position: relative; height: calc(100% - 2rem); width: 100%; } canvas { width: 100% !important; height: 100% !important; } .engagement-card { display: flex; flex-direction: column; } .hashtag-trends { grid-column: span 3; overflow: hidden; } .hashtag-container { display: flex; gap: 0.8rem; flex-wrap: wrap; margin-top: 1rem; overflow-y: auto; max-height: 150px; padding-right: 0.5rem; } .hashtag { padding: 0.6rem 1rem; border-radius: 20px; font-size: 0.9rem; font-weight: 500; background-color: rgba(240, 242, 255, 0.7); cursor: pointer; transition: all 0.3s ease; display: flex; align-items: center; gap: 0.5rem; } .hashtag:nth-child(5n+1) { background-color: rgba(60, 85, 250, 0.1); color: var(--primary); } .hashtag:nth-child(5n+2) { background-color: rgba(255, 58, 110, 0.1); color: var(--secondary); } .hashtag:nth-child(5n+3) { background-color: rgba(0, 211, 184, 0.1); color: var(--accent); } .hashtag:nth-child(5n+4) { background-color: rgba(255, 204, 0, 0.1); color: var(--yellow); } .hashtag:nth-child(5n+5) { background-color: rgba(26, 26, 46, 0.1); color: var(--dark); } .hashtag:hover { transform: translateY(-3px) scale(1.05); box-shadow: var(--shadow); } .hashtag-value { font-weight: 700; margin-left: 0.3rem; } .progress-container { width: 100%; height: 10px; background-color: rgba(240, 242, 255, 0.7); border-radius: 10px; overflow: hidden; margin-top: 1rem; } .progress-bar { height: 100%; border-radius: 10px; transition: width 1s ease; background: linear-gradient(90deg, var(--primary), var(--secondary)); background-size: 200% 200%; animation: gradientAnimation 2s ease infinite; } .notification { position: absolute; bottom: 1.5rem; right: 1.5rem; padding: 1rem; background-color: white; border-radius: 12px; box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1); display: flex; align-items: center; gap: 1rem; transform: translateY(100px); opacity: 0; transition: all 0.5s ease; z-index: 100; max-width: 300px; } .notification.show { transform: translateY(0); opacity: 1; } .notification-icon { width: 40px; height: 40px; border-radius: 50%; background-color: rgba(60, 85, 250, 0.1); display: flex; align-items: center; justify-content: center; color: var(--primary); font-size: 1.2rem; } .notification-content h4 { font-size: 0.9rem; margin-bottom: 0.2rem; } .notification-content p { font-size: 0.8rem; color: #666; } .legend { display: flex; gap: 1rem; margin-top: 0.5rem; flex-wrap: wrap; } .legend-item { display: flex; align-items: center; gap: 0.5rem; font-size: 0.8rem; } .legend-color { width: 12px; height: 12px; border-radius: 4px; } .toggle-container { display: flex; gap: 0.5rem; align-items: center; } .toggle { position: relative; width: 50px; height: 24px; } .toggle input { opacity: 0; width: 0; height: 0; } .toggle-slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; transition: .4s; border-radius: 34px; } .toggle-slider:before { position: absolute; content: ""; height: 18px; width: 18px; left: 3px; bottom: 3px; background-color: white; transition: .4s; border-radius: 50%; } input:checked + .toggle-slider { background-color: var(--primary); } input:checked + .toggle-slider:before { transform: translateX(26px); } .toggle-label { font-size: 0.8rem; font-weight: 500; } .content-recommendations { padding: 1rem; background-color: rgba(240, 242, 255, 0.7); border-radius: 12px; margin-top: 1rem; } .recommendation { margin-bottom: 0.5rem; font-size: 0.9rem; display: flex; align-items: center; gap: 0.5rem; } .recommendation:last-child { margin-bottom: 0; } .recommendation i { color: var(--primary); } .scroll-container::-webkit-scrollbar { width: 6px; } .scroll-container::-webkit-scrollbar-track { background: rgba(240, 242, 255, 0.7); border-radius: 10px; } .scroll-container::-webkit-scrollbar-thumb { background: var(--primary); border-radius: 10px; } .live-badge { padding: 0.2rem 0.6rem; background-color: var(--secondary); color: white; border-radius: 20px; font-size: 0.7rem; font-weight: 600; display: flex; align-items: center; gap: 0.3rem; position: relative; overflow: hidden; animation: pulse 2s infinite; } .live-badge::before { content: ""; position: absolute; width: 6px; height: 6px; background-color: white; border-radius: 50%; margin-right: 0.3rem; animation: pulse 1.5s infinite; } .text-effect { background: linear-gradient(90deg, var(--primary), var(--secondary), var(--accent)); background-size: 200% auto; -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; animation: gradientAnimation 3s linear infinite; } .platform-dropdown { position: relative; margin-bottom: 1rem; } .platform-select { width: 100%; padding: 0.8rem 1rem; border: none; border-radius: 10px; background-color: rgba(240, 242, 255, 0.7); font-weight: 500; cursor: pointer; appearance: none; -webkit-appearance: none; -moz-appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%233c55fa' width='18px' height='18px'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 10px center; } .top-post { display: flex; align-items: center; gap: 1rem; padding: 1rem; background-color: rgba(240, 242, 255, 0.5); border-radius: 12px; margin-bottom: 1rem; transition: all 0.3s ease; cursor: pointer; } .top-post:hover { transform: scale(1.02); background-color: rgba(240, 242, 255, 0.8); } .top-post-image { width: 60px; height: 60px; border-radius: 10px; object-fit: cover; background-color: #ddd; } .top-post-content { flex: 1; } .top-post-title { font-weight: 600; font-size: 0.9rem; margin-bottom: 0.3rem; } .top-post-stats { display: flex; gap: 1rem; font-size: 0.8rem; color: #666; } .top-post-stat { display: flex; align-items: center; gap: 0.3rem; } .floating-button { position: absolute; bottom: 2rem; right: 2rem; width: 50px; height: 50px; border-radius: 50%; background-color: var(--primary); color: white; display: flex; align-items: center; justify-content: center; box-shadow: 0 5px 15px rgba(60, 85, 250, 0.4); cursor: pointer; transition: all 0.3s ease; z-index: 10; font-size: 1.5rem; } .floating-button:hover { transform: scale(1.1) rotate(90deg); background-color: var(--secondary); } .floating-menu { position: absolute; bottom: 7rem; right: 2rem; display: flex; flex-direction: column; gap: 1rem; z-index: 9; transition: all 0.3s ease; opacity: 0; pointer-events: none; } .floating-menu.active { opacity: 1; pointer-events: all; } .floating-item { width: 40px; height: 40px; border-radius: 50%; background-color: white; color: var(--primary); display: flex; align-items: center; justify-content: center; box-shadow: var(--shadow); cursor: pointer; transition: all 0.3s ease; animation: fadeIn 0.3s ease forwards; font-size: 1.2rem; } .floating-item:hover { transform: scale(1.1); color: var(--secondary); } @media (max-width: 768px) { .grid-container { grid-template-columns: 1fr; } .insights, .hashtag-trends { grid-column: span 1; } .title { font-size: 1.4rem; } .card { padding: 1rem; } .stat-value { font-size: 1.2rem; } .hashtag-container { max-height: 120px; } } </style> </head> <body> <div class="dashboard"> <div class="header"> <h1 class="title">SocialPulse Analytics</h1> <div class="time-filter"> <button class="time-btn">Day</button> <button class="time-btn active">Week</button> <button class="time-btn">Month</button> </div> </div> <div class="grid-container"> <div class="card engagement-card"> <div class="card-header"> <h3 class="card-title">Engagement Overview</h3> <div class="platform-icon instagram"> <i class="fab fa-instagram"></i> </div> </div> <div class="stats-container"> <div class="stat"> <div class="stat-value">4.8K</div> <div class="stat-label">Likes</div> </div> <div class="stat"> <div class="stat-value">856</div> <div class="stat-label">Comments</div> </div> <div class="stat"> <div class="stat-value">1.2K</div> <div class="stat-label">Shares</div> </div> </div> <div class="toggle-container"> <span class="toggle-label">Auto-refresh</span> <label class="toggle"> <input type="checkbox" checked> <span class="toggle-slider"></span> </label> <div class="live-badge">LIVE</div> </div> <div class="content-recommendations"> <div class="recommendation"> <i class="fas fa-arrow-trend-up"></i> <span>Post in the morning (8-10AM) for 37% more engagement</span> </div> <div class="recommendation"> <i class="fas fa-lightbulb"></i> <span>Carousel posts getting 3.1x more engagement</span> </div> </div> </div> <div class="card"> <div class="card-header"> <h3 class="card-title">Audience Growth</h3> <div class="platform-icon twitter"> <i class="fab fa-twitter"></i> </div> </div> <div class="stats-container"> <div class="stat"> <div class="stat-value">+342</div> <div class="stat-label">New Followers</div> </div> <div class="stat"> <div class="stat-value">8.5%</div> <div class="stat-label">Growth Rate</div> </div> </div> <div class="progress-container"> <div class="progress-bar" style="width: 65%;"></div> </div> <div class="top-post"> <div class="top-post-image"></div> <div class="top-post-content"> <h4 class="top-post-title">Top Performing Tweet</h4> <p>"Our new product launch is finally here! #TechRevolution"</p> <div class="top-post-stats"> <div class="top-post-stat"> <i class="fas fa-heart"></i> 1.2K </div> <div class="top-post-stat"> <i class="fas fa-retweet"></i> 452 </div> </div> </div> </div> </div> <div class="card"> <div class="card-header"> <h3 class="card-title">Content Performance</h3> <div class="platform-icon tiktok"> <i class="fab fa-tiktok"></i> </div> </div> <div class="stats-container"> <div class="stat"> <div class="stat-value">15.7K</div> <div class="stat-label">Views</div> </div> <div class="stat"> <div class="stat-value">2:15</div> <div class="stat-label">Avg Watch Time</div> </div> <div class="stat"> <div class="stat-value">24.3%</div> <div class="stat-label">Completion Rate</div> </div> </div> <div class="platform-dropdown"> <select class="platform-select"> <option>All Content Types</option> <option>Short Videos</option> <option>Long Form</option> <option>Live Streams</option> </select> </div> <div class="recommendation"> <i class="fas fa-fire"></i> <span>Trending content opportunity: <strong>#DanceChallenge</strong></span> </div> </div> <div class="card insights"> <div class="card-header"> <h3 class="card-title">Cross-Platform Insights</h3> <div class="time-filter"> <button class="time-btn">Engagement</button> <button class="time-btn active">Reach</button> <button class="time-btn">Conversion</button> </div> </div> <div class="chart-container"> <canvas id="insightsChart"></canvas> </div> <div class="legend"> <div class="legend-item"> <div class="legend-color" style="background-color: #3c55fa;"></div> <span>Instagram</span> </div> <div class="legend-item"> <div class="legend-color" style="background-color: #1DA1F2;"></div> <span>Twitter</span> </div> <div class="legend-item"> <div class="legend-color" style="background-color: #EE1D52;"></div> <span>TikTok</span> </div> <div class="legend-item"> <div class="legend-color" style="background-color: #4267B2;"></div> <span>Facebook</span> </div> </div> </div> <div class="card hashtag-trends"> <div class="card-header"> <h3 class="card-title">Trending Hashtags & Topics</h3> <div class="toggle-container"> <span class="toggle-label">Industry Focus</span> <label class="toggle"> <input type="checkbox" checked> <span class="toggle-slider"></span> </label> </div> </div> <div class="hashtag-container scroll-container"> <div class="hashtag">#SustainableFashion <span class="hashtag-value">+125%</span></div> <div class="hashtag">#TechInnovation <span class="hashtag-value">+84%</span></div> <div class="hashtag">#WorkFromAnywhere <span class="hashtag-value">+67%</span></div> <div class="hashtag">#DigitalNomad <span class="hashtag-value">+52%</span></div> <div class="hashtag">#AIRevolution <span class="hashtag-value">+45%</span></div> <div class="hashtag">#CleanBeauty <span class="hashtag-value">+38%</span></div> <div class="hashtag">#ProductivityHacks <span class="hashtag-value">+33%</span></div> <div class="hashtag">#RemoteWork <span class="hashtag-value">+29%</span></div> <div class="hashtag">#CircularEconomy <span class="hashtag-value">+24%</span></div> <div class="hashtag">#MentalHealthMatters <span class="hashtag-value">+22%</span></div> <div class="hashtag">#ZeroWaste <span class="hashtag-value">+19%</span></div> <div class="hashtag">#DataPrivacy <span class="hashtag-value">+18%</span></div> </div> <div class="content-recommendations"> <p><strong>Content Opportunity:</strong> Our analysis shows <span class="text-effect">#SustainableFashion</span> is trending with your audience demographics. Consider creating content around eco-friendly materials or sustainable practices in your next posts.</p> </div> </div> </div> </div> <div class="floating-button"> <i class="fas fa-plus"></i> </div> <div class="floating-menu"> <div class="floating-item"><i class="fas fa-download"></i></div> <div class="floating-item"><i class="fas fa-share-alt"></i></div> <div class="floating-item"><i class="fas fa-bell"></i></div> </div> <div class="notification" id="notification"> <div class="notification-icon"> <i class="fas fa-arrow-trend-up"></i> </div> <div class="notification-content"> <h4>Viral Post Alert</h4> <p>Your TikTok video is gaining traction with +243% engagement in the last hour!</p> </div> </div> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <script src="https://kit.fontawesome.com/a076d05399.js" crossorigin="anonymous"></script> <script> document.addEventListener('DOMContentLoaded', function() { // Initialize chart const ctx = document.getElementById('insightsChart').getContext('2d'); const data = { labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], datasets: [ { label: 'Instagram', data: [12000, 19000, 15000, 17000, 16000, 24000, 28000], borderColor: '#3c55fa', backgroundColor: 'rgba(60, 85, 250, 0.1)', tension: 0.4, fill: true }, { label: 'Twitter', data: [5000, 7000, 6000, 9000, 12000, 10000, 11000], borderColor: '#1DA1F2', backgroundColor: 'rgba(29, 161, 242, 0.1)', tension: 0.4, fill: true }, { label: 'TikTok', data: [8000, 10000, 12000, 15000, 20000, 18000, 25000], borderColor: '#EE1D52', backgroundColor: 'rgba(238, 29, 82, 0.1)', tension: 0.4, fill: true }, { label: 'Facebook', data: [4000, 5000, 4500, 6000, 5500, 7000, 8000], borderColor: '#4267B2', backgroundColor: 'rgba(66, 103, 178, 0.1)', tension: 0.4, fill: true } ] }; const config = { type: 'line', data: data, options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false }, tooltip: { mode: 'index', intersect: false, backgroundColor: 'rgba(255, 255, 255, 0.9)', titleColor: '#1a1a2e', bodyColor: '#1a1a2e', borderColor: '#e6e6e6', borderWidth: 1, padding: 10, boxPadding: 5, usePointStyle: true, callbacks: { label: function(context) { let label = context.dataset.label || ''; if (label) { label += ': '; } if (context.parsed.y !== null) { label += new Intl.NumberFormat().format(context.parsed.y); } return label; } } } }, scales: { x: { grid: { display: false }, ticks: { color: '#666' } }, y: { beginAtZero: true, grid: { color: 'rgba(0, 0, 0, 0.05)' }, ticks: { callback: function(value) { if (value >= 1000) { return value / 1000 + 'k'; } return value; }, color: '#666' } } }, interaction: { mode: 'index', intersect: false, }, elements: { point: { radius: 2, hoverRadius: 5 } }, animation: { duration: 2000, easing: 'easeOutQuart' } } }; const myChart = new Chart(ctx, config); // Show notification after 3 seconds setTimeout(function() { document.getElementById('notification').classList.add('show'); // Hide notification after 5 seconds setTimeout(function() { document.getElementById('notification').classList.remove('show'); }, 5000); }, 3000); // Time filter buttons const timeButtons = document.querySelectorAll('.time-btn'); timeButtons.forEach(button => { button.addEventListener('click', function() { timeButtons.forEach(btn => btn.classList.remove('active')); this.classList.add('active'); // In a real app, you would fetch new data based on the time filter // For demo purposes, we'll just update the chart with random data myChart.data.datasets.forEach(dataset => { dataset.data = Array.from({length: 7}, () => Math.floor(Math.random() * 30000) + 3000); }); myChart.update(); }); }); // Hashtag click event const hashtags = document.querySelectorAll('.hashtag'); hashtags.forEach(hashtag => { hashtag.addEventListener('click', function() { hashtags.forEach(h => h.style.transform = ''); this.style.transform = 'scale(1.1)'; // In a real app, you would show more details about the hashtag const tagName = this.textContent.split(' ')[0]; const notification = document.getElementById('notification'); notification.querySelector('h4').textContent = 'Hashtag Insights'; notification.querySelector('p').textContent = `${tagName} is trending in your industry. Click to see content ideas.`; notification.classList.add('show'); setTimeout(function() { notification.classList.remove('show'); }, 3000); }); }); // Floating button const floatingButton = document.querySelector('.floating-button'); const floatingMenu = document.querySelector('.floating-menu'); floatingButton.addEventListener('click', function() { floatingMenu.classList.toggle('active'); this.classList.toggle('active'); }); // Platform dropdown const platformSelect = document.querySelector('.platform-select'); platformSelect.addEventListener('change', function() { const notification = document.getElementById('notification'); notification.querySelector('h4').textContent = 'Content Filter Applied'; notification.querySelector('p').textContent = `Now showing ${this.value} metrics. This content type performs best on weekends.`; notification.classList.add('show'); setTimeout(function() { notification.classList.remove('show'); }, 3000); }); // Simulate real-time data updates setInterval(function() { if (document.querySelector('.toggle input').checked) { // Update a random stat value to simulate live data const stats = document.querySelectorAll('.stat-value'); const random
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>NEON-X Smart Home Control</title> <style> :root { --primary-bg: #0f1117; --secondary-bg: #1a1d2a; --accent-color: #01e9ff; --accent-purple: #9d4edd; --accent-pink: #ff45a0; --text-primary: #e6e8ef; --text-secondary: #a5a9b4; --shadow-neon: 0 0 15px rgba(1, 233, 255, 0.5); --card-bg: rgba(26, 29, 42, 0.7); --grid-gap: 16px; --transition-speed: 0.3s; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { background: var(--primary-bg); color: var(--text-primary); min-height: 100vh; display: flex; justify-content: center; align-items: center; overflow-x: hidden; padding: 0; } .container { width: 100%; max-width: 700px; height: 700px; padding: 20px; display: flex; flex-direction: column; overflow: hidden; position: relative; } .background-grid { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-image: radial-gradient(var(--accent-color) 1px, transparent 1px), radial-gradient(var(--accent-purple) 1px, transparent 1px); background-size: 50px 50px; background-position: 0 0, 25px 25px; opacity: 0.05; z-index: -1; pointer-events: none; } .glow-circle { position: absolute; width: 350px; height: 350px; border-radius: 50%; background: radial-gradient(circle, rgba(1, 233, 255, 0.1) 0%, rgba(1, 233, 255, 0) 70%); z-index: -1; filter: blur(30px); animation: float 10s infinite alternate ease-in-out; pointer-events: none; } .glow-circle:nth-child(2) { width: 250px; height: 250px; background: radial-gradient(circle, rgba(157, 78, 221, 0.1) 0%, rgba(157, 78, 221, 0) 70%); animation-delay: -5s; right: 0; bottom: 40px; } .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; } .logo { display: flex; align-items: center; gap: 10px; } .logo-icon { width: 32px; height: 32px; border-radius: 8px; background: linear-gradient(45deg, var(--accent-color), var(--accent-purple)); display: flex; justify-content: center; align-items: center; box-shadow: var(--shadow-neon); } .logo-text { font-weight: 700; font-size: 1.5rem; background: linear-gradient(90deg, var(--accent-color), var(--accent-purple)); -webkit-background-clip: text; background-clip: text; color: transparent; letter-spacing: 0.5px; } .user-profile { display: flex; align-items: center; gap: 10px; } .user-avatar { width: 36px; height: 36px; border-radius: 50%; background: linear-gradient(45deg, var(--accent-color), var(--accent-purple)); display: flex; justify-content: center; align-items: center; position: relative; overflow: hidden; } .user-avatar::after { content: ""; position: absolute; width: 32px; height: 32px; border-radius: 50%; background: var(--secondary-bg); display: flex; justify-content: center; align-items: center; } .user-avatar i { z-index: 1; color: var(--accent-color); } .status-label { display: inline-flex; padding: 6px 12px; background-color: rgba(1, 233, 255, 0.1); border-radius: 20px; font-size: 0.85rem; align-items: center; gap: 6px; } .status-dot { width: 8px; height: 8px; border-radius: 50%; background-color: var(--accent-color); box-shadow: 0 0 8px var(--accent-color); animation: pulse 2s infinite; } .main-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--grid-gap); margin-bottom: var(--grid-gap); flex: 1; } .span-2-rows { grid-row: span 2; } .span-2-cols { grid-column: span 2; } .card { background: var(--card-bg); border-radius: 16px; padding: 20px; display: flex; flex-direction: column; position: relative; backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.05); overflow: hidden; transition: all var(--transition-speed) ease; } .card:hover { transform: translateY(-5px); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); border-color: rgba(1, 233, 255, 0.2); } .card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; } .card-title { font-size: 1.1rem; font-weight: 600; color: var(--text-primary); } .card-icon { width: 36px; height: 36px; border-radius: 10px; background: rgba(1, 233, 255, 0.1); display: flex; justify-content: center; align-items: center; color: var(--accent-color); transition: all var(--transition-speed) ease; } .card:hover .card-icon { background: var(--accent-color); color: var(--primary-bg); } .toggle-switch { position: relative; display: inline-block; width: 50px; height: 26px; } .toggle-switch input { opacity: 0; width: 0; height: 0; } .toggle-slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(255, 255, 255, 0.1); transition: .4s; border-radius: 34px; } .toggle-slider:before { position: absolute; content: ""; height: 20px; width: 20px; left: 3px; bottom: 3px; background-color: var(--text-primary); transition: .4s; border-radius: 50%; } input:checked + .toggle-slider { background-color: var(--accent-color); } input:checked + .toggle-slider:before { transform: translateX(24px); background-color: white; } .toggle-slider-purple { background-color: rgba(255, 255, 255, 0.1); } input:checked + .toggle-slider-purple { background-color: var(--accent-purple); } .toggle-slider-pink { background-color: rgba(255, 255, 255, 0.1); } input:checked + .toggle-slider-pink { background-color: var(--accent-pink); } .card-info { font-size: 0.9rem; color: var(--text-secondary); margin-top: 5px; } .card-content { flex: 1; display: flex; flex-direction: column; } .temperature-display { font-size: 2.5rem; font-weight: 700; margin: 10px 0; align-self: center; color: var(--text-primary); } .temp-unit { font-size: 1.5rem; font-weight: 400; color: var(--text-secondary); } .slider-container { margin-top: 15px; width: 100%; } .slider { -webkit-appearance: none; width: 100%; height: 6px; background: rgba(255, 255, 255, 0.1); border-radius: 3px; outline: none; } .slider::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 20px; height: 20px; border-radius: 50%; background: var(--accent-color); cursor: pointer; box-shadow: 0 0 10px var(--accent-color); transition: all 0.2s ease; } .slider::-webkit-slider-thumb:hover { transform: scale(1.1); } .slider-purple::-webkit-slider-thumb { background: var(--accent-purple); box-shadow: 0 0 10px var(--accent-purple); } .slider-values { display: flex; justify-content: space-between; margin-top: 10px; color: var(--text-secondary); font-size: 0.8rem; } .color-preset { display: flex; gap: 10px; margin-top: 15px; } .color-btn { width: 24px; height: 24px; border-radius: 50%; cursor: pointer; transition: all 0.2s ease; position: relative; } .color-btn:hover { transform: scale(1.2); } .color-btn.active { transform: scale(1.2); box-shadow: 0 0 10px currentColor; } .color-btn.active::after { content: ''; position: absolute; width: 10px; height: 10px; border-radius: 50%; background: white; top: 50%; left: 50%; transform: translate(-50%, -50%); } .security-status { display: flex; align-items: center; gap: 10px; margin-top: 10px; padding: 10px; border-radius: 10px; background: rgba(0, 0, 0, 0.2); } .security-icon { padding: 10px; border-radius: 50%; background: var(--accent-color); color: var(--primary-bg); } .security-armed { background: var(--accent-color); } .security-disarmed { background: var(--accent-purple); } .security-away { background: var(--accent-pink); } .mode-buttons { display: flex; gap: 10px; margin-top: 15px; } .mode-btn { flex: 1; padding: 10px; border-radius: 10px; background: rgba(255, 255, 255, 0.05); border: none; color: var(--text-primary); cursor: pointer; transition: all var(--transition-speed) ease; display: flex; align-items: center; justify-content: center; gap: 8px; } .mode-btn:hover { background: rgba(255, 255, 255, 0.1); } .mode-btn.active { background: var(--accent-color); color: var(--primary-bg); } .mode-btn.active-purple { background: var(--accent-purple); color: var(--primary-bg); } .mode-btn.active-pink { background: var(--accent-pink); color: var(--primary-bg); } .energy-chart { width: 100%; height: 100px; margin-top: 15px; display: flex; align-items: flex-end; gap: 4px; } .chart-bar { flex: 1; background: rgba(1, 233, 255, 0.2); border-radius: 3px 3px 0 0; position: relative; transition: height 0.5s ease; } .chart-bar::after { content: ''; position: absolute; top: -5px; left: 0; width: 100%; height: 5px; border-radius: 3px 3px 0 0; opacity: 0; transition: opacity 0.3s ease; } .chart-bar:hover { background: rgba(1, 233, 255, 0.5); } .chart-bar:hover::after { opacity: 1; background: var(--accent-color); } .chart-labels { display: flex; justify-content: space-between; margin-top: 5px; color: var(--text-secondary); font-size: 0.7rem; } .card-value { font-size: 1.5rem; font-weight: 600; margin: 10px 0; } .highlight { color: var(--accent-color); } .highlight-purple { color: var(--accent-purple); } .highlight-pink { color: var(--accent-pink); } .progress-bar { width: 100%; height: 8px; background: rgba(255, 255, 255, 0.1); border-radius: 4px; margin-top: 10px; overflow: hidden; position: relative; } .progress-fill { height: 100%; background: linear-gradient(90deg, var(--accent-color), var(--accent-purple)); border-radius: 4px; transition: width 0.3s ease; position: relative; } .progress-fill::after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient( 90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.3) 50%, rgba(255, 255, 255, 0) 100% ); animation: shine 2s infinite; } .quick-actions { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; margin-top: 20px; } .action-btn { padding: 15px; border-radius: 12px; background: rgba(255, 255, 255, 0.05); border: none; color: var(--text-primary); cursor: pointer; transition: all var(--transition-speed) ease; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; font-size: 0.9rem; } .action-btn i { font-size: 1.2rem; transition: transform 0.3s ease; } .action-btn:hover { background: rgba(1, 233, 255, 0.1); } .action-btn:hover i { transform: translateY(-3px); color: var(--accent-color); } .device-list { margin-top: 15px; display: flex; flex-direction: column; gap: 10px; flex: 1; overflow-y: auto; } .device-item { display: flex; justify-content: space-between; align-items: center; padding: 10px 15px; background: rgba(255, 255, 255, 0.05); border-radius: 10px; transition: all var(--transition-speed) ease; } .device-item:hover { background: rgba(255, 255, 255, 0.1); transform: translateX(5px); } .device-info { display: flex; align-items: center; gap: 10px; } .device-icon { width: 30px; height: 30px; border-radius: 8px; background: rgba(1, 233, 255, 0.1); display: flex; justify-content: center; align-items: center; color: var(--accent-color); } .device-name { font-size: 0.9rem; } .device-status { font-size: 0.8rem; color: var(--text-secondary); } @keyframes float { 0% { transform: translate(0, 0); } 100% { transform: translate(30px, -30px); } } @keyframes pulse { 0% { opacity: 0.5; transform: scale(0.8); } 50% { opacity: 1; transform: scale(1.1); } 100% { opacity: 0.5; transform: scale(0.8); } } @keyframes shine { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } } /* Responsive adjustments */ @media (max-width: 700px) { .main-grid { grid-template-columns: repeat(2, 1fr); } .card-title, .device-name { font-size: 0.9rem; } .card-info, .device-status { font-size: 0.75rem; } .temperature-display { font-size: 2rem; } .card-value { font-size: 1.2rem; } .action-btn { padding: 10px; font-size: 0.8rem; } .slider-values { font-size: 0.7rem; } } @media (max-width: 500px) { .logo-text { font-size: 1.2rem; } .status-label { font-size: 0.75rem; padding: 4px 8px; } .card { padding: 15px; } .card-icon, .device-icon { width: 30px; height: 30px; } .quick-actions { grid-template-columns: 1fr; } } </style> </head> <body> <div class="container"> <div class="background-grid"></div> <div class="glow-circle" style="top: 20%; left: 10%;"></div> <div class="glow-circle" style="bottom: 10%; right: 20%;"></div> <div class="header"> <div class="logo"> <div class="logo-icon"> <i class="fas fa-home"></i> </div> <div class="logo-text">NEON-X</div> </div> <div class="user-profile"> <div class="status-label"> <div class="status-dot"></div> <span>System Active</span> </div> <div class="user-avatar"> <i class="fas fa-user"></i> </div> </div> </div> <div class="main-grid"> <!-- Temperature Card --> <div class="card span-2-rows"> <div class="card-header"> <div class="card-title">Temperature</div> <div class="card-icon"> <i class="fas fa-thermometer-half"></i> </div> </div> <div class="card-content"> <div class="temperature-display"> <span id="temp-value">22</span><span class="temp-unit">°C</span> </div> <div class="card-info">Room feels comfortable</div> <div class="slider-container"> <input type="range" min="16" max="30" value="22" class="slider" id="temp-slider"> <div class="slider-values"> <span>16°C</span> <span>30°C</span> </div> </div> <div class="mode-buttons"> <button class="mode-btn active"> <i class="fas fa-snowflake"></i> <span>Cool</span> </button> <button class="mode-btn"> <i class="fas fa-fire"></i> <span>Heat</span> </button> <button class="mode-btn"> <i class="fas fa-wind"></i> <span>Fan</span> </button> </div> </div> </div> <!-- Lighting Card --> <div class="card span-2-cols"> <div class="card-header"> <div class="card-title">Lighting</div> <div class="card-icon"> <i class="fas fa-lightbulb"></i> </div> </div> <div class="card-content"> <div class="toggle-container"> <div style="display: flex; justify-content: space-between; align-items: center;"> <span>Living Room</span> <label class="toggle-switch"> <input type="checkbox" checked id="light-toggle"> <span class="toggle-slider"></span> </label> </div> </div> <div class="slider-container" style="margin-top: 15px;"> <input type="range" min="0" max="100" value="75" class="slider" id="brightness-slider"> <div class="slider-values"> <span>0%</span> <span>100%</span> </div> </div> <div class="color-preset"> <div class="color-btn active" style="background-color: #01e9ff;"></div> <div class="color-btn" style="background-color: #9d4edd;"></div> <div class="color-btn" style="background-color: #ff45a0;"></div> <div class="color-btn" style="background-color: #ffbd3e;"></div> <div class="color-btn" style="background-color: #4edd98;"></div> </div> </div> </div> <!-- Security Card --> <div class="card span-2-cols"> <div class="card-header"> <div class="card-title">Security</div> <div class="card-icon"> <i class="fas fa-shield-alt"></i> </div> </div> <div class="card-content"> <div class="security-status"> <div class="security-icon security-armed"> <i class="fas fa-lock"></i> </div> <div> <div>System Armed</div> <div class="device-status">All entrances secured</div> </div> </div> <div class="mode-buttons"> <button class="mode-btn active"> <i class="fas fa-home"></i> <span>Home</span> </button> <button class="mode-btn"> <i class="fas fa-plane"></i> <span>Away</span> </button> <button class="mode-btn"> <i class="fas fa-moon"></i> <span>Night</span> </button> </div> </div> </div> <!-- Energy Card --> <div class="card span-2-cols"> <div class="card-header"> <div class="card-title">Energy Usage</div> <div class="card-icon"> <i class="fas fa-bolt"></i> </div> </div> <div class="card-content"> <div class="card-value"><span class="highlight">3.8</span> kWh</div> <div class="card-info">12% less than yesterday</div> <div class="energy-chart"> <div class="chart-bar" style="height: 40%;"></div> <div class="chart-bar" style="height: 70%;"></div> <div class="chart-bar" style="height: 50%;"></div> <div class="chart-bar" style="height: 60%;"></div> <div class="chart-bar" style="height: 30%;"></div> <div class="chart-bar" style="height: 80%;"></div> <div class="chart-bar" style="height: 60%;"></div> </div> <div class="chart-labels"> <span>Mon</span> <span>Tue</span> <span>Wed</span> <span>Thu</span> <span>Fri</span> <span>Sat</span> <span>Sun</span> </div> </div> </div> <!-- Smart Devices Card --> <div class="card span-2-rows"> <div class="card-header"> <div class="card-title">Smart Devices</div> <div class="card-icon"> <i class="fas fa-plug"></i> </div> </div> <div class="card-content"> <div class="device-list"> <div class="device-item"> <div class="device-info"> <div class="device-icon"> <i class="fas fa-tv"></i> </div> <div> <div class="device-name">Living Room TV</div> <div class="device-status">Playing Netflix</div> </div> </div> <label class="toggle-switch"> <input type="checkbox" checked> <span class="toggle-slider"></span> </label> </div> <div class="device-item"> <div class="device-info"> <div class="device-icon"> <i class="fas fa-fan"></i> </div> <div> <div class="device-name">Bedroom Fan</div> <div class="device-status">Speed: Medium</div> </div> </div> <label class="toggle-switch"> <input type="checkbox" checked> <span class="toggle-slider-purple toggle-slider"></span> </label> </div> <div class="device-item"> <div class="device-info"> <div class="device-icon"> <i class="fas fa-coffee"></i> </div> <div> <div class="device-name">Coffee Maker</div> <div class="device-status">Ready for brewing</div> </div> </div> <label class="toggle-switch"> <input type="checkbox"> <span class="toggle-slider-pink toggle-slider"></span> </label> </div> <div class="device-item"> <div class="device-info"> <div class="device-icon"> <i class="fas fa-volume-up"></i> </div> <div> <div class="device-name">Smart Speaker</div> <div class="device-status">Playing: Chill Mix</div> </div> </div> <label class="toggle-switch"> <input type="checkbox" checked> <span class="toggle-slider"></span> </label> </div> </div> </div> </div> <!-- Camera Card --> <div class="card span-2-cols"> <div class="card-header"> <div class="card-title">Front Door Camera</div> <div class="card-icon"> <i class="fas fa-video"></i> </div> </div> <div class="card-content"> <div class="card-info">Last motion detected: 11 min ago</div> <div class="progress-bar"> <div class="progress-fill" style="width: 90%;"></div> </div> <div class="quick-actions"> <button class="action-btn"> <i class="fas fa-image"></i> <span>View Snapshot</span> </button> <button class="action-btn"> <i class="fas fa-video"></i> <span>Live Feed</span> </button> </div> </div> </div> <!-- Scenes Card --> <div class="card span-2-cols"> <div class="card-header"> <div class="card-title">Quick Scenes</div> <div class="card-icon"> <i class="fas fa-magic"></i> </div> </div> <div class="card-content"> <div class="mode-buttons" style="margin-top: 0;"> <button class="mode-btn"> <i class="fas fa-film"></i> <span>Movie Night</span> </button> <button class="mode-btn active-purple"> <i class="fas fa-book"></i> <span>Reading</span> </button> </div> <div class="mode-buttons" style="margin-top: 10px;"> <button class="mode-btn"> <i class="fas fa-utensils"></i> <span>Dinner</span> </button> <button class="mode-btn"> <i class="fas fa-cocktail"></i> <span>Party</span> </button> </div> </div> </div> </div> </div> <script src="https://kit.fontawesome.com/a076d05399.js" crossorigin="anonymous"></script> <script> document.addEventListener('DOMContentLoaded', function() { // Simulate Font Awesome loading const icons = document.querySelectorAll('i'); icons.forEach(icon => { if (icon.classList.contains('fa-home')) icon.textContent = '⌂'; if (icon.classList.contains('fa-user')) icon.textContent = '👤'; if (icon.classList.contains('fa-thermometer-half')) icon.textContent = '🌡️'; if (icon.classList.contains('fa-lightbulb')) icon.textContent = '💡'; if (icon.classList.contains('fa-shield-alt')) icon.textContent = '🛡️'; if (icon.classList.contains('fa-bolt')) icon.textContent = '⚡'; if (icon.classList.contains('fa-plug')) icon.textContent = '🔌'; if (icon.classList.contains('fa-tv')) icon.textContent = '📺'; if (icon.classList.contains('fa-fan')) icon.textContent = '💨'; if (icon.classList.contains('fa-coffee')) icon.textContent = '☕'; if (icon.classList.contains('fa-volume-up')) icon.textContent = '🔊'; if (icon.classList.contains('fa-video')) icon.textContent = '📹'; if (icon.classList.contains('fa-magic')) icon.textContent = '✨'; if (icon.classList.contains('fa-film')) icon.textContent = '🎬'; if (icon.classList.contains('fa-book')) icon.textContent = '📚'; if (icon.classList.contains('fa-utensils')) icon.textContent = '🍽️'; if (icon.classList.contains('fa-cocktail')) icon.textContent = '🍹'; if (icon.classList.contains('fa-snowflake')) icon.textContent = '❄️'; if (icon.classList.contains('fa-fire')) icon.textContent = '🔥'; if (icon.classList.contains('fa-wind')) icon.textContent = '💨'; if (icon.classList.contains('fa-lock')) icon.textContent = '🔒'; if (icon.classList.contains('fa-home')) icon.textContent = '🏠'; if (icon.classList.contains('fa-plane')) icon.textContent = '✈️'; if (icon.classList.contains('fa-moon')) icon.textContent = '🌙'; if (icon.classList.contains('fa-image')) icon.textContent = '📷'; }); // Temperature slider const tempSlider = document.getElementById('temp-slider'); const tempValue = document.getElementById('temp-value'); tempSlider.addEventListener('input', function() { tempValue.textContent = this.value; // Add haptic feedback effect this.style.transform = 'scale(1.02)'; setTimeout(() => { this.style.transform = 'scale(1)'; }, 100); }); // Light toggle const lightToggle = document.getElementById('light-toggle'); const brightnessSlider = document.getElementById('brightness-slider'); lightToggle.addEventListener('change', function() { if (this.checked) { brightnessSlider.disabled = false; brightnessSlider.style.opacity = '1'; } else { brightnessSlider.disabled = true; brightnessSlider.style.opacity = '0.5'; } }); // Color preset buttons const colorButtons = document.querySelectorAll('.color-btn'); colorButtons.forEach(btn => { btn.addEventListener('click', function() { colorButtons.forEach(b => b.classList.remove('active')); this.classList.add('active'); }); }); // Mode buttons const modeButtons = document.querySelectorAll('.mode-buttons .mode-btn'); modeButtons.forEach(btn => { btn.addEventListener('click', function() { // Only make buttons in the same container affect each other const parent = this.closest('.mode-buttons'); parent.querySelectorAll('.mode-btn').forEach(b => { b.classList.remove('active', 'active-purple', 'active-pink'); }); // Apply appropriate active class based on parent card if (this.closest('.card').querySelector('.card-title').textContent.includes('Scenes')) {
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Educational Course Navigation Panel</title> <style> :root { --primary: #6f8de0; --primary-light: #e0e7fc; --secondary: #8fc9b9; --accent: #ffa45b; --text: #334155; --light-text: #64748b; --background: #f8fafc; --card: #ffffff; --border: #e2e8f0; --shadow: rgba(0, 0, 0, 0.05); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', sans-serif; } body { background-color: var(--background); color: var(--text); font-size: 14px; line-height: 1.5; display: flex; justify-content: center; align-items: center; min-height: 100vh; padding: 20px; } .course-panel { width: 100%; max-width: 660px; height: 660px; background-color: var(--card); border-radius: 20px; box-shadow: 0 10px 30px var(--shadow); overflow: hidden; display: flex; flex-direction: column; } .panel-header { padding: 24px 30px; border-bottom: 1px solid var(--border); display: flex; justify-content: space-between; align-items: center; background-color: var(--primary-light); } .course-title { font-family: 'Poppins', sans-serif; font-weight: 700; font-size: 1.4rem; color: var(--primary); } .course-subtitle { font-weight: 400; font-size: 0.9rem; color: var(--light-text); margin-top: 4px; } .progress-container { margin-left: 20px; display: flex; align-items: center; } .progress-ring { position: relative; width: 50px; height: 50px; } .progress-ring circle { transition: stroke-dashoffset 0.35s; transform: rotate(-90deg); transform-origin: 50% 50%; } .progress-text { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 0.75rem; font-weight: 600; color: var(--primary); } .panel-body { flex: 1; overflow-y: auto; padding: 20px 30px; } .module-list { list-style: none; } .module-item { margin-bottom: 14px; border: 1px solid var(--border); border-radius: 12px; overflow: hidden; transition: all 0.3s ease; } .module-item:hover { box-shadow: 0 4px 12px var(--shadow); transform: translateY(-2px); } .module-header { padding: 15px 20px; display: flex; justify-content: space-between; align-items: center; cursor: pointer; background-color: var(--card); border-bottom: 1px solid transparent; transition: background-color 0.2s ease; } .module-item.active .module-header { border-bottom-color: var(--border); } .module-title { font-family: 'Poppins', sans-serif; font-weight: 600; font-size: 1rem; display: flex; align-items: center; } .module-status { display: flex; align-items: center; } .module-toggle { margin-left: 10px; width: 24px; height: 24px; display: flex; align-items: center; justify-content: center; border-radius: 50%; background-color: var(--primary-light); color: var(--primary); transition: transform 0.3s ease; } .module-item.active .module-toggle { transform: rotate(180deg); } .module-content { max-height: 0; overflow: hidden; transition: max-height 0.3s ease; } .module-item.active .module-content { max-height: 500px; } .lesson-list { list-style: none; padding: 10px 20px 15px; } .lesson-item { padding: 10px 10px 10px 35px; margin-bottom: 5px; border-radius: 8px; position: relative; cursor: pointer; transition: background-color 0.2s ease; } .lesson-item:hover { background-color: var(--primary-light); } .lesson-item.active { background-color: var(--primary-light); } .lesson-item::before { content: ""; position: absolute; left: 10px; top: 13px; width: 18px; height: 18px; border-radius: 50%; border: 2px solid var(--border); transition: all 0.2s ease; } .lesson-item.completed::before { background-color: var(--secondary); border-color: var(--secondary); background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='14' height='14' fill='none' stroke='white' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: center; } .lesson-item.active::before { border-color: var(--primary); } .lesson-title { font-size: 0.9rem; font-weight: 500; } .lesson-item.completed .lesson-title { text-decoration: line-through; color: var(--light-text); } .lesson-duration { font-size: 0.8rem; color: var(--light-text); margin-top: 2px; } .panel-footer { padding: 20px 30px; border-top: 1px solid var(--border); display: flex; justify-content: space-between; align-items: center; } .nav-buttons { display: flex; gap: 10px; } .nav-button { padding: 10px 20px; border-radius: 8px; font-weight: 500; cursor: pointer; transition: all 0.2s ease; display: flex; align-items: center; gap: 8px; } .btn-prev { background-color: var(--primary-light); color: var(--primary); } .btn-prev:hover { background-color: #d3ddfb; } .btn-next { background-color: var(--primary); color: white; } .btn-next:hover { background-color: #5c7ad8; transform: translateY(-2px); box-shadow: 0 4px 12px rgba(111, 141, 224, 0.3); } .status-indicator { display: flex; align-items: center; gap: 5px; color: var(--light-text); font-size: 0.85rem; } .status-dot { width: 8px; height: 8px; border-radius: 50%; background-color: var(--secondary); } .time-estimate { display: flex; align-items: center; color: var(--light-text); font-size: 0.85rem; margin-top: 2px; } .time-icon { margin-right: 5px; opacity: 0.7; } /* Module icon styles */ .module-icon { width: 24px; height: 24px; margin-right: 12px; display: flex; align-items: center; justify-content: center; border-radius: 8px; background-color: var(--primary-light); } .module-1 .module-icon { background-color: rgba(255, 164, 91, 0.2); color: var(--accent); } .module-2 .module-icon { background-color: rgba(143, 201, 185, 0.2); color: var(--secondary); } .module-3 .module-icon { background-color: rgba(111, 141, 224, 0.2); color: var(--primary); } .module-4 .module-icon { background-color: rgba(237, 137, 177, 0.2); color: #ed89b1; } /* Custom scrollbar */ .panel-body::-webkit-scrollbar { width: 8px; } .panel-body::-webkit-scrollbar-track { background: var(--background); border-radius: 10px; } .panel-body::-webkit-scrollbar-thumb { background: var(--border); border-radius: 10px; } .panel-body::-webkit-scrollbar-thumb:hover { background: #d1d5db; } /* Responsive styles */ @media (max-width: 600px) { .course-panel { height: 600px; } .panel-header { padding: 20px; flex-direction: column; align-items: flex-start; } .progress-container { margin-left: 0; margin-top: 15px; } .panel-body, .panel-footer { padding: 15px 20px; } .module-header { padding: 12px 15px; } .lesson-item { padding: 8px 8px 8px 30px; } .nav-button { padding: 8px 16px; font-size: 0.9rem; } } /* Animation for module content */ @keyframes fadeIn { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } .module-item.active .lesson-list { animation: fadeIn 0.4s ease forwards; } /* Tooltip styles */ .tooltip { position: relative; } .tooltip:hover::after { content: attr(data-tooltip); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background-color: var(--text); color: white; padding: 5px 10px; border-radius: 4px; font-size: 0.75rem; white-space: nowrap; z-index: 10; margin-bottom: 8px; opacity: 0; animation: fadeIn 0.3s ease forwards; } .tooltip:hover::before { content: ''; position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); border-width: 5px; border-style: solid; border-color: var(--text) transparent transparent transparent; margin-bottom: 3px; z-index: 10; opacity: 0; animation: fadeIn 0.3s ease forwards; } </style> </head> <body> <div class="course-panel"> <div class="panel-header"> <div class="title-container"> <h1 class="course-title">UX/UI Design Fundamentals</h1> <p class="course-subtitle">Master the essentials of user-centered design</p> </div> <div class="progress-container"> <div class="progress-ring"> <svg width="50" height="50" viewBox="0 0 50 50"> <circle cx="25" cy="25" r="20" fill="none" stroke="#e2e8f0" stroke-width="4"></circle> <circle cx="25" cy="25" r="20" fill="none" stroke="#6f8de0" stroke-width="4" stroke-dasharray="125.6" stroke-dashoffset="94.2"></circle> </svg> <div class="progress-text">25%</div> </div> </div> </div> <div class="panel-body"> <ul class="module-list"> <li class="module-item module-1 active"> <div class="module-header"> <div class="module-title"> <div class="module-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z"/> <path d="M5.255 5.786a.237.237 0 0 0 .241.247h.825c.138 0 .248-.113.266-.25.09-.656.54-1.134 1.342-1.134.686 0 1.314.343 1.314 1.168 0 .635-.374.927-.965 1.371-.673.489-1.206 1.06-1.168 1.987l.003.217a.25.25 0 0 0 .25.246h.811a.25.25 0 0 0 .25-.25v-.105c0-.718.273-.927 1.01-1.486.609-.463 1.244-.977 1.244-2.056 0-1.511-1.276-2.241-2.673-2.241-1.267 0-2.655.59-2.75 2.286zm1.557 5.763c0 .533.425.927 1.01.927.609 0 1.028-.394 1.028-.927 0-.552-.42-.94-1.029-.94-.584 0-1.009.388-1.009.94z"/> </svg> </div> Introduction to UX Design </div> <div class="module-status"> <div class="module-toggle"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z"/> </svg> </div> </div> </div> <div class="module-content"> <ul class="lesson-list"> <li class="lesson-item completed" data-lesson="1.1"> <div class="lesson-title">What is UX Design?</div> <div class="lesson-duration">15 minutes</div> </li> <li class="lesson-item completed" data-lesson="1.2"> <div class="lesson-title">UX vs UI: Understanding the Difference</div> <div class="lesson-duration">12 minutes</div> </li> <li class="lesson-item active" data-lesson="1.3"> <div class="lesson-title">The UX Design Process</div> <div class="lesson-duration">20 minutes</div> </li> <li class="lesson-item" data-lesson="1.4"> <div class="lesson-title">Key UX Design Principles</div> <div class="lesson-duration">18 minutes</div> </li> <li class="lesson-item" data-lesson="1.5"> <div class="lesson-title">Module 1 Quiz & Assignment</div> <div class="lesson-duration">25 minutes</div> </li> </ul> </div> </li> <li class="module-item module-2"> <div class="module-header"> <div class="module-title"> <div class="module-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path d="M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z"/> <path d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z"/> </svg> </div> User Research & Analysis </div> <div class="module-status"> <div class="module-toggle"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z"/> </svg> </div> </div> </div> <div class="module-content"> <ul class="lesson-list"> <li class="lesson-item" data-lesson="2.1"> <div class="lesson-title">Understanding Your Users</div> <div class="lesson-duration">18 minutes</div> </li> <li class="lesson-item" data-lesson="2.2"> <div class="lesson-title">User Research Methods</div> <div class="lesson-duration">22 minutes</div> </li> <li class="lesson-item" data-lesson="2.3"> <div class="lesson-title">Creating User Personas</div> <div class="lesson-duration">25 minutes</div> </li> <li class="lesson-item" data-lesson="2.4"> <div class="lesson-title">User Journey Mapping</div> <div class="lesson-duration">20 minutes</div> </li> <li class="lesson-item" data-lesson="2.5"> <div class="lesson-title">Module 2 Quiz & Assignment</div> <div class="lesson-duration">30 minutes</div> </li> </ul> </div> </li> <li class="module-item module-3"> <div class="module-header"> <div class="module-title"> <div class="module-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path d="M12.146.146a.5.5 0 0 1 .708 0l3 3a.5.5 0 0 1 0 .708l-10 10a.5.5 0 0 1-.168.11l-5 2a.5.5 0 0 1-.65-.65l2-5a.5.5 0 0 1 .11-.168l10-10zM11.207 2.5 13.5 4.793 14.793 3.5 12.5 1.207 11.207 2.5zm1.586 3L10.5 3.207 4 9.707V10h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.293l6.5-6.5zm-9.761 5.175-.106.106-1.528 3.821 3.821-1.528.106-.106A.5.5 0 0 1 5 12.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.468-.325z"/> </svg> </div> Wireframing & Prototyping </div> <div class="module-status"> <div class="module-toggle"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z"/> </svg> </div> </div> </div> <div class="module-content"> <ul class="lesson-list"> <li class="lesson-item" data-lesson="3.1"> <div class="lesson-title">Introduction to Wireframing</div> <div class="lesson-duration">15 minutes</div> </li> <li class="lesson-item" data-lesson="3.2"> <div class="lesson-title">Low-Fidelity vs. High-Fidelity Wireframes</div> <div class="lesson-duration">18 minutes</div> </li> <li class="lesson-item" data-lesson="3.3"> <div class="lesson-title">Creating Interactive Prototypes</div> <div class="lesson-duration">25 minutes</div> </li> <li class="lesson-item" data-lesson="3.4"> <div class="lesson-title">Wireframing Tools & Best Practices</div> <div class="lesson-duration">20 minutes</div> </li> <li class="lesson-item" data-lesson="3.5"> <div class="lesson-title">Module 3 Quiz & Assignment</div> <div class="lesson-duration">35 minutes</div> </li> </ul> </div> </li> <li class="module-item module-4"> <div class="module-header"> <div class="module-title"> <div class="module-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm.93-9.412-1 4.705c-.07.34.029.533.304.533.194 0 .487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703 0-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381 2.29-.287zM8 5.5a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/> </svg> </div> Usability Testing </div> <div class="module-status"> <div class="module-toggle"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z"/> </svg> </div> </div> </div> <div class="module-content"> <ul class="lesson-list"> <li class="lesson-item" data-lesson="4.1"> <div class="lesson-title">Principles of Usability Testing</div> <div class="lesson-duration">16 minutes</div> </li> <li class="lesson-item" data-lesson="4.2"> <div class="lesson-title">Planning Effective User Tests</div> <div class="lesson-duration">22 minutes</div> </li> <li class="lesson-item" data-lesson="4.3"> <div class="lesson-title">Conducting User Tests</div> <div class="lesson-duration">25 minutes</div> </li> <li class="lesson-item" data-lesson="4.4"> <div class="lesson-title">Analyzing & Implementing User Feedback</div> <div class="lesson-duration">20 minutes</div> </li> <li class="lesson-item" data-lesson="4.5"> <div class="lesson-title">Final Course Project</div> <div class="lesson-duration">45 minutes</div> </li> </ul> </div> </li> </ul> </div> <div class="panel-footer"> <div class="status-indicator"> <span class="status-dot"></span> <span>Currently learning: The UX Design Process</span> <div class="time-estimate"> <svg class="time-icon" xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="currentColor" viewBox="0 0 16 16"> <path d="M8 3.5a.5.5 0 0 0-1 0V9a.5.5 0 0 0 .252.434l3.5 2a.5.5 0 0 0 .496-.868L8 8.71V3.5z"/> <path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm7-8A7 7 0 1 1 1 8a7 7 0 0 1 14 0z"/> </svg> 20 min remaining </div> </div> <div class="nav-buttons"> <div class="nav-button btn-prev tooltip" data-tooltip="Go to previous lesson"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z"/> </svg> Previous </div> <div class="nav-button btn-next tooltip" data-tooltip="Go to next lesson"> Next <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z"/> </svg> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Module toggle functionality const moduleHeaders = document.querySelectorAll('.module-header'); moduleHeaders.forEach(header => { header.addEventListener('click', function() { const moduleItem = this.parentElement; // Close all other modules document.querySelectorAll('.module-item').forEach(item => { if (item !== moduleItem) { item.classList.remove('active'); } }); // Toggle current module moduleItem.classList.toggle('active'); }); }); // Lesson selection const lessonItems = document.querySelectorAll('.lesson-item'); lessonItems.forEach(item => { item.addEventListener('click', function() { // Remove active class from all lessons lessonItems.forEach(lesson => { lesson.classList.remove('active'); }); // Add active class to clicked lesson this.classList.add('active'); // Update the current lesson in footer const lessonTitle = this.querySelector('.lesson-title').textContent; const lessonDuration = this.querySelector('.lesson-duration').textContent; document.querySelector('.status-indicator span:last-child').textContent = `Currently learning: ${lessonTitle}`; document.querySelector('.time-estimate').innerHTML = ` <svg class="time-icon" xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="currentColor" viewBox="0 0 16 16"> <path d="M8 3.5a.5.5 0 0 0-1 0V9a.5.5 0 0 0 .252.434l3.5 2a.5.5 0 0 0 .496-.868L8 8.71V3.5z"/> <path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm7-8A7 7 0 1 1 1 8a7 7 0 0 1 14 0z"/> </svg> ${lessonDuration} remaining `; }); }); // Mark lesson as completed on double-click lessonItems.forEach(item => { item.addEventListener('dblclick', function() { this.classList.toggle('completed'); // Update progress updateProgress(); }); }); // Navigation buttons const prevButton = document.querySelector('.btn-prev'); const nextButton = document.querySelector('.btn-next'); prevButton.addEventListener('click', function() { navigateLesson('prev'); }); nextButton.addEventListener('click', function() { navigateLesson('next'); }); // Navigate to previous or next lesson function navigateLesson(direction) { const activeLesson = document.querySelector('.lesson-item.active'); if (activeLesson) { let targetLesson; if (direction === 'prev') { targetLesson = activeLesson.previousElementSibling; // If no previous sibling within the module, go to last lesson of previous module if (!targetLesson) { const currentModule = activeLesson.closest('.module-item'); const prevModule = currentModule.previousElementSibling; if (prevModule) { prevModule.classList.add('active'); currentModule.classList.remove('active'); const prevModuleLessons = prevModule.querySelectorAll('.lesson-item'); targetLesson = prevModuleLessons[prevModuleLessons.length - 1]; } } } else { targetLesson = activeLesson.nextElementSibling; // If no next sibling within the module, go to first lesson of next module if (!targetLesson) { const currentModule = activeLesson.closest('.module-item'); const nextModule = currentModule.nextElementSibling; if (nextModule) { nextModule.classList.add('active'); currentModule.classList.remove('active'); targetLesson = nextModule.querySelector('.lesson-item'); } } } if (targetLesson) { activeLesson.classList.remove('active'); targetLesson.classList.add('active'); // Update the current lesson in footer const lessonTitle = targetLesson.querySelector('.lesson-title').textContent; const lessonDuration = targetLesson.querySelector('.lesson-duration').textContent; document.querySelector('.status-indicator span:last-child').textContent = `Currently learning: ${lessonTitle}`; document.querySelector('.time-estimate').innerHTML = ` <svg class="time-icon" xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="currentColor" viewBox="0 0 16 16"> <path d="M8 3.5a.5.5 0 0 0-1 0V9a.5.5 0 0 0 .252.434l3.5 2a.5.5 0 0 0 .496-.868L8 8.71V3.5z"/> <path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm7-8A7 7 0 1 1 1 8a7 7 0 0 1 14 0z"/> </svg> ${lessonDuration} remaining `; // Scroll the lesson into view if needed targetLesson.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); } } } // Calculate and update progress function updateProgress() { const totalLessons = document.querySelectorAll('.lesson-item').length; const completedLessons = document.querySelectorAll('.lesson-item.completed').length; const progressPercentage = Math.round((completedLessons / totalLessons) * 100); const progressCircle = document.querySelector('.progress-ring circle:last-child'); const progressText = document.querySelector('.progress-text'); // Update the progress text progressText.textContent = `${progressPercentage}%`; // Update the progress ring const radius = 20; const circumference = 2 * Math.PI * radius; const offset = circumference - (progressPercentage
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> @import url('https://fonts.googleapis.com/css2?family=Caveat:wght@400;700&family=Montserrat:wght@300;400;500;600;700&display=swap'); :root { --primary-color: #FF7D35; --secondary-color: #2E5266; --accent-color: #6CAE75; --light-color: #F4F4F4; --dark-color: #333333; --transition: all 0.3s ease; } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Montserrat', sans-serif; background: #f9f9f9; color: var(--dark-color); line-height: 1.6; overflow-x: hidden; max-width: 700px; margin: 0 auto; height: 700px; } .container { display: flex; flex-direction: column; height: 100%; overflow: hidden; background: white; border-radius: 12px; box-shadow: 0 8px 30px rgba(0, 0, 0, 0.1); padding: 0; position: relative; } .background-pattern { position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0.05; pointer-events: none; background-image: radial-gradient(circle at 25px 25px, var(--primary-color) 2%, transparent 2%), radial-gradient(circle at 75px 75px, var(--accent-color) 2%, transparent 2%); background-size: 100px 100px; z-index: 0; } .header { background: linear-gradient(135deg, var(--primary-color), #FF9E66); color: white; padding: 20px 30px; border-radius: 12px 12px 0 0; position: relative; z-index: 1; } .header h1 { font-size: 28px; font-weight: 700; margin-bottom: 5px; } .title-accent { font-family: 'Caveat', cursive; font-size: 38px; font-weight: 700; color: white; text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.3); transform: rotate(-2deg); display: inline-block; } .trip-details { display: flex; align-items: center; margin-top: 10px; } .trip-dates { display: flex; align-items: center; margin-right: 15px; font-size: 14px; } .trip-dates i { margin-right: 5px; } .tab-container { display: flex; background: white; padding: 0 20px; border-bottom: 1px solid #eee; position: relative; z-index: 2; } .tab { padding: 15px 20px; font-weight: 600; cursor: pointer; position: relative; font-size: 14px; color: var(--dark-color); opacity: 0.7; transition: var(--transition); } .tab.active { color: var(--primary-color); opacity: 1; } .tab.active::after { content: ''; position: absolute; bottom: 0; left: 0; width: 100%; height: 3px; background: var(--primary-color); border-radius: 3px 3px 0 0; animation: slideIn 0.3s ease forwards; } @keyframes slideIn { from { transform: translateY(10px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } .content { flex: 1; overflow-y: auto; padding: 20px 30px; position: relative; z-index: 1; scrollbar-width: thin; } .content::-webkit-scrollbar { width: 6px; } .content::-webkit-scrollbar-thumb { background-color: rgba(0, 0, 0, 0.2); border-radius: 3px; } .tab-content { display: none; animation: fadeIn 0.4s ease forwards; } .tab-content.active { display: block; } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .itinerary-day { margin-bottom: 20px; border-radius: 10px; overflow: hidden; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.05); background: white; transition: var(--transition); } .itinerary-day:hover { transform: translateY(-3px); box-shadow: 0 6px 20px rgba(0, 0, 0, 0.1); } .day-header { display: flex; justify-content: space-between; align-items: center; padding: 15px 20px; background: #f5f5f5; cursor: pointer; transition: var(--transition); } .day-header:hover { background: #f0f0f0; } .day-title { display: flex; align-items: center; } .day-number { font-family: 'Caveat', cursive; font-size: 24px; color: var(--primary-color); margin-right: 10px; font-weight: 700; } .day-date { font-size: 14px; opacity: 0.7; } .toggle-icon { transition: var(--transition); } .day-content { max-height: 0; overflow: hidden; transition: max-height 0.3s ease-out; } .day-expanded .day-content { max-height: 500px; transition: max-height 0.5s ease-in; } .day-expanded .toggle-icon { transform: rotate(180deg); } .event { padding: 15px 20px; border-bottom: 1px solid #f0f0f0; position: relative; } .event:last-child { border-bottom: none; } .event-time { font-weight: 600; margin-bottom: 5px; color: var(--secondary-color); font-size: 14px; } .event-title { font-weight: 600; margin-bottom: 5px; } .event-location { font-size: 13px; opacity: 0.7; display: flex; align-items: center; } .event-location i { margin-right: 5px; font-size: 12px; } .event::before { content: ''; position: absolute; top: 18px; left: 10px; width: 8px; height: 8px; border-radius: 50%; background: var(--accent-color); } .event { padding-left: 30px; } .map-container { width: 100%; height: 300px; border-radius: 10px; overflow: hidden; position: relative; margin-bottom: 20px; } .map-container img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.3s ease; } .map-container:hover img { transform: scale(1.05); } .map-marker { position: absolute; width: 20px; height: 20px; transform: translate(-50%, -50%); cursor: pointer; z-index: 2; transition: all 0.2s ease; } .map-marker::before { content: ''; position: absolute; width: 20px; height: 20px; background: var(--primary-color); border-radius: 50%; transform: scale(0.6); opacity: 0.9; box-shadow: 0 0 0 rgba(255, 125, 53, 0.6); animation: pulse 2s infinite; } .map-marker::after { content: ''; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 10px; height: 10px; background: white; border-radius: 50%; z-index: 1; } .map-marker:hover::before { transform: scale(0.8); } @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(255, 125, 53, 0.6); } 70% { box-shadow: 0 0 0 10px rgba(255, 125, 53, 0); } 100% { box-shadow: 0 0 0 0 rgba(255, 125, 53, 0); } } .map-tooltip { position: absolute; background: white; padding: 10px; border-radius: 6px; box-shadow: 0 3px 15px rgba(0, 0, 0, 0.2); font-size: 12px; max-width: 150px; opacity: 0; pointer-events: none; transform: translateY(10px); transition: all 0.2s ease; z-index: 3; } .map-tooltip.visible { opacity: 1; transform: translateY(0); } .map-tooltip h4 { margin-bottom: 5px; color: var(--primary-color); } .add-note { width: 100%; border: 1px dashed #ddd; border-radius: 8px; padding: 15px; font-family: 'Caveat', cursive; font-size: 16px; color: var(--dark-color); background: #fafafa; transition: var(--transition); resize: none; height: 80px; margin-bottom: 15px; } .add-note:focus { border-color: var(--accent-color); outline: none; background: white; } .add-note::placeholder { color: #aaa; } .button { background: var(--secondary-color); color: white; border: none; padding: 10px 20px; border-radius: 6px; font-weight: 600; cursor: pointer; transition: var(--transition); display: inline-flex; align-items: center; justify-content: center; font-size: 14px; } .button:hover { background: #234559; transform: translateY(-2px); } .button i { margin-right: 8px; } .button.primary { background: var(--primary-color); } .button.primary:hover { background: #E86620; } .weather-info { display: flex; align-items: center; margin-bottom: 20px; padding: 15px; background: linear-gradient(to right, #F9F9F9, #F3F3F3); border-radius: 10px; box-shadow: 0 3px 10px rgba(0, 0, 0, 0.05); } .weather-icon { font-size: 36px; color: #FFB627; margin-right: 15px; } .weather-details h3 { font-size: 16px; margin-bottom: 5px; } .weather-details p { font-size: 14px; opacity: 0.7; } .actions { display: flex; justify-content: space-between; margin-top: 25px; } @media (max-width: 600px) { .header { padding: 15px 20px; } .header h1 { font-size: 22px; } .title-accent { font-size: 30px; } .tab { padding: 12px 15px; font-size: 13px; } .content { padding: 15px 20px; } .map-container { height: 220px; } .actions { flex-direction: column; gap: 10px; } .button { width: 100%; } } .notepad { position: relative; padding: 20px; margin-bottom: 20px; background: #fffdf6; border-radius: 3px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); } .notepad::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 30px; background: linear-gradient(to right, var(--primary-color) 0%, var(--primary-color) 100%); opacity: 0.2; border-radius: 3px 3px 0 0; } .notepad-content { font-family: 'Caveat', cursive; font-size: 18px; line-height: 1.5; position: relative; z-index: 1; } .notepad-title { font-family: 'Montserrat', sans-serif; font-weight: 700; font-size: 16px; margin-bottom: 10px; color: var(--secondary-color); } .progress-container { margin-bottom: 20px; } .progress-title { display: flex; justify-content: space-between; margin-bottom: 8px; } .progress-bar { width: 100%; height: 6px; background: #f0f0f0; border-radius: 3px; overflow: hidden; } .progress-fill { height: 100%; background: var(--primary-color); border-radius: 3px; position: relative; width: 40%; transition: width 1s ease-in-out; } .progress-fill::after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient( 90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.3) 50%, rgba(255, 255, 255, 0) 100% ); animation: shimmer 2s infinite; } @keyframes shimmer { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } } .expense-item { display: flex; justify-content: space-between; padding: 10px 0; border-bottom: 1px solid #f0f0f0; } .expense-item:last-child { border-bottom: none; } .expense-name { display: flex; align-items: center; } .expense-icon { width: 30px; height: 30px; border-radius: 50%; background: var(--light-color); display: flex; align-items: center; justify-content: center; margin-right: 10px; color: var(--secondary-color); } .expense-amount { font-weight: 600; } .expense-category { font-size: 12px; opacity: 0.7; } .packing-list { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; margin-top: 10px; } .packing-item { display: flex; align-items: center; padding: 8px 12px; background: #f9f9f9; border-radius: 6px; transition: all 0.2s ease; } .packing-item:hover { background: #f0f0f0; } .packing-item input { margin-right: 10px; } .packing-item label { font-size: 14px; cursor: pointer; } .packing-item input:checked + label { text-decoration: line-through; opacity: 0.6; } .ticket { background: white; border-radius: 10px; padding: 15px; margin-bottom: 15px; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.05); transition: var(--transition); position: relative; overflow: hidden; } .ticket:hover { transform: translateY(-3px); box-shadow: 0 6px 20px rgba(0, 0, 0, 0.1); } .ticket::before { content: ''; position: absolute; top: 0; left: 0; width: 5px; height: 100%; background: var(--accent-color); } .ticket-type { text-transform: uppercase; font-size: 11px; letter-spacing: 1px; opacity: 0.7; margin-bottom: 5px; } .ticket-header { display: flex; justify-content: space-between; margin-bottom: 10px; } .ticket-title { font-weight: 600; font-size: 16px; } .ticket-details { display: flex; font-size: 14px; } .ticket-detail { margin-right: 20px; } .ticket-detail-label { font-size: 12px; opacity: 0.7; margin-bottom: 2px; } .ticket-detail-value { font-weight: 600; } .ticket-qr { position: absolute; right: 15px; top: 15px; width: 50px; height: 50px; background: #f0f0f0; display: flex; align-items: center; justify-content: center; border-radius: 5px; } .photo-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-top: 15px; } .photo-item { height: 90px; border-radius: 8px; overflow: hidden; position: relative; cursor: pointer; } .photo-item img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.3s ease; } .photo-item:hover img { transform: scale(1.1); } </style> </head> <body> <div class="container"> <div class="background-pattern"></div> <div class="header"> <h1>Your Journey to <span class="title-accent">Kyoto, Japan</span></h1> <div class="trip-details"> <div class="trip-dates"> <i class="fas fa-calendar-alt"></i> Nov 12 - Nov 19, 2023 </div> <div class="trip-dates"> <i class="fas fa-user-friends"></i> 2 Travelers </div> </div> </div> <div class="tab-container"> <div class="tab active" data-tab="itinerary"> <i class="fas fa-route"></i> Itinerary </div> <div class="tab" data-tab="map"> <i class="fas fa-map-marked-alt"></i> Map </div> <div class="tab" data-tab="budget"> <i class="fas fa-yen-sign"></i> Budget </div> <div class="tab" data-tab="documents"> <i class="fas fa-file-alt"></i> Documents </div> </div> <div class="content"> <div class="tab-content active" id="itinerary"> <div class="itinerary-day"> <div class="day-header"> <div class="day-title"> <div class="day-number">Day 1</div> <div class="day-date">Nov 12, Sunday</div> </div> <div class="toggle-icon"> <i class="fas fa-chevron-down"></i> </div> </div> <div class="day-content"> <div class="event"> <div class="event-time">07:25 - 11:40</div> <div class="event-title">Flight: Tokyo Narita to Osaka Kansai</div> <div class="event-location"><i class="fas fa-plane"></i> Japan Airlines JL123</div> </div> <div class="event"> <div class="event-time">13:00 - 14:30</div> <div class="event-title">Train to Kyoto Station</div> <div class="event-location"><i class="fas fa-train"></i> Haruka Express</div> </div> <div class="event"> <div class="event-time">15:00</div> <div class="event-title">Check-in: Kyoto Ryokan Sakura</div> <div class="event-location"><i class="fas fa-map-marker-alt"></i> Higashiyama District</div> </div> <div class="event"> <div class="event-time">17:30 - 19:30</div> <div class="event-title">Evening Stroll & Dinner at Pontocho Alley</div> <div class="event-location"><i class="fas fa-utensils"></i> Traditional Kaiseki</div> </div> </div> </div> <div class="itinerary-day"> <div class="day-header"> <div class="day-title"> <div class="day-number">Day 2</div> <div class="day-date">Nov 13, Monday</div> </div> <div class="toggle-icon"> <i class="fas fa-chevron-down"></i> </div> </div> <div class="day-content"> <div class="event"> <div class="event-time">08:00 - 09:00</div> <div class="event-title">Traditional Japanese Breakfast</div> <div class="event-location"><i class="fas fa-coffee"></i> Ryokan Dining Room</div> </div> <div class="event"> <div class="event-time">09:30 - 12:00</div> <div class="event-title">Arashiyama Bamboo Grove & Monkey Park</div> <div class="event-location"><i class="fas fa-tree"></i> Western Kyoto</div> </div> <div class="event"> <div class="event-time">12:30 - 13:30</div> <div class="event-title">Lunch at Yudofu Sagano</div> <div class="event-location"><i class="fas fa-utensils"></i> Tofu Restaurant</div> </div> <div class="event"> <div class="event-time">14:00 - 16:30</div> <div class="event-title">Visit Tenryu-ji Temple & Gardens</div> <div class="event-location"><i class="fas fa-torii-gate"></i> UNESCO World Heritage Site</div> </div> </div> </div> <div class="itinerary-day"> <div class="day-header"> <div class="day-title"> <div class="day-number">Day 3</div> <div class="day-date">Nov 14, Tuesday</div> </div> <div class="toggle-icon"> <i class="fas fa-chevron-down"></i> </div> </div> <div class="day-content"> <div class="event"> <div class="event-time">09:00 - 11:30</div> <div class="event-title">Fushimi Inari Shrine Hike</div> <div class="event-location"><i class="fas fa-mountain"></i> Southern Kyoto</div> </div> <div class="event"> <div class="event-time">12:00 - 13:00</div> <div class="event-title">Lunch at Inari Street Food Stalls</div> <div class="event-location"><i class="fas fa-utensils"></i> Try Inari Sushi & Kitsune Udon</div> </div> <div class="event"> <div class="event-time">14:00 - 16:00</div> <div class="event-title">Kiyomizu-dera Temple</div> <div class="event-location"><i class="fas fa-torii-gate"></i> Eastern Kyoto</div> </div> <div class="event"> <div class="event-time">16:30 - 18:30</div> <div class="event-title">Tea Ceremony Experience</div> <div class="event-location"><i class="fas fa-mug-hot"></i> En Tea House</div> </div> </div> </div> <div class="notepad"> <div class="notepad-title">Travel Notes</div> <div class="notepad-content"> Remember to pack light layers for November weather. Shrine visits early morning to avoid crowds. Try the matcha parfait at Tsujiri Tea House! Pick up omamori charms from each temple. </div> </div> <div class="actions"> <button class="button primary"><i class="fas fa-download"></i> Download Itinerary</button> <button class="button"><i class="fas fa-share-alt"></i> Share Trip</button> </div> </div> <div class="tab-content" id="map"> <div class="weather-info"> <div class="weather-icon"> <i class="fas fa-cloud-sun"></i> </div> <div class="weather-details"> <h3>Kyoto Weather Forecast</h3> <p>58°F / 14°C - Partly Cloudy with occasional showers</p> </div> </div> <div class="map-container"> <img src="https://images.unsplash.com/photo-1545569341-9eb8b30979d9?ixlib=rb-1.2.1&auto=format&fit=crop&w=1050&q=80" alt="Kyoto Map"> <div class="map-marker" style="top: 30%; left: 40%;" data-place="Kiyomizu-dera Temple"></div> <div class="map-marker" style="top: 45%; left: 20%;" data-place="Arashiyama Bamboo Grove"></div> <div class="map-marker" style="top: 60%; left: 50%;" data-place="Fushimi Inari Shrine"></div> <div class="map-marker" style="top: 35%; left: 65%;" data-place="Gion District"></div> <div class="map-marker" style="top: 50%; left: 35%;" data-place="Kyoto Imperial Palace"></div> <div class="map-tooltip" id="map-tooltip"> <h4>Location Name</h4> <p>Description will appear here</p> </div> </div> <h3>Key Attractions</h3> <div class="itinerary-day"> <div class="day-header"> <div class="day-title"> <div class="day-number">Eastern Kyoto</div> </div> <div class="toggle-icon"> <i class="fas fa-chevron-down"></i> </div> </div> <div class="day-content"> <div class="event"> <div class="event-title">Kiyomizu-dera Temple</div> <div class="event-location"><i class="fas fa-map-marker-alt"></i> 1-chōme-294 Kiyomizu, Higashiyama Ward</div> </div> <div class="event"> <div class="event-title">Gion District</div> <div class="event-location"><i class="fas fa-map-marker-alt"></i> Geisha District with traditional teahouses</div> </div> </div> </div> <div class="itinerary-day"> <div class="day-header"> <div class="day-title"> <div class="day-number">Western Kyoto</div> </div> <div class="toggle-icon"> <i class="fas fa-chevron-down"></i> </div> </div> <div class="day-content"> <div class="event"> <div class="event-title">Arashiyama Bamboo Grove</div> <div class="event-location"><i class="fas fa-map-marker-alt"></i> Saga-Toriimoto</div> </div> <div class="event"> <div class="event-title">Golden Pavilion (Kinkaku-ji)</div> <div class="event-location"><i class="fas fa-map-marker-alt"></i> 1 Kinkakujicho, Kita Ward</div> </div> </div> </div> <textarea class="add-note" placeholder="Add notes about locations or directions..."></textarea> <div class="actions"> <button class="button primary"><i class="fas fa-directions"></i> Get Directions</button> <button class="button"><i class="fas fa-print"></i> Print Map</button> </div> </div> <div class="tab-content" id="budget"> <div class="progress-container"> <div class="progress-title"> <span>Budget Progress</span> <span>¥175,000 / ¥250,000</span> </div> <div class="progress-bar"> <div class="progress-fill" style="width: 70%;"></div> </div> </div> <h3>Expenses</h3> <div class="expense-item"> <div class="expense-name"> <div class="expense-icon"> <i class="fas fa-home"></i> </div> <div> <div>Kyoto Ryokan Sakura</div> <div class="expense-category">Accommodation</div> </div> </div> <div class="expense-amount">¥84,000</div> </div> <div class="expense-item"> <div class="expense-name"> <div class="expense-icon"> <i class="fas fa-plane"></i> </div> <div> <div>Japan Airlines</div> <div class="expense-category">Transportation</div> </div> </div> <div class="expense-amount">¥56,000</div> </div> <div class="expense-item"> <div class="expense-name"> <div class="expense-icon"> <i class="fas fa-utensils"></i> </div> <div> <div>Food & Dining</div> <div class="expense-category">6 days estimate</div> </div> </div> <div class="expense-amount">¥35,000</div> </div> <h3>To Buy</h3> <div class="packing-list"> <div class="packing-item"> <input type="checkbox" id="item1"> <label for="item1">Kyoto Bus Pass</label> </div> <div class="packing-item"> <input type="checkbox" id="item2"> <label for="item2">Tea Ceremony Tickets</label> </div> <div class="packing-item"> <input type="checkbox" id="item3"> <label for="item3">Monkey Park Entrance</label> </div> <div class="packing-item"> <input type="checkbox" id="item4" checked> <label for="item4">JR Rail Pass</label> </div> </div> <h3>Currency Exchange</h3> <div class="notepad"> <div class="notepad-content"> Current rate: 1 USD = ¥149.50<br> Best exchange spots: Kyoto Station or 7-Eleven ATMs<br> Avoid airport exchanges (poor rates) </div> </div> <div class="actions"> <button class="button primary"><i class="fas fa-plus"></i> Add Expense</button> <button class="button"><i class="fas fa-file-export"></i> Export Budget</button> </div> </div> <div class="tab-content" id="documents"> <div class="ticket"> <div class="ticket-type">Flight</div> <div class="ticket-header"> <div class="ticket-title">Tokyo Narita → Osaka Kansai</div> <div class="ticket-qr"> <i class="fas fa-qrcode"></i> </div> </div> <div class="ticket-details"> <div class="ticket-detail"> <div class="ticket-detail-label">Date</div> <div class="ticket-detail-value">Nov 12, 2023</div> </div> <div class="ticket-detail"> <div class="ticket-detail-label">Flight</div> <div class="ticket-detail-value">JL 123</div> </div> <div class="ticket-detail"> <div class="ticket-detail-label">Departure</div> <div class="ticket-detail-value">07:25</div> </div> </div> </div> <div class="ticket"> <div class="ticket-type">Accommodation</div> <div class="ticket-header"> <div class="ticket-title">Kyoto Ryokan Sakura</div>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Daily Chronicle: News Aggregator</title> <style> @import url('https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;700;900&family=Source+Sans+Pro:wght@300;400;600&family=Libre+Baskerville:wght@400;700&display=swap'); * { margin: 0; padding: 0; box-sizing: border-box; } :root { --primary-color: #1A1A1A; --secondary-color: #8B0000; --accent-color: #F5F5DC; --text-color: #333; --light-gray: #E5E5E5; --medium-gray: #999; --dark-gray: #555; --white: #FFF; --black: #000; --serif: 'Playfair Display', 'Times New Roman', serif; --sans: 'Source Sans Pro', Arial, sans-serif; --alt-serif: 'Libre Baskerville', Georgia, serif; } body { font-family: var(--sans); background-color: var(--white); color: var(--text-color); max-width: 700px; height: 700px; margin: 0 auto; overflow-x: hidden; overflow-y: auto; } .container { padding: 15px; height: 100%; display: flex; flex-direction: column; } header { border-bottom: 3px solid var(--primary-color); margin-bottom: 15px; position: relative; } .masthead { display: flex; justify-content: center; align-items: center; position: relative; } .date { font-family: var(--sans); font-size: 0.8rem; color: var(--dark-gray); text-align: center; margin-bottom: 5px; letter-spacing: 1px; } .title { font-family: var(--serif); font-weight: 900; font-size: 2.5rem; text-align: center; letter-spacing: -1px; margin: 0; padding: 0; color: var(--primary-color); text-transform: uppercase; position: relative; display: inline-block; } .title::after { content: ""; position: absolute; width: 40%; height: 2px; background-color: var(--secondary-color); bottom: 0; left: 30%; } .subtitle { font-family: var(--alt-serif); font-size: 0.9rem; font-style: italic; text-align: center; color: var(--dark-gray); margin: 5px 0 10px; } .filter-container { background-color: var(--light-gray); padding: 10px; border-radius: 3px; margin-bottom: 15px; transition: all 0.3s ease; } .filter-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; } .filter-header h3 { font-family: var(--serif); font-size: 1rem; font-weight: 700; margin: 0; } .filter-toggle { background: none; border: none; color: var(--secondary-color); cursor: pointer; font-size: 0.9rem; text-decoration: underline; transition: color 0.2s; } .filter-toggle:hover { color: var(--primary-color); } .filter-options { display: flex; flex-wrap: wrap; gap: 8px; height: 0; overflow: hidden; transition: height 0.3s ease; } .filter-options.expanded { height: auto; } .filter-btn { background-color: var(--white); border: 1px solid var(--medium-gray); padding: 5px 12px; border-radius: 15px; font-family: var(--sans); font-size: 0.8rem; cursor: pointer; transition: all 0.2s ease; } .filter-btn:hover { background-color: var(--light-gray); } .filter-btn.active { background-color: var(--secondary-color); color: var(--white); border-color: var(--secondary-color); } .news-grid { display: grid; grid-template-columns: repeat(2, 1fr); grid-gap: 20px; overflow-y: auto; flex-grow: 1; } .news-item { background-color: var(--white); border: 1px solid var(--light-gray); border-radius: 5px; overflow: hidden; box-shadow: 0 2px 4px rgba(0,0,0,0.05); transition: transform 0.3s ease, box-shadow 0.3s ease; display: flex; flex-direction: column; cursor: pointer; position: relative; } .news-item:hover { transform: translateY(-5px); box-shadow: 0 8px 16px rgba(0,0,0,0.1); } .news-image { height: 120px; overflow: hidden; position: relative; } .news-image img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.5s ease; } .news-item:hover .news-image img { transform: scale(1.05); } .category-tag { position: absolute; top: 10px; left: 10px; background-color: var(--secondary-color); color: var(--white); padding: 3px 8px; font-size: 0.7rem; border-radius: 3px; text-transform: uppercase; font-weight: 600; letter-spacing: 0.5px; z-index: 1; } .news-content { padding: 15px; flex-grow: 1; display: flex; flex-direction: column; } .news-title { font-family: var(--serif); font-size: 1rem; font-weight: 700; margin-bottom: 8px; line-height: 1.3; color: var(--primary-color); } .news-excerpt { font-size: 0.85rem; line-height: 1.4; color: var(--dark-gray); margin-bottom: 10px; flex-grow: 1; } .news-meta { display: flex; justify-content: space-between; align-items: center; font-size: 0.75rem; color: var(--medium-gray); border-top: 1px solid var(--light-gray); padding-top: 8px; margin-top: auto; } .news-source { font-weight: 600; } .news-time { display: flex; align-items: center; } .pulse { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background-color: var(--secondary-color); margin-right: 6px; position: relative; } .pulse::after { content: ''; position: absolute; width: 100%; height: 100%; border-radius: 50%; background-color: rgba(139, 0, 0, 0.3); animation: pulse 2s infinite; left: 0; top: 0; } @keyframes pulse { 0% { transform: scale(1); opacity: 1; } 100% { transform: scale(3); opacity: 0; } } .trending-banner { background-color: var(--secondary-color); color: var(--white); padding: 8px 15px; border-radius: 3px; margin-bottom: 15px; overflow: hidden; position: relative; white-space: nowrap; } .trending-text { display: inline-block; animation: scrollText 20s linear infinite; } @keyframes scrollText { 0% { transform: translateX(100%); } 100% { transform: translateX(-100%); } } .breaking-news { position: relative; border-left: 3px solid var(--secondary-color); background-color: var(--accent-color); padding: 10px 15px; margin-bottom: 15px; animation: fadeInUp 0.5s ease; } @keyframes fadeInUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .breaking-title { display: flex; align-items: center; margin-bottom: 5px; } .breaking-title span { font-family: var(--serif); font-weight: 700; font-size: 0.9rem; color: var(--secondary-color); text-transform: uppercase; margin-right: 10px; animation: blink 1s infinite; } @keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } .breaking-content { font-size: 0.9rem; line-height: 1.4; } .breaking-content a { color: var(--secondary-color); text-decoration: none; font-weight: 600; } .breaking-content a:hover { text-decoration: underline; } .footer { text-align: center; font-size: 0.75rem; color: var(--medium-gray); margin-top: 15px; padding-top: 10px; border-top: 1px solid var(--light-gray); } .footer span { display: block; margin-top: 3px; } @media (max-width: 600px) { .news-grid { grid-template-columns: 1fr; grid-gap: 15px; } .title { font-size: 2rem; } .filter-options { flex-direction: column; align-items: stretch; } .filter-btn { width: 100%; text-align: left; } } .refresh-button { background-color: var(--white); border: 1px solid var(--secondary-color); color: var(--secondary-color); padding: 8px 15px; border-radius: 3px; font-family: var(--sans); font-size: 0.85rem; cursor: pointer; transition: all 0.2s ease; display: flex; align-items: center; justify-content: center; margin-top: 15px; } .refresh-button:hover { background-color: var(--secondary-color); color: var(--white); } .refresh-icon { display: inline-block; width: 16px; height: 16px; margin-right: 5px; transition: transform 0.5s ease; } .refresh-button:hover .refresh-icon { animation: rotate 1s ease; } @keyframes rotate { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } .skeleton { animation: skeleton-loading 1.5s linear infinite alternate; border-radius: 3px; } @keyframes skeleton-loading { 0% { background-color: rgba(225, 225, 225, 0.5); } 100% { background-color: rgba(240, 240, 240, 0.8); } } </style> </head> <body> <div class="container"> <header> <div class="masthead"> <div> <p class="date" id="current-date">Wednesday, August 2, 2023</p> <h1 class="title">Daily Chronicle</h1> <p class="subtitle">All the news that's fit to aggregate</p> </div> </div> </header> <div class="trending-banner"> <div class="trending-text"> MARKETS: S&P 500 rises 1.2% to new record high • TECH: Apple unveils AI strategy at developer conference • POLITICS: Senate passes bipartisan infrastructure bill • HEALTH: WHO announces progress on new COVID variant vaccine • SPORTS: Olympics viewership exceeds expectations </div> </div> <div class="breaking-news"> <div class="breaking-title"> <span>Breaking</span> <div class="breaking-content"> Historic climate agreement reached as 190 nations commit to new emissions targets. <a href="#" class="read-more">Full story →</a> </div> </div> </div> <div class="filter-container"> <div class="filter-header"> <h3>Filter Stories</h3> <button class="filter-toggle" id="filter-toggle">Show filters</button> </div> <div class="filter-options" id="filter-options"> <button class="filter-btn active" data-category="all">All</button> <button class="filter-btn" data-category="politics">Politics</button> <button class="filter-btn" data-category="business">Business</button> <button class="filter-btn" data-category="technology">Technology</button> <button class="filter-btn" data-category="health">Health</button> <button class="filter-btn" data-category="science">Science</button> <button class="filter-btn" data-category="arts">Arts</button> </div> </div> <div class="news-grid" id="news-grid"> <!-- News items will be dynamically inserted here --> </div> <button class="refresh-button" id="refresh-button"> <svg class="refresh-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="1 4 1 10 7 10"></polyline> <polyline points="23 20 23 14 17 14"></polyline> <path d="M20.49 9A9 9 0 0 0 5.64 5.64L1 10m22 4l-4.64 4.36A9 9 0 0 1 3.51 15"></path> </svg> Refresh Stories </button> <footer class="footer"> <div>© 2023 Daily Chronicle News Aggregator</div> <span>Last updated: <span id="update-time">Just now</span></span> </footer> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Set current date const dateOptions = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }; const currentDate = new Date().toLocaleDateString('en-US', dateOptions); document.getElementById('current-date').textContent = currentDate; // Toggle filter options const filterToggle = document.getElementById('filter-toggle'); const filterOptions = document.getElementById('filter-options'); filterToggle.addEventListener('click', function() { filterOptions.classList.toggle('expanded'); filterToggle.textContent = filterOptions.classList.contains('expanded') ? 'Hide filters' : 'Show filters'; }); // Filter functionality const filterButtons = document.querySelectorAll('.filter-btn'); filterButtons.forEach(button => { button.addEventListener('click', function() { // Remove active class from all buttons filterButtons.forEach(btn => btn.classList.remove('active')); // Add active class to clicked button this.classList.add('active'); // Filter the news items const category = this.getAttribute('data-category'); filterNewsByCategory(category); }); }); // Create news data const newsData = [ { id: 1, title: "Breakthrough in Quantum Computing Promises Revolution in Data Processing", excerpt: "Scientists have achieved quantum supremacy with a new 128-qubit processor that solves problems impossible for conventional computers.", category: "technology", source: "Tech Horizon", time: "35 minutes ago", image: "https://source.unsplash.com/random/300x200?quantum" }, { id: 2, title: "Global Markets Rally as Inflation Data Shows Cooling Trend", excerpt: "Stock indices worldwide surge as latest economic indicators suggest inflation may have peaked, raising hopes for less aggressive rate hikes.", category: "business", source: "Financial Times", time: "1 hour ago", image: "https://source.unsplash.com/random/300x200?finance" }, { id: 3, title: "Senate Passes Landmark Climate Legislation with Bipartisan Support", excerpt: "Historic bill allocates $500 billion for renewable energy infrastructure and sets ambitious carbon reduction targets for the next decade.", category: "politics", source: "Capitol Report", time: "2 hours ago", image: "https://source.unsplash.com/random/300x200?congress" }, { id: 4, title: "Revolutionary Gene Therapy Shows Promise in Treating Rare Genetic Disorders", excerpt: "Clinical trials demonstrate 94% success rate in correcting genetic mutations responsible for previously untreatable conditions.", category: "health", source: "Medical Journal", time: "3 hours ago", image: "https://source.unsplash.com/random/300x200?medical" }, { id: 5, title: "James Webb Telescope Captures First Evidence of Water on Distant Exoplanet", excerpt: "Astronomers detect water vapor in the atmosphere of K2-18b, reigniting discussions about potential habitable worlds beyond our solar system.", category: "science", source: "Astronomy Today", time: "4 hours ago", image: "https://source.unsplash.com/random/300x200?space" }, { id: 6, title: "Renowned Author's Long-Awaited Novel Breaks Pre-Order Records", excerpt: "Literary sensation's first work in a decade becomes the most pre-ordered book in publishing history, set to launch next month.", category: "arts", source: "Literary Review", time: "5 hours ago", image: "https://source.unsplash.com/random/300x200?books" }, { id: 7, title: "Tensions Rise in Trade Negotiations as Deadline Approaches", excerpt: "Diplomatic sources report major disagreements on tariff structures could derail the multinational trade agreement years in the making.", category: "politics", source: "Global Affairs", time: "6 hours ago", image: "https://source.unsplash.com/random/300x200?diplomacy" }, { id: 8, title: "Tech Giant Unveils Revolutionary Neural Interface for Consumer Market", excerpt: "New wearable device translates thoughts into digital commands with 95% accuracy, raising both excitement and ethical concerns.", category: "technology", source: "Digital Frontier", time: "7 hours ago", image: "https://source.unsplash.com/random/300x200?wearable" } ]; // Initialize news grid renderNewsItems(newsData); // Filter news by category function filterNewsByCategory(category) { const newsGrid = document.getElementById('news-grid'); // Show loading state newsGrid.innerHTML = ''; for (let i = 0; i < 4; i++) { const skeletonItem = document.createElement('div'); skeletonItem.className = 'news-item skeleton'; skeletonItem.style.height = '280px'; newsGrid.appendChild(skeletonItem); } // Simulate loading delay setTimeout(() => { let filteredNews = newsData; if (category !== 'all') { filteredNews = newsData.filter(item => item.category === category); } renderNewsItems(filteredNews); // Update last refreshed time updateRefreshTime(); }, 500); } // Render news items function renderNewsItems(items) { const newsGrid = document.getElementById('news-grid'); newsGrid.innerHTML = ''; if (items.length === 0) { const noResults = document.createElement('div'); noResults.className = 'no-results'; noResults.textContent = 'No stories found for this category. Try another filter.'; noResults.style.gridColumn = '1 / -1'; noResults.style.textAlign = 'center'; noResults.style.padding = '30px'; noResults.style.color = 'var(--medium-gray)'; newsGrid.appendChild(noResults); return; } items.forEach(item => { const newsItem = document.createElement('article'); newsItem.className = 'news-item'; newsItem.setAttribute('data-category', item.category); newsItem.innerHTML = ` <div class="news-image"> <span class="category-tag">${item.category}</span> <img src="${item.image}" alt="${item.title}"> </div> <div class="news-content"> <h2 class="news-title">${item.title}</h2> <p class="news-excerpt">${item.excerpt}</p> <div class="news-meta"> <span class="news-source">${item.source}</span> <span class="news-time"> <span class="pulse"></span> ${item.time} </span> </div> </div> `; newsGrid.appendChild(newsItem); }); } // Refresh button functionality const refreshButton = document.getElementById('refresh-button'); refreshButton.addEventListener('click', function() { // Simulate loading new content by shuffling existing content const shuffledNews = [...newsData].sort(() => Math.random() - 0.5); // Show loading state const newsGrid = document.getElementById('news-grid'); newsGrid.innerHTML = ''; for (let i = 0; i < 4; i++) { const skeletonItem = document.createElement('div'); skeletonItem.className = 'news-item skeleton'; skeletonItem.style.height = '280px'; newsGrid.appendChild(skeletonItem); } // Simulate loading delay setTimeout(() => { renderNewsItems(shuffledNews); updateRefreshTime(); }, 800); }); // Update refresh time function updateRefreshTime() { document.getElementById('update-time').textContent = 'Just now'; } // Initialize with expanded filters for demo purposes setTimeout(() => { filterToggle.click(); }, 500); }); </script> </body> </html>