Gradient buttons are a powerful design element that can add depth and vibrancy to any user interface. They effortlessly draw attention and enhance the overall aesthetic of your web pages.
In this article, we will explore 10 stunning gradient button examples that can elevate your design projects. Each example showcases unique color combinations and styles to inspire your next creation.
CODE1
Here's the code:
CODETEXT1
CODE2
Here's the code:
CODETEXT2
CODE3
Here's the code:
CODETEXT3
CODE4
Here's the code:
CODETEXT4
CODE5
Here's the code:
CODETEXT5
Designers and developers love Subframe for its drag-and-drop interface and intuitive, responsive canvas. Create pixel-perfect UI effortlessly, including stunning gradient buttons.
Join the community of satisfied users and elevate your design projects. Start for free today!
CODE6
Here's the code:
CODETEXT6
CODE7
Here's the code:
CODETEXT7
CODE8
Here's the code:
CODETEXT8
CODE9
Here's the code:
CODETEXT9
CODE10
Here's the code:
CODETEXT10
Unlock the power of Subframe to design stunning UIs, including gradient buttons, with unmatched efficiency. Create pixel-perfect interfaces effortlessly using our drag-and-drop editor.
Join the community of designers and developers who trust Subframe for their projects. Start for free and begin creating immediately!
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; } body { display: flex; justify-content: center; align-items: center; width: 100%; height: 100vh; background-color: #f8f9fa; overflow: hidden; } .checkout-container { position: relative; width: 100%; max-width: 650px; height: 650px; padding: 20px; background-color: white; border-radius: 16px; box-shadow: 0 10px 50px rgba(0, 0, 0, 0.08); overflow: hidden; } .header { text-align: center; padding-bottom: 20px; border-bottom: 1px solid #edf0f2; margin-bottom: 25px; } .header h1 { font-size: 24px; font-weight: 700; color: #303540; margin-bottom: 8px; } .header p { color: #71757e; font-size: 15px; line-height: 1.5; } .steps { display: flex; justify-content: space-between; margin-bottom: 30px; } .step { display: flex; flex-direction: column; align-items: center; position: relative; flex: 1; } .step::after { content: ''; position: absolute; top: 15px; right: -50%; width: 100%; height: 2px; background-color: #e7e9ed; z-index: 1; } .step:last-child::after { display: none; } .step-circle { width: 32px; height: 32px; background-color: #e7e9ed; border-radius: 50%; display: flex; justify-content: center; align-items: center; margin-bottom: 8px; color: #71757e; font-weight: 600; position: relative; z-index: 2; transition: all 0.3s ease; } .step.active .step-circle { background: linear-gradient(135deg, #ff6b35 0%, #ff9065 100%); color: white; box-shadow: 0 5px 15px rgba(255, 107, 53, 0.4); } .step.completed .step-circle { background: linear-gradient(135deg, #ff6b35 0%, #ff9065 100%); color: white; } .step-label { font-size: 13px; color: #71757e; font-weight: 500; } .step.active .step-label { color: #ff6b35; font-weight: 600; } .checkout-form { margin-top: 10px; } .form-section { margin-bottom: 25px; } .section-title { font-size: 18px; font-weight: 600; margin-bottom: 15px; color: #303540; display: flex; align-items: center; } .section-title svg { margin-right: 10px; } .form-row { display: flex; gap: 16px; margin-bottom: 16px; } .form-group { flex: 1; position: relative; } .form-control { width: 100%; padding: 14px 16px; border: 1px solid #dde1e7; border-radius: 8px; font-size: 15px; transition: all 0.2s ease; background: #f8f9fa; color: #303540; } .form-control:focus { outline: none; border-color: #ff6b35; box-shadow: 0 0 0 3px rgba(255, 107, 53, 0.15); background: white; } .form-control::placeholder { color: #a0a5b0; } .form-label { position: absolute; top: -10px; left: 12px; background: white; padding: 0 5px; font-size: 12px; color: #71757e; font-weight: 500; transition: all 0.2s ease; } .form-control:focus + .form-label { color: #ff6b35; } .gradient-button { position: relative; background: linear-gradient(135deg, #ff6b35 0%, #ff9065 100%); color: white; font-weight: 600; font-size: 16px; padding: 16px 24px; border: none; border-radius: 8px; cursor: pointer; transition: all 0.3s ease; overflow: hidden; z-index: 1; width: 100%; box-shadow: 0 6px 20px rgba(255, 107, 53, 0.25); display: flex; justify-content: center; align-items: center; margin-top: 15px; } .gradient-button:hover { transform: translateY(-2px); box-shadow: 0 10px 25px rgba(255, 107, 53, 0.4); } .gradient-button:active { transform: translateY(1px); box-shadow: 0 4px 15px rgba(255, 107, 53, 0.3); } .gradient-button::before { content: ""; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(135deg, #ff9065 0%, #ff6b35 100%); opacity: 0; z-index: -1; transition: opacity 0.3s ease; } .gradient-button:hover::before { opacity: 1; } .gradient-button-icon { margin-left: 10px; transition: transform 0.3s ease; } .gradient-button:hover .gradient-button-icon { transform: translateX(4px); } .subtotal-row { display: flex; justify-content: space-between; padding: 12px 0; border-bottom: 1px dashed #edf0f2; font-size: 15px; color: #71757e; } .total-row { display: flex; justify-content: space-between; padding: 18px 0 10px; font-size: 18px; font-weight: 700; color: #303540; } .secure-badge { display: flex; align-items: center; justify-content: center; margin-top: 20px; color: #71757e; font-size: 13px; } .secure-badge svg { margin-right: 8px; } .order-summary { padding: 15px; background: #f8f9fa; border-radius: 8px; margin-bottom: 25px; } .summary-item { display: flex; align-items: center; margin-bottom: 12px; } .summary-item-img { width: 50px; height: 50px; background: #fff; border-radius: 6px; display: flex; align-items: center; justify-content: center; margin-right: 12px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); } .summary-item-details { flex: 1; } .summary-item-name { font-weight: 600; color: #303540; font-size: 14px; } .summary-item-variant { color: #71757e; font-size: 12px; } .summary-item-price { font-weight: 600; color: #303540; } .card-icons { margin-top: 10px; display: flex; gap: 8px; } .card-icon { width: 40px; height: 25px; border-radius: 4px; background: white; display: flex; align-items: center; justify-content: center; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.05); } .pulse-animation { animation: pulse 2s infinite; } @keyframes pulse { 0% { box-shadow: 0 6px 20px rgba(255, 107, 53, 0.25); } 50% { box-shadow: 0 6px 30px rgba(255, 107, 53, 0.5); } 100% { box-shadow: 0 6px 20px rgba(255, 107, 53, 0.25); } } /* Confetti Animation */ .confetti-container { position: fixed; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden; z-index: 1000; pointer-events: none; display: none; } .confetti { position: absolute; width: 10px; height: 10px; background-color: #ff6b35; opacity: 0; } @media (max-width: 500px) { .form-row { flex-direction: column; gap: 12px; } .checkout-container { padding: 15px; height: auto; min-height: 650px; } .header h1 { font-size: 20px; } .section-title { font-size: 16px; } .steps { margin-bottom: 20px; } .step-label { font-size: 12px; } } </style> </head> <body> <div class="checkout-container"> <div class="header"> <h1>Complete Your Purchase</h1> <p>You're just moments away from unlocking premium features</p> </div> <div class="steps"> <div class="step completed"> <div class="step-circle">1</div> <div class="step-label">Cart</div> </div> <div class="step active"> <div class="step-circle">2</div> <div class="step-label">Payment</div> </div> <div class="step"> <div class="step-circle">3</div> <div class="step-label">Confirm</div> </div> </div> <form class="checkout-form" id="checkout-form"> <div class="form-section"> <div class="section-title"> <svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M20 7H4C2.89543 7 2 7.89543 2 9V19C2 20.1046 2.89543 21 4 21H20C21.1046 21 22 20.1046 22 19V9C22 7.89543 21.1046 7 20 7Z" stroke="#ff6b35" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M16 21V5C16 3.89543 15.1046 3 14 3H10C8.89543 3 8 3.89543 8 5V21" stroke="#ff6b35" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> Order Summary </div> <div class="order-summary"> <div class="summary-item"> <div class="summary-item-img"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M16 8V7C16 5.93913 15.5786 4.92172 14.8284 4.17157C14.0783 3.42143 13.0609 3 12 3C10.9391 3 9.92172 3.42143 9.17157 4.17157C8.42143 4.92172 8 5.93913 8 7V8H16Z" stroke="#ff6b35" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M5 8H19C20.1046 8 21 8.89543 21 10V19C21 20.1046 20.1046 21 19 21H5C3.89543 21 3 20.1046 3 19V10C3 8.89543 3.89543 8 5 8Z" stroke="#ff6b35" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </div> <div class="summary-item-details"> <div class="summary-item-name">Premium Plan</div> <div class="summary-item-variant">Annual Subscription</div> </div> <div class="summary-item-price">$99.00</div> </div> <div class="subtotal-row"> <span>Subtotal</span> <span>$99.00</span> </div> <div class="subtotal-row"> <span>Tax (7%)</span> <span>$6.93</span> </div> <div class="total-row"> <span>Total</span> <span>$105.93</span> </div> </div> </div> <div class="form-section"> <div class="section-title"> <svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <rect x="2" y="5" width="20" height="14" rx="2" stroke="#ff6b35" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M2 10H22" stroke="#ff6b35" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> Payment Details </div> <div class="form-row"> <div class="form-group"> <input type="text" class="form-control" id="cardNumber" placeholder="1234 5678 9012 3456"> <label for="cardNumber" class="form-label">Card Number</label> </div> </div> <div class="form-row"> <div class="form-group"> <input type="text" class="form-control" id="cardName" placeholder="John Smith"> <label for="cardName" class="form-label">Cardholder Name</label> </div> </div> <div class="form-row"> <div class="form-group"> <input type="text" class="form-control" id="expiry" placeholder="MM/YY"> <label for="expiry" class="form-label">Expiry Date</label> </div> <div class="form-group"> <input type="text" class="form-control" id="cvv" placeholder="123"> <label for="cvv" class="form-label">CVV</label> </div> </div> <div class="card-icons"> <div class="card-icon"> <svg width="30" height="20" viewBox="0 0 30 20" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M7.5 13.75H4.375V6.25H7.5V13.75Z" fill="#E01020"/> <path d="M5 5C3.75 5.625 2.8125 6.875 2.5 8.125C2.5 9.6875 3.125 11.25 4.375 12.1875C5.3125 13.125 6.5625 13.75 7.8125 13.75H5V5Z" fill="#EA595D"/> <path d="M5 5C6.25 4.0625 7.8125 3.75 9.0625 4.0625C10.625 4.0625 12.1875 4.6875 13.125 5.9375C14.0625 6.875 14.6875 8.125 14.6875 9.6875C14.6875 10.9375 14.375 12.5 13.125 13.4375C12.1875 14.375 10.9375 15 9.6875 15H7.8125C6.5625 15 5 14.375 4.375 13.4375C3.125 12.5 2.5 10.9375 2.5 9.6875C2.8125 7.5 3.75 5.9375 5 5Z" fill="#F39F18"/> <path d="M27.5 15H16.25V5H27.5V15Z" fill="#0962AE"/> <path d="M16.25 10C16.25 7.8125 17.5 5.9375 19.375 5C18.4375 5.625 17.8125 6.875 17.8125 8.125C17.8125 9.6875 18.4375 10.9375 19.375 12.1875C20.3125 13.125 21.5625 13.75 22.8125 13.75C24.0625 13.75 25.3125 13.125 26.25 12.1875C27.1875 11.25 27.8125 9.6875 27.8125 8.125C27.8125 6.875 27.1875 5.625 26.25 5C28.125 5.9375 29.375 7.8125 29.375 10C29.375 12.5 27.8125 14.6875 25.3125 15.3125C23.75 15.9375 21.875 15.625 20.625 14.375C19.0625 13.4375 18.125 12.1875 17.8125 10.3125L16.25 10Z" fill="#0962AE"/> </svg> </div> <div class="card-icon"> <svg width="30" height="20" viewBox="0 0 30 20" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M27.1875 16.25H2.8125C1.875 16.25 1.25 15.625 1.25 14.6875V5.3125C1.25 4.375 1.875 3.75 2.8125 3.75H27.1875C28.125 3.75 28.75 4.375 28.75 5.3125V14.6875C28.75 15.625 28.125 16.25 27.1875 16.25Z" fill="#F9F9F9"/> <path d="M11.5625 13.75H8.4375V6.25H11.5625V13.75Z" fill="#252566"/> <path d="M8.75 10C8.75 8.125 9.6875 6.5625 11.25 5.625C10.3125 6.25 9.6875 7.5 9.6875 8.75C9.6875 10 10.3125 11.25 11.25 11.875C9.6875 10.9375 8.75 9.375 8.75 10Z" fill="#25256C"/> <path d="M18.4375 13.75H15.625V6.25H18.4375L18.4375 13.75Z" fill="#F9A533"/> <path d="M16.875 10C16.875 8.125 17.8125 6.5625 19.375 5.625C18.4375 6.25 17.8125 7.5 17.8125 8.75C17.8125 10 18.4375 11.25 19.375 11.875C17.8125 10.9375 16.875 9.375 16.875 10Z" fill="#F9A533"/> <path d="M12.5 6.25H15.3125L15.9375 7.8125C16.5625 9.0625 16.5625 10.9375 15.9375 12.1875L15.3125 13.75H12.5V6.25Z" fill="#252566"/> <path d="M21.25 13.75V6.25H23.75C24.6875 6.25 25.625 6.875 25.625 7.8125C25.625 8.75 25 9.375 24.0625 9.6875C25 9.6875 25.9375 10.625 25.9375 11.5625C25.9375 12.8125 24.6875 13.75 23.4375 13.75H21.25Z" fill="#F22F15"/> <path d="M21.5625 9.0625H23.4375C24.0625 9.0625 24.375 8.75 24.375 8.125C24.375 7.5 24.0625 7.1875 23.4375 7.1875H21.5625V9.0625Z" fill="#F9F9F9"/> <path d="M21.5625 12.8125H23.75C24.375 12.8125 24.6875 12.5 24.6875 11.875C24.6875 11.25 24.0625 10.9375 23.75 10.9375H21.5625V12.8125Z" fill="#F9F9F9"/> </svg> </div> <div class="card-icon"> <svg width="30" height="20" viewBox="0 0 30 20" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M27.1875 16.25H2.8125C1.875 16.25 1.25 15.625 1.25 14.6875V5.3125C1.25 4.375 1.875 3.75 2.8125 3.75H27.1875C28.125 3.75 28.75 4.375 28.75 5.3125V14.6875C28.75 15.625 28.125 16.25 27.1875 16.25Z" fill="#016FD0"/> <path d="M15 13.75C12.8125 13.75 11.25 11.875 11.25 10C11.25 8.125 12.8125 6.25 15 6.25C17.1875 6.25 18.75 8.125 18.75 10C18.75 11.875 17.1875 13.75 15 13.75Z" fill="#FFAA3B"/> <path d="M7.5 6.25H10.3125L11.25 8.4375V6.25H14.6875L15.3125 8.75L15.9375 6.25H19.375V13.75H16.875V9.0625L15.9375 13.75H14.6875L13.75 9.0625V13.75H10V11.875H8.75V13.75H6.25V7.5L7.5 6.25Z" fill="#F9F9F9"/> <path d="M16.25 11.25H18.75V9.0625H20V7.5H18.75V5.625H17.1875L16.25 7.5V9.0625H17.8125L16.25 11.25Z" fill="#F9F9F9"/> <path d="M6.875 10.9375H8.4375V9.375H10V8.125H8.4375V6.875H6.875V8.125H5.3125V9.375H6.875V10.9375Z" fill="#F9F9F9"/> </svg> </div> </div> </div> <button type="button" id="checkout-button" class="gradient-button"> Complete Payment <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="gradient-button-icon"> <path d="M5 12H19" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M12 5L19 12L12 19" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </button> <div class="secure-badge"> <svg width="14" height="14" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12 22C12 22 20 18 20 12V5L12 2L4 5V12C4 18 12 22 12 22Z" stroke="#71757e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> Secure, encrypted payment processing </div> </form> </div> <div class="confetti-container" id="confetti-container"></div> <script> document.addEventListener('DOMContentLoaded', function() { const checkoutButton = document.getElementById('checkout-button'); const confettiContainer = document.getElementById('confetti-container'); // Add pulse animation to button setTimeout(() => { checkoutButton.classList.add('pulse-animation'); }, 1000); // Form input validation and formatting const cardNumberInput = document.getElementById('cardNumber'); const expiryInput = document.getElementById('expiry'); const cvvInput = document.getElementById('cvv'); cardNumberInput.addEventListener('input', function(e) { let value = e.target.value.replace(/\D/g, ''); if (value.length > 16) value = value.slice(0, 16); // Format with spaces let formattedValue = ''; for (let i = 0; i < value.length; i++) { if (i > 0 && i % 4 === 0) { formattedValue += ' '; } formattedValue += value[i]; } e.target.value = formattedValue; }); expiryInput.addEventListener('input', function(e) { let value = e.target.value.replace(/\D/g, ''); if (value.length > 4) value = value.slice(0, 4); if (value.length > 2) { value = value.slice(0, 2) + '/' + value.slice(2); } e.target.value = value; }); cvvInput.addEventListener('input', function(e) { let value = e.target.value.replace(/\D/g, ''); if (value.length > 3) value = value.slice(0, 3); e.target.value = value; }); // Button click handler checkoutButton.addEventListener('click', function() { checkoutButton.innerHTML = 'Processing...'; checkoutButton.disabled = true; setTimeout(() => { createConfetti(); // Show success message after payment const formContainer = document.querySelector('.checkout-form'); formContainer.innerHTML = ` <div style="text-align: center; padding: 40px 20px;"> <svg width="64" height="64" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M22 11.08V12C21.9988 14.1564 21.3005 16.2547 20.0093 17.9818C18.7182 19.709 16.9033 20.9725 14.8354 21.5839C12.7674 22.1953 10.5573 22.1219 8.53447 21.3746C6.51168 20.6273 4.78465 19.2461 3.61096 17.4371C2.43727 15.628 1.87979 13.4881 2.02168 11.3363C2.16356 9.18455 2.99721 7.13631 4.39828 5.49706C5.79935 3.85781 7.69279 2.71537 9.79619 2.24013C11.8996 1.7649 14.1003 1.98232 16.07 2.85999" stroke="#ff6b35" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M22 4L12 14.01L9 11.01" stroke="#ff6b35" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> <h2 style="color: #303540; margin-top: 20px; font-size: 24px;">Payment Successful!</h2> <p style="color: #71757e; margin: 15px 0 25px; line-height: 1.5;"> Your premium subscription has been activated.<br> A receipt has been sent to your email. </p> <button class="gradient-button" style="max-width: 220px; margin: 0 auto;"> Continue to Dashboard </button> </div> `; // Update the step indicators const steps = document.querySelectorAll('.step'); steps.forEach(step => step.classList.remove('active')); steps[2].classList.add('active'); steps[0].classList.add('completed'); steps[1].classList.add('completed'); }, 1500); }); // Confetti animation function function createConfetti() { confettiContainer.style.display = 'block'; const colors = ['#ff6b35', '#ff9065', '#ff7c4d', '#ff5722', '#ffab91']; for (let i = 0; i < 150; i++) { const confetti = document.createElement('div'); confetti.className = 'confetti'; confetti.style.left = Math.random() * 100 + '%'; confetti.style.top = -20 + 'px'; confetti.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)]; confetti.style.width = Math.random() * 10 + 5 + 'px'; confetti.style.height = Math.random() * 10 + 5 + 'px'; confetti.style.opacity = Math.random() + 0.5; confetti.style.borderRadius = Math.random() > 0.5 ? '50%' : '0'; confetti.style.transform = `rotate(${Math.random() * 360}deg)`; confettiContainer.appendChild(confetti); const delay = Math.random() * 2; const duration = Math.random() * 3 + 3; confetti.animate([ { transform: `translate(0, 0) rotate(0deg)`, opacity: 1 }, { transform: `translate(${Math.random() * 100 - 50}px, ${window.innerHeight}px) rotate(${Math.random() * 360}deg)`, opacity: 0 } ], { duration: duration * 1000, delay: delay * 1000, fill: 'forwards', easing: 'cubic-bezier(0.21, 0.98, 0.6, 0.99)' }); setTimeout(() => { confetti.remove(); }, (duration + delay) * 1000); } setTimeout(() => { confettiContainer.style.display = 'none'; }, 6000); } // Form input animations const formControls = document.querySelectorAll('.form-control'); formControls.forEach(input => { input.addEventListener('focus', function() { this.parentElement.style.transform = 'translateY(-2px)'; this.parentElement.style.transition = 'transform 0.2s ease'; }); input.addEventListener('blur', function() { this.parentElement.style.transform = 'translateY(0)'; }); }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Health & Fitness Dashboard</title> <style> :root { --neon-green: #39ff14; --electric-blue: #00fcff; --deep-purple: #9900ff; --vibrant-pink: #ff00cc; --primary-font: 'Montserrat', sans-serif; --secondary-font: 'Poppins', sans-serif; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: var(--primary-font); } @import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700&family=Poppins:wght@300;400;500;600&display=swap'); body { background-color: #0a0e14; color: #ffffff; height: 700px; width: 700px; max-width: 100%; overflow-x: hidden; padding: 20px; display: flex; flex-direction: column; } .dashboard-container { display: flex; flex-direction: column; height: 100%; max-width: 100%; gap: 20px; } header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; } .logo { font-size: 1.8rem; font-weight: 700; background: linear-gradient(to right, var(--neon-green), var(--electric-blue)); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; letter-spacing: 1px; } .user-info { display: flex; align-items: center; gap: 10px; } .avatar { width: 40px; height: 40px; border-radius: 50%; background: linear-gradient(to bottom right, var(--electric-blue), var(--deep-purple)); display: flex; align-items: center; justify-content: center; font-weight: 600; position: relative; overflow: hidden; } .avatar::after { content: ''; position: absolute; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.1); transform: translateX(-100%); transition: transform 0.4s ease; } .avatar:hover::after { transform: translateX(0); } .stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 15px; } .stat-card { background: rgba(255, 255, 255, 0.08); border-radius: 12px; padding: 15px; transition: transform 0.3s ease, box-shadow 0.3s ease; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); position: relative; overflow: hidden; } .stat-card::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(130deg, rgba(57, 255, 20, 0.08), rgba(0, 252, 255, 0.08)); opacity: 0; transition: opacity 0.3s ease; } .stat-card:hover { transform: translateY(-5px); box-shadow: 0 8px 30px rgba(0, 0, 0, 0.2); } .stat-card:hover::before { opacity: 1; } .stat-name { font-size: 0.9rem; color: rgba(255, 255, 255, 0.7); margin-bottom: 8px; } .stat-value { font-size: 1.8rem; font-weight: 600; letter-spacing: -0.5px; } .stat-trend { font-size: 0.8rem; margin-top: 8px; display: flex; align-items: center; gap: 5px; } .trend-up { color: var(--neon-green); } .trend-down { color: var(--vibrant-pink); } .activity-chart { flex-grow: 1; margin-top: 10px; background: rgba(255, 255, 255, 0.05); border-radius: 12px; padding: 20px; position: relative; overflow: hidden; display: flex; flex-direction: column; } .chart-title { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; } .chart-title h3 { font-size: 1.2rem; font-weight: 600; } .chart-filters { display: flex; gap: 10px; } .chart-filter { background: rgba(255, 255, 255, 0.1); border: none; color: white; padding: 6px 12px; border-radius: 20px; font-size: 0.8rem; cursor: pointer; transition: background 0.3s ease; } .chart-filter.active { background: linear-gradient(to right, var(--neon-green), var(--electric-blue)); color: #0a0e14; font-weight: 600; } .chart-container { flex-grow: 1; display: flex; align-items: flex-end; gap: 8px; padding-top: 10px; } .chart-bar { flex-grow: 1; height: 100%; display: flex; flex-direction: column; justify-content: flex-end; align-items: center; position: relative; } .bar { width: 100%; max-width: 8px; background: linear-gradient(to top, var(--neon-green), var(--electric-blue)); border-radius: 4px; transition: height 1s cubic-bezier(0.19, 1, 0.22, 1); box-shadow: 0 0 10px rgba(57, 255, 20, 0.4); } .bar-label { font-size: 0.7rem; margin-top: 8px; color: rgba(255, 255, 255, 0.7); } .action-buttons { display: flex; gap: 15px; margin-top: 20px; } .gradient-button { flex: 1; border: none; border-radius: 12px; padding: 15px 25px; color: white; font-weight: 600; font-size: 1rem; cursor: pointer; text-align: center; position: relative; overflow: hidden; background-size: 200% 200%; transition: all 0.3s ease; letter-spacing: 0.5px; } .gradient-button.primary { background: linear-gradient(45deg, var(--neon-green), var(--electric-blue)); } .gradient-button.secondary { background: linear-gradient(45deg, var(--deep-purple), var(--vibrant-pink)); } .ripple { position: absolute; border-radius: 50%; background: rgba(255, 255, 255, 0.4); transform: scale(0); animation: ripple 0.6s linear; pointer-events: none; } @keyframes ripple { to { transform: scale(2.5); opacity: 0; } } .gradient-button:hover { background-position: right center; transform: translateY(-2px); box-shadow: 0 8px 25px rgba(57, 255, 20, 0.3); } .gradient-button.secondary:hover { box-shadow: 0 8px 25px rgba(153, 0, 255, 0.3); } .pulse { animation: pulse 1.5s infinite; } @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(57, 255, 20, 0.4); } 70% { box-shadow: 0 0 0 10px rgba(57, 255, 20, 0); } 100% { box-shadow: 0 0 0 0 rgba(57, 255, 20, 0); } } @media (max-width: 480px) { body { padding: 15px; } .stats-grid { grid-template-columns: 1fr 1fr; } .stat-value { font-size: 1.5rem; } .logo { font-size: 1.5rem; } .action-buttons { flex-direction: column; } } </style> </head> <body> <div class="dashboard-container"> <header> <div class="logo">VITALITY</div> <div class="user-info"> <div class="avatar">JD</div> </div> </header> <div class="stats-grid"> <div class="stat-card"> <div class="stat-name">Active Calories</div> <div class="stat-value">583</div> <div class="stat-trend trend-up">+12% ↑</div> </div> <div class="stat-card"> <div class="stat-name">Steps</div> <div class="stat-value">8,974</div> <div class="stat-trend trend-up">+7% ↑</div> </div> <div class="stat-card"> <div class="stat-name">Heart Rate</div> <div class="stat-value">72<span style="font-size: 1rem;">bpm</span></div> <div class="stat-trend trend-down">-3% ↓</div> </div> <div class="stat-card"> <div class="stat-name">Sleep</div> <div class="stat-value">7.2<span style="font-size: 1rem;">h</span></div> <div class="stat-trend trend-up">+8% ↑</div> </div> </div> <div class="activity-chart"> <div class="chart-title"> <h3>Weekly Activity</h3> <div class="chart-filters"> <button class="chart-filter">Steps</button> <button class="chart-filter active">Calories</button> <button class="chart-filter">Sleep</button> </div> </div> <div class="chart-container"> <div class="chart-bar"> <div class="bar" style="height: 40%;"></div> <div class="bar-label">Mon</div> </div> <div class="chart-bar"> <div class="bar" style="height: 65%;"></div> <div class="bar-label">Tue</div> </div> <div class="chart-bar"> <div class="bar" style="height: 85%;"></div> <div class="bar-label">Wed</div> </div> <div class="chart-bar"> <div class="bar" style="height: 55%;"></div> <div class="bar-label">Thu</div> </div> <div class="chart-bar"> <div class="bar" style="height: 70%;"></div> <div class="bar-label">Fri</div> </div> <div class="chart-bar"> <div class="bar" style="height: 45%;"></div> <div class="bar-label">Sat</div> </div> <div class="chart-bar"> <div class="bar" style="height: 30%;"></div> <div class="bar-label">Sun</div> </div> </div> </div> <div class="action-buttons"> <button class="gradient-button primary pulse">Start Workout</button> <button class="gradient-button secondary">Track Nutrition</button> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Animate chart bars on load const bars = document.querySelectorAll('.bar'); bars.forEach(bar => { const originalHeight = bar.style.height; bar.style.height = '0%'; setTimeout(() => { bar.style.height = originalHeight; }, 300); }); // Add ripple effect to buttons const buttons = document.querySelectorAll('.gradient-button'); buttons.forEach(button => { button.addEventListener('click', function(e) { const circle = document.createElement('span'); const diameter = Math.max(button.clientWidth, button.clientHeight); const radius = diameter / 2; circle.style.width = circle.style.height = `${diameter}px`; circle.style.left = `${e.clientX - button.offsetLeft - radius}px`; circle.style.top = `${e.clientY - button.offsetTop - radius}px`; circle.classList.add('ripple'); const ripple = button.getElementsByClassName('ripple')[0]; if (ripple) { ripple.remove(); } button.appendChild(circle); }); }); // Filter chart interaction const filters = document.querySelectorAll('.chart-filter'); filters.forEach(filter => { filter.addEventListener('click', function() { filters.forEach(f => f.classList.remove('active')); this.classList.add('active'); // Simulate data change const newHeights = [ Math.floor(Math.random() * 60) + 20 + '%', Math.floor(Math.random() * 60) + 20 + '%', Math.floor(Math.random() * 60) + 20 + '%', Math.floor(Math.random() * 60) + 20 + '%', Math.floor(Math.random() * 60) + 20 + '%', Math.floor(Math.random() * 60) + 20 + '%', Math.floor(Math.random() * 60) + 20 + '%' ]; bars.forEach((bar, index) => { bar.style.height = '0%'; setTimeout(() => { bar.style.height = newHeights[index]; }, 300); }); }); }); // Stat card hover interactions const statCards = document.querySelectorAll('.stat-card'); statCards.forEach(card => { card.addEventListener('mouseenter', function() { const value = this.querySelector('.stat-value'); value.style.transform = 'scale(1.05)'; value.style.transition = 'transform 0.3s ease'; }); card.addEventListener('mouseleave', function() { const value = this.querySelector('.stat-value'); value.style.transform = 'scale(1)'; }); }); }); </script> </body> </html>
<html> <head> <title>Creative Portfolio</title> <style> /* Base styles and reset */ * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Poppins', sans-serif; } body { background-color: #f8f9fa; color: #333; overflow-x: hidden; width: 100%; height: 100vh; display: flex; flex-direction: column; transition: background-color 0.5s ease; } /* Typography */ h1 { font-size: 2.5rem; margin-bottom: 0.5rem; font-weight: 700; background: linear-gradient(45deg, #ff6b6b, #6b88ff); -webkit-background-clip: text; background-clip: text; color: transparent; transition: transform 0.3s ease; } h2 { font-size: 1.8rem; margin-bottom: 1rem; color: #555; } p { line-height: 1.6; margin-bottom: 1.5rem; color: #666; } /* Container */ .container { max-width: 700px; margin: 0 auto; padding: 2rem; height: 100%; overflow-y: auto; scroll-behavior: smooth; -ms-overflow-style: none; scrollbar-width: none; } .container::-webkit-scrollbar { display: none; } /* Header */ header { text-align: center; padding: 1rem 0 2rem; position: relative; } .header-badge { position: absolute; top: -15px; right: 10px; background: linear-gradient(135deg, #a6c1ee, #fbc2eb); border-radius: 50%; width: 60px; height: 60px; display: flex; align-items: center; justify-content: center; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); font-weight: bold; transform: rotate(10deg); animation: float 3s ease-in-out infinite; } @keyframes float { 0%, 100% { transform: translateY(0) rotate(10deg); } 50% { transform: translateY(-10px) rotate(5deg); } } /* Navigation */ nav { margin-bottom: 2rem; display: flex; justify-content: center; flex-wrap: wrap; gap: 0.75rem; } /* Gradient Buttons */ .gradient-btn { padding: 0.75rem 1.5rem; border: none; border-radius: 50px; font-weight: 500; cursor: pointer; transition: all 0.3s ease; background-size: 300% 100%; text-decoration: none; color: white; font-size: 0.9rem; position: relative; overflow: hidden; display: inline-block; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); } .gradient-btn:before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.2); transition: 0.5s; transform: skewX(25deg); } .gradient-btn:hover:before { left: 100%; } .gradient-btn:hover { transform: scale(1.05); box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); background-position: right center; } .gradient-btn:active { transform: scale(0.98); } .btn-primary { background-image: linear-gradient(to right, #fbc2eb 0%, #a6c1ee 51%, #fbc2eb 100%); } .btn-secondary { background-image: linear-gradient(to right, #a1c4fd 0%, #c2e9fb 51%, #a1c4fd 100%); } .btn-tertiary { background-image: linear-gradient(to right, #84fab0 0%, #8fd3f4 51%, #84fab0 100%); } .btn-quaternary { background-image: linear-gradient(to right, #f6d365 0%, #fda085 51%, #f6d365 100%); } /* Portfolio Gallery */ .portfolio-section { margin: 2rem 0; } .portfolio-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 1.5rem; margin-top: 1.5rem; } .portfolio-item { border-radius: 12px; overflow: hidden; position: relative; height: 180px; cursor: pointer; transition: transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275); box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); } .portfolio-item:hover { transform: translateY(-10px) scale(1.02); box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15); } .portfolio-img { width: 100%; height: 100%; object-fit: cover; } .portfolio-overlay { position: absolute; bottom: 0; left: 0; right: 0; background: linear-gradient(to top, rgba(0, 0, 0, 0.8), transparent); padding: 1rem; transform: translateY(100%); transition: transform 0.3s ease; } .portfolio-item:hover .portfolio-overlay { transform: translateY(0); } .portfolio-title { color: white; margin-bottom: 0.5rem; font-size: 1rem; } .portfolio-category { color: rgba(255, 255, 255, 0.8); font-size: 0.8rem; } /* About Section */ .about-section { background: linear-gradient(135deg, rgba(252, 207, 233, 0.1), rgba(206, 232, 255, 0.1)); padding: 2rem; border-radius: 15px; margin: 2rem 0; position: relative; overflow: hidden; } .about-section:before { content: ''; position: absolute; width: 150px; height: 150px; background: linear-gradient(135deg, rgba(252, 207, 233, 0.3), rgba(206, 232, 255, 0.3)); border-radius: 50%; top: -75px; right: -75px; z-index: 0; } .about-content { position: relative; z-index: 1; } /* Contact Section */ .contact-section { margin: 2rem 0; } .contact-form { display: flex; flex-direction: column; gap: 1rem; } .form-group { display: flex; flex-direction: column; gap: 0.5rem; } .form-label { font-weight: 500; color: #555; } .form-input, .form-textarea { padding: 0.75rem; border: 2px solid #e1e5ee; border-radius: 8px; transition: border-color 0.3s ease; font-size: 1rem; } .form-input:focus, .form-textarea:focus { outline: none; border-color: #a6c1ee; box-shadow: 0 0 0 4px rgba(166, 193, 238, 0.1); } .form-textarea { min-height: 120px; resize: vertical; } /* Theme Toggle */ .theme-switch { position: fixed; bottom: 20px; right: 20px; z-index: 100; width: 50px; height: 50px; border-radius: 50%; background: linear-gradient(135deg, #a6c1ee, #fbc2eb); display: flex; align-items: center; justify-content: center; cursor: pointer; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.15); transition: transform 0.3s ease; } .theme-switch:hover { transform: scale(1.1); } .theme-icon { color: white; font-size: 1.5rem; } /* Modal */ .modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.8); display: flex; align-items: center; justify-content: center; z-index: 1000; opacity: 0; visibility: hidden; transition: opacity 0.3s ease, visibility 0.3s ease; } .modal.open { opacity: 1; visibility: visible; } .modal-content { background-color: white; padding: 2rem; border-radius: 15px; max-width: 90%; max-height: 90%; overflow: auto; position: relative; transform: scale(0.8); transition: transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); } .modal.open .modal-content { transform: scale(1); } .modal-close { position: absolute; top: 15px; right: 15px; width: 30px; height: 30px; display: flex; align-items: center; justify-content: center; background: #f1f1f1; border-radius: 50%; cursor: pointer; transition: background-color 0.3s ease; } .modal-close:hover { background-color: #e1e1e1; } /* Dark Theme */ body.dark-theme { background-color: #2d3436; color: #f1f1f1; } body.dark-theme p { color: #ddd; } body.dark-theme h2 { color: #f1f1f1; } body.dark-theme .about-section { background: linear-gradient(135deg, rgba(252, 207, 233, 0.05), rgba(206, 232, 255, 0.05)); } body.dark-theme .form-label { color: #ddd; } body.dark-theme .form-input, body.dark-theme .form-textarea { background-color: #3d4548; border-color: #4a5558; color: #f1f1f1; } body.dark-theme .modal-content { background-color: #2d3436; } body.dark-theme .modal-close { background-color: #3d4548; } /* Cursor */ .custom-cursor { position: fixed; width: 20px; height: 20px; border-radius: 50%; background: linear-gradient(135deg, #a6c1ee, #fbc2eb); pointer-events: none; transform: translate(-50%, -50%); z-index: 9999; opacity: 0.7; transition: width 0.3s, height 0.3s, opacity 0.3s; mix-blend-mode: exclusion; } /* Animations */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .animate-fade { animation: fadeIn 1s ease forwards; } /* Adaptive Design */ @media (max-width: 700px) { h1 { font-size: 2rem; } h2 { font-size: 1.5rem; } .portfolio-grid { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); } .container { padding: 1.5rem; } .header-badge { width: 50px; height: 50px; font-size: 0.8rem; } nav { gap: 0.5rem; } .gradient-btn { padding: 0.6rem 1.2rem; font-size: 0.8rem; } } @media (max-width: 500px) { .portfolio-grid { grid-template-columns: 1fr 1fr; } } </style> </head> <body> <div class="custom-cursor"></div> <div class="container"> <header> <div class="header-badge">2024</div> <h1>Vivi Noya</h1> <p>Visual Designer & Digital Artist</p> </header> <nav> <button class="gradient-btn btn-primary" data-section="portfolio">Portfolio</button> <button class="gradient-btn btn-secondary" data-section="about">About Me</button> <button class="gradient-btn btn-tertiary" data-section="contact">Contact</button> <button class="gradient-btn btn-quaternary" id="colorShift">Shift Colors</button> </nav> <section id="portfolio" class="portfolio-section animate-fade"> <h2>Featured Works</h2> <p>A curated selection of projects showcasing my experimental design approach and passion for fluid, colorful aesthetics.</p> <div class="portfolio-grid"> <div class="portfolio-item" data-project="chromatic"> <img src="https://images.unsplash.com/photo-1549887552-cb1071d3e5ca" alt="Chromatic Dreams Project" class="portfolio-img"> <div class="portfolio-overlay"> <h3 class="portfolio-title">Chromatic Dreams</h3> <p class="portfolio-category">Digital Art</p> </div> </div> <div class="portfolio-item" data-project="fluidity"> <img src="https://images.unsplash.com/photo-1550859492-d5da9d8e45f3" alt="Fluid Motions Project" class="portfolio-img"> <div class="portfolio-overlay"> <h3 class="portfolio-title">Fluid Motions</h3> <p class="portfolio-category">Animation</p> </div> </div> <div class="portfolio-item" data-project="pastel"> <img src="https://images.unsplash.com/photo-1517697471339-4aa32003c11a" alt="Pastel Horizons Project" class="portfolio-img"> <div class="portfolio-overlay"> <h3 class="portfolio-title">Pastel Horizons</h3> <p class="portfolio-category">Illustration</p> </div> </div> <div class="portfolio-item" data-project="gradient"> <img src="https://images.unsplash.com/photo-1550684848-fac1c5b4e853" alt="Gradient Landscapes Project" class="portfolio-img"> <div class="portfolio-overlay"> <h3 class="portfolio-title">Gradient Landscapes</h3> <p class="portfolio-category">UI Design</p> </div> </div> </div> </section> <section id="about" class="about-section animate-fade" style="display: none;"> <div class="about-content"> <h2>About My Artistic Journey</h2> <p>I'm a visual artist who specializes in creating fluid, dream-like digital experiences. My work explores the boundary between tangible and abstract, using pastel gradients and flowing transitions as my signature aesthetic.</p> <p>With a background in fine arts and digital media, I blend traditional artistic principles with modern digital techniques. My design philosophy centers on creating immersive, emotionally resonant experiences that invite viewers to explore and interact.</p> <p>Each project is an opportunity to push creative boundaries, experimenting with new color combinations and animation techniques that capture the essence of fluidity and transformation.</p> </div> </section> <section id="contact" class="contact-section animate-fade" style="display: none;"> <h2>Let's Create Something Beautiful</h2> <p>Have a project in mind? I'd love to hear about it. My collaborative approach ensures your vision comes to life with the perfect blend of artistic expression and functional design.</p> <form class="contact-form"> <div class="form-group"> <label for="name" class="form-label">Name</label> <input type="text" id="name" class="form-input" placeholder="Your name"> </div> <div class="form-group"> <label for="email" class="form-label">Email</label> <input type="email" id="email" class="form-input" placeholder="Your email address"> </div> <div class="form-group"> <label for="message" class="form-label">Project Details</label> <textarea id="message" class="form-textarea" placeholder="Tell me about your project ideas..."></textarea> </div> <button type="button" class="gradient-btn btn-primary" id="submit-form">Send Message</button> </form> </section> </div> <div class="theme-switch" id="theme-toggle"> <span class="theme-icon">🌙</span> </div> <div class="modal" id="project-modal"> <div class="modal-content"> <div class="modal-close">×</div> <div id="modal-data"></div> </div> </div> <script> // DOM Elements const navButtons = document.querySelectorAll('nav .gradient-btn[data-section]'); const sections = document.querySelectorAll('section'); const themeToggle = document.getElementById('theme-toggle'); const themeIcon = document.querySelector('.theme-icon'); const colorShiftBtn = document.getElementById('colorShift'); const portfolioItems = document.querySelectorAll('.portfolio-item'); const modal = document.getElementById('project-modal'); const modalClose = document.querySelector('.modal-close'); const modalData = document.getElementById('modal-data'); const customCursor = document.querySelector('.custom-cursor'); const submitFormBtn = document.getElementById('submit-form'); // Project Data const projectDetails = { chromatic: { title: "Chromatic Dreams", description: "An exploration of color theory through digital manipulation, creating abstract landscapes that evoke emotional responses through carefully calibrated color harmonies.", techniques: "Digital painting, procedural generation, color theory", year: "2023", image: "https://images.unsplash.com/photo-1549887552-cb1071d3e5ca" }, fluidity: { title: "Fluid Motions", description: "A series of animated digital artworks that capture the essence of liquid movement, inspired by the natural flow of water and air currents.", techniques: "After Effects, 3D modeling, particle systems", year: "2023", image: "https://images.unsplash.com/photo-1550859492-d5da9d8e45f3" }, pastel: { title: "Pastel Horizons", description: "Illustrated landscapes that blend dreamlike pastel palettes with surreal architectural elements, creating environments that exist between reality and imagination.", techniques: "Digital illustration, color grading, atmospheric perspective", year: "2022", image: "https://images.unsplash.com/photo-1517697471339-4aa32003c11a" }, gradient: { title: "Gradient Landscapes", description: "A UI design system that implements fluid gradient transitions as its core visual language, creating intuitive and emotionally responsive interfaces.", techniques: "UI/UX design, CSS animations, interaction design", year: "2024", image: "https://images.unsplash.com/photo-1550684848-fac1c5b4e853" } }; // Navigation navButtons.forEach(button => { button.addEventListener('click', () => { const targetSection = button.getAttribute('data-section'); sections.forEach(section => { section.style.display = 'none'; section.classList.remove('animate-fade'); }); document.getElementById(targetSection).style.display = 'block'; setTimeout(() => { document.getElementById(targetSection).classList.add('animate-fade'); }, 10); navButtons.forEach(btn => btn.style.opacity = '0.7'); button.style.opacity = '1'; }); }); // Theme Toggle themeToggle.addEventListener('click', () => { document.body.classList.toggle('dark-theme'); if (document.body.classList.contains('dark-theme')) { themeIcon.textContent = '☀️'; } else { themeIcon.textContent = '🌙'; } }); // Color Shift Effect const gradients = [ ['#fbc2eb', '#a6c1ee'], ['#a1c4fd', '#c2e9fb'], ['#84fab0', '#8fd3f4'], ['#f6d365', '#fda085'], ['#ff9a9e', '#fad0c4'], ['#a18cd1', '#fbc2eb'], ['#ffecd2', '#fcb69f'] ]; let currentGradientIndex = 0; colorShiftBtn.addEventListener('click', () => { currentGradientIndex = (currentGradientIndex + 1) % gradients.length; const newGradient = gradients[currentGradientIndex]; document.querySelectorAll('.btn-primary').forEach(btn => { btn.style.backgroundImage = `linear-gradient(to right, ${newGradient[0]} 0%, ${newGradient[1]} 51%, ${newGradient[0]} 100%)`; }); document.querySelectorAll('.header-badge, .theme-switch, .custom-cursor').forEach(el => { el.style.background = `linear-gradient(135deg, ${newGradient[0]}, ${newGradient[1]})`; }); document.querySelector('h1').style.background = `linear-gradient(45deg, ${newGradient[0]}, ${newGradient[1]})`; document.querySelector('h1').style.webkitBackgroundClip = 'text'; document.querySelector('h1').style.backgroundClip = 'text'; }); // Portfolio Items Modal portfolioItems.forEach(item => { item.addEventListener('click', () => { const projectId = item.getAttribute('data-project'); const project = projectDetails[projectId]; modalData.innerHTML = ` <img src="${project.image}" alt="${project.title}" style="width: 100%; border-radius: 10px; margin-bottom: 1rem;"> <h2>${project.title}</h2> <p>${project.description}</p> <p><strong>Techniques:</strong> ${project.techniques}</p> <p><strong>Year:</strong> ${project.year}</p> `; modal.classList.add('open'); }); }); modalClose.addEventListener('click', () => { modal.classList.remove('open'); }); // Click outside modal to close modal.addEventListener('click', (e) => { if (e.target === modal) { modal.classList.remove('open'); } }); // Custom Cursor document.addEventListener('mousemove', (e) => { customCursor.style.left = `${e.clientX}px`; customCursor.style.top = `${e.clientY}px`; }); document.addEventListener('mousedown', () => { customCursor.style.width = '15px'; customCursor.style.height = '15px'; customCursor.style.opacity = '1'; }); document.addEventListener('mouseup', () => { customCursor.style.width = '20px'; customCursor.style.height = '20px'; customCursor.style.opacity = '0.7'; }); // Hover effects for buttons and portfolio items const interactiveElements = document.querySelectorAll('.gradient-btn, .portfolio-item'); interactiveElements.forEach(element => { element.addEventListener('mouseenter', () => { customCursor.style.width = '40px'; customCursor.style.height = '40px'; customCursor.style.opacity = '0.5'; }); element.addEventListener('mouseleave', () => { customCursor.style.width = '20px'; customCursor.style.height = '20px'; customCursor.style.opacity = '0.7'; }); }); // Form submission (prevent actual submission) submitFormBtn.addEventListener('click', (e) => { e.preventDefault(); const nameField = document.getElementById('name'); const emailField = document.getElementById('email'); const messageField = document.getElementById('message'); // Simple validation if (nameField.value && emailField.value && messageField.value) { // Show success message in the form area const contactSection = document.getElementById('contact'); contactSection.innerHTML = ` <h2>Message Sent Successfully!</h2> <p>Thank you for reaching out, ${nameField.value}. I'll review your project details and get back to you within 48 hours at ${emailField.value}.</p> <button class="gradient-btn btn-primary" id="reset-form">Send Another Message</button> `; // Add event listener to the new button document.getElementById('reset-form').addEventListener('click', () => { window.location.reload(); }); } else { // Simple validation feedback (in a real app, you'd want more robust validation) const emptyFields = []; if (!nameField.value) emptyFields.push('Name'); if (!emailField.value) emptyFields.push('Email'); if (!messageField.value) emptyFields.push('Message'); alert(`Please fill in the following fields: ${emptyFields.join(', ')}`); } }); // Initialize - show portfolio section by default document.getElementById('portfolio').style.display = 'block'; </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Velvet Premium Subscription</title> <style> :root { --primary-violet: #8A2BE2; --primary-pink: #FF69B4; --dark-violet: #4B0082; --light-pink: #FFC0CB; --off-white: #F9F5FF; --dark-bg: #1F1133; --transition-time: 0.5s; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body, html { height: 100%; background-color: var(--dark-bg); color: var(--off-white); overflow-x: hidden; } .container { width: 100%; height: 100%; padding: 1.5rem; display: flex; flex-direction: column; align-items: center; justify-content: center; position: relative; max-width: 700px; margin: 0 auto; overflow: hidden; } .background-glow { position: absolute; width: 300px; height: 300px; border-radius: 50%; background: radial-gradient(circle, rgba(255,105,180,0.3) 0%, rgba(138,43,226,0.2) 50%, transparent 70%); filter: blur(30px); z-index: -1; animation: pulse 8s infinite alternate; } .circle-1 { top: -50px; right: -50px; } .circle-2 { bottom: 100px; left: -100px; } @keyframes pulse { 0% { transform: scale(1); opacity: 0.4; } 100% { transform: scale(1.3); opacity: 0.7; } } .header { text-align: center; margin-bottom: 2rem; position: relative; } .logo { display: flex; align-items: center; justify-content: center; margin-bottom: 1.5rem; } .logo-icon { width: 60px; height: 60px; border-radius: 20px; background: linear-gradient(120deg, var(--primary-violet), var(--primary-pink)); position: relative; overflow: hidden; display: flex; align-items: center; justify-content: center; } .logo-icon:before { content: 'V'; color: white; font-size: 36px; font-weight: bold; } .logo-text { margin-left: 12px; font-size: 1.8rem; font-weight: bold; background: linear-gradient(120deg, var(--primary-pink), var(--primary-violet)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; } h1 { font-size: 2.25rem; margin-bottom: 1rem; line-height: 1.2; font-weight: 700; } .tagline { font-size: 1.1rem; opacity: 0.9; margin-bottom: 1rem; font-weight: 300; max-width: 540px; } .benefits { display: flex; flex-wrap: wrap; gap: 1.5rem; justify-content: center; margin: 1.5rem 0; } .benefit-card { background: rgba(255, 255, 255, 0.05); backdrop-filter: blur(10px); border-radius: 12px; padding: 1.2rem; width: calc(50% - 0.75rem); min-width: 200px; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); transition: transform var(--transition-time), box-shadow var(--transition-time); position: relative; overflow: hidden; } .benefit-card:hover { transform: translateY(-5px); box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15); } .benefit-card::before { content: ''; position: absolute; top: 0; left: 0; width: 4px; height: 100%; background: linear-gradient(to bottom, var(--primary-violet), var(--primary-pink)); border-radius: 4px 0 0 4px; } .benefit-icon { font-size: 1.5rem; margin-bottom: 0.8rem; display: inline-block; background: linear-gradient(120deg, var(--primary-pink), var(--primary-violet)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; } .benefit-title { font-size: 1.1rem; font-weight: 600; margin-bottom: 0.5rem; } .benefit-desc { font-size: 0.9rem; opacity: 0.8; line-height: 1.4; } .pricing { margin: 2rem 0; width: 100%; max-width: 500px; background: rgba(255, 255, 255, 0.05); backdrop-filter: blur(10px); border-radius: 16px; padding: 1.5rem; text-align: center; position: relative; overflow: hidden; box-shadow: 0 8px 30px rgba(0, 0, 0, 0.2); } .pricing::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, var(--primary-violet), var(--primary-pink), var(--primary-violet)); background-size: 200% 100%; animation: gradientMove 3s infinite linear; } @keyframes gradientMove { 0% { background-position: 0% 0%; } 100% { background-position: 200% 0%; } } .price-title { font-size: 1.2rem; margin-bottom: 0.6rem; } .price { font-size: 3rem; font-weight: 700; margin-bottom: 0.5rem; position: relative; display: inline-block; } .price span { font-size: 1rem; position: relative; top: -1.5rem; } .price-period { font-size: 0.9rem; opacity: 0.7; margin-bottom: 1.2rem; } .price-features { margin: 1.5rem 0; text-align: left; } .price-feature { margin-bottom: 0.8rem; display: flex; align-items: center; } .price-feature:before { content: '✓'; display: inline-block; margin-right: 10px; color: var(--primary-pink); font-weight: bold; } .action-buttons { display: flex; flex-direction: column; gap: 1rem; width: 100%; max-width: 400px; margin: 0 auto; } .gradient-btn { background: linear-gradient(120deg, var(--primary-violet), var(--primary-pink)); color: white; border: none; padding: 1rem 2rem; border-radius: 50px; font-size: 1rem; font-weight: 600; cursor: pointer; transition: all var(--transition-time); position: relative; overflow: hidden; z-index: 1; box-shadow: 0 4px 15px rgba(138, 43, 226, 0.4); } .gradient-btn::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(120deg, var(--dark-violet), var(--primary-violet), var(--primary-pink)); opacity: 0; z-index: -1; transition: opacity var(--transition-time); } .gradient-btn:hover { transform: translateY(-3px); box-shadow: 0 8px 25px rgba(138, 43, 226, 0.6); } .gradient-btn:hover::before { opacity: 1; } .gradient-btn:active { transform: translateY(0); } .gradient-btn.primary { background-size: 200% 100%; animation: gradientShift 3s infinite alternate; } @keyframes gradientShift { 0% { background-position: 0% 50%; } 100% { background-position: 100% 50%; } } .btn-glow { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border-radius: 50px; z-index: -2; transition: all var(--transition-time); opacity: 0; background: radial-gradient(circle at center, rgba(255, 105, 180, 0.8) 0%, rgba(138, 43, 226, 0.4) 60%, transparent 70%); filter: blur(15px); } .gradient-btn:hover .btn-glow { opacity: 0.7; transform: scale(1.1); } .secondary-btn { background: transparent; color: var(--off-white); border: 1px solid rgba(255, 255, 255, 0.3); padding: 1rem 2rem; border-radius: 50px; font-size: 1rem; font-weight: 500; cursor: pointer; transition: all var(--transition-time); } .secondary-btn:hover { background: rgba(255, 255, 255, 0.1); border-color: rgba(255, 255, 255, 0.5); } .testimonials { margin-top: 2rem; margin-bottom: 1rem; text-align: center; } .testimonial-container { margin-top: 1.5rem; display: flex; overflow-x: auto; scroll-snap-type: x mandatory; gap: 1.5rem; -ms-overflow-style: none; scrollbar-width: none; padding-bottom: 1rem; } .testimonial-container::-webkit-scrollbar { display: none; } .testimonial { scroll-snap-align: center; flex: 0 0 calc(100% - 2rem); padding: 1.5rem; background: rgba(255, 255, 255, 0.05); backdrop-filter: blur(10px); border-radius: 12px; text-align: left; position: relative; } .testimonial::before { content: '"'; position: absolute; top: 10px; left: 15px; font-size: 3rem; opacity: 0.2; font-family: serif; } .testimonial-quote { font-style: italic; margin-bottom: 1rem; font-size: 0.95rem; line-height: 1.5; } .testimonial-author { display: flex; align-items: center; } .author-avatar { width: 40px; height: 40px; border-radius: 50%; background: linear-gradient(120deg, var(--primary-violet), var(--primary-pink)); margin-right: 12px; display: flex; align-items: center; justify-content: center; font-weight: bold; color: white; } .author-info { font-size: 0.9rem; } .author-name { font-weight: 600; } .author-title { opacity: 0.7; font-size: 0.8rem; } .faq { margin: 2rem 0; width: 100%; } .faq-title { text-align: center; margin-bottom: 1.5rem; } .faq-item { margin-bottom: 1rem; border-radius: 12px; overflow: hidden; background: rgba(255, 255, 255, 0.05); backdrop-filter: blur(10px); } .faq-question { padding: 1rem; cursor: pointer; display: flex; justify-content: space-between; align-items: center; font-weight: 600; transition: background-color var(--transition-time); } .faq-question:hover { background: rgba(255, 255, 255, 0.1); } .faq-toggle { width: 20px; height: 20px; display: flex; align-items: center; justify-content: center; transition: transform var(--transition-time); } .faq-toggle::before, .faq-toggle::after { content: ''; position: absolute; background-color: white; } .faq-toggle::before { width: 12px; height: 2px; } .faq-toggle::after { width: 2px; height: 12px; transition: transform var(--transition-time); } .faq-item.active .faq-toggle::after { transform: scaleY(0); } .faq-answer { max-height: 0; overflow: hidden; transition: max-height var(--transition-time); padding: 0 1rem; font-size: 0.95rem; line-height: 1.5; opacity: 0.8; } .faq-item.active .faq-answer { max-height: 200px; padding: 0 1rem 1rem; } .footer { text-align: center; margin-top: 2rem; font-size: 0.8rem; opacity: 0.6; } .limited-offer { display: inline-block; background: linear-gradient(120deg, var(--primary-pink), var(--primary-violet)); padding: 0.3rem 0.8rem; border-radius: 20px; font-size: 0.8rem; font-weight: 600; margin-bottom: 0.5rem; text-transform: uppercase; letter-spacing: 1px; animation: pulse-light 2s infinite; } @keyframes pulse-light { 0% { box-shadow: 0 0 0 0 rgba(255, 105, 180, 0.5); } 70% { box-shadow: 0 0 0 10px rgba(255, 105, 180, 0); } 100% { box-shadow: 0 0 0 0 rgba(255, 105, 180, 0); } } /* Responsive Design */ @media (max-width: 600px) { h1 { font-size: 1.8rem; } .tagline { font-size: 1rem; } .benefit-card { width: 100%; } .price { font-size: 2.5rem; } .gradient-btn, .secondary-btn { padding: 0.8rem 1.5rem; } } @media (max-width: 400px) { .container { padding: 1rem; } h1 { font-size: 1.5rem; } .logo-icon { width: 50px; height: 50px; } .logo-text { font-size: 1.5rem; } } /* Scrollbar styles */ ::-webkit-scrollbar { width: 10px; height: 10px; } ::-webkit-scrollbar-track { background: rgba(255, 255, 255, 0.05); } ::-webkit-scrollbar-thumb { background: linear-gradient(var(--primary-violet), var(--primary-pink)); border-radius: 5px; } ::-webkit-scrollbar-thumb:hover { background: linear-gradient(var(--primary-pink), var(--primary-violet)); } /* Form Styles */ .email-form { position: relative; width: 100%; margin-bottom: 1rem; } .email-input { width: 100%; padding: 1rem 1.5rem; border-radius: 50px; border: 1px solid rgba(255, 255, 255, 0.2); background: rgba(255, 255, 255, 0.05); color: white; font-size: 1rem; transition: all var(--transition-time); } .email-input:focus { outline: none; border-color: var(--primary-pink); box-shadow: 0 0 0 3px rgba(255, 105, 180, 0.3); } .email-input::placeholder { color: rgba(255, 255, 255, 0.5); } /* Floating Elements */ .floating-elements { position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden; pointer-events: none; z-index: -1; } .floating-element { position: absolute; width: 80px; height: 80px; border-radius: 50%; background: linear-gradient(120deg, rgba(138, 43, 226, 0.1), rgba(255, 105, 180, 0.1)); filter: blur(20px); } .element-1 { top: 20%; left: 10%; animation: float 15s infinite linear alternate; } .element-2 { top: 60%; right: 15%; width: 120px; height: 120px; animation: float 18s infinite linear alternate-reverse; } .element-3 { bottom: 10%; left: 30%; width: 60px; height: 60px; animation: float 12s infinite linear alternate; } @keyframes float { 0% { transform: translate(0, 0) rotate(0deg); } 33% { transform: translate(50px, 20px) rotate(120deg); } 66% { transform: translate(-30px, 40px) rotate(240deg); } 100% { transform: translate(20px, -30px) rotate(360deg); } } </style> </head> <body> <div class="container"> <div class="background-glow circle-1"></div> <div class="background-glow circle-2"></div> <div class="floating-elements"> <div class="floating-element element-1"></div> <div class="floating-element element-2"></div> <div class="floating-element element-3"></div> </div> <div class="header"> <div class="logo"> <div class="logo-icon"></div> <div class="logo-text">Velvet</div> </div> <div class="limited-offer">Limited Time Offer</div> <h1>Experience Luxury in Digital Form</h1> <p class="tagline">Join our elite clientele with access to premium services tailored for the discerning individual. Elevate your experience with Velvet.</p> </div> <div class="benefits"> <div class="benefit-card"> <div class="benefit-icon">✦</div> <h3 class="benefit-title">Exclusive Content</h3> <p class="benefit-desc">Access to our curated library of premium content not available to the general public.</p> </div> <div class="benefit-card"> <div class="benefit-icon">✦</div> <h3 class="benefit-title">Priority Support</h3> <p class="benefit-desc">Dedicated concierge team available 24/7 to assist with your every need.</p> </div> <div class="benefit-card"> <div class="benefit-icon">✦</div> <h3 class="benefit-title">VIP Events</h3> <p class="benefit-desc">Invitations to exclusive member-only events and private gatherings.</p> </div> <div class="benefit-card"> <div class="benefit-icon">✦</div> <h3 class="benefit-title">Early Access</h3> <p class="benefit-desc">Be first in line for new releases, features, and limited collections.</p> </div> </div> <div class="pricing"> <h3 class="price-title">Elite Membership</h3> <div class="price"><span>$</span>199</div> <div class="price-period">per month</div> <div class="price-features"> <div class="price-feature">Unlimited access to all premium services</div> <div class="price-feature">Personalized recommendations</div> <div class="price-feature">Member-exclusive discounts</div> <div class="price-feature">No contract, cancel anytime</div> </div> </div> <div class="email-form"> <input type="email" class="email-input" placeholder="Enter your email address" required> </div> <div class="action-buttons"> <button class="gradient-btn primary" id="subscribe-btn"> Start Your Elite Experience <div class="btn-glow"></div> </button> <button class="secondary-btn" id="learn-more-btn">Learn More</button> </div> <div class="testimonials"> <h3>What Our Members Say</h3> <div class="testimonial-container"> <div class="testimonial"> <p class="testimonial-quote">Velvet has truly redefined luxury in the digital space. The exclusivity and attention to detail is unmatched in today's market.</p> <div class="testimonial-author"> <div class="author-avatar">AJ</div> <div class="author-info"> <div class="author-name">Alexandra James</div> <div class="author-title">Executive Director</div> </div> </div> </div> <div class="testimonial"> <p class="testimonial-quote">The personalized service and exclusive events have made this subscription invaluable to me. Worth every penny of the premium price.</p> <div class="testimonial-author"> <div class="author-avatar">MR</div> <div class="author-info"> <div class="author-name">Michael Reynolds</div> <div class="author-title">Entrepreneur</div> </div> </div> </div> </div> </div> <div class="faq"> <h3 class="faq-title">Frequently Asked Questions</h3> <div class="faq-item"> <div class="faq-question"> How exclusive is the membership? <div class="faq-toggle"></div> </div> <div class="faq-answer"> Our membership is limited to ensure personalized service and exclusive experiences. We maintain a cap on total members to preserve the quality of our community. </div> </div> <div class="faq-item"> <div class="faq-question"> Can I cancel my subscription? <div class="faq-toggle"></div> </div> <div class="faq-answer"> Yes, you can cancel your Elite Membership at any time. There are no contracts or hidden fees. Your benefits will continue until the end of your current billing period. </div> </div> <div class="faq-item"> <div class="faq-question"> What sets Velvet apart from other services? <div class="faq-toggle"></div> </div> <div class="faq-answer"> Velvet offers unparalleled exclusivity, premium content curation, and personalized experiences that are constantly evolving. Our dedicated concierge team ensures that every member receives individual attention. </div> </div> </div> <div class="footer"> © 2023 Velvet Elite Membership. All rights reserved. </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // FAQ Functionality const faqItems = document.querySelectorAll('.faq-item'); faqItems.forEach(item => { const question = item.querySelector('.faq-question'); question.addEventListener('click', () => { item.classList.toggle('active'); // Close other items faqItems.forEach(otherItem => { if (otherItem !== item) { otherItem.classList.remove('active'); } }); }); }); // Gradient Button Hover Effects const gradientBtns = document.querySelectorAll('.gradient-btn'); gradientBtns.forEach(btn => { btn.addEventListener('mousemove', e => { const rect = btn.getBoundingClientRect(); const x = ((e.clientX - rect.left) / btn.offsetWidth) * 100; const y = ((e.clientY - rect.top) / btn.offsetHeight) * 100; // Adjust the glow position const glow = btn.querySelector('.btn-glow'); if (glow) { glow.style.background = `radial-gradient(circle at ${x}% ${y}%, rgba(255, 105, 180, 0.8) 0%, rgba(138, 43, 226, 0.4) 60%, transparent 70%)`; } }); }); // Button Clicks const subscribeBtn = document.getElementById('subscribe-btn'); const learnMoreBtn = document.getElementById('learn-more-btn'); const emailInput = document.querySelector('.email-input'); subscribeBtn.addEventListener('click', () => { const email = emailInput.value; if(isValidEmail(email)) { // Visually indicate success subscribeBtn.textContent = "Subscription Confirmed!"; subscribeBtn.style.background = "linear-gradient(120deg, #32CD32, #008000)"; emailInput.style.borderColor = "#32CD32"; // Reset after 3 seconds setTimeout(() => { subscribeBtn.textContent = "Start Your Elite Experience"; subscribeBtn.style.background = ""; emailInput.style.borderColor = ""; emailInput.value = ""; }, 3000); } else { // Shake the email input to indicate invalid email emailInput.classList.add('shake'); emailInput.style.borderColor = "#FF4444"; setTimeout(() => { emailInput.classList.remove('shake'); emailInput.style.borderColor = ""; }, 600); } }); learnMoreBtn.addEventListener('click', () => { // Smooth scroll to FAQs section document.querySelector('.faq').scrollIntoView({ behavior: 'smooth' }); }); // Horizontal scroll for testimonials const testimonialContainer = document.querySelector('.testimonial-container'); let isDown = false; let startX; let scrollLeft; testimonialContainer.addEventListener('mousedown', (e) => { isDown = true; testimonialContainer.style.cursor = 'grabbing'; startX = e.pageX - testimonialContainer.offsetLeft; scrollLeft = testimonialContainer.scrollLeft; }); testimonialContainer.addEventListener('mouseleave', () => { isDown = false; testimonialContainer.style.cursor = 'grab'; }); testimonialContainer.addEventListener('mouseup', () => { isDown = false; testimonialContainer.style.cursor = 'grab'; }); testimonialContainer.addEventListener('mousemove', (e) => { if(!isDown) return; e.preventDefault(); const x = e.pageX - testimonialContainer.offsetLeft; const walk = (x - startX) * 2; testimonialContainer.scrollLeft = scrollLeft - walk; }); // Auto scrolling for testimonials let scrollAmount = 0; const scrollStep = 1; let scrollInterval; function startScrolling() { scrollInterval = setInterval(() => { testimonialContainer.scrollBy(scrollStep, 0); scrollAmount += scrollStep; // Reset scroll when we reach the end if (scrollAmount >= testimonialContainer.scrollWidth / 2) { testimonialContainer.scrollTo(0, 0); scrollAmount = 0; } }, 30); } function stopScrolling() { clearInterval(scrollInterval); } // Start auto-scrolling after a brief delay setTimeout(startScrolling, 3000); // Stop scrolling when user interacts with the testimonials testimonialContainer.addEventListener('mouseenter', stopScrolling); testimonialContainer.addEventListener('touchstart', stopScrolling); // Resume scrolling when user stops interacting testimonialContainer.addEventListener('mouseleave', startScrolling); testimonialContainer.addEventListener('touchend', () => { setTimeout(startScrolling, 3000); }); // Helper function to validate email function isValidEmail(email) { const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return re.test(email); } // Add shake animation const style = document.createElement('style'); style.textContent = ` @keyframes shake { 0%, 100% { transform: translateX(0); } 10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); } 20%, 40%, 60%, 80% { transform: translateX(5px); } } .shake { animation: shake 0.6s ease-in-out; } `; document.head.appendChild(style); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>SaaS Dashboard Interface Elements</title> <style> * { 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: #f5f7fa; display: flex; justify-content: center; align-items: center; min-height: 700px; color: #333; } .dashboard-container { width: 100%; max-width: 680px; height: 680px; background-color: #fff; border-radius: 16px; box-shadow: 0 10px 25px rgba(0, 0, 0, 0.05); padding: 28px; display: flex; flex-direction: column; overflow: hidden; position: relative; } .dashboard-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 24px; } .dashboard-title { font-size: 24px; font-weight: 700; color: #1A2B42; } .dashboard-subtitle { font-size: 14px; color: #647287; margin-top: 4px; } .dashboard-content { flex: 1; display: grid; grid-template-columns: repeat(2, 1fr); grid-template-rows: repeat(2, 1fr); gap: 20px; margin-bottom: 20px; } .dashboard-card { background-color: #F8FAFC; border-radius: 12px; padding: 20px; display: flex; flex-direction: column; justify-content: space-between; transition: all 0.3s ease; border: 1px solid #EAEEF3; } .dashboard-card:hover { transform: translateY(-5px); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.05); } .card-title { font-size: 15px; font-weight: 600; color: #475467; margin-bottom: 14px; } .card-value { font-size: 28px; font-weight: 700; color: #1A2B42; margin-bottom: 8px; } .card-change { font-size: 13px; font-weight: 500; display: flex; align-items: center; } .positive { color: #10B981; } .negative { color: #EF4444; } .action-bar { display: flex; justify-content: space-between; align-items: center; padding: 16px 0; border-top: 1px solid #EAEEF3; } /* Gradient Button Styles */ .btn { padding: 12px 20px; font-size: 14px; font-weight: 500; border-radius: 8px; border: 1px solid transparent; cursor: pointer; transition: all 0.2s ease; position: relative; overflow: hidden; display: inline-flex; align-items: center; justify-content: center; text-decoration: none; } .btn-icon { margin-right: 8px; display: flex; } .btn-primary { background: linear-gradient(135deg, #3B82F6 0%, #2563EB 100%); color: white; border: 1px solid rgba(255, 255, 255, 0.1); } .btn-primary:hover { background: linear-gradient(135deg, #4B93FF 0%, #3373FB 100%); box-shadow: 0 4px 12px rgba(37, 99, 235, 0.2); border: 1px solid rgba(255, 255, 255, 0.25); } .btn-secondary { background: linear-gradient(135deg, #F8FAFC 0%, #EFF3F8 100%); color: #1E40AF; border: 1px solid #D1D9E6; } .btn-secondary:hover { background: linear-gradient(135deg, #FFFFFF 0%, #F1F5FB 100%); box-shadow: 0 4px 12px rgba(37, 99, 235, 0.1); border: 1px solid #3B82F6; } .btn-outline { background: transparent; color: #3B82F6; border: 1px solid #D1D9E6; } .btn-outline:hover { background: linear-gradient(135deg, #F0F7FF 0%, #E6F0FD 100%); border: 1px solid #3B82F6; } .btn:active { transform: translateY(1px); } /* Button ripple effect */ .ripple { position: absolute; border-radius: 50%; background-color: rgba(255, 255, 255, 0.4); transform: scale(0); animation: ripple 0.6s linear; pointer-events: none; } @keyframes ripple { to { transform: scale(4); opacity: 0; } } .button-group { display: flex; gap: 12px; } .notification-badge { position: absolute; top: -8px; right: -8px; width: 18px; height: 18px; background-color: #EF4444; color: white; border-radius: 50%; font-size: 11px; display: flex; align-items: center; justify-content: center; font-weight: 600; } .btn-icon-only { width: 42px; height: 42px; padding: 0; border-radius: 8px; position: relative; } /* Toast notification */ .toast { position: absolute; top: 20px; right: 20px; background: linear-gradient(135deg, #3B82F6 0%, #2563EB 100%); color: white; padding: 12px 20px; border-radius: 8px; box-shadow: 0 4px 12px rgba(37, 99, 235, 0.3); display: flex; align-items: center; transform: translateX(120%); transition: transform 0.3s ease; z-index: 1000; } .toast.show { transform: translateX(0); } .toast-icon { margin-right: 12px; } .toast-message { font-size: 14px; font-weight: 500; } .small-text { font-size: 13px; color: #64748B; } /* For smaller screens */ @media (max-width: 600px) { .dashboard-content { grid-template-columns: 1fr; grid-template-rows: repeat(4, 1fr); } .dashboard-card { padding: 16px; } .action-bar { flex-direction: column; gap: 16px; } .button-group { width: 100%; justify-content: space-between; } .btn { padding: 10px 16px; font-size: 13px; } } </style> </head> <body> <div class="dashboard-container"> <div class="dashboard-header"> <div> <h1 class="dashboard-title">Analytics Dashboard</h1> <p class="dashboard-subtitle">Real-time metrics for your SaaS platform</p> </div> <button class="btn btn-outline btn-icon-only" id="notificationBtn"> <div class="notification-badge">3</div> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12 22C13.1 22 14 21.1 14 20H10C10 21.1 10.9 22 12 22ZM18 16V11C18 7.93 16.36 5.36 13.5 4.68V4C13.5 3.17 12.83 2.5 12 2.5C11.17 2.5 10.5 3.17 10.5 4V4.68C7.63 5.36 6 7.92 6 11V16L4 18V19H20V18L18 16Z" fill="#3B82F6"/> </svg> </button> </div> <div class="dashboard-content"> <div class="dashboard-card"> <div class="card-title">Active Users</div> <div> <div class="card-value">8,294</div> <div class="card-change positive"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M7 14L12 9L17 14H7Z" fill="#10B981"/> </svg> +12.5% from last week </div> </div> </div> <div class="dashboard-card"> <div class="card-title">Conversion Rate</div> <div> <div class="card-value">3.2%</div> <div class="card-change negative"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M7 10L12 15L17 10H7Z" fill="#EF4444"/> </svg> -0.8% from last week </div> </div> </div> <div class="dashboard-card"> <div class="card-title">Average Session Time</div> <div> <div class="card-value">4:32</div> <div class="card-change positive"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M7 14L12 9L17 14H7Z" fill="#10B981"/> </svg> +0:46 from last week </div> </div> </div> <div class="dashboard-card"> <div class="card-title">Monthly Revenue</div> <div> <div class="card-value">$42,582</div> <div class="card-change positive"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M7 14L12 9L17 14H7Z" fill="#10B981"/> </svg> +18.3% from last month </div> </div> </div> </div> <div class="action-bar"> <span class="small-text">Last updated: Today at 15:42</span> <div class="button-group"> <button class="btn btn-secondary" id="exportBtn"> <span class="btn-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M19 9H15V3H9V9H5L12 16L19 9ZM5 18V20H19V18H5Z" fill="#1E40AF"/> </svg> </span> Export Data </button> <button class="btn btn-primary" id="insightsBtn"> <span class="btn-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M9 21C9 21.55 9.45 22 10 22H14C14.55 22 15 21.55 15 21V20H9V21ZM12 2C8.14 2 5 5.14 5 9C5 11.38 6.19 13.47 8 14.74V17C8 17.55 8.45 18 9 18H15C15.55 18 16 17.55 16 17V14.74C17.81 13.47 19 11.38 19 9C19 5.14 15.86 2 12 2ZM14.85 13.1L14 13.7V16H10V13.7L9.15 13.1C7.8 12.16 7 10.63 7 9C7 6.24 9.24 4 12 4C14.76 4 17 6.24 17 9C17 10.63 16.2 12.16 14.85 13.1Z" fill="white"/> </svg> </span> Generate Insights </button> </div> </div> <div class="toast" id="toast"> <div class="toast-icon"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M9 16.17L4.83 12L3.41 13.41L9 19L21 7L19.59 5.59L9 16.17Z" fill="white"/> </svg> </div> <div class="toast-message" id="toast-message">Action completed successfully</div> </div> </div> <script> // Ripple effect for buttons const buttons = document.querySelectorAll('.btn'); buttons.forEach(button => { button.addEventListener('click', function(e) { const x = e.clientX - e.target.getBoundingClientRect().left; const y = e.clientY - e.target.getBoundingClientRect().top; const ripple = document.createElement('span'); ripple.classList.add('ripple'); ripple.style.left = `${x}px`; ripple.style.top = `${y}px`; this.appendChild(ripple); setTimeout(() => { ripple.remove(); }, 600); }); }); // Toast notification function function showToast(message, duration = 3000) { const toast = document.getElementById('toast'); const toastMessage = document.getElementById('toast-message'); toastMessage.textContent = message; toast.classList.add('show'); setTimeout(() => { toast.classList.remove('show'); }, duration); } // Button click handlers document.getElementById('exportBtn').addEventListener('click', function() { showToast('Data exported successfully to CSV'); }); document.getElementById('insightsBtn').addEventListener('click', function() { showToast('Generating insights report...'); // Simulate loading time setTimeout(() => { showToast('Insights report ready for viewing'); }, 2000); }); document.getElementById('notificationBtn').addEventListener('click', function() { showToast('You have 3 unread notifications'); const badge = this.querySelector('.notification-badge'); badge.style.display = 'none'; // Reset badge after 5 seconds for demo purposes setTimeout(() => { badge.style.display = 'flex'; }, 5000); }); // Simulate a data update for the dashboard cards function updateDashboardData() { const cards = document.querySelectorAll('.dashboard-card'); cards.forEach(card => { card.style.transition = 'transform 0.3s ease, box-shadow 0.3s ease, background-color 0.3s ease'; card.style.backgroundColor = '#F0F7FF'; setTimeout(() => { card.style.backgroundColor = '#F8FAFC'; }, 500); }); document.querySelector('.small-text').textContent = 'Last updated: Just now'; } // Simulate data update every 30 seconds setInterval(updateDashboardData, 30000); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>FestivalRush - Event Booking Platform</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { background-color: #0d1117; color: #ffffff; height: 100vh; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 20px; overflow-x: hidden; max-width: 700px; margin: 0 auto; } .container { width: 100%; max-width: 650px; padding: 30px; background: linear-gradient(145deg, #111922, #1a2634); border-radius: 16px; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); position: relative; overflow: hidden; } .container::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(45deg, rgba(255, 0, 0, 0.05), rgba(255, 165, 0, 0.05)); pointer-events: none; } h1 { font-size: 28px; margin-bottom: 20px; text-align: center; background: linear-gradient(to right, #ff4d4d, #ff8a00); -webkit-background-clip: text; background-clip: text; color: transparent; font-weight: 800; letter-spacing: -0.5px; } p.subtitle { text-align: center; margin-bottom: 25px; font-size: 16px; color: #a0aec0; line-height: 1.5; } .countdown { display: flex; justify-content: center; margin-bottom: 25px; gap: 15px; } .countdown-item { display: flex; flex-direction: column; align-items: center; background: rgba(255, 255, 255, 0.08); border-radius: 8px; padding: 10px 12px; min-width: 60px; } .countdown-value { font-size: 22px; font-weight: bold; color: #fff; } .countdown-label { font-size: 12px; color: #a0aec0; text-transform: uppercase; } .events { display: grid; grid-template-columns: 1fr; gap: 20px; margin-bottom: 20px; } .event-card { background: rgba(255, 255, 255, 0.05); border-radius: 12px; padding: 20px; position: relative; transition: all 0.3s ease; border: 1px solid rgba(255, 255, 255, 0.1); overflow: hidden; } .event-card:hover { transform: translateY(-5px); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2); background: rgba(255, 255, 255, 0.08); } .event-card h3 { font-size: 18px; margin-bottom: 10px; color: #fff; font-weight: 600; } .event-date { color: #ff6b6b; font-size: 14px; margin-bottom: 8px; font-weight: 500; } .event-location { color: #a0aec0; font-size: 14px; margin-bottom: 15px; display: flex; align-items: center; } .event-location::before { content: '📍'; margin-right: 5px; } .event-card p { color: #cbd5e0; font-size: 14px; line-height: 1.5; margin-bottom: 15px; } .seats-left { font-size: 14px; color: #ffd700; margin-bottom: 15px; font-weight: 500; } .gradient-btn { display: inline-block; padding: 12px 24px; border-radius: 50px; font-weight: bold; font-size: 15px; cursor: pointer; transition: all 0.3s ease; position: relative; overflow: hidden; text-align: center; color: white; background: linear-gradient(90deg, #ff4d4d, #ff7e5f, #ff8a00); background-size: 200% 100%; border: none; width: 100%; text-transform: uppercase; letter-spacing: 1px; } .gradient-btn:hover { background-position: 100% 0; box-shadow: 0 0 15px rgba(255, 77, 77, 0.5); animation: pulse 1.5s infinite; } @keyframes pulse { 0% { transform: scale(1); box-shadow: 0 0 0 0 rgba(255, 77, 77, 0.7); } 70% { transform: scale(1.02); box-shadow: 0 0 0 10px rgba(255, 77, 77, 0); } 100% { transform: scale(1); box-shadow: 0 0 0 0 rgba(255, 77, 77, 0); } } .sold-out-btn { display: inline-block; padding: 12px 24px; border-radius: 50px; font-weight: bold; font-size: 15px; text-align: center; color: #a0aec0; background: rgba(255, 255, 255, 0.1); width: 100%; text-transform: uppercase; letter-spacing: 1px; cursor: not-allowed; } .hot-badge { position: absolute; top: 15px; right: 15px; background: linear-gradient(90deg, #ff4d4d, #ff8a00); color: white; font-size: 12px; font-weight: bold; padding: 5px 10px; border-radius: 30px; text-transform: uppercase; animation: pulse-subtle 2s infinite; } @keyframes pulse-subtle { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } footer { text-align: center; margin-top: 20px; font-size: 14px; color: #718096; } .flash-sale { background: linear-gradient(90deg, rgba(255, 77, 77, 0.15), rgba(255, 138, 0, 0.15)); border-radius: 8px; padding: 15px; margin-bottom: 20px; display: flex; align-items: center; justify-content: space-between; border: 1px dashed rgba(255, 138, 0, 0.5); } .flash-sale-text { flex: 1; } .flash-sale h3 { color: #ff8a00; font-size: 16px; margin-bottom: 5px; } .flash-sale p { color: #d1d5db; font-size: 14px; margin: 0; } .promo-code { background: rgba(255, 255, 255, 0.15); padding: 8px 12px; border-radius: 4px; font-family: monospace; font-size: 16px; color: #fff; letter-spacing: 1px; font-weight: bold; border: 1px dashed #ff8a00; } @media (max-width: 600px) { .container { padding: 20px; } h1 { font-size: 24px; } .countdown { gap: 10px; } .countdown-item { min-width: 50px; padding: 8px 10px; } .countdown-value { font-size: 18px; } .countdown-label { font-size: 10px; } .flash-sale { flex-direction: column; text-align: center; gap: 10px; } } </style> </head> <body> <div class="container"> <h1>Experience the Rush</h1> <p class="subtitle">Limited spots for epic events happening this summer. Secure your spot before they're gone!</p> <div class="countdown"> <div class="countdown-item"> <span class="countdown-value" id="days">03</span> <span class="countdown-label">Days</span> </div> <div class="countdown-item"> <span class="countdown-value" id="hours">11</span> <span class="countdown-label">Hours</span> </div> <div class="countdown-item"> <span class="countdown-value" id="minutes">45</span> <span class="countdown-label">Mins</span> </div> <div class="countdown-item"> <span class="countdown-value" id="seconds">22</span> <span class="countdown-label">Secs</span> </div> </div> <div class="flash-sale"> <div class="flash-sale-text"> <h3>48-HOUR FLASH SALE</h3> <p>Get 25% off any event with code:</p> </div> <div class="promo-code">SIZZLE25</div> </div> <div class="events"> <div class="event-card"> <div class="hot-badge">HOT</div> <h3>SummerBeat Festival</h3> <div class="event-date">July 15-17, 2023</div> <div class="event-location">Sunset Beach Arena</div> <p>Three days of non-stop electronic music featuring 30+ global DJs, immersive art installations, and beachfront camping.</p> <div class="seats-left">Only 23 tickets remaining!</div> <button class="gradient-btn">Book Now</button> </div> <div class="event-card"> <h3>Culinary Masterclass</h3> <div class="event-date">June 28, 2023</div> <div class="event-location">Downtown Gastro Hub</div> <p>Learn to craft perfect pasta dishes with Michelin-starred Chef Marco Rossi. Includes wine pairing and take-home recipe book.</p> <div class="seats-left">Only 7 spots remaining!</div> <button class="gradient-btn">Secure Spot</button> </div> <div class="event-card"> <h3>Stadium Concert: Taylor Swift</h3> <div class="event-date">August 5, 2023</div> <div class="event-location">MetLife Stadium</div> <p>The most anticipated tour of the year with special guest performances. VIP packages with meet & greet available.</p> <div class="sold-out-btn">Sold Out</div> </div> </div> </div> <footer>Early bird prices end with the countdown. Book now to save up to 40%!</footer> <script> document.addEventListener('DOMContentLoaded', function() { // Countdown Timer function updateCountdown() { const now = new Date(); const target = new Date(now); target.setDate(target.getDate() + 3); target.setHours(now.getHours() + 11); target.setMinutes(now.getMinutes() + 45); target.setSeconds(now.getSeconds() + 22); const diff = target - now; const days = Math.floor(diff / (1000 * 60 * 60 * 24)); const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); const seconds = Math.floor((diff % (1000 * 60)) / 1000); document.getElementById('days').textContent = days.toString().padStart(2, '0'); document.getElementById('hours').textContent = hours.toString().padStart(2, '0'); document.getElementById('minutes').textContent = minutes.toString().padStart(2, '0'); document.getElementById('seconds').textContent = seconds.toString().padStart(2, '0'); } // Initial call updateCountdown(); // Update every second setInterval(updateCountdown, 1000); // Handle button clicks const bookButtons = document.querySelectorAll('.gradient-btn'); bookButtons.forEach(button => { button.addEventListener('click', function(e) { e.preventDefault(); const originalText = this.textContent; this.textContent = 'Processing...'; setTimeout(() => { this.textContent = 'Reserved!'; this.style.background = 'linear-gradient(90deg, #4caf50, #45a049)'; this.style.animation = 'none'; // Change back after 2 seconds setTimeout(() => { this.textContent = originalText; this.style.background = 'linear-gradient(90deg, #ff4d4d, #ff7e5f, #ff8a00)'; this.style.animation = ''; }, 2000); }, 1000); }); }); // Update remaining tickets randomly function updateRemainingTickets() { const seatsLeftElements = document.querySelectorAll('.seats-left'); seatsLeftElements.forEach(element => { const currentNumber = parseInt(element.textContent.match(/\d+/)[0]); if (currentNumber > 1) { const newNumber = Math.max(1, currentNumber - Math.floor(Math.random() * 3)); element.textContent = `Only ${newNumber} ${newNumber === 1 ? 'ticket' : 'tickets'} remaining!`; if (newNumber <= 5) { element.style.color = '#ff4d4d'; element.style.fontWeight = 'bold'; } } }); } // Update tickets every 15-45 seconds setInterval(updateRemainingTickets, Math.floor(Math.random() * 30000) + 15000); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Focus Flow - Educational App Interface</title> <style> @import url('https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&display=swap'); * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Outfit', sans-serif; } :root { --teal: #00897B; --mint: #ADEFD1; --light-teal: #B2DFDB; --deep-teal: #004D40; --soft-gray: #f3f5f7; --medium-gray: #c4c9d0; --dark-gray: #626870; } body { background-color: #f9fafb; height: 100vh; display: flex; justify-content: center; align-items: center; padding: 20px; } .app-container { width: 100%; max-width: 660px; height: 660px; background-color: white; border-radius: 24px; box-shadow: 0 10px 40px rgba(0, 0, 0, 0.05); padding: 28px; display: flex; flex-direction: column; overflow: hidden; position: relative; } header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 24px; } .logo { font-size: 24px; font-weight: 700; color: var(--deep-teal); } .logo span { color: var(--teal); } .user-profile { width: 42px; height: 42px; border-radius: 50%; background: linear-gradient(135deg, var(--mint), var(--teal)); display: flex; align-items: center; justify-content: center; color: white; font-weight: 600; cursor: pointer; transition: transform 0.3s ease; } .user-profile:hover { transform: scale(1.05); } .progress-container { margin-bottom: 20px; } .progress-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; } .progress-title { font-weight: 600; color: var(--dark-gray); font-size: 14px; } .progress-percentage { font-weight: 700; color: var(--teal); font-size: 14px; } .progress-bar { height: 8px; background-color: var(--soft-gray); border-radius: 4px; overflow: hidden; } .progress-fill { height: 100%; background: linear-gradient(90deg, var(--teal), var(--mint)); border-radius: 4px; width: 65%; transition: width 1s ease-in-out; } .module-title { font-weight: 700; color: var(--deep-teal); font-size: 20px; margin-bottom: 16px; } .lessons-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 28px; } .lesson-card { background-color: var(--soft-gray); border-radius: 16px; padding: 20px; cursor: pointer; transition: all 0.3s ease; position: relative; overflow: hidden; } .lesson-card:hover { transform: translateY(-5px); box-shadow: 0 8px 16px rgba(0, 0, 0, 0.05); } .lesson-icon { width: 44px; height: 44px; border-radius: 12px; background: linear-gradient(135deg, var(--light-teal), var(--teal)); display: flex; align-items: center; justify-content: center; color: white; font-size: 20px; margin-bottom: 12px; } .completed-icon { position: absolute; top: 10px; right: 10px; width: 20px; height: 20px; background-color: var(--teal); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 12px; color: white; } .lesson-title { font-weight: 600; color: var(--deep-teal); margin-bottom: 6px; font-size: 15px; } .lesson-details { font-size: 13px; color: var(--dark-gray); } .gradient-button { background: linear-gradient(90deg, var(--teal), var(--mint)); border: none; border-radius: 12px; padding: 16px 24px; color: white; font-weight: 600; font-size: 16px; cursor: pointer; transition: all 0.3s ease; position: relative; overflow: hidden; z-index: 1; outline: none; display: flex; align-items: center; justify-content: center; gap: 8px; box-shadow: 0 4px 12px rgba(0, 137, 123, 0.15); } .gradient-button:before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(90deg, var(--mint), var(--teal)); opacity: 0; z-index: -1; transition: opacity 0.3s ease; } .gradient-button:hover:before { opacity: 1; } .gradient-button:active { transform: scale(0.98); } .gradient-button i { transition: transform 0.3s ease; } .gradient-button:hover i { transform: translateX(3px); } .daily-challenge { background: linear-gradient(135deg, var(--mint), var(--teal)); border-radius: 16px; padding: 20px; display: flex; justify-content: space-between; align-items: center; margin-top: auto; } .challenge-info { color: white; } .challenge-title { font-weight: 700; margin-bottom: 4px; font-size: 16px; } .challenge-desc { font-size: 14px; opacity: 0.9; } .challenge-button { background-color: white; border: none; border-radius: 12px; padding: 10px 16px; color: var(--teal); font-weight: 600; font-size: 14px; cursor: pointer; transition: all 0.3s ease; } .challenge-button:hover { transform: scale(1.05); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); } .modal-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); display: flex; justify-content: center; align-items: center; opacity: 0; visibility: hidden; transition: all 0.3s ease; z-index: 100; } .modal-overlay.active { opacity: 1; visibility: visible; } .modal { background-color: white; border-radius: 20px; padding: 28px; width: 85%; max-width: 500px; transform: translateY(20px); transition: all 0.3s ease; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); } .modal-overlay.active .modal { transform: translateY(0); } .modal-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; } .modal-title { font-weight: 700; color: var(--deep-teal); font-size: 20px; } .close-button { background: none; border: none; font-size: 24px; color: var(--dark-gray); cursor: pointer; transition: color 0.3s ease; } .close-button:hover { color: var(--deep-teal); } .modal-content { margin-bottom: 24px; } .modal-text { color: var(--dark-gray); line-height: 1.5; margin-bottom: 16px; font-size: 15px; } .color-ring { position: absolute; bottom: -100px; right: -100px; width: 200px; height: 200px; border-radius: 50%; background: radial-gradient(circle, var(--mint) 0%, rgba(173, 239, 209, 0) 70%); opacity: 0.5; z-index: -1; } .color-ring-2 { position: absolute; top: -80px; left: -80px; width: 160px; height: 160px; border-radius: 50%; background: radial-gradient(circle, var(--teal) 0%, rgba(0, 137, 123, 0) 70%); opacity: 0.3; z-index: -1; } /* Responsive adjustments */ @media (max-width: 600px) { .lessons-grid { grid-template-columns: 1fr; } .app-container { height: auto; min-height: 660px; padding: 20px; } .module-title { font-size: 18px; } .gradient-button { padding: 14px 20px; font-size: 15px; } } /* Animations */ @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } @keyframes float { 0% { transform: translateY(0); } 50% { transform: translateY(-10px); } 100% { transform: translateY(0); } } .pulse-animation { animation: pulse 2s infinite ease-in-out; } .float-animation { animation: float 4s infinite ease-in-out; } </style> </head> <body> <div class="app-container"> <div class="color-ring"></div> <div class="color-ring-2"></div> <header> <div class="logo">Focus<span>Flow</span></div> <div class="user-profile">JS</div> </header> <div class="progress-container"> <div class="progress-header"> <div class="progress-title">CURRENT MODULE PROGRESS</div> <div class="progress-percentage">65%</div> </div> <div class="progress-bar"> <div class="progress-fill" id="progress-fill"></div> </div> </div> <h2 class="module-title">Data Analysis Fundamentals</h2> <div class="lessons-grid"> <div class="lesson-card" id="lesson-1"> <div class="completed-icon">✓</div> <div class="lesson-icon">📊</div> <div class="lesson-title">Data Visualization</div> <div class="lesson-details">8 topics • 25 min</div> </div> <div class="lesson-card" id="lesson-2"> <div class="completed-icon">✓</div> <div class="lesson-icon">📋</div> <div class="lesson-title">Statistical Analysis</div> <div class="lesson-details">6 topics • 20 min</div> </div> <div class="lesson-card" id="lesson-3"> <div class="lesson-icon">🔍</div> <div class="lesson-title">Data Interpretation</div> <div class="lesson-details">7 topics • 22 min</div> </div> <div class="lesson-card" id="lesson-4"> <div class="lesson-icon">📈</div> <div class="lesson-title">Trend Forecasting</div> <div class="lesson-details">5 topics • 18 min</div> </div> </div> <button class="gradient-button" id="continue-button"> Continue Learning <i>→</i> </button> <div class="daily-challenge"> <div class="challenge-info"> <div class="challenge-title">Daily Challenge</div> <div class="challenge-desc">Create a visualization from the sample dataset</div> </div> <button class="challenge-button" id="challenge-button">Begin</button> </div> </div> <div class="modal-overlay" id="modal-overlay"> <div class="modal"> <div class="modal-header"> <div class="modal-title">Data Interpretation</div> <button class="close-button" id="close-modal">×</button> </div> <div class="modal-content"> <p class="modal-text">In this lesson, you'll learn how to draw meaningful insights from analyzed data. We'll cover pattern recognition, contextual analysis, and how to communicate findings effectively.</p> <p class="modal-text">This skill is essential for turning raw data into actionable information that drives decision-making in organizations.</p> </div> <button class="gradient-button pulse-animation" id="start-lesson-button"> Start Lesson <i>→</i> </button> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Animation for progress bar on load setTimeout(() => { document.getElementById('progress-fill').style.width = '65%'; }, 300); // Lesson cards interaction const lessonCards = document.querySelectorAll('.lesson-card'); lessonCards.forEach(card => { card.addEventListener('click', function() { document.getElementById('modal-overlay').classList.add('active'); }); }); // Continue button interaction document.getElementById('continue-button').addEventListener('click', function() { // Simulate continuing to the next lesson document.getElementById('lesson-3').click(); }); // Challenge button interaction document.getElementById('challenge-button').addEventListener('click', function() { // Open modal with challenge details document.getElementById('modal-overlay').classList.add('active'); document.querySelector('.modal-title').textContent = 'Daily Challenge'; document.querySelector('.modal-content').innerHTML = ` <p class="modal-text">Today's challenge focuses on creating an insightful visualization using the provided sample dataset on consumer behavior.</p> <p class="modal-text">You'll practice selecting appropriate chart types, highlighting key patterns, and adding contextual annotations to make your visualization both informative and accessible.</p> `; document.getElementById('start-lesson-button').textContent = 'Begin Challenge →'; }); // Close modal button document.getElementById('close-modal').addEventListener('click', function() { document.getElementById('modal-overlay').classList.remove('active'); }); // Start lesson button in modal document.getElementById('start-lesson-button').addEventListener('click', function() { // Simulate starting the lesson document.getElementById('modal-overlay').classList.remove('active'); // Update progress setTimeout(() => { document.getElementById('progress-fill').style.width = '75%'; document.querySelector('.progress-percentage').textContent = '75%'; }, 300); }); // Close modal when clicking outside document.getElementById('modal-overlay').addEventListener('click', function(e) { if (e.target === this) { this.classList.remove('active'); } }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Tides & Horizons Travel Agency</title> <style> @import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;600;700&family=Playfair+Display:wght@400;600;700&display=swap'); * { margin: 0; padding: 0; box-sizing: border-box; } :root { --ocean-blue-light: #81d4fa; --ocean-blue-medium: #039be5; --ocean-blue-dark: #01579b; --sandy-gold-light: #ffe082; --sandy-gold-medium: #ffd54f; --sandy-gold-dark: #ffb300; --text-dark: #263238; --text-light: #f5f5f5; --background: #f9fbfd; } body { font-family: 'Montserrat', sans-serif; background-color: var(--background); color: var(--text-dark); line-height: 1.6; max-width: 700px; margin: 0 auto; height: 100vh; overflow-x: hidden; } header { padding: 1.5rem; display: flex; justify-content: space-between; align-items: center; position: relative; } .logo { font-family: 'Playfair Display', serif; font-weight: 700; font-size: 1.5rem; display: flex; align-items: center; background: linear-gradient(45deg, var(--ocean-blue-dark), var(--sandy-gold-dark)); -webkit-background-clip: text; background-clip: text; color: transparent; position: relative; } .logo::before { content: "✦"; font-size: 1.2rem; margin-right: 0.5rem; color: var(--sandy-gold-dark); } nav { display: flex; gap: 1.2rem; } nav a { color: var(--text-dark); text-decoration: none; font-weight: 500; transition: all 0.3s ease; font-size: 0.9rem; position: relative; } nav a::after { content: ''; position: absolute; width: 0; height: 2px; bottom: -4px; left: 0; background: linear-gradient(90deg, var(--ocean-blue-medium), var(--sandy-gold-medium)); transition: width 0.3s ease; } nav a:hover::after { width: 100%; } main { padding: 0 1.5rem 2rem; } .hero { position: relative; background: linear-gradient(135deg, rgba(1, 87, 155, 0.8), rgba(255, 179, 0, 0.6)), url('https://images.unsplash.com/photo-1507525428034-b723cf961d3e?ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=60'); background-size: cover; background-position: center; color: var(--text-light); border-radius: 12px; padding: 3rem 2rem; margin-bottom: 2rem; overflow: hidden; height: 250px; display: flex; flex-direction: column; justify-content: center; } .hero::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: radial-gradient(circle at top right, rgba(129, 212, 250, 0.3), transparent 50%); animation: shimmer 6s infinite alternate; } @keyframes shimmer { 0% { opacity: 0.5; transform: scale(1); } 100% { opacity: 0.8; transform: scale(1.2); } } .hero h1 { font-family: 'Playfair Display', serif; font-size: 2.4rem; font-weight: 600; margin-bottom: 1rem; position: relative; z-index: 2; } .hero p { font-size: 1rem; max-width: 500px; margin-bottom: 1.5rem; position: relative; z-index: 2; } .section-title { font-family: 'Playfair Display', serif; font-size: 1.5rem; margin-bottom: 1.5rem; position: relative; display: inline-block; } .section-title::after { content: ''; position: absolute; bottom: -8px; left: 0; width: 60px; height: 3px; background: linear-gradient(90deg, var(--ocean-blue-medium), var(--sandy-gold-medium)); } .wave-divider { width: 100%; height: 40px; background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1200 120' preserveAspectRatio='none'%3E%3Cpath d='M0,0V46.29c47.79,22.2,103.59,32.17,158,28,70.36-5.37,136.33-33.31,206.8-37.5C438.64,32.43,512.34,53.67,583,72.05c69.27,18,138.3,24.88,209.4,13.08,36.15-6,69.85-17.84,104.45-29.34C989.49,25,1113-14.29,1200,52.47V0Z' opacity='0.2' fill='%2303a9f4'%3E%3C/path%3E%3C/svg%3E"); background-size: 100% 100%; margin: 1.5rem 0; } .destinations-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 1.2rem; margin-bottom: 2rem; } .destination-card { background-color: white; border-radius: 10px; overflow: hidden; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.05); transition: transform 0.3s ease, box-shadow 0.3s ease; cursor: pointer; position: relative; } .destination-card:hover { transform: translateY(-5px); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1); } .destination-card img { width: 100%; height: 130px; object-fit: cover; display: block; } .destination-info { padding: 1rem; } .destination-info h3 { font-size: 1rem; margin-bottom: 0.5rem; } .destination-info p { font-size: 0.85rem; color: #546e7a; margin-bottom: 0.5rem; } .price { font-weight: 600; color: var(--ocean-blue-dark); } .search-container { background-color: white; padding: 1.5rem; border-radius: 12px; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.05); margin-bottom: 2rem; } .search-form { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; } .search-form .form-group { display: flex; flex-direction: column; } .search-form label { font-size: 0.8rem; font-weight: 500; margin-bottom: 0.5rem; color: #546e7a; } .search-form input, .search-form select { padding: 0.7rem; border: 1px solid #e0e0e0; border-radius: 6px; font-family: 'Montserrat', sans-serif; transition: border-color 0.3s ease; } .search-form input:focus, .search-form select:focus { outline: none; border-color: var(--ocean-blue-medium); box-shadow: 0 0 0 2px rgba(3, 155, 229, 0.1); } .gradient-button { background: linear-gradient(45deg, var(--ocean-blue-dark), var(--ocean-blue-medium), var(--sandy-gold-medium), var(--sandy-gold-dark)); background-size: 300% 300%; border: none; border-radius: 6px; color: white; padding: 0.8rem 1.5rem; font-weight: 600; font-family: 'Montserrat', sans-serif; cursor: pointer; transition: all 0.3s ease; position: relative; overflow: hidden; display: inline-flex; align-items: center; justify-content: center; box-shadow: 0 4px 10px rgba(3, 155, 229, 0.2); } .gradient-button::before { content: ''; position: absolute; top: -50%; left: -100%; width: 40px; height: 200%; background: rgba(255, 255, 255, 0.3); transform: rotate(30deg); transition: all 0.5s ease; } .gradient-button:hover { background-position: 100% 0; box-shadow: 0 6px 15px rgba(3, 155, 229, 0.3); } .gradient-button:hover::before { left: 150%; } .search-button { grid-column: 1 / -1; margin-top: 1rem; justify-self: end; } .promotion-section { background: linear-gradient(135deg, #f5f7fa, #c3cfe2); padding: 1.5rem; border-radius: 12px; position: relative; overflow: hidden; margin-bottom: 2rem; } .promotion-section::before { content: ''; position: absolute; right: -5%; bottom: -15%; width: 200px; height: 200px; background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%2303a9f4' opacity='0.2'%3E%3Cpath d='M12 2L4.5 20.29l.71.71L12 18l6.79 3 .71-.71z'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-size: contain; transform: rotate(15deg); } .promotion-content { position: relative; z-index: 1; } .promotion-content h2 { font-family: 'Playfair Display', serif; font-size: 1.8rem; margin-bottom: 1rem; color: var(--ocean-blue-dark); } .promotion-content p { font-size: 0.95rem; margin-bottom: 1.2rem; max-width: 400px; } .timer { display: flex; gap: 0.8rem; margin-bottom: 1.5rem; } .timer-box { background-color: white; padding: 0.5rem 0.8rem; border-radius: 6px; text-align: center; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); min-width: 50px; } .timer-box .number { font-size: 1.2rem; font-weight: 600; color: var(--ocean-blue-dark); display: block; } .timer-box .label { font-size: 0.7rem; color: #546e7a; } .newsletter { display: flex; gap: 0.5rem; max-width: 400px; } .newsletter input { flex: 1; padding: 0.8rem; border: 1px solid #e0e0e0; border-radius: 6px; font-family: 'Montserrat', sans-serif; } footer { text-align: center; padding: 1.5rem; font-size: 0.8rem; color: #546e7a; border-top: 1px solid #e0e0e0; margin-top: 2rem; } .socials { display: flex; justify-content: center; gap: 1rem; margin-top: 1rem; } .social-icon { width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; border-radius: 50%; background: linear-gradient(135deg, var(--ocean-blue-medium), var(--sandy-gold-medium)); color: white; transition: transform 0.3s ease; } .social-icon:hover { transform: translateY(-3px); } @media (max-width: 600px) { nav { display: none; } .hero { padding: 2rem 1.5rem; height: auto; } .hero h1 { font-size: 1.8rem; } .destinations-grid { grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); } .search-form { grid-template-columns: 1fr; } .search-button { justify-self: stretch; } .newsletter { flex-direction: column; } } /* Loading animation for buttons */ .loading { position: relative; color: transparent !important; } .loading::after { content: ""; position: absolute; width: 20px; height: 20px; border: 2px solid rgba(255,255,255,0.3); border-radius: 50%; border-top-color: white; animation: spin 0.8s infinite linear; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } /* Destination hover effect */ .destination-card::after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(to top, rgba(1, 87, 155, 0.3), transparent); opacity: 0; transition: opacity 0.3s ease; } .destination-card:hover::after { opacity: 1; } /* Mobile menu button */ .menu-toggle { display: none; background: none; border: none; cursor: pointer; padding: 5px; } .menu-toggle span { display: block; width: 25px; height: 3px; background: var(--text-dark); margin: 4px 0; border-radius: 3px; transition: all 0.3s ease; } @media (max-width: 600px) { .menu-toggle { display: block; } nav.active { display: flex; flex-direction: column; position: absolute; top: 100%; right: 1.5rem; background: white; padding: 1rem; border-radius: 8px; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); z-index: 10; } } /* Date picker styling enhancement */ input[type="date"] { position: relative; } input[type="date"]::-webkit-calendar-picker-indicator { background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23039be5'%3E%3Cpath d='M9 11H7v2h2v-2zm4 0h-2v2h2v-2zm4 0h-2v2h2v-2zm2-7h-1V2h-2v2H8V2H6v2H5c-1.11 0-1.99.9-1.99 2L3 20c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 16H5V9h14v11z'/%3E%3C/svg%3E"); width: 20px; height: 20px; opacity: 0.7; cursor: pointer; } </style> </head> <body> <header> <div class="logo">Tides & Horizons</div> <nav id="navMenu"> <a href="#">Destinations</a> <a href="#">Experiences</a> <a href="#">Deals</a> <a href="#">About Us</a> </nav> <button class="menu-toggle" id="menuToggle"> <span></span> <span></span> <span></span> </button> </header> <main> <section class="hero"> <h1>Find Your Ocean of Possibilities</h1> <p>Where coastal escapes and mountain adventures await. Begin your journey with hand-curated experiences.</p> </section> <section class="search-container"> <h2 class="section-title">Plan Your Escape</h2> <form class="search-form" id="searchForm"> <div class="form-group"> <label for="destination">Where to?</label> <input type="text" id="destination" placeholder="City, region or country"> </div> <div class="form-group"> <label for="depart">Depart</label> <input type="date" id="depart"> </div> <div class="form-group"> <label for="return">Return</label> <input type="date" id="return"> </div> <div class="form-group"> <label for="travelers">Travelers</label> <select id="travelers"> <option value="1">1 Traveler</option> <option value="2" selected>2 Travelers</option> <option value="3">3 Travelers</option> <option value="4">4 Travelers</option> <option value="5+">5+ Travelers</option> </select> </div> <button type="button" id="searchButton" class="gradient-button search-button"> <span>Discover Journeys</span> </button> </form> </section> <div class="wave-divider"></div> <section> <h2 class="section-title">Trending Destinations</h2> <div class="destinations-grid"> <div class="destination-card"> <img src="https://images.unsplash.com/photo-1589394760151-b4c9261818cc?ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=60" alt="Santorini, Greece"> <div class="destination-info"> <h3>Santorini, Greece</h3> <p>Coastal luxury & sunsets</p> <div class="price">From $1,299</div> </div> </div> <div class="destination-card"> <img src="https://images.unsplash.com/photo-1500530855697-b586d89ba3ee?ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=60" alt="Maldives"> <div class="destination-info"> <h3>Maldives Islands</h3> <p>Overwater villa escape</p> <div class="price">From $2,199</div> </div> </div> <div class="destination-card"> <img src="https://images.unsplash.com/photo-1573843981267-be1999ff37cd?ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=60" alt="Bali, Indonesia"> <div class="destination-info"> <h3>Bali, Indonesia</h3> <p>Cultural immersion & beaches</p> <div class="price">From $899</div> </div> </div> <div class="destination-card"> <img src="https://images.unsplash.com/photo-1502602898657-3e91760cbb34?ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=60" alt="Paris, France"> <div class="destination-info"> <h3>Paris, France</h3> <p>Romantic city adventure</p> <div class="price">From $949</div> </div> </div> </div> <button type="button" class="gradient-button" id="moreDestinations"> <span>View All Destinations</span> </button> </section> <div class="wave-divider"></div> <section class="promotion-section"> <div class="promotion-content"> <h2>Early Summer Sale — 30% Off</h2> <p>Book your Mediterranean adventure by May 15th and receive 30% off luxury accommodations plus complimentary sunset excursions.</p> <div class="timer"> <div class="timer-box"> <span class="number" id="days">14</span> <span class="label">Days</span> </div> <div class="timer-box"> <span class="number" id="hours">23</span> <span class="label">Hours</span> </div> <div class="timer-box"> <span class="number" id="minutes">59</span> <span class="label">Minutes</span> </div> <div class="timer-box"> <span class="number" id="seconds">59</span> <span class="label">Seconds</span> </div> </div> <div class="newsletter"> <input type="email" placeholder="Enter your email"> <button type="button" class="gradient-button" id="subscribeButton"> <span>Get Deal</span> </button> </div> </div> </section> </main> <footer> <p>© 2023 Tides & Horizons Travel Agency. All journeys begin with a single step.</p> <div class="socials"> <a href="#" class="social-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> <path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.44s-.644-1.44-1.439-1.44z"/> </svg> </a> <a href="#" class="social-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> <path d="M22.675 0h-21.35c-.732 0-1.325.593-1.325 1.325v21.351c0 .731.593 1.324 1.325 1.324h11.495v-9.294h-3.128v-3.622h3.128v-2.671c0-3.1 1.893-4.788 4.659-4.788 1.325 0 2.463.099 2.795.143v3.24l-1.918.001c-1.504 0-1.795.715-1.795 1.763v2.313h3.587l-.467 3.622h-3.12v9.293h6.116c.73 0 1.323-.593 1.323-1.325v-21.35c0-.732-.593-1.325-1.325-1.325z"/> </svg> </a> <a href="#" class="social-icon"> <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> <path d="M24 4.557c-.883.392-1.832.656-2.828.775 1.017-.609 1.798-1.574 2.165-2.724-.951.564-2.005.974-3.127 1.195-.897-.957-2.178-1.555-3.594-1.555-3.179 0-5.515 2.966-4.797 6.045-4.091-.205-7.719-2.165-10.148-5.144-1.29 2.213-.669 5.108 1.523 6.574-.806-.026-1.566-.247-2.229-.616-.054 2.281 1.581 4.415 3.949 4.89-.693.188-1.452.232-2.224.084.626 1.956 2.444 3.379 4.6 3.419-2.07 1.623-4.678 2.348-7.29 2.04 2.179 1.397 4.768 2.212 7.548 2.212 9.142 0 14.307-7.721 13.995-14.646.962-.695 1.797-1.562 2.457-2.549z"/> </svg> </a> </div> </footer> <script> document.addEventListener('DOMContentLoaded', function() { // Countdown timer function updateTimer() { const now = new Date(); const deadline = new Date('May 15, 2023 23:59:59'); const diff = deadline - now; if (diff <= 0) { document.getElementById('days').textContent = '0'; document.getElementById('hours').textContent = '0'; document.getElementById('minutes').textContent = '0'; document.getElementById('seconds').textContent = '0'; return; } const days = Math.floor(diff / (1000 * 60 * 60 * 24)); const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); const seconds = Math.floor((diff % (1000 * 60)) / 1000); document.getElementById('days').textContent = days; document.getElementById('hours').textContent = hours; document.getElementById('minutes').textContent = minutes; document.getElementById('seconds').textContent = seconds; } updateTimer(); setInterval(updateTimer, 1000); // Button click animations and effects const buttons = document.querySelectorAll('.gradient-button'); buttons.forEach(button => { button.addEventListener('click', function(e) { e.preventDefault(); // Add loading state this.classList.add('loading'); // Simulate loading setTimeout(() => { this.classList.remove('loading'); // If it's the search button, show a success message if (this.id === 'searchButton') { const form = document.getElementById('searchForm'); const destination = document.getElementById('destination').value; if (destination) { form.innerHTML = `<div style="text-align: center; padding: 1rem;"> <svg width="50" height="50" viewBox="0 0 24 24" fill="none" stroke="#039be5" stroke-width="2"> <path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"></path> <polyline points="22 4 12 14.01 9 11.01"></polyline> </svg> <h3 style="margin: 1rem 0; color: #01579b;">Amazing options found!</h3> <p>We've found 17 journeys to ${destination}. Check your personalized results below.</p> <button type="button" class="gradient-button" style="margin-top: 1rem;">View Journeys</button> </div>`; } } // If it's the subscribe button, show a thank you message if (this.id === 'subscribeButton') { const newsletter = document.querySelector('.newsletter'); newsletter.innerHTML = `<p style="font-weight: 500; color: #01579b;">Thanks! Your exclusive deal will arrive shortly.</p>`; } }, 1500); }); }); // Destination cards effect const destinationCards = document.querySelectorAll('.destination-card'); destinationCards.forEach(card => { card.addEventListener('click', function() { this.style.transform = 'scale(0.95)'; setTimeout(() => { this.style.transform = 'translateY(-5px)'; }, 150); }); }); // Mobile menu toggle const menuToggle = document.getElementById('menuToggle'); const navMenu = document.getElementById('navMenu'); menuToggle.addEventListener('click', function() { navMenu.classList.toggle('active'); const spans = this.querySelectorAll('span'); if (navMenu.classList.contains('active')) { spans[0].style.transform = 'rotate(-45deg) translate(-5px, 6px)'; spans[1].style.opacity = '0'; spans[2].style.transform = 'rotate(45deg) translate(-5px, -6px)'; } else { spans[0].style.transform = 'none'; spans[1].style.opacity = '1'; spans[2].style.transform = 'none'; } }); // Set default dates for the form const today = new Date(); const departDate = new Date(today); departDate.setDate(today.getDate() + 7); const returnDate = new Date(today); returnDate.setDate(today.getDate() + 14); document.getElementById('depart').valueAsDate = departDate; document.getElementById('return').valueAsDate = returnDate; // Animate gradient for buttons setInterval(() => { const buttons = document.querySelectorAll('.gradient-button'); buttons.forEach(button => { const currentPosition = getComputedStyle(button).backgroundPosition; const x = parseInt(currentPosition.split(' ')[0]) || 0; const newPosition = (x + 1) % 300; button.style.backgroundPosition = `${newPosition}% 0%`; }); }, 100); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>NewsNow - Media Portal</title> <style> :root { --dark-slate: #1e293b; --slate-blue: #334866; --medium-indigo: #4338ca; --vibrant-indigo: #4f46e5; --light-indigo: #818cf8; --near-white: #f8fafc; --gray-100: #f3f4f6; --gray-200: #e5e7eb; --gray-300: #d1d5db; --gray-800: #1f2937; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; } body { background-color: var(--gray-100); color: var(--gray-800); display: flex; justify-content: center; align-items: center; min-height: 700px; padding: 20px; overflow-x: hidden; } .portal-container { width: 100%; max-width: 640px; background-color: white; border-radius: 12px; box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1); overflow: hidden; position: relative; } .portal-header { background: linear-gradient(135deg, var(--dark-slate), var(--vibrant-indigo)); padding: 25px; color: white; position: relative; } .portal-title { font-size: 24px; font-weight: 700; margin-bottom: 10px; display: flex; align-items: center; } .portal-title span { margin-left: 8px; } .portal-subtitle { font-size: 14px; opacity: 0.9; margin-bottom: 20px; line-height: 1.5; } .search-container { display: flex; margin-top: 20px; position: relative; } .search-input { flex: 1; padding: 14px 20px; border: none; border-radius: 30px; font-size: 14px; background-color: rgba(255, 255, 255, 0.15); backdrop-filter: blur(5px); color: white; transition: all 0.3s ease; } .search-input::placeholder { color: rgba(255, 255, 255, 0.7); } .search-input:focus { background-color: rgba(255, 255, 255, 0.25); outline: none; } .search-button { position: absolute; right: 5px; top: 5px; background: linear-gradient(135deg, var(--medium-indigo), var(--vibrant-indigo)); border: none; color: white; width: 38px; height: 38px; border-radius: 50%; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: all 0.3s ease; } .search-button:hover { transform: scale(1.05); box-shadow: 0 0 15px rgba(79, 70, 229, 0.5); } .category-tabs { display: flex; padding: 0 25px; background-color: white; overflow-x: auto; scrollbar-width: none; border-bottom: 1px solid var(--gray-200); } .category-tabs::-webkit-scrollbar { display: none; } .category-tab { padding: 16px 15px; font-size: 14px; font-weight: 600; color: var(--gray-800); cursor: pointer; position: relative; white-space: nowrap; transition: all 0.2s ease; } .category-tab.active { color: var(--vibrant-indigo); } .category-tab.active::after { content: ''; position: absolute; bottom: 0; left: 15px; right: 15px; height: 3px; background: linear-gradient(90deg, var(--medium-indigo), var(--vibrant-indigo)); border-radius: 3px 3px 0 0; } .content-area { padding: 25px; max-height: 400px; overflow-y: auto; scrollbar-width: thin; scrollbar-color: var(--gray-300) transparent; } .content-area::-webkit-scrollbar { width: 6px; } .content-area::-webkit-scrollbar-track { background: transparent; } .content-area::-webkit-scrollbar-thumb { background-color: var(--gray-300); border-radius: 6px; } .news-item { display: flex; padding: 15px 0; border-bottom: 1px solid var(--gray-200); transition: transform 0.2s ease; } .news-item:hover { transform: translateX(5px); } .news-item:last-child { border-bottom: none; } .news-image { width: 100px; height: 70px; border-radius: 8px; object-fit: cover; margin-right: 15px; background-color: var(--gray-200); } .news-content { flex: 1; } .news-title { font-size: 16px; font-weight: 600; margin-bottom: 5px; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } .news-meta { display: flex; font-size: 12px; color: var(--slate-blue); margin-bottom: 5px; } .news-source { font-weight: 600; margin-right: 10px; } .news-time { opacity: 0.8; } .news-excerpt { font-size: 13px; line-height: 1.5; color: var(--gray-800); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } .actions-bar { padding: 20px 25px; background-color: white; border-top: 1px solid var(--gray-200); display: flex; justify-content: space-between; align-items: center; } .gradient-button { background: linear-gradient(135deg, var(--dark-slate), var(--vibrant-indigo)); color: white; border: none; border-radius: 8px; padding: 10px 20px; font-size: 14px; font-weight: 600; cursor: pointer; transition: all 0.3s ease; position: relative; overflow: hidden; display: flex; align-items: center; justify-content: center; z-index: 1; } .gradient-button::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(135deg, var(--vibrant-indigo), var(--medium-indigo)); z-index: -1; opacity: 0; transition: opacity 0.3s ease; } .gradient-button:hover { transform: translateY(-2px); box-shadow: 0 5px 15px rgba(30, 41, 59, 0.3); } .gradient-button:hover::before { opacity: 1; } .gradient-button:active { transform: translateY(0); } .gradient-button.secondary { background: transparent; color: var(--vibrant-indigo); border: 1px solid var(--vibrant-indigo); } .gradient-button.secondary::before { background: linear-gradient(135deg, rgba(79, 70, 229, 0.1), rgba(67, 56, 202, 0.1)); } .gradient-button.secondary:hover { color: var(--vibrant-indigo); box-shadow: 0 5px 15px rgba(79, 70, 229, 0.15); } .gradient-button i { margin-right: 8px; font-size: 16px; } .gradient-button.icon-only { width: 40px; height: 40px; padding: 0; border-radius: 50%; } .gradient-button.icon-only i { margin-right: 0; } .newsletter-section { padding: 25px; background: linear-gradient(135deg, rgba(30, 41, 59, 0.05), rgba(79, 70, 229, 0.05)); border-radius: 10px; margin-top: 20px; } .newsletter-title { font-size: 16px; font-weight: 600; margin-bottom: 10px; color: var(--dark-slate); } .newsletter-desc { font-size: 14px; color: var(--slate-blue); margin-bottom: 15px; line-height: 1.5; } .newsletter-form { display: flex; gap: 10px; } .newsletter-input { flex: 1; padding: 12px 15px; border: 1px solid var(--gray-300); border-radius: 8px; font-size: 14px; transition: all 0.3s ease; } .newsletter-input:focus { outline: none; border-color: var(--vibrant-indigo); box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.1); } @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(79, 70, 229, 0.4); } 70% { box-shadow: 0 0 0 10px rgba(79, 70, 229, 0); } 100% { box-shadow: 0 0 0 0 rgba(79, 70, 229, 0); } } .pulse-button { animation: pulse 2s infinite; } .badge { background: linear-gradient(135deg, var(--vibrant-indigo), var(--medium-indigo)); color: white; padding: 2px 8px; border-radius: 12px; font-size: 10px; font-weight: 600; margin-left: 8px; } @media (max-width: 500px) { .portal-header { padding: 20px; } .category-tabs { padding: 0 20px; } .content-area { padding: 20px; } .actions-bar { padding: 15px 20px; } .news-image { width: 80px; height: 60px; } .news-title { font-size: 15px; } .newsletter-section { padding: 20px; } .newsletter-form { flex-direction: column; } } /* Loading animation */ .loader { width: 20px; height: 20px; border: 2px solid rgba(255, 255, 255, 0.3); border-radius: 50%; border-top-color: white; animation: spin 0.8s linear infinite; display: none; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .loading .loader { display: block; } .loading .button-text { display: none; } .notification { position: fixed; bottom: 20px; right: 20px; padding: 15px 20px; background: linear-gradient(135deg, var(--dark-slate), var(--vibrant-indigo)); color: white; border-radius: 8px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); transform: translateY(100px); opacity: 0; transition: all 0.3s ease; display: flex; align-items: center; z-index: 1000; } .notification.show { transform: translateY(0); opacity: 1; } .notification-icon { margin-right: 12px; font-size: 18px; } .notification-text { font-size: 14px; font-weight: 500; } </style> </head> <body> <div class="portal-container"> <div class="portal-header"> <div class="portal-title"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M19 5V19H5V5H19ZM21 3H3V21H21V3ZM17 17H7V16H17V17ZM17 15H7V14H17V15ZM17 12H7V7H17V12Z" fill="white"/> </svg> <span>NewsNow</span> <div class="badge">BETA</div> </div> <div class="portal-subtitle">Your trusted source for critical journalism and curated media across global politics, tech innovation, and climate analysis.</div> <div class="search-container"> <input type="text" class="search-input" placeholder="Search for news, topics, or sources..."> <button class="search-button"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M15.5 14H14.71L14.43 13.73C15.41 12.59 16 11.11 16 9.5C16 5.91 13.09 3 9.5 3C5.91 3 3 5.91 3 9.5C3 13.09 5.91 16 9.5 16C11.11 16 12.59 15.41 13.73 14.43L14 14.71V15.5L19 20.49L20.49 19L15.5 14ZM9.5 14C7.01 14 5 11.99 5 9.5C5 7.01 7.01 5 9.5 5C11.99 5 14 7.01 14 9.5C14 11.99 11.99 14 9.5 14Z" fill="white"/> </svg> </button> </div> </div> <div class="category-tabs"> <div class="category-tab active">Front Page</div> <div class="category-tab">Global Politics</div> <div class="category-tab">Technology</div> <div class="category-tab">Climate</div> <div class="category-tab">Markets</div> <div class="category-tab">Opinion</div> </div> <div class="content-area"> <div class="news-item"> <img src="https://source.unsplash.com/random/200x140/?politics" alt="News image" class="news-image"> <div class="news-content"> <div class="news-title">European Leaders Agree on New Framework for Digital Currency Regulation</div> <div class="news-meta"> <div class="news-source">Financial Times</div> <div class="news-time">2 hours ago</div> </div> <div class="news-excerpt">After months of negotiations, EU officials reached consensus on guidelines that balance innovation protection with consumer safeguards.</div> </div> </div> <div class="news-item"> <img src="https://source.unsplash.com/random/200x140/?technology" alt="News image" class="news-image"> <div class="news-content"> <div class="news-title">Quantum Computing Breakthrough Could Accelerate AI Development Timeline</div> <div class="news-meta"> <div class="news-source">MIT Technology Review</div> <div class="news-time">5 hours ago</div> </div> <div class="news-excerpt">Researchers demonstrated a stable 128-qubit processor capable of solving complex problems that would take traditional supercomputers decades.</div> </div> </div> <div class="news-item"> <img src="https://source.unsplash.com/random/200x140/?climate" alt="News image" class="news-image"> <div class="news-content"> <div class="news-title">Arctic Sea Ice Reaches Historic Low for Third Consecutive Season</div> <div class="news-meta"> <div class="news-source">Nature Climate</div> <div class="news-time">Yesterday</div> </div> <div class="news-excerpt">Satellite data confirms the alarming trend as scientists warn of cascading effects on global weather patterns and coastal communities.</div> </div> </div> <div class="news-item"> <img src="https://source.unsplash.com/random/200x140/?business" alt="News image" class="news-image"> <div class="news-content"> <div class="news-title">Global Supply Chain Resilience Index Shows Improvement Despite Ongoing Challenges</div> <div class="news-meta"> <div class="news-source">The Economist</div> <div class="news-time">Yesterday</div> </div> <div class="news-excerpt">Companies are adapting to persistent disruptions by diversifying suppliers and implementing advanced logistics technology solutions.</div> </div> </div> <div class="newsletter-section"> <div class="newsletter-title">Stay informed with our Daily Briefing</div> <div class="newsletter-desc">Get curated insights from our editors delivered to your inbox every morning with context that matters.</div> <div class="newsletter-form"> <input type="email" class="newsletter-input" placeholder="Your email address"> <button class="gradient-button pulse-button" id="subscribe-button"> <span class="button-text">Subscribe</span> <div class="loader"></div> </button> </div> </div> </div> <div class="actions-bar"> <button class="gradient-button"> <i> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M18 16.08C17.24 16.08 16.56 16.38 16.04 16.85L8.91 12.7C8.96 12.47 9 12.24 9 12C9 11.76 8.96 11.53 8.91 11.3L15.96 7.19C16.5 7.69 17.21 8 18 8C19.66 8 21 6.66 21 5C21 3.34 19.66 2 18 2C16.34 2 15 3.34 15 5C15 5.24 15.04 5.47 15.09 5.7L8.04 9.81C7.5 9.31 6.79 9 6 9C4.34 9 3 10.34 3 12C3 13.66 4.34 15 6 15C6.79 15 7.5 14.69 8.04 14.19L15.16 18.35C15.11 18.56 15.08 18.78 15.08 19C15.08 20.61 16.39 21.92 18 21.92C19.61 21.92 20.92 20.61 20.92 19C20.92 17.39 19.61 16.08 18 16.08Z" fill="currentColor"/> </svg> </i> Share Briefing </button> <button class="gradient-button secondary"> <i> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M17 3H7C5.9 3 5.01 3.9 5.01 5L5 21L12 18L19 21V5C19 3.9 18.1 3 17 3Z" fill="currentColor"/> </svg> </i> Save for Later </button> </div> </div> <div class="notification" id="notification"> <div class="notification-icon"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2ZM10 17L5 12L6.41 10.59L10 14.17L17.59 6.58L19 8L10 17Z" fill="white"/> </svg> </div> <div class="notification-text">Success! You've subscribed to the Daily Briefing.</div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Category tab selection const tabs = document.querySelectorAll('.category-tab'); tabs.forEach(tab => { tab.addEventListener('click', function() { tabs.forEach(t => t.classList.remove('active')); this.classList.add('active'); }); }); // Subscribe button functionality const subscribeButton = document.getElementById('subscribe-button'); const emailInput = document.querySelector('.newsletter-input'); const notification = document.getElementById('notification'); subscribeButton.addEventListener('click', function() { const email = emailInput.value.trim(); if (!email || !isValidEmail(email)) { emailInput.style.borderColor = '#ef4444'; emailInput.focus(); return; } // Show loading state this.classList.add('loading'); // Simulate API call setTimeout(() => { // Reset and show success this.classList.remove('loading'); emailInput.value = ''; // Show notification notification.classList.add('show'); // Hide notification after 4 seconds setTimeout(() => { notification.classList.remove('show'); }, 4000); }, 1500); }); // Email validation function function isValidEmail(email) { const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return re.test(String(email).toLowerCase()); } // Reset input border on focus emailInput.addEventListener('focus', function() { this.style.borderColor = ''; }); // Simulate search functionality const searchInput = document.querySelector('.search-input'); const searchButton = document.querySelector('.search-button'); searchButton.addEventListener('click', function() { if (searchInput.value.trim()) { searchButton.innerHTML = '<div class="loader"></div>'; setTimeout(() => { searchButton.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M15.5 14H14.71L14.43 13.73C15.41 12.59 16 11.11 16 9.5C16 5.91 13.09 3 9.5 3C5.91 3 3 5.91 3 9.5C3 13.09 5.91 16 9.5 16C11.11 16 12.59 15.41 13.73 14.43L14 14.71V15.5L19 20.49L20.49 19L15.5 14ZM9.5 14C7.01 14 5 11.99 5 9.5C5 7.01 7.01 5 9.5 5C11.99 5 14 7.01 14 9.5C14 11.99 11.99 14 9.5 14Z" fill="white"/></svg>'; }, 1000); } }); // Make the news items interactive const newsItems = document.querySelectorAll('.news-item'); newsItems.forEach(item => { item.addEventListener('click', function() { // Add a subtle feedback effect this.style.opacity = '0.7'; setTimeout(() => { this.style.opacity = '1'; }, 200); }); }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>FitPulse Tracker</title> <style> :root { --magenta: #FF1493; --violet: #8A2BE2; --dark-violet: #4B0082; --light-gray: #f5f5f5; --medium-gray: #e0e0e0; --dark-gray: #333; --white: #ffffff; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; } body { background-color: #f9f9f9; color: var(--dark-gray); display: flex; justify-content: center; align-items: center; min-height: 700px; padding: 20px; overflow-x: hidden; } .app-container { background-color: var(--white); border-radius: 24px; width: 100%; max-width: 380px; box-shadow: 0 12px 30px rgba(0, 0, 0, 0.08); overflow: hidden; position: relative; min-height: 650px; display: flex; flex-direction: column; } .app-header { background: linear-gradient(135deg, var(--magenta), var(--violet)); padding: 25px 20px; color: var(--white); position: relative; overflow: hidden; } .app-header h1 { font-size: 24px; font-weight: 700; margin-bottom: 15px; position: relative; z-index: 2; } .app-header p { font-size: 14px; opacity: 0.9; position: relative; z-index: 2; line-height: 1.4; } .header-pattern { position: absolute; top: 0; right: 0; width: 100%; height: 100%; background-image: radial-gradient(circle at 80% 20%, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0) 50%); z-index: 1; } .fitness-dashboard { padding: 20px; flex-grow: 1; } .stats-row { display: flex; justify-content: space-between; margin-bottom: 25px; } .stat-card { background-color: var(--light-gray); border-radius: 16px; padding: 15px; width: calc(50% - 8px); display: flex; flex-direction: column; align-items: center; transition: transform 0.3s ease, box-shadow 0.3s ease; cursor: pointer; } .stat-card:hover { transform: translateY(-5px); box-shadow: 0 8px 15px rgba(0, 0, 0, 0.1); } .stat-card .icon { width: 48px; height: 48px; border-radius: 50%; background: linear-gradient(135deg, var(--magenta), var(--violet)); display: flex; justify-content: center; align-items: center; margin-bottom: 12px; color: var(--white); font-size: 20px; } .stat-card .count { font-size: 24px; font-weight: 700; margin-bottom: 5px; } .stat-card .label { font-size: 13px; color: #666; text-align: center; } .activity-title { font-size: 18px; font-weight: 600; margin-bottom: 15px; } .button-container { display: flex; flex-direction: column; gap: 15px; margin-top: 20px; } .gradient-button { background: linear-gradient(135deg, var(--magenta), var(--violet)); border: none; border-radius: 30px; color: var(--white); font-weight: 600; padding: 15px 20px; font-size: 16px; cursor: pointer; position: relative; overflow: hidden; transition: transform 0.25s cubic-bezier(0.175, 0.885, 0.32, 1.275); box-shadow: 0 5px 15px rgba(138, 43, 226, 0.3); display: flex; align-items: center; justify-content: center; gap: 10px; } .gradient-button:hover { box-shadow: 0 8px 20px rgba(138, 43, 226, 0.4); } .gradient-button:active { transform: scale(0.95); } .button-icon { font-size: 18px; } .button-ripple { position: absolute; background: rgba(255, 255, 255, 0.7); border-radius: 50%; transform: scale(0); animation: ripple 0.6s linear; pointer-events: none; } @keyframes ripple { to { transform: scale(4); opacity: 0; } } .secondary-button { background: var(--white); border: 2px solid var(--medium-gray); color: var(--dark-gray); box-shadow: none; } .workouts-list { margin: 20px 0; } .workout-item { display: flex; align-items: center; padding: 15px; background-color: var(--light-gray); border-radius: 16px; margin-bottom: 12px; transition: transform 0.3s ease, background-color 0.3s ease; cursor: pointer; } .workout-item:hover { transform: translateX(5px); background-color: var(--medium-gray); } .workout-icon { width: 40px; height: 40px; border-radius: 12px; background: linear-gradient(135deg, var(--magenta), var(--violet)); display: flex; justify-content: center; align-items: center; color: var(--white); margin-right: 15px; flex-shrink: 0; } .workout-info { flex-grow: 1; } .workout-title { font-weight: 600; margin-bottom: 4px; } .workout-subtitle { font-size: 13px; color: #666; } .workout-action { color: var(--violet); font-size: 22px; } .nav-bar { display: flex; justify-content: space-around; padding: 15px 10px; background-color: var(--white); border-top: 1px solid var(--medium-gray); } .nav-item { display: flex; flex-direction: column; align-items: center; color: #999; font-size: 12px; cursor: pointer; transition: color 0.3s ease; } .nav-item.active { color: var(--violet); } .nav-icon { font-size: 20px; margin-bottom: 5px; } .progress-ring { position: relative; display: flex; justify-content: center; align-items: center; margin: 20px auto; width: 160px; height: 160px; } .progress-ring__circle { transform: rotate(-90deg); transform-origin: center; transition: stroke-dashoffset 0.8s ease; } .progress-ring__text { position: absolute; text-align: center; } .progress-ring__percent { font-size: 32px; font-weight: 700; color: var(--violet); margin-bottom: 5px; } .progress-ring__label { font-size: 14px; color: #666; } .highlight { position: relative; display: inline-block; } .highlight::after { content: ''; position: absolute; bottom: 2px; left: 0; width: 100%; height: 8px; background: linear-gradient(135deg, rgba(255, 20, 147, 0.3), rgba(138, 43, 226, 0.3)); z-index: -1; border-radius: 4px; } @media (max-width: 400px) { .app-container { border-radius: 16px; } .stats-row { flex-direction: column; gap: 12px; } .stat-card { width: 100%; } } </style> </head> <body> <div class="app-container"> <div class="app-header"> <div class="header-pattern"></div> <h1>FitPulse Tracker</h1> <p>Hey there! You're <span class="highlight">62% closer</span> to your weekly fitness goal. Keep pushing!</p> </div> <div class="fitness-dashboard"> <div class="progress-ring"> <svg width="160" height="160" viewBox="0 0 160 160"> <circle class="progress-ring__circle-bg" stroke="#e0e0e0" stroke-width="10" fill="transparent" r="70" cx="80" cy="80"/> <circle class="progress-ring__circle" stroke="url(#gradient)" stroke-width="10" stroke-linecap="round" fill="transparent" r="70" cx="80" cy="80"/> <defs> <linearGradient id="gradient" x1="0%" y1="0%" x2="100%" y2="0%"> <stop offset="0%" stop-color="#FF1493" /> <stop offset="100%" stop-color="#8A2BE2" /> </linearGradient> </defs> </svg> <div class="progress-ring__text"> <div class="progress-ring__percent">62%</div> <div class="progress-ring__label">Weekly Goal</div> </div> </div> <div class="stats-row"> <div class="stat-card"> <div class="icon">🔥</div> <div class="count">1,243</div> <div class="label">Calories burned today</div> </div> <div class="stat-card"> <div class="icon">👟</div> <div class="count">8,742</div> <div class="label">Steps walked today</div> </div> </div> <h3 class="activity-title">Today's Workouts</h3> <div class="workouts-list"> <div class="workout-item"> <div class="workout-icon">🏃</div> <div class="workout-info"> <div class="workout-title">Morning Run</div> <div class="workout-subtitle">5.2 km • 28 mins • 308 cal</div> </div> <div class="workout-action">›</div> </div> <div class="workout-item"> <div class="workout-icon">💪</div> <div class="workout-info"> <div class="workout-title">Upper Body Strength</div> <div class="workout-subtitle">45 mins • 287 cal</div> </div> <div class="workout-action">›</div> </div> </div> <div class="button-container"> <button class="gradient-button"> <span class="button-icon">+</span> <span>Start New Workout</span> </button> <button class="gradient-button secondary-button"> <span class="button-icon">📊</span> <span>View Weekly Analysis</span> </button> </div> </div> <div class="nav-bar"> <div class="nav-item active"> <div class="nav-icon">📊</div> <span>Dashboard</span> </div> <div class="nav-item"> <div class="nav-icon">🏆</div> <span>Progress</span> </div> <div class="nav-item"> <div class="nav-icon">🔍</div> <span>Discover</span> </div> <div class="nav-item"> <div class="nav-icon">👤</div> <span>Profile</span> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Set up progress ring const circle = document.querySelector('.progress-ring__circle'); const radius = circle.r.baseVal.value; const circumference = radius * 2 * Math.PI; circle.style.strokeDasharray = `${circumference} ${circumference}`; circle.style.strokeDashoffset = circumference; function setProgress(percent) { const offset = circumference - percent / 100 * circumference; circle.style.strokeDashoffset = offset; } // Animate progress to 62% setTimeout(() => { setProgress(62); }, 300); // Add ripple effect to buttons const buttons = document.querySelectorAll('.gradient-button'); buttons.forEach(button => { button.addEventListener('click', function(e) { const x = e.clientX - e.target.getBoundingClientRect().left; const y = e.clientY - e.target.getBoundingClientRect().top; const ripple = document.createElement('span'); ripple.classList.add('button-ripple'); ripple.style.left = `${x}px`; ripple.style.top = `${y}px`; this.appendChild(ripple); // Haptic feedback simulation (vibration if supported) if (navigator.vibrate) { navigator.vibrate(40); } setTimeout(() => { ripple.remove(); }, 600); }); }); // Make navigation items interactive const navItems = document.querySelectorAll('.nav-item'); navItems.forEach(item => { item.addEventListener('click', function() { navItems.forEach(nav => nav.classList.remove('active')); this.classList.add('active'); }); }); // Make stat cards and workout items interactive const interactiveElements = document.querySelectorAll('.stat-card, .workout-item'); interactiveElements.forEach(el => { el.addEventListener('click', function() { // Add quick animation this.style.transform = 'scale(0.95)'; setTimeout(() => { this.style.transform = ''; }, 150); // Haptic feedback if (navigator.vibrate) { navigator.vibrate(20); } }); }); }); </script> </body> </html>