Checkout forms are a crucial part of any e-commerce experience, often determining whether a customer completes their purchase. A well-designed form can significantly enhance user satisfaction and boost conversion rates.
In this article, we will explore ten exemplary checkout forms that stand out for their usability, design, and efficiency. These examples will provide valuable insights for anyone looking to optimize their own checkout process.
CODE1
Here's the code:
CODETEXT1
CODE2
Here's the code:
CODETEXT2
CODE3
Here's the code:
CODETEXT3
CODE4
Here's the code:
CODETEXT4
CODE5
Here's the code:
CODETEXT5
Designers and developers, elevate your checkout forms with Subframe's drag-and-drop interface and intuitive, responsive canvas. Create pixel-perfect UI effortlessly, loved by professionals across the board.
Start for free and experience the ease of building stunning, production-ready designs today!
CODE6
Here's the code:
CODETEXT6
CODE7
Here's the code:
CODETEXT7
CODE8
Here's the code:
CODETEXT8
CODE9
Here's the code:
CODETEXT9
CODE10
Here's the code:
CODETEXT10
Ready to elevate your UI design game? With Subframe, you can create pixel-perfect checkout forms and other UIs effortlessly. Our drag-and-drop interface ensures efficiency and immediate results.
Don't wait! Start for free and begin designing stunning, production-ready UIs right away.
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>MAISON Checkout</title> <style> :root { --primary: #f8c9bb; --secondary: #324b4c; --text: #333333; --light-gray: #f5f5f5; --mid-gray: #d4d4d4; --white: #ffffff; --error: #e74c3c; --success: #2ecc71; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', sans-serif; } body { background-color: var(--white); color: var(--text); font-size: 16px; line-height: 1.5; max-width: 700px; height: 700px; margin: 0 auto; padding: 20px; overflow-x: hidden; overflow-y: auto; } .checkout-container { display: flex; flex-direction: column; height: 100%; } .checkout-header { text-align: center; margin-bottom: 25px; } .checkout-header h1 { font-size: 24px; font-weight: 500; letter-spacing: 1px; margin-bottom: 5px; } .progress-bar { display: flex; justify-content: space-between; margin: 20px 0 30px; position: relative; } .progress-bar::before { content: ''; position: absolute; top: 50%; left: 0; transform: translateY(-50%); height: 2px; width: 100%; background-color: var(--mid-gray); z-index: 1; } .progress-bar-fill { position: absolute; top: 50%; left: 0; transform: translateY(-50%); height: 2px; width: 0; background-color: var(--secondary); z-index: 2; transition: width 0.5s ease; } .step { width: 30px; height: 30px; border-radius: 50%; background-color: var(--white); border: 2px solid var(--mid-gray); display: flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 600; color: var(--mid-gray); position: relative; z-index: 3; transition: all 0.3s ease; } .step.active { border-color: var(--secondary); color: var(--secondary); background-color: var(--white); } .step.completed { border-color: var(--secondary); background-color: var(--secondary); color: var(--white); } .step-label { position: absolute; top: 35px; font-size: 12px; white-space: nowrap; font-weight: 500; } .checkout-form { flex: 1; overflow-y: auto; } .form-step { display: none; animation: fadeIn 0.5s ease; } .form-step.active { display: block; } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } h2 { font-size: 20px; font-weight: 500; margin-bottom: 20px; color: var(--secondary); } .form-group { margin-bottom: 20px; } label { display: block; font-size: 14px; margin-bottom: 6px; font-weight: 500; } input, select { width: 100%; padding: 12px 15px; border: 1px solid var(--mid-gray); border-radius: 4px; font-size: 14px; transition: all 0.3s ease; background-color: var(--white); } input:focus, select:focus { outline: none; border-color: var(--secondary); box-shadow: 0 0 0 3px rgba(50, 75, 76, 0.1); } .form-row { display: flex; gap: 15px; } .form-col { flex: 1; } .btn { background-color: var(--secondary); color: var(--white); border: none; border-radius: 4px; padding: 14px 20px; font-size: 15px; font-weight: 500; cursor: pointer; transition: all 0.3s ease; width: 100%; text-transform: uppercase; letter-spacing: 1px; } .btn:hover { background-color: #273a3b; transform: translateY(-2px); } .btn:active { transform: translateY(0); } .btn-outline { background-color: transparent; border: 1px solid var(--secondary); color: var(--secondary); } .btn-outline:hover { background-color: rgba(50, 75, 76, 0.05); } .actions { display: flex; gap: 15px; margin-top: 30px; } .error-message { color: var(--error); font-size: 12px; margin-top: 5px; display: none; } input.error { border-color: var(--error); } .success-icon { display: none; position: absolute; right: 15px; top: 50%; transform: translateY(-50%); color: var(--success); } .field-container { position: relative; } .order-summary { background-color: var(--light-gray); padding: 20px; border-radius: 8px; margin-bottom: 25px; } .order-item { display: flex; justify-content: space-between; margin-bottom: 10px; font-size: 14px; } .order-total { display: flex; justify-content: space-between; margin-top: 15px; padding-top: 15px; border-top: 1px solid var(--mid-gray); font-weight: 600; } .payment-methods { display: flex; gap: 10px; margin-bottom: 20px; } .payment-method { flex: 1; border: 1px solid var(--mid-gray); border-radius: 4px; padding: 15px; text-align: center; cursor: pointer; transition: all 0.3s ease; } .payment-method:hover { border-color: var(--secondary); } .payment-method.selected { border-color: var(--secondary); background-color: rgba(50, 75, 76, 0.05); } .payment-method i { font-size: 24px; margin-bottom: 8px; display: block; } .card-icon { position: absolute; right: 15px; top: 50%; transform: translateY(-50%); color: var(--mid-gray); } .shipping-option { border: 1px solid var(--mid-gray); border-radius: 4px; padding: 15px; margin-bottom: 15px; cursor: pointer; transition: all 0.3s ease; display: flex; align-items: center; } .shipping-option:hover { border-color: var(--secondary); } .shipping-option.selected { border-color: var(--secondary); background-color: rgba(50, 75, 76, 0.05); } .shipping-radio { margin-right: 15px; } .shipping-details { flex: 1; } .shipping-name { font-weight: 500; margin-bottom: 4px; } .shipping-description { font-size: 13px; color: #666; } .shipping-price { font-weight: 600; } .checkout-confirmation { text-align: center; height: 100%; display: flex; flex-direction: column; justify-content: center; align-items: center; animation: fadeIn 0.5s ease; } .confirmation-circle { width: 80px; height: 80px; border-radius: 50%; background-color: var(--success); display: flex; justify-content: center; align-items: center; margin-bottom: 25px; position: relative; overflow: hidden; } .confirmation-circle::after { content: "✓"; color: white; font-size: 40px; font-weight: bold; } .confirmation-circle::before { content: ""; position: absolute; width: 100%; height: 100%; border-radius: 50%; border: 4px solid rgba(255, 255, 255, 0.3); box-sizing: border-box; animation: pulse 2s infinite; } @keyframes pulse { 0% { transform: scale(0.8); opacity: 1; } 70% { transform: scale(1.1); opacity: 0; } 100% { transform: scale(0.8); opacity: 0; } } .confirmation-title { font-size: 24px; font-weight: 500; margin-bottom: 15px; color: var(--secondary); } .confirmation-message { font-size: 16px; margin-bottom: 30px; max-width: 80%; line-height: 1.6; color: #666; } .tooltip { position: relative; display: inline-block; margin-left: 5px; cursor: pointer; } .tooltip i { color: var(--mid-gray); font-size: 14px; } .tooltip .tooltip-text { visibility: hidden; width: 200px; background-color: var(--secondary); color: var(--white); text-align: center; border-radius: 4px; padding: 8px; position: absolute; z-index: 1; bottom: 125%; left: 50%; transform: translateX(-50%); opacity: 0; transition: opacity 0.3s; font-size: 12px; font-weight: normal; } .tooltip .tooltip-text::after { content: ""; position: absolute; top: 100%; left: 50%; margin-left: -5px; border-width: 5px; border-style: solid; border-color: var(--secondary) transparent transparent transparent; } .tooltip:hover .tooltip-text { visibility: visible; opacity: 1; } @media (max-width: 600px) { body { padding: 15px; } .form-row { flex-direction: column; gap: 20px; } .actions { flex-direction: column; } .step-label { font-size: 10px; } } </style> </head> <body> <div class="checkout-container"> <div class="checkout-header"> <h1>MAISON CHECKOUT</h1> <p>Complete your purchase</p> </div> <div class="progress-bar"> <div class="progress-bar-fill" id="progress-fill"></div> <div class="step active" data-step="1"> 1 <span class="step-label">Shipping</span> </div> <div class="step" data-step="2"> 2 <span class="step-label">Payment</span> </div> <div class="step" data-step="3"> 3 <span class="step-label">Review</span> </div> </div> <div class="checkout-form"> <!-- Step 1: Shipping --> <div class="form-step active" id="step-1"> <h2>Shipping Information</h2> <div class="form-group"> <label for="fullname">Full Name</label> <div class="field-container"> <input type="text" id="fullname" placeholder="Enter your full name" autocomplete="off" data-validate="required"> <span class="success-icon">✓</span> </div> <div class="error-message">Please enter your full name</div> </div> <div class="form-group"> <label for="email">Email Address</label> <div class="field-container"> <input type="email" id="email" placeholder="Enter your email address" autocomplete="off" data-validate="email"> <span class="success-icon">✓</span> </div> <div class="error-message">Please enter a valid email address</div> </div> <div class="form-group"> <label for="address">Street Address</label> <div class="field-container"> <input type="text" id="address" placeholder="Enter your street address" autocomplete="off" data-validate="required"> <span class="success-icon">✓</span> </div> <div class="error-message">Please enter your street address</div> </div> <div class="form-row"> <div class="form-col"> <div class="form-group"> <label for="city">City</label> <div class="field-container"> <input type="text" id="city" placeholder="Enter your city" autocomplete="off" data-validate="required"> <span class="success-icon">✓</span> </div> <div class="error-message">Please enter your city</div> </div> </div> <div class="form-col"> <div class="form-group"> <label for="postal-code">Postal Code</label> <div class="field-container"> <input type="text" id="postal-code" placeholder="Enter postal code" autocomplete="off" data-validate="required"> <span class="success-icon">✓</span> </div> <div class="error-message">Please enter your postal code</div> </div> </div> </div> <div class="form-group"> <label for="country">Country</label> <select id="country" data-validate="required"> <option value="">Select your country</option> <option value="US">United States</option> <option value="CA">Canada</option> <option value="UK">United Kingdom</option> <option value="AU">Australia</option> <option value="FR">France</option> <option value="DE">Germany</option> <option value="IT">Italy</option> <option value="JP">Japan</option> </select> <div class="error-message">Please select your country</div> </div> <div class="form-group"> <label>Shipping Method</label> <div class="shipping-option" data-value="standard"> <input type="radio" name="shipping" id="standard-shipping" class="shipping-radio" checked> <div class="shipping-details"> <div class="shipping-name">Standard Shipping</div> <div class="shipping-description">Delivery in 4-6 business days</div> </div> <div class="shipping-price">$5.99</div> </div> <div class="shipping-option" data-value="express"> <input type="radio" name="shipping" id="express-shipping" class="shipping-radio"> <div class="shipping-details"> <div class="shipping-name">Express Shipping</div> <div class="shipping-description">Delivery in 2-3 business days</div> </div> <div class="shipping-price">$14.99</div> </div> <div class="shipping-option" data-value="overnight"> <input type="radio" name="shipping" id="overnight-shipping" class="shipping-radio"> <div class="shipping-details"> <div class="shipping-name">Overnight Shipping</div> <div class="shipping-description">Delivery in 1 business day</div> </div> <div class="shipping-price">$24.99</div> </div> </div> <div class="actions"> <button class="btn" id="shipping-next">Continue to Payment</button> </div> </div> <!-- Step 2: Payment --> <div class="form-step" id="step-2"> <h2>Payment Details</h2> <div class="payment-methods"> <div class="payment-method selected" data-method="card"> <i>💳</i> <div>Credit Card</div> </div> <div class="payment-method" data-method="paypal"> <i>🅿️</i> <div>PayPal</div> </div> <div class="payment-method" data-method="wallet"> <i>📱</i> <div>Digital Wallet</div> </div> </div> <div id="card-payment-form"> <div class="form-group"> <label for="card-name">Name on Card</label> <div class="field-container"> <input type="text" id="card-name" placeholder="Enter name on card" autocomplete="off" data-validate="required"> <span class="success-icon">✓</span> </div> <div class="error-message">Please enter the name on your card</div> </div> <div class="form-group"> <label for="card-number">Card Number</label> <div class="field-container"> <input type="text" id="card-number" placeholder="0000 0000 0000 0000" autocomplete="off" data-validate="creditcard" maxlength="19"> <span class="card-icon">💳</span> <span class="success-icon">✓</span> </div> <div class="error-message">Please enter a valid card number</div> </div> <div class="form-row"> <div class="form-col"> <div class="form-group"> <label for="expiry-date">Expiry Date <span class="tooltip"><i>ⓘ</i><span class="tooltip-text">Enter as MM/YY format</span></span></label> <div class="field-container"> <input type="text" id="expiry-date" placeholder="MM/YY" autocomplete="off" data-validate="expiry" maxlength="5"> <span class="success-icon">✓</span> </div> <div class="error-message">Please enter a valid expiry date</div> </div> </div> <div class="form-col"> <div class="form-group"> <label for="cvv">Security Code (CVV) <span class="tooltip"><i>ⓘ</i><span class="tooltip-text">3 or 4 digits usually found on the back of your card</span></span></label> <div class="field-container"> <input type="text" id="cvv" placeholder="123" autocomplete="off" data-validate="cvv" maxlength="4"> <span class="success-icon">✓</span> </div> <div class="error-message">Please enter a valid security code</div> </div> </div> </div> <div class="form-group"> <label for="billing-zip">Billing Postal Code</label> <div class="field-container"> <input type="text" id="billing-zip" placeholder="Enter postal code" autocomplete="off" data-validate="required"> <span class="success-icon">✓</span> </div> <div class="error-message">Please enter your billing postal code</div> </div> </div> <div class="actions"> <button class="btn btn-outline" id="payment-prev">Back</button> <button class="btn" id="payment-next">Continue to Review</button> </div> </div> <!-- Step 3: Review --> <div class="form-step" id="step-3"> <h2>Review Your Order</h2> <div class="order-summary"> <div class="order-item"> <div>Gold Vermeil Chain Bracelet</div> <div>$125.00</div> </div> <div class="order-item"> <div>Silk Midi Dress - Ivory</div> <div>$295.00</div> </div> <div class="order-item"> <div>Shipping: <span id="shipping-method">Standard Shipping</span></div> <div id="shipping-cost">$5.99</div> </div> <div class="order-total"> <div>Total</div> <div id="order-total-amount">$425.99</div> </div> </div> <div class="form-group"> <label>Shipping Address</label> <div id="shipping-address" style="padding: 12px 15px; border: 1px solid var(--mid-gray); border-radius: 4px; font-size: 14px; background-color: var(--light-gray);"> Please complete step 1 </div> </div> <div class="form-group"> <label>Payment Method</label> <div id="payment-method-review" style="padding: 12px 15px; border: 1px solid var(--mid-gray); border-radius: 4px; font-size: 14px; background-color: var(--light-gray);"> Please complete step 2 </div> </div> <div class="actions"> <button class="btn btn-outline" id="review-prev">Back</button> <button class="btn" id="place-order">Place Order</button> </div> </div> </div> <!-- Confirmation Screen (hidden initially) --> <div class="checkout-confirmation" id="confirmation" style="display: none;"> <div class="confirmation-circle"></div> <h2 class="confirmation-title">Order Confirmed!</h2> <p class="confirmation-message">Thank you for your purchase. Your order #MAI23789 has been confirmed and will be processed shortly.</p> <button class="btn" id="continue-shopping">Continue Shopping</button> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const steps = document.querySelectorAll('.step'); const formSteps = document.querySelectorAll('.form-step'); const progressFill = document.getElementById('progress-fill'); const confirmationScreen = document.getElementById('confirmation'); const shippingOptions = document.querySelectorAll('.shipping-option'); const paymentMethods = document.querySelectorAll('.payment-method'); let currentStep = 1; // Initialize updateProgress(); // Shipping options selection shippingOptions.forEach(option => { option.addEventListener('click', function() { shippingOptions.forEach(opt => opt.classList.remove('selected')); this.classList.add('selected'); const radio = this.querySelector('input[type="radio"]'); radio.checked = true; // Update shipping info in review step const method = this.querySelector('.shipping-name').textContent; const cost = this.querySelector('.shipping-price').textContent; document.getElementById('shipping-method').textContent = method; document.getElementById('shipping-cost').textContent = cost; // Recalculate total calculateTotal(); }); }); // Payment methods selection paymentMethods.forEach(method => { method.addEventListener('click', function() { paymentMethods.forEach(m => m.classList.remove('selected')); this.classList.add('selected'); // Update payment method in review step const methodName = this.querySelector('div').textContent; document.getElementById('payment-method-review').textContent = `${methodName} (ending in ${document.getElementById('card-number').value.slice(-4) || '****'})`; }); }); // Next button - Shipping document.getElementById('shipping-next').addEventListener('click', function() { if (validateStep(1)) { updateShippingReview(); goToStep(2); } }); // Previous button - Payment document.getElementById('payment-prev').addEventListener('click', function() { goToStep(1); }); // Next button - Payment document.getElementById('payment-next').addEventListener('click', function() { if (validateStep(2)) { updatePaymentReview(); goToStep(3); } }); // Previous button - Review document.getElementById('review-prev').addEventListener('click', function() { goToStep(2); }); // Place order button document.getElementById('place-order').addEventListener('click', function() { // Show animation for processing order this.textContent = 'Processing...'; this.disabled = true; // Simulate order processing setTimeout(() => { document.querySelector('.checkout-form').style.display = 'none'; document.querySelector('.progress-bar').style.display = 'none'; confirmationScreen.style.display = 'flex'; }, 1500); }); // Continue shopping button document.getElementById('continue-shopping').addEventListener('click', function() { // Reset to step 1 goToStep(1); resetForm(); document.querySelector('.checkout-form').style.display = 'block'; document.querySelector('.progress-bar').style.display = 'flex'; confirmationScreen.style.display = 'none'; document.getElementById('place-order').textContent = 'Place Order'; document.getElementById('place-order').disabled = false; }); // Input field validations const inputFields = document.querySelectorAll('input[data-validate], select[data-validate]'); inputFields.forEach(field => { field.addEventListener('blur', function() { validateField(this); }); field.addEventListener('input', function() { // Format card number with spaces if (this.id === 'card-number') { formatCardNumber(this); } // Format expiry date if (this.id === 'expiry-date') { formatExpiryDate(this); } // Remove error styling on input this.classList.remove('error'); this.parentElement.nextElementSibling.style.display = 'none'; }); }); // Functions function goToStep(step) { currentStep = step; // Update active step steps.forEach(s => { const stepNum = parseInt(s.dataset.step); s.classList.remove('active', 'completed'); if (stepNum < currentStep) { s.classList.add('completed'); } else if (stepNum === currentStep) { s.classList.add('active'); } }); // Show active form step formSteps.forEach((s, index) => { s.classList.remove('active'); if (index === currentStep - 1) { s.classList.add('active'); } }); updateProgress(); } function updateProgress() { const percentage = ((currentStep - 1) / (steps.length - 1)) * 100; progressFill.style.width = `${percentage}%`; } function validateStep(stepNum) { const currentFormStep = document.getElementById(`step-${stepNum}`); const fields = currentFormStep.querySelectorAll('[data-validate]'); let isValid = true; fields.forEach(field => { if (!validateField(field)) { isValid = false; } }); return isValid; } function validateField(field) { const value = field.value.trim(); const validationType = field.dataset.validate; let isValid = true; const errorElement = field.parentElement.nextElementSibling; const successIcon = field.parentElement.querySelector('.success-icon'); // Reset field.classList.remove('error'); errorElement.style.display = 'none'; successIcon.style.display = 'none'; switch (validationType) { case 'required': isValid = value !== ''; break; case 'email': const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; isValid = emailRegex.test(value); break; case 'creditcard': // Just basic validation - checking if it's a number with correct length const cleanValue = value.replace(/\s/g, ''); isValid = /^\d{13,19}$/.test(cleanValue); break; case 'expiry': const expiryRegex = /^(0[1-9]|1[0-2])\/\d{2}$/; if (expiryRegex.test(value)) { const [month, year] = value.split('/'); const currentYear = new Date().getFullYear() % 100; const currentMonth = new Date().getMonth() + 1; // Check if the card is not expired isValid = (parseInt(year) > currentYear || (parseInt(year) === currentYear && parseInt(month) >= currentMonth)); } else { isValid = false; } break; case 'cvv': isValid = /^\d{3,4}$/.test(value); break; } if (!isValid) { field.classList.add('error'); errorElement.style.display = 'block'; } else if (value) { successIcon.style.display = 'block'; } return isValid; } function formatCardNumber(input) { let value = input.value.replace(/\D/g, ''); let formattedValue = ''; for (let i = 0; i < value.length; i++) { if (i > 0 && i % 4 === 0) { formattedValue += ' '; } formattedValue += value[i]; } input.value = formattedValue; } function formatExpiryDate(input) { let value = input.value.replace(/\D/g, ''); if (value.length > 2) { input.value = value.substring(0, 2) + '/' + value.substring(2); } else { input.value = value; } } function updateShippingReview() { const fullname = document.getElementById('fullname').value; const address = document.getElementById('address').value; const city = document.getElementById('city').value; const postalCode = document.getElementById('postal-code').value; const country = document.getElementById('country'); const countryText = country.options[country.selectedIndex].text; document.getElementById('shipping-address').textContent = `${fullname} ${address} ${city}, ${postalCode} ${countryText}`; } function updatePaymentReview() { const selectedMethod = document.querySelector('.payment-method.selected'); const methodName = selectedMethod.querySelector('div').textContent; if (methodName === 'Credit Card') { const cardNumber = document.getElementById('card-number').value; document.getElementById('payment-method-review').textContent = `Credit Card (ending in ${cardNumber.slice(-4)})`; } else { document.getElementById('payment-method-review').textContent = methodName; } } function calculateTotal() { const selectedShipping = document.querySelector('.shipping-option.selected') || document.querySelector('.shipping-option'); const shippingCost = selectedShipping.querySelector('.shipping-price').textContent; const shippingValue = parseFloat(shippingCost.replace('$', '')); // Base price of items const basePrice = 420.00; // $125 + $295 const total = basePrice + shippingValue; document.getElementById('order-total-amount').textContent = `$${total.toFixed(2)}`; } function resetForm() { const allInputs = document.querySelectorAll('input, select'); allInputs.forEach(input => { input.value = ''; input.classList.remove('error'); const successIcon = input.parentElement.querySelector('.success-icon'); if (successIcon) successIcon.style.display = 'none'; }); // Reset shipping and payment selections shippingOptions.forEach((option, index) => { if (index === 0) { option.classList.add('selected'); option.querySelector('input').checked = true; } else { option.classList.remove('selected'); option.querySelector('input').checked = false; } }); paymentMethods.forEach((method, index) => { if (index === 0) { method.classList.add('selected'); } else { method.classList.remove('selected'); } }); // Reset review information document.getElementById('shipping-address').textContent = 'Please complete step 1'; document.getElementById('payment-method-review').textContent = 'Please complete step 2'; document.getElementById('shipping-method').textContent = 'Standard Shipping'; document.getElementById('shipping-cost').textContent = '$5.99'; calculateTotal(); } // Initialize shipping options const defaultShipping = document.querySelector('.shipping-option'); defaultShipping.classList.add('selected'); calculateTotal(); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>StreamVerse Subscription Checkout</title> <style> :root { --primary: #6c63ff; --secondary: #ff6584; --accent: #4ce1b6; --dark: #2d3748; --light: #f7fafc; --error: #ff4757; --success: #2ed573; --gradient: linear-gradient(135deg, var(--primary), var(--secondary)); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Poppins', sans-serif; } body { background: #f0f2f5; color: var(--dark); display: flex; justify-content: center; align-items: center; min-height: 100vh; overflow-x: hidden; padding: 20px; } .container { width: 100%; max-width: 650px; background: white; border-radius: 16px; box-shadow: 0 15px 35px rgba(0, 0, 0, 0.1); overflow: hidden; position: relative; } .header { background: var(--gradient); padding: 25px 30px; text-align: center; color: white; position: relative; overflow: hidden; } .header::before { content: ''; position: absolute; top: -50%; left: -50%; width: 200%; height: 200%; background: radial-gradient(circle, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0) 60%); transform: rotate(30deg); animation: shimmer 5s infinite linear; } @keyframes shimmer { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .header h1 { font-size: 28px; margin-bottom: 5px; position: relative; z-index: 2; } .header p { opacity: 0.9; font-size: 16px; position: relative; z-index: 2; } .progress-container { display: flex; justify-content: space-between; margin: 35px 30px 25px; position: relative; } .progress-container::before { content: ''; position: absolute; top: 50%; left: 0; transform: translateY(-50%); height: 4px; width: 100%; background: #e0e0e0; z-index: 1; } .progress-bar { position: absolute; top: 50%; left: 0; transform: translateY(-50%); height: 4px; background: var(--gradient); z-index: 2; width: 0%; transition: width 0.5s ease; } .step { width: 40px; height: 40px; background: white; border: 4px solid #e0e0e0; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: bold; color: var(--dark); z-index: 3; position: relative; transition: all 0.3s ease; } .step.active { border-color: var(--primary); background: white; transform: scale(1.1); box-shadow: 0 0 15px rgba(108, 99, 255, 0.4); } .step.completed { border-color: var(--primary); background: var(--primary); color: white; } .step-label { position: absolute; top: 45px; left: 50%; transform: translateX(-50%); font-size: 12px; white-space: nowrap; font-weight: 500; color: var(--dark); } .form-container { padding: 20px 30px 30px; height: 425px; overflow: hidden; position: relative; } .step-content { position: absolute; width: 100%; transition: transform 0.5s ease-in-out, opacity 0.4s ease; opacity: 0; transform: translateX(100px); top: 20px; left: 0; padding: 0 30px; pointer-events: none; } .step-content.active { opacity: 1; transform: translateX(0); pointer-events: all; } .step-content h2 { margin-bottom: 20px; color: var(--primary); font-size: 22px; } .form-group { margin-bottom: 20px; } .form-group label { display: block; margin-bottom: 8px; font-weight: 500; font-size: 14px; } .form-control { width: 100%; padding: 14px 16px; font-size: 15px; border: 2px solid #e0e0e0; border-radius: 8px; transition: border-color 0.3s, box-shadow 0.3s; background: #f9f9f9; } .form-control:focus { border-color: var(--primary); box-shadow: 0 0 0 3px rgba(108, 99, 255, 0.25); outline: none; background: white; } .form-control.error { border-color: var(--error); background: rgba(255, 71, 87, 0.05); } .error-message { color: var(--error); font-size: 13px; margin-top: 6px; display: none; animation: shake 0.4s ease-in-out; } @keyframes shake { 0%, 100% { transform: translateX(0); } 20%, 60% { transform: translateX(-5px); } 40%, 80% { transform: translateX(5px); } } .plan-options { display: flex; gap: 15px; margin-bottom: 20px; } .plan-option { flex: 1; padding: 16px; border: 2px solid #e0e0e0; border-radius: 10px; text-align: center; cursor: pointer; transition: all 0.3s; position: relative; overflow: hidden; } .plan-option:hover { transform: translateY(-5px); box-shadow: 0 8px 15px rgba(0, 0, 0, 0.1); } .plan-option.selected { border-color: var(--primary); background: rgba(108, 99, 255, 0.05); box-shadow: 0 5px 15px rgba(108, 99, 255, 0.2); } .plan-option.selected::before { content: '✓'; position: absolute; top: -10px; right: -10px; width: 30px; height: 30px; background: var(--primary); color: white; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 14px; transform: scale(0); animation: checkmark 0.5s forwards; } @keyframes checkmark { 0% { transform: scale(0); } 70% { transform: scale(1.2); } 100% { transform: scale(1); } } .plan-name { font-weight: 600; margin-bottom: 5px; font-size: 16px; } .plan-price { font-size: 20px; font-weight: 700; color: var(--primary); margin-bottom: 5px; } .plan-description { font-size: 13px; color: #666; } .payment-card { border: 2px solid #e0e0e0; border-radius: 10px; padding: 15px; margin-bottom: 20px; position: relative; transition: all 0.3s; } .payment-card.active { border-color: var(--primary); background: rgba(108, 99, 255, 0.05); box-shadow: 0 5px 15px rgba(108, 99, 255, 0.2); } .card-header { display: flex; align-items: center; margin-bottom: 15px; } .radio-input { opacity: 0; position: absolute; } .radio-label { padding-left: 28px; position: relative; cursor: pointer; display: inline-block; font-weight: 600; font-size: 16px; } .radio-label::before { content: ''; position: absolute; left: 0; top: 0; width: 20px; height: 20px; border: 2px solid #ccc; border-radius: 50%; transition: all 0.3s; } .radio-label::after { content: ''; position: absolute; left: 5px; top: 5px; width: 10px; height: 10px; border-radius: 50%; background: var(--primary); transform: scale(0); transition: transform 0.3s; } .radio-input:checked + .radio-label::before { border-color: var(--primary); } .radio-input:checked + .radio-label::after { transform: scale(1); } .card-icons { display: flex; gap: 8px; margin-left: auto; } .card-icon { width: 30px; height: 20px; background-size: contain; background-repeat: no-repeat; background-position: center; opacity: 0.7; transition: opacity 0.3s; } .card-info { display: none; animation: fadeIn 0.5s; } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .card-info.active { display: block; } .card-row { display: flex; gap: 15px; margin-bottom: 15px; } .card-row .form-group { flex: 1; margin-bottom: 0; } .summary-list { margin-bottom: 20px; } .summary-item { display: flex; justify-content: space-between; padding: 10px 0; border-bottom: 1px solid #eee; } .summary-total { display: flex; justify-content: space-between; padding: 15px 0; font-size: 18px; font-weight: 700; color: var(--primary); margin-top: 15px; border-top: 2px solid #eee; } .btn-container { display: flex; justify-content: space-between; margin-top: 30px; } .btn { padding: 14px 24px; border-radius: 8px; font-weight: 600; font-size: 16px; cursor: pointer; transition: all 0.3s; border: none; outline: none; } .btn-prev { background: transparent; color: var(--dark); border: 2px solid #e0e0e0; } .btn-prev:hover { background: #f5f5f5; border-color: #d0d0d0; } .btn-next { background: var(--gradient); color: white; box-shadow: 0 5px 15px rgba(108, 99, 255, 0.3); } .btn-next:hover { box-shadow: 0 7px 20px rgba(108, 99, 255, 0.4); transform: translateY(-2px); } .confetti { position: fixed; width: 10px; height: 10px; background-color: #f0f0f0; position: absolute; top: 0; opacity: 0; z-index: 1000; } @keyframes confettiRain { 0% { opacity: 1; transform: translateY(0) rotateZ(0); } 100% { opacity: 0; transform: translateY(1000px) rotateZ(720deg); } } .success-animation { text-align: center; margin-top: 50px; } .success-circle { width: 80px; height: 80px; background: var(--success); border-radius: 50%; margin: 0 auto 20px; position: relative; animation: successPulse 2s infinite; } @keyframes successPulse { 0% { box-shadow: 0 0 0 0 rgba(46, 213, 115, 0.6); } 70% { box-shadow: 0 0 0 20px rgba(46, 213, 115, 0); } 100% { box-shadow: 0 0 0 0 rgba(46, 213, 115, 0); } } .success-circle::before { content: ''; width: 30px; height: 15px; border-left: 4px solid white; border-bottom: 4px solid white; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -60%) rotate(-45deg); } .success-title { font-size: 24px; color: var(--success); margin-bottom: 15px; } .success-text { color: #666; margin-bottom: 30px; } .pulse-btn { animation: pulseBtn 1.5s infinite; } @keyframes pulseBtn { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } .features { display: flex; flex-direction: column; gap: 10px; margin-top: 15px; } .feature-item { display: flex; align-items: center; font-size: 14px; } .feature-icon { width: 20px; height: 20px; background: var(--accent); border-radius: 50%; display: flex; align-items: center; justify-content: center; margin-right: 10px; color: white; font-size: 12px; } @media (max-width: 600px) { .container { border-radius: 0; box-shadow: none; } .header { padding: 20px; } .header h1 { font-size: 24px; } .progress-container { margin: 25px 20px 20px; } .form-container { padding: 15px 20px 25px; height: 450px; } .step-content { padding: 0 20px; } .step-content h2 { font-size: 20px; } .plan-options { flex-direction: column; gap: 10px; } .card-row { flex-direction: column; gap: 10px; } .btn { padding: 12px 18px; font-size: 15px; } } /* Special effect for the back of the card */ .flip-card { perspective: 1000px; margin-top: 15px; } .flip-card-inner { position: relative; width: 100%; height: 60px; text-align: center; transition: transform 0.8s; transform-style: preserve-3d; } .flip-card.flipped .flip-card-inner { transform: rotateY(180deg); } .flip-card-front, .flip-card-back { position: absolute; width: 100%; height: 100%; -webkit-backface-visibility: hidden; backface-visibility: hidden; border-radius: 8px; padding: 15px; background-color: #f9f9f9; border: 2px solid #e0e0e0; display: flex; align-items: center; } .flip-card-back { transform: rotateY(180deg); background-color: #f5f5f5; justify-content: space-between; } .flip-btn { background: none; border: none; color: var(--primary); font-weight: 600; cursor: pointer; font-size: 13px; text-decoration: underline; margin-left: auto; transition: color 0.3s; } .flip-btn:hover { color: var(--secondary); } .cvv-label { font-size: 14px; font-weight: 500; margin-right: 15px; } </style> </head> <body> <div class="container"> <div class="header"> <h1>StreamVerse Premium</h1> <p>Unlock a world of unlimited entertainment</p> </div> <div class="progress-container"> <div class="progress-bar" id="progress-bar"></div> <div class="step active" data-step="1"> 1 <span class="step-label">Plan</span> </div> <div class="step" data-step="2"> 2 <span class="step-label">Details</span> </div> <div class="step" data-step="3"> 3 <span class="step-label">Payment</span> </div> <div class="step" data-step="4"> 4 <span class="step-label">Confirm</span> </div> </div> <div class="form-container"> <!-- Step 1: Plan Selection --> <div class="step-content active" id="step-1"> <h2>Choose Your Plan</h2> <div class="plan-options"> <div class="plan-option" data-plan="basic"> <div class="plan-name">Basic</div> <div class="plan-price">$8.99<span>/mo</span></div> <div class="plan-description">HD streaming on one device</div> <div class="features"> <div class="feature-item"> <div class="feature-icon">✓</div> <span>HD Content</span> </div> <div class="feature-item"> <div class="feature-icon">✓</div> <span>1 Device</span> </div> <div class="feature-item"> <div class="feature-icon">✓</div> <span>Ad-free</span> </div> </div> </div> <div class="plan-option" data-plan="standard"> <div class="plan-name">Standard</div> <div class="plan-price">$13.99<span>/mo</span></div> <div class="plan-description">Full HD on two devices</div> <div class="features"> <div class="feature-item"> <div class="feature-icon">✓</div> <span>Full HD</span> </div> <div class="feature-item"> <div class="feature-icon">✓</div> <span>2 Devices</span> </div> <div class="feature-item"> <div class="feature-icon">✓</div> <span>Downloads</span> </div> </div> </div> <div class="plan-option" data-plan="premium"> <div class="plan-name">Premium</div> <div class="plan-price">$17.99<span>/mo</span></div> <div class="plan-description">4K HDR on four devices</div> <div class="features"> <div class="feature-item"> <div class="feature-icon">✓</div> <span>4K HDR</span> </div> <div class="feature-item"> <div class="feature-icon">✓</div> <span>4 Devices</span> </div> <div class="feature-item"> <div class="feature-icon">✓</div> <span>Spatial Audio</span> </div> </div> </div> </div> <div class="btn-container"> <div></div> <button class="btn btn-next" id="step1-next">Continue</button> </div> </div> <!-- Step 2: User Details --> <div class="step-content" id="step-2"> <h2>Account Details</h2> <div class="form-group"> <label for="email">Email Address</label> <input type="email" id="email" class="form-control" placeholder="[email protected]"> <div class="error-message" id="email-error">Please enter a valid email address</div> </div> <div class="form-group"> <label for="username">Username</label> <input type="text" id="username" class="form-control" placeholder="Choose a username"> <div class="error-message" id="username-error">Username must be at least 4 characters</div> </div> <div class="form-group"> <label for="password">Password</label> <input type="password" id="password" class="form-control" placeholder="Create a secure password"> <div class="error-message" id="password-error">Password must be at least 8 characters</div> </div> <div class="btn-container"> <button class="btn btn-prev" id="step2-prev">Back</button> <button class="btn btn-next" id="step2-next">Continue</button> </div> </div> <!-- Step 3: Payment Method --> <div class="step-content" id="step-3"> <h2>Payment Information</h2> <div class="payment-card active"> <div class="card-header"> <input type="radio" id="credit-card" name="payment-method" class="radio-input" checked> <label for="credit-card" class="radio-label">Credit/Debit Card</label> <div class="card-icons"> <div class="card-icon" style="background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NzYgNTEyIj48cGF0aCBmaWxsPSIjMDA3OWJlIiBkPSJNNDcwLjEgMzJoLTQxMkM0OC4xNCAzMiAyMiA1OC4xNCAyMiA5MC4xdjMzMS44YzAgMzEuOTYgMjYuMTQgNTguMSA1OC4xIDU4LjFoNDEyYzMxLjk2IDAgNTguMS0yNi4xNCA1OC4xLTU4LjFWOTAuMWMwLTMxLjk2LTI2LjE0LTU4LjEtNTguMS01OC4xek0zOTIuMCAyODQuMmMwIDI1LjczLTIwLjk1IDQ2LjctNDYuNyA0Ni43aC02Ni42M2MtMjUuNzUgMC00Ni43LTIwLjk1LTQ2LjctNDYuN3YtNjYuNmMwLTI1Ljc1IDIwLjk1LTQ2LjcgNDYuNy00Ni43aDY2LjYzYzI1Ljc1IDAgNDYuNyAyMC45NSA0Ni43IDQ2Ljd2NjYuNnoiLz48L3N2Zz4=')"></div> <div class="card-icon" style="background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NzYgNTEyIj48cGF0aCBmaWxsPSIjZWQwMDA2IiBkPSJNNDgwLjMgMTM2LjljMCAxMC45LTYuNiAyNi0yNC40IDI2LTExLjggMC0xNy41LTcuMy0xNy41LTE2LjIgMC0xMi44IDExLjItMTkuNyAyNC42LTE5LjcgMy4yIDAgNi4xLjMgOS4yIDEuMXYtMmMwLTUuMi0zLjItOC4yLTkuNS04LjItNS4yIDAtOS42IDEuMS0xMy43IDIuOXYtMTJjNC41LTEuOSAxMC41LTMgMTcuMi0zIDEzLjEgMCAyMy4yIDYuMiAyMy4yIDIzLjV2N3ptLTQwLjEtNy41YzAgNi41IDMuOCA5LjYgOS4yIDkuNiA2LjIgMCAxNS40LTMuNiAxNS40LTEzLjJ2LTIuM2MtMi4xLS42LTQuNy0uOC03LTEuMS03LjkgMC0xNy42IDIuMy0xNy42IDd6TTUzOC4xIDk5YzAtNC40LTEtOC0yLjItMTEuNmgtMjUuNnYzLjVjNS41IDUuNiA4LjEgMTIuOSA4LjEgMjEuOXYxMy45aC0xMi40YzMuOCAwIDcgLjggOS41IDIuM3YxMS44Yy0yLjYgMS4zLTYuMSAyLjItMTAuNCAxLjktNi41LS4zLTExLjUuOS0xNi4xIDMuM1YxMjBjMC0xMi42LTYuOC0yNC0yMC42LTI0LTQuNyAwLTguNyAxLjUtMTIuMSA0LjQtMy40LTIuOS03LjgtNC40LTEyLjktNC40LTEzLjggMC0yMC44IDguOC0yMC44IDI0LjV2MjZoLTE0Ljd2LTI3YzAtMTIuMy02LjktMjMuNS0yMS0yMy41LTEzLjIgMC0yMi45IDkuOS0yMi45IDI2Ljk2di4wNGMwIDYuOTUgMS45IDEzLjczIDYgMTljLTQuNjUgMS45NS0xMS44IDMuMTItMjAuMzQgMS42NXYtNDguNmgtMTQuOXYzNC4ybC0uMDEtLjAxYy0xLjE5IDExLjQuODcgMjEuMDEgNy41IDI4LjkxYTI0LjM2IDI0LjM2IDAgMCAxLTcuMzcgMy43NWMtLjk0LjI5LTEuOTEuNTItMi45Mi43LS4yOC0uMDgtLjU3LS4xNi0uODYtLjIzLS45Mi0yLjk2LS4zMi02LjczIDEuODMtOC42LTMuNjggMC02LjAyLTIuMzMtNi4wMi02Ljg0IDAtMi4zNyAxLjE5LTQuOCAzLjU3LTYuNDUgMy0yLjA3IDEuODgtNS44MS0uMzUtNy42MS0yLjIzLTEuNzktNi4zNC0xLjQ3LTguNjcuMzMtMi4zMyAxLjgtMy42NyA0LjQ2LTMuNjcgNy4xM3YuMDFjMCAzLjU2LTIuMzMgNi0zLjk5IDcuMTYtLjUtMS4wOS0xLjE5LTIuMDEtMi4wNi0yLjczLTIuMjEtMS44Mi01Ljk3LTEuODItOC4xOSAwQTcuNDY3IDcuNDY3IDAgMCAwIDIzMS4wNiAxMzJjMCAzLjI3IDIuMDQgNi4xOSA1LjE1IDcuMjZBMjIyLjUgMjIyLjUgMCAwIDAgMjI4IDEzNmgtMjUuNXYtMTQuNWMwLTE1LTkuNC0yNC41LTI0LjktMjQuNS0xMi40IDAtMjAuMSA1LjUtMjIuMiA1LjUtMiAwLTIuNC0uOS0yLjUtMi43IDAtMS4xLjktMi40IDIuNS0zLjYgMCAwIDguMy01LjQgMjAuNy01LjQgMTQuMyAwIDI3LjEgOS40IDI3LjEgMzEuNVYxMzZoLTQ2LjdjLTEuMDEgMC0xLjk3LjIzLTIuODcuNTktMy4zNy0zLjI5LTUuNi03LjkzLTUuNi0xMy4yMiAwLTkuOTMgOC4wMS0xOC4wMSAxNy45MS0xOC4wMSA0LjE1IDAgNy45NyAxLjQyIDExLjAyIDMuNzlsLjAyLS4wNGMzLjA1LTIuMzcgNi44Ny0zLjc5IDExLjAyLTMuNzkgOS45IDAgMTcuOTMgOC4wNiAxNy45MyAxOC4wMSAwIDUuMjgtMi4yOCA5Ljk0LTUuODggMTMuMjNIMTUwYTIzLjkxIDIzLjkxIDAgMCAwLTQuMTQtLjZjLS42MS0uMDUtMS4yLS4xLTEuNzgtLjEtNi4wNSAwLTExLjM1IDIuMzEtMTUuNTcgNS41SDI5LjJBMjkuMjEgMjkuMjEgMCAwIDEgMCA5MC43OVYyOS4yQzAgMTMuMDcgMTMuMDcgMCAyOS4yIDBINTE3YzE2LjEzIDAgMjkuMiAxMy4wNyAyOS4yIDI5LjJ2NjEuNTljMCAxNC40LTExLjQ1IDI2LjA5LTI1Ljc4IDI2LjM4LTIuOTUtLjA1LTUuNzEtLjctNS43MS03LjE3di0xMXptLTIwMS4yLTkxLjI1aDEyLjZ2NDEuMyAxLjY1YzAgNC4xOSAxLjk0IDcuMDUgNi4xNiA3LjA1IDUuMjcgMCAxMC4xMS00LjQzIDEwLjUzLTkuN1YwaDEyLjZsMC0uMDF2NDQuNjVjMCAxMy45OC03LjA2IDI0LjUtMjIuOTMgMjQuNS04LjggMC0xMy42OC0yLjk3LTE4Ljk2LTcuMzJWMHpNMzY0IDUxLjQ1di0xLjhWMjAuM2gtMTIuN3YzLjVjLTMuMTQtMi42OC02LjU0LTQuNjItMTIuOTMtNC42Mi0xMi44IDAtMjEuODggMTAuMi0yMS44OCAyNS40NnYuMDRjMCAxNS4yOCA5LjA4IDI1LjQ0IDIxLjg4IDI1LjQ0IDYuMzkgMCA5Ljc5LTEuNzQgMTIuOTMtNC44N3YxLjgwNmMwIDguMTM0LTQuMzY2IDEyLjY5NC0xMi41MyAxMi42OTQtNS43NTggMC0xMS4yMTQtMS45My0xNS4yMjktNC4zNnYxMy4yNjVjNC4xNzUgMi4yNzMgOC45OTMgMy44MzQgMTYuMjY5IDMuODM0IDE1LjY2OSAwIDI0LjE4OS05LjEzNCAyNC4xODktMjUuNzI0VjUxLjQ1em00OS4yIDIxLjM1Yy0zLjkyIDAtNi4zNy0yLjg2LTYuMzctNy42M1YzMy41OWg5Ljk4djExLjYzYzAgNC43Ny0yLjIgNy42My02LjA3IDcuNjN6TTQxOC40IDE1LjE3YzAtNC45MS0zLjctOC42OS04LjgxLTguNjlzLTguODIgMy43OC04LjgyIDguNjkgMy43MSA4LjY5IDguODIgOC42OSA4LjgxLTMuNzggOC44MS04LjY5ek00MDEuMDYgMjBoMTcuMDR2NDUuMyAxLjdoLTE3LjA0VjIwem0tOTkuODkgMjAuMyA3LjE3LTIwLjNoMTMuNTNsL
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Enterprise SaaS Checkout</title> <style> :root { --primary: #1a3b5d; --secondary: #4b6a8a; --accent: #0084ff; --light: #f5f7fa; --mid: #e0e5eb; --dark: #2c3e50; --success: #25b979; --error: #e74c3c; --shadow: rgba(22, 40, 69, 0.1); --font-main: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: var(--font-main); } body { background-color: var(--light); color: var(--dark); height: 100%; overflow-y: auto; padding: 20px; font-size: 14px; line-height: 1.5; } .checkout-container { max-width: 650px; margin: 0 auto; background: white; border-radius: 12px; box-shadow: 0 8px 30px var(--shadow); overflow: hidden; height: calc(100vh - 40px); max-height: 660px; display: flex; flex-direction: column; } .checkout-header { padding: 25px 30px 20px; border-bottom: 1px solid var(--mid); background: linear-gradient(to right, #fbfcfd, #f7f9fc); } .logo { height: 32px; margin-bottom: 15px; display: flex; align-items: center; } .logo-icon { width: 32px; height: 32px; border-radius: 6px; background: linear-gradient(135deg, var(--primary), var(--accent)); display: flex; align-items: center; justify-content: center; color: white; font-weight: 700; margin-right: 12px; } .logo-text { font-weight: 600; font-size: 18px; color: var(--primary); } .checkout-title { font-size: 22px; font-weight: 600; color: var(--primary); margin-bottom: 5px; } .checkout-subtitle { color: var(--secondary); font-size: 15px; } .checkout-body { padding: 25px 30px; overflow-y: auto; flex: 1; } .summary { display: flex; align-items: center; margin-bottom: 25px; padding: 18px; border-radius: 10px; background: linear-gradient(to right, #f7faff, #edf4ff); border: 1px solid #e1ebfa; } .plan-icon { background: white; width: 46px; height: 46px; border-radius: 8px; display: flex; align-items: center; justify-content: center; margin-right: 15px; flex-shrink: 0; color: var(--accent); box-shadow: 0 3px 10px rgba(0, 132, 255, 0.15); } .plan-details { flex: 1; } .plan-name { font-weight: 600; font-size: 16px; color: var(--primary); margin-bottom: 4px; } .plan-billing { color: var(--secondary); font-size: 14px; } .plan-price { font-weight: 700; font-size: 18px; color: var(--primary); white-space: nowrap; } .field-group { margin-bottom: 22px; } .field-label { display: block; margin-bottom: 8px; font-weight: 500; color: var(--primary); } .field-required { color: var(--accent); font-weight: 700; } .field-input { width: 100%; padding: 12px 16px; border: 1px solid var(--mid); border-radius: 8px; font-size: 15px; outline: none; transition: all 0.2s ease; background: white; } .field-input:hover { border-color: #c0ccd9; } .field-input:focus { border-color: var(--accent); box-shadow: 0 0 0 3px rgba(0, 132, 255, 0.1); } .field-row { display: flex; gap: 15px; } .field-col { flex: 1; } .tooltip { display: inline-block; margin-left: 6px; position: relative; cursor: pointer; } .tooltip-icon { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; border-radius: 50%; background: var(--mid); color: var(--secondary); font-size: 11px; font-weight: 600; } .tooltip-content { position: absolute; top: 100%; left: 50%; transform: translateX(-50%); margin-top: 8px; width: 250px; padding: 10px 12px; background: white; border-radius: 6px; box-shadow: 0 4px 15px var(--shadow); font-size: 13px; color: var(--secondary); opacity: 0; visibility: hidden; transition: all 0.2s ease; pointer-events: none; z-index: 10; } .tooltip-content::before { content: ''; position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); border: 6px solid transparent; border-bottom-color: white; } .tooltip:hover .tooltip-content { opacity: 1; visibility: visible; } .collapsible { margin-bottom: 22px; } .collapsible-header { display: flex; align-items: center; justify-content: space-between; padding: 14px 18px; background: var(--light); border-radius: 8px; cursor: pointer; transition: all 0.2s ease; } .collapsible-header:hover { background: #edf0f5; } .collapsible-title { font-weight: 600; color: var(--primary); } .collapsible-icon { color: var(--secondary); transform: rotate(0deg); transition: transform 0.3s ease; } .collapsible-content { max-height: 0; overflow: hidden; transition: max-height 0.3s ease, padding 0.3s ease; padding: 0 18px; } .collapsible.open .collapsible-icon { transform: rotate(180deg); } .collapsible.open .collapsible-content { max-height: 500px; padding: 18px; } .checkout-footer { padding: 20px 30px; border-top: 1px solid var(--mid); background: linear-gradient(to right, #fbfcfd, #f7f9fc); } .submit-btn { width: 100%; padding: 14px; background: linear-gradient(to right, var(--accent), #2196f3); color: white; font-weight: 600; font-size: 16px; border: none; border-radius: 8px; cursor: pointer; transition: all 0.2s ease; box-shadow: 0 4px 10px rgba(0, 132, 255, 0.25); } .submit-btn:hover { background: linear-gradient(to right, #007ae6, #0b87e4); box-shadow: 0 6px 15px rgba(0, 132, 255, 0.3); } .submit-btn:active { transform: translateY(1px); } .secure-badge { display: flex; align-items: center; justify-content: center; margin-top: 14px; color: var(--secondary); font-size: 13px; } .secure-badge svg { margin-right: 8px; } .error-message { color: var(--error); font-size: 13px; margin-top: 6px; display: none; } .field-input.error { border-color: var(--error); background-color: rgba(231, 76, 60, 0.03); } .field-input.error + .error-message { display: block; } .field-input.valid { border-color: var(--success); background-color: rgba(37, 185, 121, 0.03); } .card-input-container { position: relative; } .card-icon { position: absolute; right: 16px; top: 50%; transform: translateY(-50%); color: var(--secondary); } /* Progress steps */ .progress-steps { display: flex; margin-bottom: 25px; padding-bottom: 18px; border-bottom: 1px solid var(--mid); } .step { flex: 1; display: flex; align-items: center; position: relative; } .step-number { width: 26px; height: 26px; border-radius: 50%; background: var(--light); border: 1px solid var(--mid); display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 600; color: var(--secondary); margin-right: 8px; transition: all 0.3s ease; z-index: 1; } .step-text { font-size: 13px; color: var(--secondary); transition: all 0.3s ease; } .step.active .step-number { background: var(--accent); border-color: var(--accent); color: white; } .step.active .step-text { color: var(--primary); font-weight: 500; } .step.completed .step-number { background: var(--success); border-color: var(--success); color: white; } .step::before { content: ''; position: absolute; top: 13px; left: 26px; width: calc(100% - 26px); height: 1px; background: var(--mid); z-index: 0; } .step:last-child::before { display: none; } /* Loading pulse animation for submit button */ @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(0, 132, 255, 0.4); } 70% { box-shadow: 0 0 0 10px rgba(0, 132, 255, 0); } 100% { box-shadow: 0 0 0 0 rgba(0, 132, 255, 0); } } .submit-btn.processing { animation: pulse 1.5s infinite; opacity: 0.9; } /* Card flip animation for confirmation */ .checkout-wrapper { perspective: 1000px; height: 100%; } .checkout-container { transition: transform 0.6s; transform-style: preserve-3d; position: relative; } .checkout-container.flipped { transform: rotateY(180deg); } .checkout-front, .checkout-back { backface-visibility: hidden; position: absolute; top: 0; left: 0; right: 0; bottom: 0; display: flex; flex-direction: column; } .checkout-front { z-index: 2; transform: rotateY(0deg); } .checkout-back { transform: rotateY(180deg); background: white; display: flex; flex-direction: column; justify-content: center; align-items: center; padding: 30px; text-align: center; } .success-icon { width: 80px; height: 80px; background: var(--success); border-radius: 50%; display: flex; align-items: center; justify-content: center; margin-bottom: 25px; color: white; font-size: 40px; } .success-title { font-size: 24px; font-weight: 600; color: var(--primary); margin-bottom: 15px; } .success-message { color: var(--secondary); margin-bottom: 30px; } .success-details { background: var(--light); padding: 20px; border-radius: 10px; width: 100%; max-width: 400px; margin-bottom: 25px; } .detail-row { display: flex; justify-content: space-between; margin-bottom: 10px; } .detail-row:last-child { margin-bottom: 0; padding-top: 10px; border-top: 1px dashed var(--mid); font-weight: 600; } .detail-label { color: var(--secondary); } .detail-value { color: var(--primary); font-weight: 500; } @media (max-width: 600px) { .field-row { flex-direction: column; gap: 10px; } .checkout-body { padding: 20px; } .checkout-header, .checkout-footer { padding: 20px; } } </style> </head> <body> <div class="checkout-wrapper"> <div class="checkout-container"> <div class="checkout-front"> <div class="checkout-header"> <div class="logo"> <div class="logo-icon">EC</div> <div class="logo-text">EnterpriseCloud</div> </div> <h1 class="checkout-title">Complete Your Purchase</h1> <p class="checkout-subtitle">Secure enterprise-level checkout for EnterpriseCloud Suite</p> </div> <div class="checkout-body"> <div class="progress-steps"> <div class="step completed"> <div class="step-number">✓</div> <div class="step-text">Plan</div> </div> <div class="step active"> <div class="step-number">2</div> <div class="step-text">Billing</div> </div> <div class="step"> <div class="step-number">3</div> <div class="step-text">Confirm</div> </div> </div> <div class="summary"> <div class="plan-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <rect x="2" y="7" width="20" height="14" rx="2" ry="2"></rect> <path d="M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16"></path> </svg> </div> <div class="plan-details"> <div class="plan-name">Enterprise Cloud Suite Pro</div> <div class="plan-billing">Annual billing · 50 user licenses</div> </div> <div class="plan-price">$24,000.00</div> </div> <form id="checkout-form"> <div class="field-group"> <label class="field-label">Company Information</label> <div class="field-row"> <div class="field-col"> <input type="text" class="field-input" placeholder="Company Name" required> </div> <div class="field-col"> <input type="text" class="field-input" placeholder="VAT/Tax ID" id="tax-id"> <div class="tooltip"> <div class="tooltip-icon">?</div> <div class="tooltip-content">For EU companies, please enter your VAT number. For US businesses, enter your EIN/TIN.</div> </div> </div> </div> </div> <div class="field-group"> <label class="field-label">Billing Contact <span class="field-required">*</span></label> <div class="field-row"> <div class="field-col"> <input type="text" class="field-input" placeholder="First Name" required> </div> <div class="field-col"> <input type="text" class="field-input" placeholder="Last Name" required> </div> </div> <div style="margin-top: 12px;"> <input type="email" class="field-input" placeholder="Work Email" required> </div> <div style="margin-top: 12px;"> <input type="tel" class="field-input" placeholder="Phone Number" required> </div> </div> <div class="field-group"> <label class="field-label">Billing Address <span class="field-required">*</span></label> <input type="text" class="field-input" placeholder="Street Address" required> <div style="margin-top: 12px;"> <input type="text" class="field-input" placeholder="Address Line 2 (Optional)"> </div> <div class="field-row" style="margin-top: 12px;"> <div class="field-col"> <input type="text" class="field-input" placeholder="City" required> </div> <div class="field-col"> <input type="text" class="field-input" placeholder="State/Province" required> </div> </div> <div class="field-row" style="margin-top: 12px;"> <div class="field-col"> <input type="text" class="field-input" placeholder="ZIP/Postal Code" required> </div> <div class="field-col"> <select class="field-input" required> <option value="" disabled selected>Country</option> <option value="US">United States</option> <option value="CA">Canada</option> <option value="UK">United Kingdom</option> <option value="DE">Germany</option> <option value="FR">France</option> <option value="AU">Australia</option> <option value="JP">Japan</option> </select> </div> </div> </div> <div class="collapsible"> <div class="collapsible-header"> <div class="collapsible-title">Payment Information</div> <div class="collapsible-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </div> </div> <div class="collapsible-content"> <div class="card-input-container"> <input type="text" class="field-input" placeholder="Card Number" id="card-number"> <div class="card-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <rect x="1" y="4" width="22" height="16" rx="2" ry="2"></rect> <line x1="1" y1="10" x2="23" y2="10"></line> </svg> </div> <div class="error-message">Please enter a valid card number</div> </div> <div class="field-row" style="margin-top: 12px;"> <div class="field-col"> <input type="text" class="field-input" placeholder="MM / YY" id="card-expiry"> <div class="error-message">Please enter a valid expiration date</div> </div> <div class="field-col"> <input type="text" class="field-input" placeholder="CVC" id="card-cvc"> <div class="error-message">Please enter a valid CVC code</div> </div> </div> <div style="margin-top: 12px;"> <input type="text" class="field-input" placeholder="Name on Card" required> </div> </div> </div> <div class="collapsible"> <div class="collapsible-header"> <div class="collapsible-title">Additional Options</div> <div class="collapsible-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </div> </div> <div class="collapsible-content"> <div style="margin-bottom: 15px;"> <label style="display: flex; align-items: flex-start; cursor: pointer;"> <input type="checkbox" style="margin-top: 3px; margin-right: 10px;"> <div> <div style="font-weight: 500; color: var(--primary); margin-bottom: 2px;">Add Priority Support</div> <div style="color: var(--secondary); font-size: 13px;">24/7 dedicated technical support with 4-hour response SLA</div> </div> </label> </div> <div style="margin-bottom: 15px;"> <label style="display: flex; align-items: flex-start; cursor: pointer;"> <input type="checkbox" style="margin-top: 3px; margin-right: 10px;"> <div> <div style="font-weight: 500; color: var(--primary); margin-bottom: 2px;">Custom Implementation Package</div> <div style="color: var(--secondary); font-size: 13px;">Professional services for enterprise deployment</div> </div> </label> </div> <div> <label style="display: flex; align-items: flex-start; cursor: pointer;"> <input type="checkbox" style="margin-top: 3px; margin-right: 10px;"> <div> <div style="font-weight: 500; color: var(--primary); margin-bottom: 2px;">Multi-Year Discount</div> <div style="color: var(--secondary); font-size: 13px;">Lock in current pricing with a 3-year contract (15% savings)</div> </div> </label> </div> </div> </div> <div class="collapsible"> <div class="collapsible-header"> <div class="collapsible-title">Purchase Order</div> <div class="collapsible-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </div> </div> <div class="collapsible-content"> <div style="margin-bottom: 12px;"> <input type="text" class="field-input" placeholder="PO Number (if applicable)"> </div> <div> <label class="field-label">Upload PO Document (Optional)</label> <div style="border: 1px dashed var(--mid); border-radius: 8px; padding: 15px; text-align: center; cursor: pointer;" id="upload-area"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 10px; color: var(--secondary);"> <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path> <polyline points="17 8 12 3 7 8"></polyline> <line x1="12" y1="3" x2="12" y2="15"></line> </svg> <div style="color: var(--secondary); font-size: 13px;">Drag and drop a file or click to browse</div> </div> </div> </div> </div> </form> </div> <div class="checkout-footer"> <button class="submit-btn" id="submit-btn">Complete Purchase</button> <div class="secure-badge"> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect> <path d="M7 11V7a5 5 0 0 1 10 0v4"></path> </svg> Secure, encrypted checkout · PCI DSS Level 1 Compliant </div> </div> </div> <div class="checkout-back"> <div class="success-icon">✓</div> <h2 class="success-title">Purchase Complete!</h2> <p class="success-message">Your EnterpriseCloud Suite Pro has been successfully activated.</p> <div class="success-details"> <div class="detail-row"> <div class="detail-label">Order Number</div> <div class="detail-value">EC-5892733</div> </div> <div class="detail-row"> <div class="detail-label">License Count</div> <div class="detail-value">50 Users</div> </div> <div class="detail-row"> <div class="detail-label">Billing Period</div> <div class="detail-value">Annual (May 2023 - May 2024)</div> </div> <div class="detail-row"> <div class="detail-label">Total Amount</div> <div class="detail-value">$24,000.00</div> </div> </div> <button class="submit-btn" style="max-width: 300px;">Access Your Account</button> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Toggle collapsible sections const collapsibles = document.querySelectorAll('.collapsible'); collapsibles.forEach(collapsible => { const header = collapsible.querySelector('.collapsible-header'); header.addEventListener('click', () => { collapsible.classList.toggle('open'); }); }); // Auto-format card number input with spaces const cardNumberInput = document.getElementById('card-number'); if (cardNumberInput) { cardNumberInput.addEventListener('input', function() { let value = this.value.replace(/\s+/g, '').replace(/[^0-9]/gi, ''); let formattedValue = ''; for (let i = 0; i < value.length; i++) { if (i > 0 && i % 4 === 0) { formattedValue += ' '; } formattedValue += value[i]; } this.value = formattedValue; // Validate and show visual feedback if (value.length > 0 && value.length < 16) { this.classList.add('error'); this.classList.remove('valid'); } else if (value.length === 16) { this.classList.remove('error'); this.classList.add('valid'); } else { this.classList.remove('error'); this.classList.remove('valid'); } }); } // Auto-format card expiry input const cardExpiryInput = document.getElementById('card-expiry'); if (cardExpiryInput) { cardExpiryInput.addEventListener('input', function() { let value = this.value.replace(/\s+/g, '').replace(/[^0-9]/gi, ''); if (value.length > 2) { this.value = value.substring(0, 2) + ' / ' + value.substring(2, 4); } else { this.value = value; } // Validate MM/YY format if (value.length > 0 && value.length < 4) { this.classList.add('error'); this.classList.remove('valid'); } else if (value.length === 4) { const month = parseInt(value.substring(0, 2)); if (month > 0 && month <= 12) { this.classList.remove('error'); this.classList.add('valid'); } else { this.classList.add('error'); this.classList.remove('valid'); } } else { this.classList.remove('error'); this.classList.remove('valid'); } }); } // Format CVC const cardCvcInput = document.getElementById('card-cvc'); if (cardCvcInput) { cardCvcInput.addEventListener('input', function() { let value = this.value.replace(/\s+/g, '').replace(/[^0-9]/gi, ''); this.value = value.substring(0, 3); // Validate if (value.length > 0 && value.length < 3) { this.classList.add('error'); this.classList.remove('valid'); } else if (value.length === 3) { this.classList.remove('error'); this.classList.add('valid'); } else { this.classList.remove('error'); this.classList.remove('valid'); } }); } // Tax ID formatter for different countries const taxIdInput = document.getElementById('tax-id'); if (taxIdInput) { taxIdInput.addEventListener('input', function() { const value = this.value.replace(/[^A-Za-z0-9]/gi, ''); // Basic format for display if (value.startsWith('GB')) { // UK VAT format this.value = value.substring(0, 2) + ' ' + value.substring(2); } else if (value.length > 2 && !isNaN(value)) { // US EIN format this.value = value.substring(0, 2) + '-' + value.substring(2); } else { this.value = value; } }); } // File upload area const uploadArea = document.getElementById('upload-area'); if (uploadArea) { uploadArea.addEventListener('click', function() { // In a real implementation, this would trigger a file browser console.log('File upload clicked'); // Simulate upload success state setTimeout(() => { uploadArea.innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#25b979" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 10px;"> <path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"></path> <polyline points="22 4 12 14.01 9 11.01"></polyline> </svg> <div style="color: var(--success); font-weight: 500; font-size: 14px;">PO_document_2023.pdf uploaded</div> `; }, 1000); }); } // Submit button click handler const submitBtn = document.getElementById('submit-btn'); if (submitBtn) { submitBtn.addEventListener('click', function(e) { e.preventDefault(); // Form validation would normally go here // Show processing state this.classList.add('processing'); this.textContent = 'Processing...'; // Simulate processing and show success setTimeout(() => { // Flip the card to show success screen document.querySelector('.checkout-container').classList.add('flipped'); }, 2000); }); } // Auto-open the first collapsible for payment info setTimeout(() => { document.querySelector('.collapsible').classList.add('open'); }, 500); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Mobile-First Checkout</title> <style> :root { --primary: #3a86ff; --primary-dark: #2a75f0; --secondary: #ff006e; --text: #333; --light-gray: #f8f9fa; --gray: #e9ecef; --border: #dee2e6; --success: #38b000; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; } body { background-color: #f8f9fa; color: var(--text); display: flex; justify-content: center; align-items: center; min-height: 700px; overflow-x: hidden; } .checkout-container { width: 100%; max-width: 700px; height: 700px; background-color: white; border-radius: 16px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.05); overflow: hidden; position: relative; display: flex; flex-direction: column; } .header { padding: 20px 16px; background-color: white; border-bottom: 1px solid var(--gray); display: flex; justify-content: space-between; align-items: center; z-index: 2; } .logo { font-weight: 700; font-size: 22px; color: var(--primary); display: flex; align-items: center; } .logo svg { margin-right: 8px; } .progress-dots { display: flex; align-items: center; gap: 8px; margin-right: 8px; } .dot { width: 12px; height: 12px; border-radius: 50%; background-color: var(--gray); transition: background-color 0.3s, transform 0.3s; } .dot.active { background-color: var(--primary); transform: scale(1.2); } .steps-container { flex: 1; overflow: hidden; position: relative; } .steps { display: flex; height: 100%; transition: transform 0.4s cubic-bezier(0.23, 1, 0.32, 1); } .step { min-width: 100%; padding: 24px 20px; overflow-y: auto; height: 100%; } h2 { font-size: 24px; margin-bottom: 24px; color: var(--text); } .form-group { margin-bottom: 20px; } label { display: block; margin-bottom: 8px; font-weight: 500; font-size: 14px; } input, select { width: 100%; height: 56px; padding: 0 16px; border: 2px solid var(--border); border-radius: 12px; font-size: 16px; transition: border-color 0.3s, box-shadow 0.3s; -webkit-appearance: none; background-color: white; } input:focus, select:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(58, 134, 255, 0.15); } .card-fields { display: flex; gap: 12px; } .card-fields .form-group { flex: 1; } .button { width: 100%; height: 56px; background-color: var(--primary); color: white; border: none; border-radius: 12px; font-size: 16px; font-weight: 600; cursor: pointer; transition: background-color 0.3s, transform 0.2s; display: flex; justify-content: center; align-items: center; gap: 10px; } .button:hover { background-color: var(--primary-dark); } .button:active { transform: scale(0.98); } .button-secondary { background-color: white; color: var(--primary); border: 2px solid var(--border); } .button-secondary:hover { background-color: var(--light-gray); } .button-row { display: flex; gap: 12px; margin-top: 24px; } .address-fields { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; } .field-full { grid-column: span 2; } .cart-item { display: flex; align-items: center; padding: 16px; border-radius: 12px; background-color: var(--light-gray); margin-bottom: 12px; } .cart-item-image { width: 60px; height: 60px; background-color: white; border-radius: 8px; margin-right: 16px; display: flex; justify-content: center; align-items: center; overflow: hidden; } .cart-item-image img { width: 100%; height: 100%; object-fit: cover; } .cart-item-details { flex: 1; } .cart-item-name { font-weight: 600; margin-bottom: 4px; } .cart-item-variant { font-size: 14px; color: #666; margin-bottom: 4px; } .cart-item-price { font-weight: 600; color: var(--primary); } .summary { margin-top: 24px; } .summary-row { display: flex; justify-content: space-between; margin-bottom: 8px; } .summary-row.total { font-weight: 700; font-size: 18px; margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--gray); } .payment-methods { display: flex; gap: 12px; margin-bottom: 24px; } .payment-method { flex: 1; position: relative; } .payment-method input { position: absolute; opacity: 0; cursor: pointer; } .payment-method label { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 80px; border: 2px solid var(--border); border-radius: 12px; padding: 12px; cursor: pointer; transition: border-color 0.3s, box-shadow 0.3s; } .payment-method input:checked + label { border-color: var(--primary); box-shadow: 0 0 0 3px rgba(58, 134, 255, 0.15); } .payment-method svg { margin-bottom: 8px; } .loading-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(255, 255, 255, 0.9); display: flex; flex-direction: column; justify-content: center; align-items: center; z-index: 10; opacity: 0; pointer-events: none; transition: opacity 0.3s; } .loading-overlay.active { opacity: 1; pointer-events: all; } .spinner { width: 50px; height: 50px; border: 5px solid var(--light-gray); border-top: 5px solid var(--primary); border-radius: 50%; animation: spin 1s linear infinite; margin-bottom: 16px; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .success-animation { width: 80px; height: 80px; margin-bottom: 24px; position: relative; } .success-animation .circle { width: 80px; height: 80px; border: 4px solid var(--success); border-radius: 50%; transform: scale(0); animation: circle-grow 0.3s forwards; } .success-animation .checkmark { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) scale(0); animation: checkmark-grow 0.3s 0.3s forwards; } @keyframes circle-grow { to { transform: scale(1); } } @keyframes checkmark-grow { to { transform: translate(-50%, -50%) scale(1); } } /* Animated background pattern */ .animated-bg { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(45deg, rgba(58, 134, 255, 0.02) 25%, transparent 25%, transparent 50%, rgba(58, 134, 255, 0.02) 50%, rgba(58, 134, 255, 0.02) 75%, transparent 75%, transparent); background-size: 20px 20px; opacity: 0.5; z-index: -1; animation: bg-slide 20s linear infinite; } @keyframes bg-slide { 0% { background-position: 0 0; } 100% { background-position: 40px 40px; } } </style> </head> <body> <div class="checkout-container"> <div class="animated-bg"></div> <div class="header"> <div class="logo"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M4 22C3.45 22 2.97917 21.8042 2.5875 21.4125C2.19583 21.0208 2 20.55 2 20V8C2 7.45 2.19583 6.97917 2.5875 6.5875C2.97917 6.19583 3.45 6 4 6H20C20.55 6 21.0208 6.19583 21.4125 6.5875C21.8042 6.97917 22 7.45 22 8V20C22 20.55 21.8042 21.0208 21.4125 21.4125C21.0208 21.8042 20.55 22 20 22H4ZM4 13H20V8H4V13ZM4 15V20H20V15H4ZM7 11H17V9H7V11ZM7 19H10V17H7V19ZM12 19H17V17H12V19ZM4 2H20V4H4V2Z" fill="#3A86FF"/> </svg> SwiftShop </div> <div class="progress-dots"> <div class="dot active" data-step="1"></div> <div class="dot" data-step="2"></div> <div class="dot" data-step="3"></div> </div> </div> <div class="steps-container"> <div class="steps"> <!-- Step 1: Cart Details --> <div class="step" id="step1"> <h2>Your Cart</h2> <div class="cart-items"> <div class="cart-item"> <div class="cart-item-image"> <svg width="36" height="36" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M19 14V19C19 19.55 18.804 20.021 18.412 20.413C18.021 20.804 17.55 21 17 21H5C4.45 21 3.979 20.804 3.587 20.413C3.196 20.021 3 19.55 3 19V5C3 4.45 3.196 3.979 3.587 3.587C3.979 3.196 4.45 3 5 3H11V5H5V19H17V14H19ZM13 3V5H19.586L8.293 16.293L9.707 17.707L21 6.414V13H23V3H13Z" fill="#3A86FF"/> </svg> </div> <div class="cart-item-details"> <div class="cart-item-name">Ultra Wireless Earbuds Pro</div> <div class="cart-item-variant">Midnight Black</div> <div class="cart-item-price">$129.99</div> </div> </div> <div class="cart-item"> <div class="cart-item-image"> <svg width="36" height="36" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M7 22C6.45 22 5.97917 21.8042 5.5875 21.4125C5.19583 21.0208 5 20.55 5 20V8H4V6H9V4H15V6H20V8H19V20C19 20.55 18.8042 21.0208 18.4125 21.4125C18.0208 21.8042 17.55 22 17 22H7ZM17 8H7V20H17V8ZM9 18H11V10H9V18ZM13 18H15V10H13V18ZM7 8V20V8Z" fill="#3A86FF"/> </svg> </div> <div class="cart-item-details"> <div class="cart-item-name">PowerBank 10000mAh</div> <div class="cart-item-variant">Fast Charging</div> <div class="cart-item-price">$49.99</div> </div> </div> </div> <div class="summary"> <div class="summary-row"> <div>Subtotal</div> <div>$179.98</div> </div> <div class="summary-row"> <div>Shipping</div> <div>$5.99</div> </div> <div class="summary-row"> <div>Tax</div> <div>$14.40</div> </div> <div class="summary-row total"> <div>Total</div> <div>$200.37</div> </div> </div> <div class="button-row"> <button class="button" id="toStep2"> Continue to Shipping <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M11.7 17.7L16.4 13H4V11H16.4L11.7 6.3L13.1 4.9L20.2 12L13.1 19.1L11.7 17.7Z" fill="white"/> </svg> </button> </div> </div> <!-- Step 2: Shipping Info --> <div class="step" id="step2"> <h2>Shipping Information</h2> <form id="shippingForm"> <div class="form-group"> <label for="fullName">Full Name</label> <input type="text" id="fullName" placeholder="Your full name" autocomplete="name"> </div> <div class="form-group"> <label for="email">Email Address</label> <input type="email" id="email" placeholder="[email protected]" autocomplete="email"> </div> <div class="form-group"> <label for="phone">Phone Number</label> <input type="tel" id="phone" placeholder="(123) 456-7890" autocomplete="tel"> </div> <div class="address-fields"> <div class="form-group field-full"> <label for="address">Street Address</label> <input type="text" id="address" placeholder="123 Main St" autocomplete="street-address"> </div> <div class="form-group"> <label for="city">City</label> <input type="text" id="city" placeholder="City" autocomplete="address-level2"> </div> <div class="form-group"> <label for="zipCode">ZIP Code</label> <input type="text" id="zipCode" placeholder="12345" autocomplete="postal-code"> </div> <div class="form-group"> <label for="state">State</label> <select id="state" autocomplete="address-level1"> <option value="" disabled selected>Select State</option> <option value="CA">California</option> <option value="NY">New York</option> <option value="TX">Texas</option> <option value="FL">Florida</option> <option value="IL">Illinois</option> </select> </div> <div class="form-group"> <label for="country">Country</label> <select id="country" autocomplete="country"> <option value="US">United States</option> <option value="CA">Canada</option> <option value="UK">United Kingdom</option> </select> </div> </div> <div class="button-row"> <button type="button" class="button button-secondary" id="backToStep1"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12.3 17.7L7.6 13H20V11H7.6L12.3 6.3L10.9 4.9L3.8 12L10.9 19.1L12.3 17.7Z" fill="#3A86FF"/> </svg> Back </button> <button type="button" class="button" id="toStep3"> Continue to Payment <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M11.7 17.7L16.4 13H4V11H16.4L11.7 6.3L13.1 4.9L20.2 12L13.1 19.1L11.7 17.7Z" fill="white"/> </svg> </button> </div> </form> </div> <!-- Step 3: Payment --> <div class="step" id="step3"> <h2>Payment Method</h2> <div class="payment-methods"> <div class="payment-method"> <input type="radio" id="card" name="paymentMethod" value="card" checked> <label for="card"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M20 4H4C2.89 4 2.01 4.89 2.01 6L2 18C2 19.11 2.89 20 4 20H20C21.11 20 22 19.11 22 18V6C22 4.89 21.11 4 20 4ZM20 18H4V12H20V18ZM20 8H4V6H20V8Z" fill="#3A86FF"/> </svg> Credit Card </label> </div> <div class="payment-method"> <input type="radio" id="paypal" name="paymentMethod" value="paypal"> <label for="paypal"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M19.5 5.5V19.5H4.5V5.5H19.5ZM19.5 3.5H4.5C3.4 3.5 2.5 4.4 2.5 5.5V19.5C2.5 20.6 3.4 21.5 4.5 21.5H19.5C20.6 21.5 21.5 20.6 21.5 19.5V5.5C21.5 4.4 20.6 3.5 19.5 3.5ZM11.8 17H9.7L8.1 13.8L6.5 17H4.4L7 12L4.4 7H6.5L8.1 10.2L9.7 7H11.8L9.2 12L11.8 17ZM17.5 15.3C17.5 16.3 16.7 17 15.7 17C14.7 17 13.9 16.3 13.9 15.3C13.9 14.3 14.7 13.6 15.7 13.6H17.5V15.3ZM15.7 10.8C16.7 10.8 17.5 11.5 17.5 12.5V12.8H15.7C14.7 12.8 13.9 12.1 13.9 11.1C13.9 10.1 14.7 9.4 15.7 9.4C16.7 9.4 17.5 10.1 17.5 11.1V11.4H15.7C15.4 11.4 15.1 11.7 15.1 12C15.1 12.3 15.4 12.6 15.7 12.6H17.5V12.5C17.5 11.5 16.7 10.8 15.7 10.8Z" fill="#3A86FF"/> </svg> PayPal </label> </div> </div> <div id="cardPaymentForm"> <div class="form-group"> <label for="cardNumber">Card Number</label> <input type="text" id="cardNumber" placeholder="1234 5678 9012 3456" autocomplete="cc-number"> </div> <div class="form-group"> <label for="cardName">Name on Card</label> <input type="text" id="cardName" placeholder="Name as shown on card" autocomplete="cc-name"> </div> <div class="card-fields"> <div class="form-group"> <label for="expiryDate">Expiry Date</label> <input type="text" id="expiryDate" placeholder="MM/YY" autocomplete="cc-exp"> </div> <div class="form-group"> <label for="cvv">Security Code</label> <input type="text" id="cvv" placeholder="CVV" autocomplete="cc-csc"> </div> </div> <div class="button-row"> <button type="button" class="button button-secondary" id="backToStep2"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12.3 17.7L7.6 13H20V11H7.6L12.3 6.3L10.9 4.9L3.8 12L10.9 19.1L12.3 17.7Z" fill="#3A86FF"/> </svg> Back </button> <button type="button" class="button" id="placeOrder"> Complete Purchase <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> </button> </div> </div> </div> </div> </div> <!-- Loading overlay --> <div class="loading-overlay" id="loadingOverlay"> <div class="spinner" id="spinner"></div> <div class="success-animation" id="successAnimation" style="display: none;"> <div class="circle"></div> <svg class="checkmark" width="40" height="40" 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="#38b000"/> </svg> </div> <h2 id="loadingText">Processing payment...</h2> <p id="loadingSubtext">Please don't close this page.</p> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const steps = document.querySelector('.steps'); const dots = document.querySelectorAll('.dot'); let currentStep = 1; // Form inputs with validation hints const inputs = document.querySelectorAll('input, select'); inputs.forEach(input => { input.addEventListener('focus', function() { this.style.borderColor = '#3a86ff'; this.style.boxShadow = '0 0 0 3px rgba(58, 134, 255, 0.15)'; }); input.addEventListener('blur', function() { if (this.value === '') { this.style.borderColor = '#dee2e6'; this.style.boxShadow = 'none'; } else { this.style.borderColor = '#38b000'; this.style.boxShadow = '0 0 0 3px rgba(56, 176, 0, 0.1)'; } }); }); // Navigation between steps document.getElementById('toStep2').addEventListener('click', function() { goToStep(2); }); document.getElementById('backToStep1').addEventListener('click', function() { goToStep(1); }); document.getElementById('toStep3').addEventListener('click', function() { goToStep(3); }); document.getElementById('backToStep2').addEventListener('click', function() { goToStep(2); }); document.getElementById('placeOrder').addEventListener('click', function() { showLoadingOverlay(); setTimeout(showOrderSuccess, 2000); }); // Payment method toggle document.getElementById('card').addEventListener('change', function() { document.getElementById('cardPaymentForm').style.display = 'block'; }); document.getElementById('paypal').addEventListener('change', function() { document.getElementById('cardPaymentForm').style.display = 'block'; }); // Card number formatting document.getElementById('cardNumber').addEventListener('input', function(e) { let value = e.target.value.replace(/\D/g, ''); if (value.length > 0) { value = value.match(new RegExp('.{1,4}', 'g')).join(' '); } e.target.value = value.substring(0, 19); // limit to 16 digits + 3 spaces }); // Expiry date formatting document.getElementById('expiryDate').addEventListener('input', function(e) { let value = e.target.value.replace(/\D/g, ''); if (value.length > 2) { value = value.substring(0, 2) + '/' + value.substring(2, 4); } e.target.value = value.substring(0, 5); // limit to MM/YY format }); // CVV formatting document.getElementById('cvv').addEventListener('input', function(e) { let value = e.target.value.replace(/\D/g, ''); e.target.value = value.substring(0, 3); // limit to 3 digits }); function goToStep(step) { currentStep = step; steps.style.transform = `translateX(-${(step - 1) * 100}%)`; // Update progress dots dots.forEach(dot => { if (parseInt(dot.getAttribute('data-step')) <= currentStep) { dot.classList.add('active'); } else { dot.classList.remove('active'); } }); } function showLoadingOverlay() { const overlay = document.getElementById('loadingOverlay'); overlay.classList.add('active'); } function showOrderSuccess() { document.getElementById('spinner').style.display = 'none'; document.getElementById('successAnimation').style.display = 'block'; document.getElementById('loadingText').textContent = 'Payment successful!'; document.getElementById('loadingSubtext').textContent = 'Your order has been placed.'; } }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Maison de Luxe | Checkout</title> <style> @import url('https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;500;600;700&family=Cormorant+Garamond:wght@300;400;500&display=swap'); * { margin: 0; padding: 0; box-sizing: border-box; } :root { --dark-bg: #111111; --darker-bg: #0a0a0a; --gold: #d4af37; --gold-light: #e0c158; --off-white: #f8f5f0; --transition: all 0.4s cubic-bezier(0.25, 1, 0.5, 1); } body { font-family: 'Cormorant Garamond', serif; background-color: var(--dark-bg); color: var(--off-white); display: flex; flex-direction: column; justify-content: center; align-items: center; min-height: 700px; max-width: 700px; margin: 0 auto; padding: 20px; overflow-x: hidden; } h1, h2, h3, h4 { font-family: 'Playfair Display', serif; font-weight: 500; letter-spacing: 0.03em; } .logo { font-size: 22px; text-transform: uppercase; letter-spacing: 3px; color: var(--gold); margin-bottom: 25px; position: relative; } .logo::after { content: ''; position: absolute; width: 30px; height: 1px; background-color: var(--gold); bottom: -8px; left: 50%; transform: translateX(-50%); } .checkout-container { width: 100%; max-width: 600px; background-color: var(--darker-bg); border-radius: 8px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4); overflow: hidden; position: relative; } .checkout-header { padding: 25px 30px; border-bottom: 1px solid rgba(212, 175, 55, 0.1); text-align: center; } .checkout-header h2 { font-size: 24px; margin-bottom: 5px; } .checkout-header p { color: rgba(248, 245, 240, 0.7); font-size: 16px; font-style: italic; } .checkout-body { padding: 0; position: relative; height: 460px; overflow: hidden; } .progress-bar { display: flex; justify-content: space-between; padding: 20px 40px; position: relative; margin-bottom: 15px; } .progress-bar::after { content: ''; position: absolute; top: 30px; left: 70px; right: 70px; height: 1px; background: rgba(212, 175, 55, 0.2); z-index: 1; } .progress-step { width: 20px; height: 20px; border-radius: 50%; background: var(--darker-bg); border: 1px solid var(--gold); position: relative; z-index: 2; transition: var(--transition); } .progress-step.active { background: var(--gold); box-shadow: 0 0 10px rgba(212, 175, 55, 0.5); } .progress-step-label { position: absolute; bottom: -25px; left: 50%; transform: translateX(-50%); font-size: 12px; color: rgba(248, 245, 240, 0.7); white-space: nowrap; font-family: 'Playfair Display', serif; } .checkout-form { position: absolute; width: 100%; padding: 20px 30px; transition: var(--transition); opacity: 0; transform: translateX(50px); pointer-events: none; height: 380px; overflow-y: auto; } .checkout-form.active { opacity: 1; transform: translateX(0); pointer-events: all; } .form-group { margin-bottom: 20px; } .form-group label { display: block; margin-bottom: 8px; font-size: 14px; color: rgba(248, 245, 240, 0.9); letter-spacing: 0.5px; } .form-control { width: 100%; padding: 12px 15px; background-color: rgba(255, 255, 255, 0.05); border: 1px solid rgba(212, 175, 55, 0.2); border-radius: 4px; color: var(--off-white); font-family: 'Cormorant Garamond', serif; font-size: 16px; transition: var(--transition); } .form-control:focus { outline: none; border-color: var(--gold); box-shadow: 0 0 0 2px rgba(212, 175, 55, 0.1); } .form-row { display: flex; gap: 15px; } .form-row .form-group { flex: 1; } .product-preview { display: flex; background: rgba(10, 10, 10, 0.5); border-radius: 6px; padding: 15px; align-items: center; margin-bottom: 25px; border: 1px solid rgba(212, 175, 55, 0.1); } .product-image { width: 80px; height: 80px; object-fit: cover; border-radius: 4px; margin-right: 15px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); } .product-details h4 { margin-bottom: 5px; font-size: 18px; } .product-price { color: var(--gold); font-weight: 500; font-size: 18px; margin-top: 5px; } .btn { background-color: transparent; color: var(--off-white); border: 1px solid var(--gold); padding: 12px 25px; cursor: pointer; font-family: 'Playfair Display', serif; font-size: 14px; letter-spacing: 1px; border-radius: 4px; transition: var(--transition); position: relative; overflow: hidden; } .btn-primary { background-color: var(--gold); color: var(--darker-bg); } .btn:hover { background-color: var(--gold-light); color: var(--darker-bg); transform: translateY(-2px); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); } .btn::after { content: ''; position: absolute; width: 0; height: 100%; top: 0; left: 0; background-color: rgba(255, 255, 255, 0.1); transition: width 0.3s ease; } .btn:hover::after { width: 120%; } .checkout-actions { display: flex; justify-content: space-between; padding: 20px 30px; border-top: 1px solid rgba(212, 175, 55, 0.1); } .credit-card { position: relative; background: linear-gradient(135deg, #1a1a1a 0%, #0a0a0a 100%); border-radius: 10px; padding: 20px; max-width: 320px; height: 180px; margin: 0 auto 25px; box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3); border: 1px solid rgba(212, 175, 55, 0.3); overflow: hidden; } .credit-card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(135deg, rgba(212, 175, 55, 0.1) 0%, rgba(212, 175, 55, 0.05) 100%); opacity: 0.5; z-index: 1; border-radius: 10px; } .card-chip { width: 40px; height: 30px; background: linear-gradient(135deg, var(--gold) 0%, var(--gold-light) 100%); border-radius: 5px; margin-bottom: 20px; position: relative; z-index: 2; } .card-chip::after { content: ''; position: absolute; width: 70%; height: 60%; background-color: rgba(0, 0, 0, 0.2); top: 20%; left: 15%; border-radius: 2px; } .card-number { font-family: 'Playfair Display', serif; letter-spacing: 2px; color: var(--off-white); margin-bottom: 20px; font-size: 18px; position: relative; z-index: 2; } .card-details { display: flex; justify-content: space-between; position: relative; z-index: 2; } .card-holder, .card-expiry { font-size: 12px; color: rgba(248, 245, 240, 0.7); margin-bottom: 5px; } .card-holder-name, .card-expiry-date { font-size: 14px; color: var(--off-white); font-weight: 500; } .card-network { position: absolute; top: 20px; right: 20px; font-size: 16px; color: var(--gold); font-weight: bold; letter-spacing: 1px; z-index: 2; } .thank-you { text-align: center; padding: 30px; } .thank-you h3 { font-size: 28px; margin-bottom: 15px; color: var(--gold); } .thank-you p { font-size: 16px; margin-bottom: 30px; line-height: 1.6; } .checkmark { width: 80px; height: 80px; border-radius: 50%; display: block; stroke-width: 2; stroke: var(--gold); stroke-miterlimit: 10; box-shadow: 0 0 20px rgba(212, 175, 55, 0.3); animation: fill .4s ease-in-out .4s forwards, scale .3s ease-in-out .9s both; position: relative; margin: 0 auto 30px auto; background: rgba(212, 175, 55, 0.1); } .checkmark__circle { stroke-dasharray: 166; stroke-dashoffset: 166; stroke-width: 2; stroke-miterlimit: 10; stroke: var(--gold); fill: none; animation: stroke 0.6s cubic-bezier(0.65, 0, 0.45, 1) forwards; } .checkmark__check { transform-origin: 50% 50%; stroke-dasharray: 48; stroke-dashoffset: 48; animation: stroke 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.8s forwards; } @keyframes stroke { 100% { stroke-dashoffset: 0; } } @keyframes scale { 0%, 100% { transform: none; } 50% { transform: scale3d(1.1, 1.1, 1); } } @keyframes fill { 100% { box-shadow: 0 0 0 2px rgba(212, 175, 55, 0.1); } } /* Responsive adjustments */ @media (max-width: 500px) { .form-row { flex-direction: column; gap: 0; } .checkout-header h2 { font-size: 20px; } .checkout-body { height: 420px; } .progress-bar { padding: 15px 20px; } .progress-bar::after { left: 50px; right: 50px; } .credit-card { height: 160px; padding: 15px; } .card-number { font-size: 16px; } } /* Scroll styling */ .checkout-form::-webkit-scrollbar { width: 5px; } .checkout-form::-webkit-scrollbar-track { background: rgba(255, 255, 255, 0.05); } .checkout-form::-webkit-scrollbar-thumb { background-color: rgba(212, 175, 55, 0.3); border-radius: 20px; } /* Custom hover effects */ input[type="checkbox"] { appearance: none; -webkit-appearance: none; width: 18px; height: 18px; border: 1px solid rgba(212, 175, 55, 0.3); border-radius: 3px; background: transparent; position: relative; vertical-align: middle; margin-right: 8px; cursor: pointer; } input[type="checkbox"]:checked { background-color: var(--gold); } input[type="checkbox"]:checked::after { content: "✓"; position: absolute; color: var(--darker-bg); font-size: 14px; top: 50%; left: 50%; transform: translate(-50%, -50%); } .save-for-later { display: flex; align-items: center; margin-top: 5px; font-size: 14px; color: rgba(248, 245, 240, 0.8); } /* Shimmer effect */ .gold-shine { position: relative; overflow: hidden; } .gold-shine::before { content: ''; position: absolute; top: 0; left: -100%; width: 50%; height: 100%; background: linear-gradient( to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.1) 50%, rgba(255, 255, 255, 0) 100% ); transform: skewX(-25deg); animation: shine 3s infinite; } @keyframes shine { 0% { left: -100%; } 20%, 100% { left: 100%; } } /* Pulse effect for buttons */ .btn-pulse { animation: pulse 2s infinite; } @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(212, 175, 55, 0.4); } 70% { box-shadow: 0 0 0 10px rgba(212, 175, 55, 0); } 100% { box-shadow: 0 0 0 0 rgba(212, 175, 55, 0); } } </style> </head> <body> <h1 class="logo">Maison de Luxe</h1> <div class="checkout-container"> <div class="checkout-header"> <h2>Secure Checkout</h2> <p>Complete your purchase of exceptional craftsmanship</p> </div> <div class="checkout-body"> <div class="progress-bar"> <div class="progress-step active" id="step1"> <span class="progress-step-label">Products</span> </div> <div class="progress-step" id="step2"> <span class="progress-step-label">Details</span> </div> <div class="progress-step" id="step3"> <span class="progress-step-label">Payment</span> </div> <div class="progress-step" id="step4"> <span class="progress-step-label">Confirmation</span> </div> </div> <!-- Form Section 1: Order Summary --> <div class="checkout-form active" id="form1"> <div class="product-preview"> <img src="https://images.unsplash.com/photo-1599643478518-a784e5dc4c8f?ixlib=rb-1.2.1&auto=format&fit=crop&w=300&q=80" alt="Audemars Piguet Royal Oak" class="product-image"> <div class="product-details"> <h4>Audemars Piguet Royal Oak</h4> <div>Ref. 15400ST.OO.1220ST.01</div> <div class="product-price">€38,500</div> </div> </div> <div class="product-preview"> <img src="https://images.unsplash.com/photo-1614164185128-e4ec99c436d7?ixlib=rb-1.2.1&auto=format&fit=crop&w=300&q=80" alt="Bottega Veneta Cassette Bag" class="product-image"> <div class="product-details"> <h4>Bottega Veneta Cassette Bag</h4> <div>Intrecciato Leather, Parakeet</div> <div class="product-price">€2,800</div> </div> </div> <div class="form-group"> <label for="promo">Promotion Code</label> <input type="text" id="promo" class="form-control" placeholder="Enter code if applicable"> </div> <div style="margin-top: 30px; text-align: right;"> <div style="margin-bottom: 15px;"> <div style="display: flex; justify-content: space-between; margin-bottom: 8px;"> <span>Subtotal:</span> <span>€41,300</span> </div> <div style="display: flex; justify-content: space-between; margin-bottom: 8px;"> <span>Shipping:</span> <span>Complimentary</span> </div> <div style="display: flex; justify-content: space-between; font-weight: bold; font-size: 18px; color: var(--gold);"> <span>Total:</span> <span>€41,300</span> </div> </div> </div> </div> <!-- Form Section 2: Personal Details --> <div class="checkout-form" id="form2"> <div class="form-row"> <div class="form-group"> <label for="firstName">First Name</label> <input type="text" id="firstName" class="form-control" placeholder="Enter first name"> </div> <div class="form-group"> <label for="lastName">Last Name</label> <input type="text" id="lastName" class="form-control" placeholder="Enter last name"> </div> </div> <div class="form-group"> <label for="email">Email Address</label> <input type="email" id="email" class="form-control" placeholder="[email protected]"> </div> <div class="form-group"> <label for="phone">Phone Number</label> <input type="tel" id="phone" class="form-control" placeholder="+1 (555) 000-0000"> </div> <div class="form-group"> <label for="address">Shipping Address</label> <input type="text" id="address" class="form-control" placeholder="Enter street address"> </div> <div class="form-row"> <div class="form-group"> <label for="city">City</label> <input type="text" id="city" class="form-control" placeholder="City"> </div> <div class="form-group"> <label for="postal">Postal Code</label> <input type="text" id="postal" class="form-control" placeholder="Postal/ZIP"> </div> </div> <div class="form-group"> <label for="country">Country</label> <select id="country" class="form-control"> <option value="">Select Country</option> <option value="fr">France</option> <option value="it">Italy</option> <option value="ch">Switzerland</option> <option value="uk">United Kingdom</option> <option value="us">United States</option> </select> </div> <div class="save-for-later"> <input type="checkbox" id="saveAddress"> <label for="saveAddress">Save address for future purchases</label> </div> </div> <!-- Form Section 3: Payment --> <div class="checkout-form" id="form3"> <div class="credit-card gold-shine"> <div class="card-chip"></div> <div class="card-number" id="cardNumberDisplay">•••• •••• •••• ••••</div> <div class="card-details"> <div> <div class="card-holder">CARD HOLDER</div> <div class="card-holder-name" id="cardHolderDisplay">YOUR NAME</div> </div> <div> <div class="card-expiry">EXPIRES</div> <div class="card-expiry-date" id="cardExpiryDisplay">MM/YY</div> </div> </div> <div class="card-network">VISA</div> </div> <div class="form-group"> <label for="cardNumber">Card Number</label> <input type="text" id="cardNumber" class="form-control" placeholder="0000 0000 0000 0000" maxlength="19"> </div> <div class="form-group"> <label for="cardName">Cardholder Name</label> <input type="text" id="cardName" class="form-control" placeholder="Name as appears on card"> </div> <div class="form-row"> <div class="form-group"> <label for="expiry">Expiration Date</label> <input type="text" id="expiry" class="form-control" placeholder="MM/YY" maxlength="5"> </div> <div class="form-group"> <label for="cvv">Security Code</label> <input type="text" id="cvv" class="form-control" placeholder="CVV" maxlength="3"> </div> </div> <div class="save-for-later"> <input type="checkbox" id="savePayment"> <label for="savePayment">Securely save payment details</label> </div> </div> <!-- Form Section 4: Confirmation --> <div class="checkout-form" id="form4"> <div class="thank-you"> <svg class="checkmark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52"> <circle class="checkmark__circle" cx="26" cy="26" r="25" fill="none"/> <path class="checkmark__check" fill="none" d="M14.1 27.2l7.1 7.2 16.7-16.8"/> </svg> <h3>Thank You for Your Order</h3> <p>Your exceptional items will be carefully prepared and delivered with the utmost attention to detail. A confirmation has been sent to your email.</p> <div style="text-align: center; margin-top: 20px;"> <div style="display: inline-block; text-align: left; font-size: 14px; color: rgba(248, 245, 240, 0.8);"> <div style="margin-bottom: 5px;">Order Reference: <span style="color: var(--gold)">MDL-23871409</span></div> <div>Estimated Delivery: <span style="color: var(--off-white)">3-5 Business Days</span></div> </div> </div> </div> </div> </div> <div class="checkout-actions"> <button class="btn" id="prevBtn" style="visibility: hidden;">Previous</button> <button class="btn btn-primary btn-pulse" id="nextBtn">Continue</button> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Form navigation const forms = document.querySelectorAll('.checkout-form'); const steps = document.querySelectorAll('.progress-step'); const nextBtn = document.getElementById('nextBtn'); const prevBtn = document.getElementById('prevBtn'); let currentStep = 0; // Update form visibility based on current step function updateForm() { forms.forEach((form, index) => { form.classList.remove('active'); }); forms[currentStep].classList.add('active'); // Update progress bar steps.forEach((step, index) => { if (index <= currentStep) { step.classList.add('active'); } else { step.classList.remove('active'); } }); // Show/hide previous button if (currentStep === 0) { prevBtn.style.visibility = 'hidden'; } else { prevBtn.style.visibility = 'visible'; } // Update next button text if (currentStep === forms.length - 1) { nextBtn.textContent = 'Return to Store'; nextBtn.classList.remove('btn-pulse'); } else if (currentStep === forms.length - 2) { nextBtn.textContent = 'Complete Purchase'; nextBtn.classList.add('btn-pulse'); } else { nextBtn.textContent = 'Continue'; nextBtn.classList.remove('btn-pulse'); } } // Event listeners for navigation nextBtn.addEventListener('click', function() { if (currentStep < forms.length - 1) { currentStep++; updateForm(); } else { // Reset form on last step currentStep = 0; updateForm(); } }); prevBtn.addEventListener('click', function() { if (currentStep > 0) { currentStep--; updateForm(); } }); // Credit card live preview const cardNumber = document.getElementById('cardNumber'); const cardName = document.getElementById('cardName'); const expiry = document.getElementById('expiry'); const cardNumberDisplay = document.getElementById('cardNumberDisplay'); const cardHolderDisplay = document.getElementById('cardHolderDisplay'); const cardExpiryDisplay = document.getElementById('cardExpiryDisplay'); // Format credit card number cardNumber.addEventListener('input', function(e) { let value = e.target.value; // Remove all non-digits value = value.replace(/\D/g, ''); // Add space after every 4 digits value = value.replace(/(\d{4})(?=\d)/g, '$1 '); // Update the input value e.target.value = value; // Update the card preview cardNumberDisplay.textContent = value || '•••• •••• •••• ••••'; }); // Update cardholder name on card cardName.addEventListener('input', function(e) { cardHolderDisplay.textContent = e.target.value.toUpperCase() || 'YOUR NAME'; }); // Format expiry date expiry.addEventListener('input', function(e) { let value = e.target.value; // Remove non-digits and limit to 4 digits value = value.replace(/\D/g, '').substring(0, 4); // Format as MM/YY if (value.length > 2) { value = value.substring(0, 2) + '/' + value.substring(2); } e.target.value = value; cardExpiryDisplay.textContent = value || 'MM/YY'; }); // Add smooth hover effects to all buttons const buttons = document.querySelectorAll('.btn'); buttons.forEach(button => { button.addEventListener('mouseenter', function() { this.style.transform = 'translateY(-2px)'; }); button.addEventListener('mouseleave', function() { this.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>Donate to Change Lives</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { display: flex; justify-content: center; align-items: center; min-height: 700px; background-color: #f8f9fa; padding: 20px; } .donation-container { width: 100%; max-width: 650px; height: auto; background: white; border-radius: 20px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08); overflow: hidden; transition: all 0.3s ease; position: relative; } .donation-header { padding: 30px 40px 20px; background: linear-gradient(135deg, #e6f7ff, #f0f8ff); text-align: center; border-bottom: 1px solid #f0f0f0; } .donation-header h1 { color: #3a86ff; font-size: 28px; margin-bottom: 10px; font-weight: 600; } .donation-header p { color: #6c757d; font-size: 16px; line-height: 1.5; } .floating-hearts { position: absolute; width: 100%; height: 100px; top: 50px; left: 0; pointer-events: none; } .heart { position: absolute; width: 20px; height: 20px; background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23ff6b6b'%3E%3Cpath d='M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z'/%3E%3C/svg%3E") no-repeat center center; opacity: 0; animation: float-up 3s ease-in-out infinite; } @keyframes float-up { 0% { transform: translateY(0) scale(0.5); opacity: 0; } 10% { opacity: 0.8; } 80% { opacity: 0.2; } 100% { transform: translateY(-100px) scale(1); opacity: 0; } } .progress-indicator { display: flex; justify-content: space-between; margin: 30px 40px 20px; } .progress-step { flex: 1; text-align: center; position: relative; } .progress-step:not(:last-child):after { content: ""; position: absolute; top: 15px; right: -50%; width: 100%; height: 3px; background-color: #e9ecef; z-index: 1; } .step-number { width: 30px; height: 30px; border-radius: 50%; background-color: #e9ecef; color: #adb5bd; display: flex; align-items: center; justify-content: center; margin: 0 auto 10px; font-weight: bold; position: relative; z-index: 2; transition: all 0.3s ease; } .active .step-number { background-color: #3a86ff; color: white; } .complete .step-number { background-color: #7fe3bd; color: white; } .step-label { font-size: 12px; color: #6c757d; transition: all 0.3s ease; } .active .step-label, .complete .step-label { color: #3a86ff; font-weight: 600; } .complete .step-label { color: #7fe3bd; } .progress-step.complete:not(:last-child):after { background-color: #7fe3bd; } .progress-step.active:not(:last-child):after { background: linear-gradient(90deg, #7fe3bd 50%, #e9ecef 50%); } .donation-form { padding: 20px 40px 40px; } .form-step { display: none; } .form-step.active { display: block; animation: fadeIn 0.5s ease forwards; } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .amount-options { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 20px; } .amount-option { flex: 1; min-width: 80px; padding: 15px 10px; background-color: #f1f3f5; border-radius: 12px; text-align: center; cursor: pointer; transition: all 0.2s ease; border: 2px solid transparent; color: #495057; font-weight: 600; } .amount-option:hover { background-color: #e9ecef; } .amount-option.selected { background-color: #e7f5ff; border-color: #3a86ff; color: #3a86ff; } .custom-amount { width: 100%; margin-top: 10px; position: relative; } .custom-amount input { width: 100%; padding: 15px 15px 15px 40px; border: 2px solid #ced4da; border-radius: 12px; font-size: 16px; transition: border-color 0.2s ease; outline: none; } .custom-amount input:focus { border-color: #3a86ff; } .currency-symbol { position: absolute; left: 15px; top: 50%; transform: translateY(-50%); color: #6c757d; font-weight: bold; } .donation-frequency { margin: 25px 0; } .frequency-options { display: flex; gap: 10px; margin-top: 10px; } .frequency-option { flex: 1; padding: 12px; background-color: #f1f3f5; border-radius: 12px; text-align: center; cursor: pointer; transition: all 0.2s ease; border: 2px solid transparent; color: #495057; } .frequency-option:hover { background-color: #e9ecef; } .frequency-option.selected { background-color: #e7f5ff; border-color: #3a86ff; color: #3a86ff; font-weight: 600; } .form-group { margin-bottom: 20px; } .form-group label { display: block; margin-bottom: 8px; color: #495057; font-weight: 500; } .form-input { width: 100%; padding: 15px; border: 2px solid #ced4da; border-radius: 12px; font-size: 16px; transition: border-color 0.2s ease; outline: none; } .form-input:focus { border-color: #3a86ff; } .form-row { display: flex; gap: 15px; } .form-row .form-group { flex: 1; } .btn { width: 100%; padding: 15px; border: none; border-radius: 12px; font-size: 16px; font-weight: 600; cursor: pointer; transition: all 0.2s ease; margin-top: 10px; } .btn-primary { background-color: #3a86ff; color: white; } .btn-primary:hover { background-color: #2a75f0; transform: translateY(-2px); box-shadow: 0 4px 8px rgba(58, 134, 255, 0.2); } .btn-secondary { background-color: #f1f3f5; color: #495057; } .btn-secondary:hover { background-color: #e9ecef; } .btn-group { display: flex; gap: 10px; margin-top: 30px; } .donation-summary { background-color: #f8f9fa; border-radius: 12px; padding: 20px; margin-bottom: 20px; } .donation-summary h3 { margin-bottom: 15px; color: #495057; } .summary-item { display: flex; justify-content: space-between; margin-bottom: 10px; } .summary-item-label { color: #6c757d; } .summary-item-value { font-weight: 600; color: #495057; } .total-amount { font-size: 20px; margin-top: 15px; padding-top: 15px; border-top: 1px solid #dee2e6; } .total-amount .summary-item-value { color: #3a86ff; font-size: 24px; } .custom-checkbox { display: flex; align-items: center; margin-bottom: 15px; cursor: pointer; } .custom-checkbox input { position: absolute; opacity: 0; cursor: pointer; height: 0; width: 0; } .checkmark { height: 22px; width: 22px; background-color: #fff; border: 2px solid #ced4da; border-radius: 5px; margin-right: 10px; position: relative; transition: all 0.2s ease; } .custom-checkbox:hover input ~ .checkmark { border-color: #b1b1b1; } .custom-checkbox input:checked ~ .checkmark { background-color: #3a86ff; border-color: #3a86ff; } .checkmark:after { content: ""; position: absolute; display: none; left: 7px; top: 3px; width: 5px; height: 10px; border: solid white; border-width: 0 2px 2px 0; transform: rotate(45deg); } .custom-checkbox input:checked ~ .checkmark:after { display: block; } .custom-checkbox-text { color: #495057; font-size: 14px; } .thank-you-message { text-align: center; padding: 40px 20px; } .thank-you-icon { width: 80px; height: 80px; margin: 0 auto 20px; background-color: #7fe3bd; border-radius: 50%; display: flex; align-items: center; justify-content: center; } .thank-you-icon svg { width: 40px; height: 40px; color: white; } .thank-you-message h2 { color: #3a86ff; margin-bottom: 15px; } .thank-you-message p { color: #6c757d; margin-bottom: 30px; line-height: 1.6; } .impact-message { background-color: #fff3cd; border-radius: 12px; padding: 15px; margin-top: 20px; font-size: 15px; color: #856404; border-left: 4px solid #ffc107; line-height: 1.5; } .error-message { display: none; color: #dc3545; font-size: 14px; margin-top: 5px; } .form-group.error .form-input { border-color: #dc3545; } .form-group.error .error-message { display: block; } .card-icons { display: flex; gap: 10px; margin-top: 10px; } .card-icon { width: 40px; height: 25px; opacity: 0.6; transition: opacity 0.2s ease; } .card-icon.active { opacity: 1; } .donation-impact { background-color: #e7f5ff; border-radius: 12px; padding: 15px; margin-top: 20px; font-size: 15px; line-height: 1.5; border-left: 4px solid #3a86ff; } .donation-impact p { color: #3a86ff; margin: 0; } @media (max-width: 600px) { .donation-header { padding: 20px; } .progress-indicator { margin: 20px; } .donation-form { padding: 20px; } .amount-options { flex-direction: column; } .form-row { flex-direction: column; gap: 0; } .btn-group { flex-direction: column; } } </style> </head> <body> <div class="donation-container"> <div class="donation-header"> <h1>Your Kindness Makes a Difference</h1> <p>Every donation helps us provide essential services to communities in need</p> </div> <div class="floating-hearts"></div> <div class="progress-indicator"> <div class="progress-step active" data-step="1"> <div class="step-number">1</div> <div class="step-label">Amount</div> </div> <div class="progress-step" data-step="2"> <div class="step-number">2</div> <div class="step-label">Details</div> </div> <div class="progress-step" data-step="3"> <div class="step-number">3</div> <div class="step-label">Payment</div> </div> </div> <div class="donation-form"> <div class="form-step active" data-step="1"> <h2>Choose Your Donation Amount</h2> <div class="amount-options"> <div class="amount-option" data-amount="25">$25</div> <div class="amount-option" data-amount="50">$50</div> <div class="amount-option selected" data-amount="100">$100</div> <div class="amount-option" data-amount="250">$250</div> </div> <div class="custom-amount"> <span class="currency-symbol">$</span> <input type="number" id="custom-amount" placeholder="Enter custom amount" value="100"> </div> <div class="donation-frequency"> <h3>How often would you like to donate?</h3> <div class="frequency-options"> <div class="frequency-option selected" data-frequency="one-time">One-time</div> <div class="frequency-option" data-frequency="monthly">Monthly</div> <div class="frequency-option" data-frequency="quarterly">Quarterly</div> </div> </div> <div class="donation-impact"> <p id="impact-text">Your $100 donation can provide 40 meals for families in need.</p> </div> <div class="btn-group"> <button class="btn btn-primary" id="next-to-step-2">Continue</button> </div> </div> <div class="form-step" data-step="2"> <h2>Your Information</h2> <div class="form-row"> <div class="form-group"> <label for="first-name">First Name</label> <input type="text" id="first-name" class="form-input" placeholder="Your first name"> <div class="error-message">Please enter your first name</div> </div> <div class="form-group"> <label for="last-name">Last Name</label> <input type="text" id="last-name" class="form-input" placeholder="Your last name"> <div class="error-message">Please enter your last name</div> </div> </div> <div class="form-group"> <label for="email">Email Address</label> <input type="email" id="email" class="form-input" placeholder="Your email address"> <div class="error-message">Please enter a valid email address</div> </div> <div class="form-group"> <label for="phone">Phone Number (Optional)</label> <input type="tel" id="phone" class="form-input" placeholder="Your phone number"> </div> <label class="custom-checkbox"> <input type="checkbox" checked="checked"> <span class="checkmark"></span> <span class="custom-checkbox-text">I'd like to receive updates about how my donation is making an impact</span> </label> <div class="btn-group"> <button class="btn btn-secondary" id="back-to-step-1">Back</button> <button class="btn btn-primary" id="next-to-step-3">Continue to Payment</button> </div> </div> <div class="form-step" data-step="3"> <h2>Payment Information</h2> <div class="donation-summary"> <h3>Your Donation Summary</h3> <div class="summary-item"> <span class="summary-item-label">Donation Amount</span> <span class="summary-item-value" id="summary-amount">$100.00</span> </div> <div class="summary-item"> <span class="summary-item-label">Frequency</span> <span class="summary-item-value" id="summary-frequency">One-time</span> </div> <div class="total-amount summary-item"> <span class="summary-item-label">Total</span> <span class="summary-item-value" id="summary-total">$100.00</span> </div> </div> <div class="form-group"> <label for="card-name">Name on Card</label> <input type="text" id="card-name" class="form-input" placeholder="As it appears on card"> <div class="error-message">Please enter the name on card</div> </div> <div class="form-group"> <label for="card-number">Card Number</label> <input type="text" id="card-number" class="form-input" placeholder="XXXX XXXX XXXX XXXX"> <div class="error-message">Please enter a valid card number</div> <div class="card-icons"> <img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3E%3Cpath fill='%23FF5F00' d='M16 30h16V18H16z'/%3E%3Cpath d='M17 24c0-2.4 1.1-4.5 2.8-6-.4-.3-.9-.6-1.3-.8C16.3 15.8 14 17.7 14 24s2.3 8.2 4.5 6.8c.5-.2.9-.5 1.3-.8-1.7-1.5-2.8-3.6-2.8-6z' fill='%23EB001B'/%3E%3Cpath d='M33 24c0 3.7-3 6-7 6-1.8 0-3.5-.7-4.8-1.8 1.6-1.5 2.8-3.6 2.8-6s-1.1-4.5-2.8-6C22.5 14.7 24.2 14 26 14c4.1 0 7 2.3 7 6z' fill='%23F79E1B'/%3E%3C/svg%3E" alt="Mastercard" class="card-icon"> <img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3E%3Cpath fill='%230058A0' d='M47 39c0 1.1-.9 2-2 2H3c-1.1 0-2-.9-2-2V9c0-1.1.9-2 2-2h42c1.1 0 2 .9 2 2v30z'/%3E%3Cpath fill='%23EFC75E' d='M17.5 29.8L19 24h2l-2.5 9h-2L14 24h2l1.5 5.8zm4.8-1h1.6c1.3 0 2.1-.8 2.1-2.2 0-1.3-.8-2-2-2h-1.7v4.2zm-1.5-6.2h3.4c.9 0 1.7.3 2.2.8.6.6.9 1.3.9 2.3 0 1-.4 1.8-1 2.5-.7.6-1.6.9-2.8.9h-1.2V34h-1.5v-11.4zm16.7 8.1h-3l-.6 1.9h-1.6l3.2-9h1.5l3.2 9H39l-.5-1.9zm-.4-1.3l-1.1-3.4-1.1 3.4h2.2z'/%3E%3C/svg%3E" alt="Visa" class="card-icon active"> <img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3E%3Cpath fill='%232A2A6C' d='M45 35c0 2.209-1.791 4-4 4H7c-2.209 0-4-1.791-4-4V13c0-2.209 1.791-4 4-4h34c2.209 0 4 1.791 4 4v22z'/%3E%3Cpath fill='%23FFF' d='M17.07 28.511H14.7l1.488-9.132h2.37l-1.488 9.132zM24.678 19.591c-.468-.186-.955-.25-1.456-.25-1.602 0-2.729.808-2.729 1.948 0 .85.802 1.326 1.413 1.607.631.291.842.475.842.734 0 .39-.505.57-.969.57-.647 0-1.249-.144-1.917-.499l-.265.138-.383 1.987c.551.242 1.568.453 2.623.464 2.465 0 4.079-.799 4.094-2.037.016-.677-.425-1.192-1.361-1.615-.566-.276-.913-.458-.913-.741 0-.249.297-.515.931-.515.535-.8.935.109 1.23.232l.234.111.352-1.626-.52-.208zM33.934 19.379h-1.825c-.566 0-.99.154-1.237.719l-3.521 7.405h2.49l.495-1.319 3.024.004.275 1.315h2.206l-1.907-8.124zm-3.319 5.196l.944-2.561.543 2.561h-1.487zM12.674 19.379L10.32 25.298l-.249-1.203c-.435-1.403-1.794-2.922-3.307-3.677l2.14 8.089h2.531l3.76-9.128h-2.521z'/%3E%3Cpath fill='%23F7A823' d='M9.15 19.379H5.046l-.033.201c3.188.772 5.217 2.615 6.095 4.739l-.878-4.223c-.15-.577-.588-.717-1.08-.717z'/%3E%3C/svg%3E" alt="American Express" class="card-icon"> </div> </div> <div class="form-row"> <div class="form-group"> <label for="expiry-date">Expiration Date</label> <input type="text" id="expiry-date" class="form-input" placeholder="MM/YY"> <div class="error-message">Please enter a valid date</div> </div> <div class="form-group"> <label for="cvv">Security Code (CVV)</label> <input type="text" id="cvv" class="form-input" placeholder="CVV"> <div class="error-message">Please enter your CVV</div> </div> </div> <label class="custom-checkbox"> <input type="checkbox" checked="checked"> <span class="checkmark"></span> <span class="custom-checkbox-text">I'd like to cover the transaction fees so 100% of my donation goes to the cause</span> </label> <div class="btn-group"> <button class="btn btn-secondary" id="back-to-step-2">Back</button> <button class="btn btn-primary" id="complete-donation">Complete Donation</button> </div> </div> <div class="form-step" data-step="4"> <div class="thank-you-message"> <div class="thank-you-icon"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" /> </svg> </div> <h2>Thank You For Your Generosity!</h2> <p>Your donation of <span id="final-amount">$100.00</span> will make a significant impact in our community. We've sent a confirmation email to <span id="final-email">your email address</span>.</p> <div class="impact-message"> Thanks to your kindness, we can provide 40 meals to families facing food insecurity this month. </div> <button class="btn btn-primary" id="donate-again">Make Another Donation</button> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Heart animation function createHearts() { const heartsContainer = document.querySelector('.floating-hearts'); for (let i = 0; i < 5; i++) { const heart = document.createElement('div'); heart.classList.add('heart'); heart.style.left = `${Math.random() * 100}%`; heart.style.animationDelay = `${Math.random() * 3}s`; heartsContainer.appendChild(heart); } } createHearts(); // Step navigation const progressSteps = document.querySelectorAll('.progress-step'); const formSteps = document.querySelectorAll('.form-step'); let currentStep = 1; function goToStep(step) { // Hide all steps formSteps.forEach(formStep => { formStep.classList.remove('active'); }); // Update progress indicator progressSteps.forEach(progressStep => { const stepNumber = parseInt(progressStep.dataset.step); progressStep.classList.remove('active', 'complete'); if (stepNumber === step) { progressStep.classList.add('active'); } else if (stepNumber < step) { progressStep.classList.add('complete'); } }); // Show current step const currentFormStep = document.querySelector(`.form-step[data-step="${step}"]`); currentFormStep.classList.add('active'); currentStep = step; } // Amount selection const amountOptions = document.querySelectorAll('.amount-option'); const customAmountInput = document.getElementById('custom-amount'); let selectedAmount = 100; amountOptions.forEach(option => { option.addEventListener('click', function() { amountOptions.forEach(opt => opt.classList.remove('selected')); this.classList.add('selected'); selectedAmount = parseInt(this.dataset.amount); customAmountInput.value = selectedAmount; updateImpactText(selectedAmount); }); }); customAmountInput.addEventListener('input', function() { const value = parseFloat(this.value); if (value) { selectedAmount = value; amountOptions.forEach(opt => opt.classList.remove('selected')); updateImpactText(selectedAmount); } }); // Update donation impact text function updateImpactText(amount) { const impactTextElement = document.getElementById('impact-text'); let impactText; if (amount <= 25) { impactText = `Your $${amount} donation can provide 10 meals for families in need.`; } else if (amount <= 50) { impactText = `Your $${amount} donation can provide 20 meals for families in need.`; } else if (amount <= 100) { impactText = `Your $${amount} donation can provide 40 meals for families in need.`; } else if (amount <= 250) { impactText = `Your $${amount} donation can help support a month of clean water for a village.`; } else { impactText = `Your $${amount} donation can make a significant impact on our community programs.`; } impactTextElement.textContent = impactText; } // Frequency selection const frequencyOptions = document.querySelectorAll('.frequency-option'); let selectedFrequency = 'one-time'; frequencyOptions.forEach(option => { option.addEventListener('click', function() { frequencyOptions.forEach(opt => opt.classList.remove('selected')); this.classList.add('selected'); selectedFrequency = this.dataset.frequency; }); }); // Form navigation buttons document.getElementById('next-to-step-2').addEventListener('click', function() { goToStep(2); }); document.getElementById('back-to-step-1').addEventListener('click', function() { goToStep(1); }); document.getElementById('next-to-step-3').addEventListener('click', function() { if (validateStep2()) { updateSummary(); goToStep(3); } }); document.getElementById('back-to-step-2').addEventListener('click', function() { goToStep(2); }); document.getElementById('complete-donation').addEventListener('click', function() { if (validateStep3()) { completeDonation(); } }); document.getElementById('donate-again').addEventListener('click', function() { resetForm(); goToStep(1); }); // Form validation function validateStep2() { const firstName = document.getElementById('first-name'); const lastName = document.getElementById('last-name'); const email = document.getElementById('email'); let isValid = true; // Reset previous errors document.querySelectorAll('.form-group').forEach(group => { group.classList.remove('error'); }); if (!firstName.value.trim()) { firstName.parentNode.classList.add('error'); isValid = false; } if (!lastName.value.trim()) { lastName.parentNode.classList.add('error'); isValid = false; } const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!email.value.trim() || !emailPattern.test(email.value)) { email.parentNode.classList.add('error'); isValid = false; } return isValid; } function validateStep3() { const cardName = document.getElementById('card-name'); const cardNumber = document.getElementById('card-number'); const expiryDate = document.getElementById('expiry-date'); const cvv = document.getElementById('cvv'); let isValid = true; // Reset previous errors document.querySelectorAll('.form-group').forEach(group => { group.classList.remove('error'); }); if (!cardName.value.trim()) { cardName.parentNode.classList.add('error'); isValid = false; } if (!cardNumber.value.trim() || cardNumber.value.replace(/\s/g, '').length < 15) { cardNumber.parentNode.classList.add('error'); isValid = false; } const expiryPattern = /^(0[1-9]|1[0-2])\/\d{2}$/; if (!expiryDate.value.trim() || !expiryPattern.test(expiryDate.value)) { expiryDate.parentNode.classList.add('error'); isValid = false; } if (!cvv.value.trim() || cvv.value.length < 3) { cvv.parentNode.classList.add('error'); isValid = false; } return isValid; } // Update summary function updateSummary() { document.getElementById('summary-amount').textContent = `$${selectedAmount.toFixed(2)}`; document.getElementById('summary-frequency').textContent = selectedFrequency === 'one-time' ? 'One-time' : selectedFrequency === 'monthly' ? 'Monthly' : 'Quarterly'; document.getElementById('summary-total').textContent = `$${selectedAmount.toFixed(2)}`; } // Complete donation function completeDonation() { document.getElementById('final-amount').textContent = `$${selectedAmount.toFixed(2)}`; document.getElementById('final-email').textContent = document.getElementById('email').value; goToStep(4); } // Reset form function resetForm() { // Reset amount amountOptions.forEach(opt => opt.classList.remove('selected')); document.querySelector('.amount-option[data-amount="100"]').classList.add('selected'); customAmountInput.value = "100"; selectedAmount = 100; // Reset
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>SoundWave Festival Ticketing</title> <style> :root { --primary: #6366f1; --primary-dark: #4f46e5; --secondary: #06b6d4; --accent: #f97316; --background: #f8fafc; --text: #334155; --text-light: #64748b; --white: #ffffff; --error: #ef4444; --success: #22c55e; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { background-color: var(--background); color: var(--text); height: 100%; overflow-x: hidden; max-width: 700px; margin: 0 auto; } .container { display: flex; flex-direction: column; height: 700px; overflow-y: auto; scrollbar-width: thin; position: relative; background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%); } .container::-webkit-scrollbar { width: 6px; } .container::-webkit-scrollbar-thumb { background-color: var(--primary); border-radius: 3px; } header { background: linear-gradient(90deg, var(--primary) 0%, var(--secondary) 100%); color: var(--white); padding: 1.5rem; text-align: center; position: sticky; top: 0; z-index: 10; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); } .event-title { font-size: 1.8rem; font-weight: 800; margin-bottom: 0.5rem; letter-spacing: -0.5px; text-transform: uppercase; background: linear-gradient(90deg, #fafafa 0%, #f0f9ff 100%); -webkit-background-clip: text; background-clip: text; color: transparent; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1); } .event-date { font-size: 1rem; font-weight: 500; color: rgba(255, 255, 255, 0.9); } .event-location { font-size: 0.9rem; font-weight: 400; margin-top: 0.25rem; color: rgba(255, 255, 255, 0.8); } .checkout-grid { display: grid; grid-template-columns: 1fr; gap: 1.5rem; padding: 1.5rem; } @media (min-width: 640px) { .checkout-grid { grid-template-columns: 3fr 2fr; } } .form-section { background-color: var(--white); border-radius: 12px; padding: 1.5rem; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); margin-bottom: 1rem; } .section-title { font-size: 1.2rem; font-weight: 700; margin-bottom: 1rem; color: var(--primary-dark); display: flex; align-items: center; gap: 0.5rem; } .section-title svg { width: 20px; height: 20px; } form { display: flex; flex-direction: column; gap: 1.25rem; } .form-group { display: flex; flex-direction: column; gap: 0.5rem; } label { font-size: 0.875rem; font-weight: 600; color: var(--text); } input, select { padding: 0.75rem; border: 1px solid #cbd5e1; border-radius: 6px; font-size: 1rem; transition: all 0.3s ease; width: 100%; } input:focus, select:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.2); } .error-message { color: var(--error); font-size: 0.75rem; margin-top: 0.25rem; display: none; } .input-error { border-color: var(--error); } .input-error:focus { box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.2); } .input-error + .error-message { display: block; } .input-group { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; } .seat-selection { margin-top: 0.5rem; display: flex; flex-direction: column; gap: 1rem; } .stage { background: linear-gradient(90deg, var(--primary) 0%, var(--secondary) 100%); color: var(--white); text-align: center; padding: 0.5rem; border-radius: 6px; font-weight: 700; margin-bottom: 1rem; position: relative; overflow: hidden; } .stage::before { content: ''; position: absolute; top: 0; left: -100%; width: 50%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); animation: stageLight 3s infinite; } @keyframes stageLight { 0% { left: -100%; } 100% { left: 100%; } } .seating-area { display: grid; grid-template-columns: repeat(5, 1fr); gap: 0.5rem; width: 100%; margin: 0 auto; } .seat { aspect-ratio: 1/1; background-color: #e2e8f0; border-radius: 4px; cursor: pointer; display: flex; align-items: center; justify-content: center; font-size: 0.75rem; font-weight: 600; transition: all 0.2s ease; position: relative; overflow: hidden; } .seat:hover { transform: scale(1.05); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } .seat.available { background-color: #bfdbfe; color: var(--primary-dark); } .seat.selected { background-color: var(--primary); color: var(--white); animation: selectPulse 0.5s ease; } @keyframes selectPulse { 0% { transform: scale(1); } 50% { transform: scale(1.1); } 100% { transform: scale(1); } } .seat.unavailable { background-color: #cbd5e1; color: var(--text-light); cursor: not-allowed; opacity: 0.7; } .seat-legend { display: flex; justify-content: center; gap: 1rem; margin-top: 1rem; font-size: 0.75rem; } .legend-item { display: flex; align-items: center; gap: 0.25rem; } .legend-color { width: 1rem; height: 1rem; border-radius: 4px; } .legend-available { background-color: #bfdbfe; } .legend-selected { background-color: var(--primary); } .legend-unavailable { background-color: #cbd5e1; opacity: 0.7; } .order-summary { background-color: var(--white); border-radius: 12px; padding: 1.5rem; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); position: sticky; top: 105px; } .summary-title { font-size: 1.2rem; font-weight: 700; margin-bottom: 1rem; color: var(--primary-dark); display: flex; align-items: center; gap: 0.5rem; } .summary-item { display: flex; justify-content: space-between; margin-bottom: 0.75rem; padding-bottom: 0.75rem; border-bottom: 1px dashed #e2e8f0; } .summary-item:last-of-type { border-bottom: none; } .summary-label { font-size: 0.875rem; color: var(--text-light); } .summary-value { font-size: 0.875rem; font-weight: 600; color: var(--text); } .summary-total { display: flex; justify-content: space-between; margin-top: 1rem; padding-top: 1rem; border-top: 2px solid #e2e8f0; } .summary-total-label { font-size: 1rem; font-weight: 700; color: var(--text); } .summary-total-value { font-size: 1.1rem; font-weight: 800; color: var(--primary-dark); } .selected-seats { display: flex; flex-wrap: wrap; gap: 0.35rem; margin-top: 0.5rem; margin-bottom: 0.75rem; } .selected-seat-tag { background-color: #e0e7ff; border-radius: 9999px; padding: 0.25rem 0.5rem; font-size: 0.75rem; font-weight: 600; color: var(--primary-dark); display: flex; align-items: center; gap: 0.25rem; } .remove-seat { width: 14px; height: 14px; cursor: pointer; color: var(--primary-dark); transition: all 0.2s ease; } .remove-seat:hover { color: var(--error); } .empty-selection { font-size: 0.875rem; color: var(--text-light); font-style: italic; margin-top: 0.5rem; } .btn { display: inline-flex; align-items: center; justify-content: center; padding: 0.75rem 1.5rem; font-size: 1rem; font-weight: 600; text-align: center; border-radius: 8px; border: none; cursor: pointer; transition: all 0.3s ease; gap: 0.5rem; } .btn-primary { background: linear-gradient(90deg, var(--primary) 0%, var(--secondary) 100%); color: var(--white); box-shadow: 0 4px 6px -1px rgba(99, 102, 241, 0.4); position: relative; overflow: hidden; z-index: 1; } .btn-primary::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(90deg, var(--primary-dark) 0%, var(--primary) 100%); z-index: -1; transition: opacity 0.3s ease; opacity: 0; } .btn-primary:hover::before { opacity: 1; } .btn-primary:active { transform: translateY(2px); } .btn svg { width: 20px; height: 20px; } .btn-block { width: 100%; } .payment-options { display: flex; gap: 0.5rem; margin-top: 0.5rem; } .payment-option { border: 1px solid #cbd5e1; border-radius: 6px; padding: 0.5rem; flex: 1; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: all 0.2s ease; } .payment-option:hover { border-color: var(--primary); background-color: #f1f5f9; } .payment-option.active { border-color: var(--primary); background-color: #e0e7ff; } .payment-icon { width: 24px; height: 24px; } .success-message { background-color: #ecfdf5; border: 1px solid #a7f3d0; border-radius: 6px; padding: 1rem; margin-top: 1rem; display: flex; align-items: center; gap: 0.5rem; color: var(--success); display: none; } .success-icon { width: 20px; height: 20px; } .loader { display: none; width: 24px; height: 24px; border: 3px solid rgba(255, 255, 255, 0.3); border-radius: 50%; border-top-color: var(--white); animation: spin 1s ease-in-out infinite; } @keyframes spin { to { transform: rotate(360deg); } } .btn-text { display: inline; } .form-steps { display: flex; margin-bottom: 1.5rem; border-bottom: 1px solid #e2e8f0; padding-bottom: 1rem; } .step { flex: 1; position: relative; text-align: center; padding-bottom: 0.5rem; cursor: pointer; } .step::after { content: ''; position: absolute; bottom: -1px; left: 0; width: 100%; height: 3px; background-color: transparent; transition: all 0.3s ease; } .step.active { color: var(--primary-dark); font-weight: 600; } .step.active::after { background-color: var(--primary); } .step.completed::after { background-color: var(--success); } .step-content { display: none; } .step-content.active { display: block; animation: fadeIn 0.3s ease; } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .step-nav { display: flex; justify-content: space-between; margin-top: 1.5rem; } .promo-code { margin-top: 1rem; padding-top: 1rem; border-top: 1px dashed #e2e8f0; } .promo-input { display: flex; gap: 0.5rem; } .btn-promo { background-color: #f1f5f9; color: var(--text); padding: 0.75rem 1rem; font-size: 0.875rem; border-radius: 6px; border: 1px solid #cbd5e1; cursor: pointer; transition: all 0.2s ease; } .btn-promo:hover { background-color: #e2e8f0; } .promo-label { font-size: 0.875rem; font-weight: 600; margin-bottom: 0.5rem; } .discount-applied { color: var(--success); display: none; font-size: 0.875rem; margin-top: 0.5rem; font-weight: 500; } .highlight-animation { animation: highlightPulse 2s ease; } @keyframes highlightPulse { 0% { color: var(--text); } 50% { color: var(--accent); } 100% { color: var(--text); } } .ticket-quantity { display: flex; align-items: center; margin-top: 0.5rem; } .quantity-btn { width: 30px; height: 30px; background-color: #f1f5f9; border: 1px solid #cbd5e1; border-radius: 4px; display: flex; align-items: center; justify-content: center; cursor: pointer; font-weight: 600; transition: all 0.2s ease; } .quantity-btn:hover { background-color: #e2e8f0; } .quantity-input { width: 40px; text-align: center; margin: 0 0.5rem; border: 1px solid #cbd5e1; border-radius: 4px; padding: 0.25rem; } .cc-icons { display: flex; gap: 0.5rem; margin-top: 0.5rem; } .cc-icon { width: 32px; height: 20px; opacity: 0.5; transition: opacity 0.2s ease; } .cc-icon.active { opacity: 1; } </style> </head> <body> <div class="container"> <header> <h1 class="event-title">SoundWave Festival 2023</h1> <div class="event-date">September 15-17, 2023</div> <div class="event-location">Riverfront Park, Portland</div> </header> <div class="checkout-grid"> <div class="main-content"> <div class="form-section"> <div class="form-steps"> <div class="step active" data-step="1">Select Tickets</div> <div class="step" data-step="2">Your Details</div> <div class="step" data-step="3">Payment</div> </div> <form id="checkout-form"> <div class="step-content active" data-step="1"> <div class="section-title"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 5v2m0 4v2m0 4v2M5 5a2 2 0 00-2 2v3a2 2 0 110 4v3a2 2 0 002 2h14a2 2 0 002-2v-3a2 2 0 110-4V7a2 2 0 00-2-2H5z" /> </svg> Choose Your Tickets </div> <div class="form-group"> <label for="ticket-type">Ticket Type</label> <select id="ticket-type" required> <option value="">Select a ticket type</option> <option value="general">General Admission - $79.99</option> <option value="vip">VIP Experience - $149.99</option> <option value="backstage">Backstage Pass - $249.99</option> </select> </div> <div class="form-group"> <label for="ticket-quantity">Quantity</label> <div class="ticket-quantity"> <div class="quantity-btn decrease">-</div> <input type="number" id="ticket-quantity" class="quantity-input" value="1" min="1" max="10" readonly> <div class="quantity-btn increase">+</div> </div> </div> <div class="form-group"> <label for="ticket-day">Festival Day</label> <select id="ticket-day" required> <option value="">Select a day</option> <option value="day1">Day 1 (Sep 15) - Headliner: Arctic Monkeys</option> <option value="day2">Day 2 (Sep 16) - Headliner: Tame Impala</option> <option value="day3">Day 3 (Sep 17) - Headliner: The Strokes</option> <option value="all">Full Festival Pass (All 3 Days)</option> </select> </div> <div class="form-group"> <label>Choose Your Seats (Optional for VIP/Backstage)</label> <div class="seat-selection"> <div class="stage">STAGE</div> <div class="seating-area" id="seating-area"> <!-- Seats will be generated by JS --> </div> <div class="seat-legend"> <div class="legend-item"> <div class="legend-color legend-available"></div> <span>Available</span> </div> <div class="legend-item"> <div class="legend-color legend-selected"></div> <span>Selected</span> </div> <div class="legend-item"> <div class="legend-color legend-unavailable"></div> <span>Unavailable</span> </div> </div> </div> </div> <div class="step-nav"> <div></div> <button type="button" class="btn btn-primary next-step" data-next="2"> Continue to Details <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" /> </svg> </button> </div> </div> <div class="step-content" data-step="2"> <div class="section-title"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" /> </svg> Your Details </div> <div class="form-group"> <label for="full-name">Full Name</label> <input type="text" id="full-name" placeholder="John Doe" required> <div class="error-message">Please enter your full name</div> </div> <div class="form-group"> <label for="email">Email Address</label> <input type="email" id="email" placeholder="[email protected]" required> <div class="error-message">Please enter a valid email address</div> </div> <div class="form-group"> <label for="phone">Phone Number</label> <input type="tel" id="phone" placeholder="(555) 123-4567" required> <div class="error-message">Please enter a valid phone number</div> </div> <div class="step-nav"> <button type="button" class="btn btn-promo prev-step" data-prev="1"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" /> </svg> Back </button> <button type="button" class="btn btn-primary next-step" data-next="3"> Continue to Payment <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" /> </svg> </button> </div> </div> <div class="step-content" data-step="3"> <div class="section-title"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z" /> </svg> Payment Details </div> <div class="form-group"> <label for="card-name">Name on Card</label> <input type="text" id="card-name" placeholder="John Doe" required> <div class="error-message">Please enter the name on your card</div> </div> <div class="form-group"> <label for="card-number">Card Number</label> <input type="text" id="card-number" placeholder="1234 5678 9012 3456" required maxlength="19"> <div class="cc-icons"> <img src="https://cdn.jsdelivr.net/gh/creativetimofficial/public-assets@master/soft-ui-design-system/assets/img/logos/mastercard.png" alt="Mastercard" class="cc-icon"> <img src="https://cdn.jsdelivr.net/gh/creativetimofficial/public-assets@master/soft-ui-design-system/assets/img/logos/visa.png" alt="Visa" class="cc-icon"> <img src="https://cdn.jsdelivr.net/gh/creativetimofficial/public-assets@master/soft-ui-design-system/assets/img/logos/discover.png" alt="Discover" class="cc-icon"> <img src="https://cdn.jsdelivr.net/gh/creativetimofficial/public-assets@master/soft-ui-design-system/assets/img/logos/amex.png" alt="American Express" class="cc-icon"> </div> <div class="error-message">Please enter a valid card number</div> </div> <div class="input-group"> <div class="form-group"> <label for="expiry-date">Expiry Date</label> <input type="text" id="expiry-date" placeholder="MM/YY" required maxlength="5"> <div class="error-message">Please enter a valid expiry date</div> </div> <div class="form-group"> <label for="cvv">CVV</label> <input type="text" id="cvv" placeholder="123" required maxlength="4"> <div class="error-message">Please enter a valid CVV</div> </div> </div> <div class="step-nav"> <button type="button" class="btn btn-promo prev-step" data-prev="2"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" /> </svg> Back </button> <button type="button" id="complete-purchase" class="btn btn-primary"> <span class="btn-text">Complete Purchase</span> <div class="loader"></div> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" /> </svg> </button> </div> <div class="success-message"> <svg class="success-icon" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" /> </svg> <span>Purchase successful! Your tickets have been emailed to you.</span> </div> </div> </form> </div> </div> <div class="order-summary" id="order-summary"> <div class="summary-title"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" /> </svg> Order Summary </div> <div class="summary-item"> <div class="summary-label">Ticket Type</div> <div class="summary-value" id="summary-ticket-type">--</div> </div> <div class="summary-item"> <div class="summary-label">Event Day</div> <div class="summary-value" id="summary-event-day">--</div> </div> <div class="summary-item"> <div class="summary-label">Quantity</div> <div class="summary-value" id="summary-quantity">1</div> </div> <div class="summary-item"> <div class="summary-label">Selected Seats</div> <div class="selected-seats" id="summary-seats"> <div class="empty-selection">No seats selected yet</div> </div> </div> <div class="summary-item"> <div class="summary-label">Ticket Price</div> <div class="summary-value" id="summary-ticket-price">$0.00</div> </div> <div class="summary-item"> <div class="summary-label">Service Fee</div> <div class="summary-value" id="summary-fee">$0.00</div> </div> <div class="promo-code"> <div class="promo-label">Have a promo code?</div> <div class="promo-input"> <input type="text" id="promo-code" placeholder="Enter code"> <button type="button" id="apply-promo" class="btn-promo">Apply</button> </div> <div class="discount-applied" id="discount-message">FESTIVAL20 applied! 20% discount</div> </div> <div class="summary-total"> <div class="summary-total-label">Total</div> <div class="summary-total-value" id="summary-total">$0.00</div> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Global variables const seats = {}; let selectedSeats = []; const ticketPrices = { general: 79.99, vip: 149.99, backstage: 249.99 }; const serviceFeePercentage = 0.15; let promoDiscount = 0; let quantity = 1; // Setup seating chart const seatingArea = document.getElementById('seating-area'); const totalRows = 4; const seatsPerRow = 5; // Generate random unavailable seats for (let row = 0; row < totalRows; row++) { for (let seat = 0; seat < seatsPerRow; seat++) { const id = `${String.fromCharCode(65 + row)}${seat + 1}`; // Make some seats unavailable randomly const randomStatus = Math.random(); let status = 'available'; if (randomStatus < 0.3) { status = 'unavailable'; } seats[id] = status; const seatElement = document.createElement('div'); seatElement.className = `seat ${status}`; seatElement.id = `seat-${id}`; seatElement.textContent = id; seatElement.setAttribute('data-seat', id); seatingArea.appendChild(seatElement); } } // Event listeners document.querySelectorAll('.seat.available').forEach(seat => { seat.addEventListener('click', function() { const seatId = this.getAttribute('data-seat'); if (this.classList.contains('selected')) { this.classList.remove('selected'); selectedSeats = selectedSeats.filter(id => id !== seatId); } else { this.classList.add('selected'); selectedSeats.push(seatId); } updateSummary(); }); }); // Ticket type change document.getElementById('ticket-type').addEventListener('change', updateSummary); document.getElementById('ticket-day').addEventListener('change', updateSummary); // Quantity change document.querySelector('.quantity-btn.decrease').addEventListener('click', function() { const input = document.getElementById('ticket-quantity'); if (parseInt(input.value) > 1) { input.value = parseInt(input.value) - 1; quantity = parseInt(input.value); updateSummary(); } }); document.querySelector('.quantity-btn.increase
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Travel Booking Checkout</title> <style> :root { --primary: #1a9988; --secondary: #f87060; --accent: #ffc15e; --light: #e8f5f7; --dark: #2d4654; --success: #6bb77b; --error: #e55a44; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Poppins', 'Segoe UI', sans-serif; } body { background: linear-gradient(135deg, #e8f5f7 0%, #d1e8eb 100%); color: var(--dark); height: 100vh; display: flex; justify-content: center; align-items: center; overflow-x: hidden; } .container { width: 100%; max-width: 700px; height: 700px; background-color: white; border-radius: 20px; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.1); overflow: hidden; display: flex; flex-direction: column; position: relative; } .header { background: linear-gradient(135deg, var(--primary) 0%, #26b6a4 100%); padding: 30px 40px; color: white; position: relative; overflow: hidden; } .header h1 { font-size: 26px; margin-bottom: 10px; font-weight: 600; letter-spacing: 0.5px; } .header p { font-size: 14px; opacity: 0.9; max-width: 80%; } .geometric-shape { position: absolute; width: 200px; height: 200px; border-radius: 50%; background: rgba(255, 255, 255, 0.1); top: -100px; right: -50px; } .geometric-shape:nth-child(2) { width: 100px; height: 100px; top: 20px; right: 40px; background: rgba(255, 255, 255, 0.15); } .content { flex: 1; padding: 30px 40px; overflow-y: auto; position: relative; } .progress-container { display: flex; justify-content: space-between; margin-bottom: 30px; position: relative; } .progress-container::before { content: ''; position: absolute; height: 2px; width: 100%; background-color: #e1e1e1; top: 15px; z-index: 1; } .progress-bar { position: absolute; height: 2px; background: var(--primary); top: 15px; z-index: 2; transition: width 0.5s ease; } .progress-step { width: 30px; height: 30px; border-radius: 50%; background-color: white; border: 2px solid #e1e1e1; display: flex; justify-content: center; align-items: center; font-size: 12px; font-weight: 600; color: #888; z-index: 3; position: relative; transition: all 0.3s ease; } .progress-step.active { border-color: var(--primary); background-color: var(--primary); color: white; } .progress-step.completed { border-color: var(--primary); background-color: var(--primary); color: white; } .progress-step.completed::after { content: '✓'; } .progress-step-label { position: absolute; top: 35px; left: 50%; transform: translateX(-50%); font-size: 11px; color: #666; white-space: nowrap; } .form-section { display: none; animation: fadeIn 0.5s ease; } .form-section.active { display: block; } @keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .form-group { margin-bottom: 20px; } label { display: block; margin-bottom: 6px; font-size: 13px; font-weight: 500; color: var(--dark); } input, select { width: 100%; padding: 12px 15px; border: 1px solid #ddd; border-radius: 8px; font-size: 14px; transition: all 0.3s ease; } input:focus, select:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 2px rgba(26, 153, 136, 0.2); } .input-group { display: flex; gap: 15px; } .input-group .form-group { flex: 1; } .btn { background-color: var(--primary); color: white; border: none; padding: 12px 20px; border-radius: 8px; font-size: 14px; font-weight: 500; cursor: pointer; transition: all 0.3s ease; display: inline-flex; align-items: center; justify-content: center; } .btn:hover { background-color: #158277; transform: translateY(-2px); box-shadow: 0 5px 15px rgba(26, 153, 136, 0.3); } .btn-secondary { background-color: #e1e1e1; color: #666; } .btn-secondary:hover { background-color: #d1d1d1; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); } .buttons-container { display: flex; justify-content: space-between; margin-top: 30px; } .product-summary { background-color: var(--light); border-radius: 12px; padding: 15px; margin-bottom: 20px; } .product-summary h3 { font-size: 16px; margin-bottom: 10px; color: var(--primary); } .product-detail { display: flex; justify-content: space-between; margin-bottom: 5px; font-size: 13px; } .product-detail span:last-child { font-weight: 500; } .total-price { display: flex; justify-content: space-between; margin-top: 10px; padding-top: 10px; border-top: 1px dashed #ccc; font-weight: 600; } .card-input-container { position: relative; } .card-type { position: absolute; right: 15px; top: 50%; transform: translateY(-50%); font-size: 20px; color: #888; } .card-digits { display: flex; gap: 10px; } .card-digits input { flex: 1; text-align: center; font-size: 16px; letter-spacing: 1px; } .expiry-cvv { display: flex; gap: 15px; } .expiry-cvv .form-group { flex: 1; } .payment-methods { display: flex; gap: 10px; margin-bottom: 20px; } .payment-method { flex: 1; padding: 15px; border: 1px solid #ddd; border-radius: 8px; text-align: center; cursor: pointer; transition: all 0.3s ease; } .payment-method:hover { border-color: var(--primary); } .payment-method.active { border-color: var(--primary); background-color: rgba(26, 153, 136, 0.05); } .payment-method i { font-size: 24px; display: block; margin-bottom: 5px; color: #666; } .payment-method.active i { color: var(--primary); } .success-animation { text-align: center; padding: 50px 20px; } .checkmark { width: 80px; height: 80px; border-radius: 50%; display: block; margin: 0 auto 30px; stroke-width: 2; stroke: var(--success); stroke-miterlimit: 10; box-shadow: 0 0 0 var(--success); animation: fill .4s ease-in-out .4s forwards, scale .3s ease-in-out .9s both; } .checkmark__circle { stroke-dasharray: 166; stroke-dashoffset: 166; stroke-width: 2; stroke-miterlimit: 10; stroke: var(--success); fill: none; animation: stroke 0.6s cubic-bezier(0.65, 0, 0.45, 1) forwards; } .checkmark__check { transform-origin: 50% 50%; stroke-dasharray: 48; stroke-dashoffset: 48; animation: stroke 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.8s forwards; } @keyframes stroke { 100% { stroke-dashoffset: 0; } } @keyframes scale { 0%, 100% { transform: none; } 50% { transform: scale3d(1.1, 1.1, 1); } } @keyframes fill { 100% { box-shadow: 0 0 0 30px rgba(107, 183, 123, 0.2); } } .destination-preview { position: relative; margin-bottom: 25px; border-radius: 12px; overflow: hidden; box-shadow: 0 5px 15px rgba(0,0,0,0.1); } .destination-img { width: 100%; height: 150px; object-fit: cover; transition: transform 0.3s ease; } .destination-preview:hover .destination-img { transform: scale(1.05); } .destination-overlay { position: absolute; bottom: 0; left: 0; right: 0; padding: 15px; background: linear-gradient(to top, rgba(0,0,0,0.8), transparent); color: white; } .destination-name { font-size: 18px; font-weight: 600; margin-bottom: 5px; } .destination-dates { font-size: 12px; opacity: 0.9; } /* Floating elements for visual interest */ .floating-shape { position: absolute; z-index: -1; opacity: 0.6; animation: float 6s ease-in-out infinite; } .floating-shape.circle { width: 50px; height: 50px; border-radius: 50%; background: var(--accent); right: 10%; bottom: 20%; } .floating-shape.triangle { width: 0; height: 0; border-left: 30px solid transparent; border-right: 30px solid transparent; border-bottom: 50px solid var(--secondary); top: 20%; left: 10%; opacity: 0.4; } @keyframes float { 0% { transform: translateY(0px) rotate(0deg); } 50% { transform: translateY(-20px) rotate(5deg); } 100% { transform: translateY(0px) rotate(0deg); } } /* Responsive adjustments */ @media (max-width: 700px) { .container { height: auto; min-height: 700px; border-radius: 0; } .header { padding: 20px 25px; } .content { padding: 20px 25px; } .input-group { flex-direction: column; gap: 0; } .progress-step-label { display: none; } .card-digits { flex-wrap: wrap; } .card-digits input { flex: 1 0 calc(50% - 5px); } } /* Tooltip styles */ .tooltip { position: relative; } .tooltip .tooltip-text { visibility: hidden; width: 200px; background-color: #333; color: #fff; text-align: center; border-radius: 6px; padding: 8px; position: absolute; z-index: 10; bottom: 125%; left: 50%; transform: translateX(-50%); opacity: 0; transition: opacity 0.3s; font-size: 12px; } .tooltip .tooltip-text::after { content: ""; position: absolute; top: 100%; left: 50%; margin-left: -5px; border-width: 5px; border-style: solid; border-color: #333 transparent transparent transparent; } .tooltip:hover .tooltip-text { visibility: visible; opacity: 1; } /* Loading spinner */ .spinner { width: 40px; height: 40px; margin: 0 auto; border: 4px solid rgba(0, 0, 0, 0.1); border-radius: 50%; border-left-color: var(--primary); animation: spin 1s ease infinite; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } </style> </head> <body> <div class="container"> <div class="header"> <h1>Complete Your Adventure</h1> <p>Just a few steps away from your dream getaway to Bali</p> <div class="geometric-shape"></div> <div class="geometric-shape"></div> </div> <div class="content"> <div class="progress-container"> <div class="progress-bar" id="progress-bar"></div> <div class="progress-step active" data-step="1"> 1 <div class="progress-step-label">Trip Details</div> </div> <div class="progress-step" data-step="2"> 2 <div class="progress-step-label">Traveler Info</div> </div> <div class="progress-step" data-step="3"> 3 <div class="progress-step-label">Payment</div> </div> <div class="progress-step" data-step="4"> 4 <div class="progress-step-label">Confirmation</div> </div> </div> <!-- Step 1: Trip Details --> <div class="form-section active" id="step1"> <div class="destination-preview"> <img src="https://images.unsplash.com/photo-1537996194471-e657df975ab4?ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=80" alt="Bali" class="destination-img"> <div class="destination-overlay"> <div class="destination-name">Bali Beachfront Resort</div> <div class="destination-dates">Aug 15 - Aug 22, 2023</div> </div> </div> <div class="product-summary"> <h3>Your Tropical Escape Package</h3> <div class="product-detail"> <span>7 nights beachfront villa</span> <span>$1,200</span> </div> <div class="product-detail"> <span>Round-trip flights (2 adults)</span> <span>$1,450</span> </div> <div class="product-detail"> <span>Airport transfers</span> <span>$75</span> </div> <div class="product-detail"> <span>Sunset sailing experience</span> <span>$120</span> </div> <div class="total-price"> <span>Total</span> <span>$2,845</span> </div> </div> <div class="form-group"> <label for="promo-code">Promo Code (Optional)</label> <input type="text" id="promo-code" placeholder="Enter code if you have one"> </div> <div class="buttons-container"> <div></div> <!-- Empty div to maintain flex spacing --> <button class="btn next-btn" data-next="2">Continue to Traveler Info</button> </div> </div> <!-- Step 2: Traveler Info --> <div class="form-section" id="step2"> <h3 style="margin-bottom: 20px; color: var(--primary);">Traveler Information</h3> <div class="form-group"> <label for="full-name">Full Name (as on passport)</label> <input type="text" id="full-name" placeholder="Enter full name"> </div> <div class="input-group"> <div class="form-group"> <label for="email">Email Address</label> <input type="email" id="email" placeholder="Your email"> </div> <div class="form-group"> <label for="phone">Phone Number</label> <input type="tel" id="phone" placeholder="Your phone number"> </div> </div> <div class="form-group tooltip"> <label for="passport">Passport Number</label> <input type="text" id="passport" placeholder="Enter passport number"> <span class="tooltip-text">We need this for international travel bookings</span> </div> <div class="input-group"> <div class="form-group"> <label for="nationality">Nationality</label> <select id="nationality"> <option value="" disabled selected>Select country</option> <option value="us">United States</option> <option value="ca">Canada</option> <option value="uk">United Kingdom</option> <option value="au">Australia</option> <option value="other">Other</option> </select> </div> <div class="form-group"> <label for="birth-date">Date of Birth</label> <input type="date" id="birth-date"> </div> </div> <div class="buttons-container"> <button class="btn btn-secondary prev-btn" data-prev="1">Back</button> <button class="btn next-btn" data-next="3">Continue to Payment</button> </div> </div> <!-- Step 3: Payment --> <div class="form-section" id="step3"> <h3 style="margin-bottom: 20px; color: var(--primary);">Payment Details</h3> <div class="payment-methods"> <div class="payment-method active" data-method="credit-card"> <i>💳</i> <span>Credit Card</span> </div> <div class="payment-method" data-method="paypal"> <i>💸</i> <span>PayPal</span> </div> <div class="payment-method" data-method="bank"> <i>🏦</i> <span>Bank Transfer</span> </div> </div> <div class="form-group"> <label for="card-name">Cardholder Name</label> <input type="text" id="card-name" placeholder="Name on card"> </div> <div class="form-group card-input-container"> <label for="card-number">Card Number</label> <div class="card-digits"> <input type="text" maxlength="4" class="card-digit" placeholder="••••"> <input type="text" maxlength="4" class="card-digit" placeholder="••••"> <input type="text" maxlength="4" class="card-digit" placeholder="••••"> <input type="text" maxlength="4" class="card-digit" placeholder="••••"> </div> <div class="card-type">💳</div> </div> <div class="expiry-cvv"> <div class="form-group"> <label for="expiry">Expiry Date</label> <input type="text" id="expiry" placeholder="MM/YY"> </div> <div class="form-group tooltip"> <label for="cvv">Security Code</label> <input type="text" id="cvv" maxlength="3" placeholder="CVV"> <span class="tooltip-text">3-digit code on the back of your card</span> </div> </div> <div class="form-group"> <label for="billing-address">Billing Address</label> <input type="text" id="billing-address" placeholder="Enter your street address"> </div> <div class="input-group"> <div class="form-group"> <label for="city">City</label> <input type="text" id="city" placeholder="City"> </div> <div class="form-group"> <label for="zip">Zip Code</label> <input type="text" id="zip" placeholder="Zip code"> </div> </div> <div class="buttons-container"> <button class="btn btn-secondary prev-btn" data-prev="2">Back</button> <button class="btn" id="complete-booking">Complete Booking</button> </div> </div> <!-- Step 4: Confirmation --> <div class="form-section" id="step4"> <div id="loading" style="text-align: center; padding: 50px 0;"> <div class="spinner"></div> <p style="margin-top: 20px; color: var(--primary);">Processing your booking...</p> </div> <div id="confirmation" style="display: none;" class="success-animation"> <svg class="checkmark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52"> <circle class="checkmark__circle" cx="26" cy="26" r="25" fill="none"/> <path class="checkmark__check" fill="none" d="M14.1 27.2l7.1 7.2 16.7-16.8"/> </svg> <h2 style="color: var(--success); margin-bottom: 10px;">Booking Confirmed!</h2> <p style="margin-bottom: 20px;">Your tropical escape to Bali is all set.</p> <p style="font-size: 14px; margin-bottom: 5px;">Booking Reference: <strong>BL-42789</strong></p> <p style="font-size: 14px;">A confirmation email has been sent to your inbox.</p> <button class="btn" style="margin-top: 30px;">View Booking Details</button> </div> </div> <div class="floating-shape circle"></div> <div class="floating-shape triangle"></div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Define variables const progressBar = document.getElementById('progress-bar'); const progressSteps = document.querySelectorAll('.progress-step'); const formSections = document.querySelectorAll('.form-section'); const nextButtons = document.querySelectorAll('.next-btn'); const prevButtons = document.querySelectorAll('.prev-btn'); const completeButton = document.getElementById('complete-booking'); const paymentMethods = document.querySelectorAll('.payment-method'); const cardDigits = document.querySelectorAll('.card-digit'); // Set initial progress bar width updateProgressBar(1); // Next button click handler nextButtons.forEach(button => { button.addEventListener('click', function() { const nextStep = parseInt(this.getAttribute('data-next')); goToStep(nextStep); }); }); // Previous button click handler prevButtons.forEach(button => { button.addEventListener('click', function() { const prevStep = parseInt(this.getAttribute('data-prev')); goToStep(prevStep); }); }); // Complete booking button handler completeButton.addEventListener('click', function() { goToStep(4); // Simulate loading and then show confirmation setTimeout(() => { document.getElementById('loading').style.display = 'none'; document.getElementById('confirmation').style.display = 'block'; }, 2000); }); // Payment method selection paymentMethods.forEach(method => { method.addEventListener('click', function() { // Remove active class from all methods paymentMethods.forEach(m => m.classList.remove('active')); // Add active class to clicked method this.classList.add('active'); }); }); // Card digit input auto-focus next field cardDigits.forEach((digit, index) => { digit.addEventListener('input', function() { if (this.value.length >= 4 && index < cardDigits.length - 1) { cardDigits[index + 1].focus(); } }); // Allow backspace to go to previous field digit.addEventListener('keydown', function(e) { if (e.key === 'Backspace' && this.value.length === 0 && index > 0) { cardDigits[index - 1].focus(); } }); }); // Expiry date formatting (MM/YY) const expiryInput = document.getElementById('expiry'); expiryInput.addEventListener('input', function(e) { const input = e.target.value.replace(/\D/g, '').substring(0, 4); if (input.length > 2) { e.target.value = `${input.substring(0, 2)}/${input.substring(2)}`; } else { e.target.value = input; } }); // Function to update progress bar function updateProgressBar(currentStep) { const percent = ((currentStep - 1) / (progressSteps.length - 1)) * 100; progressBar.style.width = `${percent}%`; // Update step states progressSteps.forEach((step, idx) => { const stepNum = idx + 1; if (stepNum < currentStep) { step.classList.add('completed'); step.classList.remove('active'); } else if (stepNum === currentStep) { step.classList.add('active'); step.classList.remove('completed'); } else { step.classList.remove('active', 'completed'); } }); } // Function to go to a specific step function goToStep(stepNumber) { // Hide all sections formSections.forEach(section => { section.classList.remove('active'); }); // Show the target section document.getElementById(`step${stepNumber}`).classList.add('active'); // Update progress bar updateProgressBar(stepNumber); // Scroll to top of form document.querySelector('.content').scrollTop = 0; } // Add floating animation with random delays const floatingShapes = document.querySelectorAll('.floating-shape'); floatingShapes.forEach(shape => { const delay = Math.random() * 2; shape.style.animationDelay = `${delay}s`; }); // Sample logic to detect card type based on first digit cardDigits[0].addEventListener('input', function() { const firstDigit = this.value.charAt(0); const cardType = document.querySelector('.card-type'); if (firstDigit === '4') { cardType.textContent = '💳 Visa'; } else if (firstDigit === '5') { cardType.textContent = '💳 MasterCard'; } else if (firstDigit === '3') { cardType.textContent = '💳 Amex'; } else if (firstDigit === '6') { cardType.textContent = '💳 Discover'; } else { cardType.textContent = '💳'; } }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>PixelStack Checkout</title> <style> :root { --primary: #7d4cff; --primary-light: #9e76ff; --secondary: #32d6c7; --text: #333; --text-light: #777; --background: #f9fafc; --card: #ffffff; --border: #eaeef2; --shadow: 0 10px 30px rgba(125, 76, 255, 0.08); --success: #2ecc71; --error: #e74c3c; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; -webkit-font-smoothing: antialiased; } body { background-color: var(--background); color: var(--text); display: flex; justify-content: center; align-items: center; min-height: 100vh; padding: 20px; overflow-x: hidden; } .checkout-container { width: 100%; max-width: 640px; margin: 0 auto; background-color: var(--card); border-radius: 16px; box-shadow: var(--shadow); overflow: hidden; height: auto; max-height: 680px; position: relative; } .checkout-header { padding: 24px 30px; display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--border); } .logo { font-weight: 700; font-size: 22px; color: var(--primary); display: flex; align-items: center; gap: 8px; } .logo svg { width: 24px; height: 24px; } .checkout-steps { display: flex; gap: 8px; align-items: center; } .step { width: 8px; height: 8px; border-radius: 50%; background-color: var(--border); transition: all 0.3s ease; } .step.active { background-color: var(--primary); width: 32px; border-radius: 4px; } .product-summary { padding: 20px 30px; display: flex; gap: 20px; align-items: center; border-bottom: 1px solid var(--border); } .product-image { width: 64px; height: 64px; border-radius: 12px; background-color: var(--primary-light); display: flex; justify-content: center; align-items: center; color: white; font-size: 20px; } .product-details { flex: 1; } .product-name { font-weight: 600; font-size: 18px; margin-bottom: 4px; } .product-license { color: var(--text-light); font-size: 14px; } .product-price { font-weight: 700; font-size: 20px; color: var(--primary); } .checkout-form { padding: 20px 30px; overflow-y: auto; max-height: 420px; } .form-section { margin-bottom: 24px; } .section-title { font-weight: 600; font-size: 16px; margin-bottom: 16px; display: flex; align-items: center; gap: 8px; } .section-title svg { width: 18px; height: 18px; } .form-row { display: flex; gap: 16px; margin-bottom: 16px; } .form-group { flex: 1; position: relative; } .form-label { display: block; font-size: 13px; font-weight: 500; color: var(--text-light); margin-bottom: 6px; } .form-input { width: 100%; padding: 12px 16px; border: 1px solid var(--border); border-radius: 8px; font-size: 14px; transition: all 0.3s ease; outline: none; } .form-input:focus { border-color: var(--primary); box-shadow: 0 0 0 3px rgba(125, 76, 255, 0.1); } .input-with-icon { position: relative; } .input-icon { position: absolute; right: 12px; top: 50%; transform: translateY(-50%); color: var(--text-light); } .payment-methods { display: flex; gap: 12px; margin-bottom: 16px; } .payment-method { flex: 1; border: 1px solid var(--border); border-radius: 8px; padding: 12px; cursor: pointer; transition: all 0.3s ease; text-align: center; position: relative; } .payment-method.selected { border-color: var(--primary); background-color: rgba(125, 76, 255, 0.04); } .payment-method:hover { border-color: var(--primary-light); } .payment-method svg { width: 32px; height: 32px; margin-bottom: 8px; } .payment-method .method-name { font-size: 13px; font-weight: 500; color: var(--text); } .payment-method input[type="radio"] { position: absolute; opacity: 0; cursor: pointer; height: 0; width: 0; } .security-badge { display: flex; align-items: center; gap: 10px; background-color: rgba(46, 204, 113, 0.08); padding: 12px 16px; border-radius: 8px; margin-bottom: 20px; } .security-badge svg { color: var(--success); } .security-text { font-size: 13px; color: var(--text); } .checkout-footer { padding: 20px 30px; border-top: 1px solid var(--border); display: flex; justify-content: space-between; align-items: center; background-color: var(--card); position: sticky; bottom: 0; } .total-section { display: flex; flex-direction: column; } .total-label { font-size: 13px; color: var(--text-light); margin-bottom: 4px; } .total-amount { font-weight: 700; font-size: 20px; color: var(--text); } .checkout-btn { background-color: var(--primary); color: white; border: none; border-radius: 8px; padding: 12px 24px; font-weight: 600; font-size: 16px; cursor: pointer; transition: all 0.3s ease; display: flex; align-items: center; gap: 8px; } .checkout-btn:hover { background-color: var(--primary-light); transform: translateY(-1px); box-shadow: 0 6px 12px rgba(125, 76, 255, 0.15); } .checkout-btn svg { width: 18px; height: 18px; } .one-click-btn { background-color: var(--secondary); color: white; border: none; border-radius: 8px; padding: 12px 16px; font-weight: 600; font-size: 14px; cursor: pointer; transition: all 0.3s ease; display: flex; align-items: center; gap: 8px; position: absolute; top: 20px; right: 30px; } .one-click-btn:hover { background-color: #28b8ab; transform: translateY(-1px); box-shadow: 0 6px 12px rgba(50, 214, 199, 0.15); } .one-click-btn svg { width: 16px; height: 16px; } /* Tooltip */ .tooltip { position: relative; display: inline-block; cursor: pointer; } .tooltip .tooltip-text { visibility: hidden; width: 200px; background-color: #333; color: #fff; text-align: center; border-radius: 6px; padding: 10px; position: absolute; z-index: 1; bottom: 125%; left: 50%; transform: translateX(-50%); opacity: 0; transition: opacity 0.3s; font-size: 12px; line-height: 1.4; } .tooltip:hover .tooltip-text { visibility: visible; opacity: 1; } /* Success overlay */ .success-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: var(--card); display: flex; flex-direction: column; justify-content: center; align-items: center; z-index: 100; opacity: 0; pointer-events: none; transition: opacity 0.3s ease; } .success-overlay.show { opacity: 1; pointer-events: auto; } .success-icon { width: 80px; height: 80px; background-color: var(--success); border-radius: 50%; display: flex; justify-content: center; align-items: center; margin-bottom: 24px; transform: scale(0); transition: transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275); } .success-overlay.show .success-icon { transform: scale(1); } .success-icon svg { width: 40px; height: 40px; color: white; } .success-title { font-weight: 700; font-size: 24px; margin-bottom: 12px; opacity: 0; transform: translateY(20px); transition: all 0.4s ease; transition-delay: 0.2s; } .success-overlay.show .success-title { opacity: 1; transform: translateY(0); } .success-message { color: var(--text-light); text-align: center; max-width: 80%; margin-bottom: 30px; opacity: 0; transform: translateY(20px); transition: all 0.4s ease; transition-delay: 0.3s; } .success-overlay.show .success-message { opacity: 1; transform: translateY(0); } .download-btn { background-color: var(--primary); color: white; border: none; border-radius: 8px; padding: 14px 32px; font-weight: 600; font-size: 16px; cursor: pointer; transition: all 0.3s ease; display: flex; align-items: center; gap: 8px; opacity: 0; transform: translateY(20px); transition: all 0.4s ease; transition-delay: 0.4s; } .success-overlay.show .download-btn { opacity: 1; transform: translateY(0); } .download-btn:hover { background-color: var(--primary-light); transform: translateY(-2px); box-shadow: 0 8px 16px rgba(125, 76, 255, 0.2); } /* Credit card visual */ .card-visual { background: linear-gradient(135deg, var(--primary), var(--primary-light)); border-radius: 12px; padding: 16px; margin-bottom: 16px; color: white; position: relative; overflow: hidden; height: 180px; display: flex; flex-direction: column; justify-content: space-between; } .card-visual::before { content: ""; position: absolute; top: -50px; right: -50px; width: 150px; height: 150px; border-radius: 50%; background-color: rgba(255, 255, 255, 0.1); } .card-visual::after { content: ""; position: absolute; bottom: -80px; left: -60px; width: 180px; height: 180px; border-radius: 50%; background-color: rgba(255, 255, 255, 0.08); } .card-chip { width: 50px; height: 35px; background-color: rgba(255, 255, 255, 0.2); border-radius: 6px; position: relative; margin-bottom: 24px; } .card-chip::before { content: ""; position: absolute; top: 8px; left: 8px; width: 34px; height: 19px; background-color: rgba(255, 255, 255, 0.3); border-radius: 3px; } .card-number { font-size: 18px; letter-spacing: 2px; margin-bottom: 24px; z-index: 1; } .card-details { display: flex; justify-content: space-between; z-index: 1; } .card-holder, .card-expires { display: flex; flex-direction: column; } .card-label { font-size: 10px; text-transform: uppercase; opacity: 0.7; margin-bottom: 4px; } .card-value { font-size: 14px; font-weight: 500; } /* Loading spinner */ .spinner { width: 20px; height: 20px; border: 2px solid rgba(255, 255, 255, 0.3); border-radius: 50%; border-top-color: #fff; animation: spin 1s ease-in-out infinite; display: none; } @keyframes spin { to { transform: rotate(360deg); } } /* Responsive adjustments */ @media (max-width: 600px) { .checkout-container { border-radius: 0; max-height: 100vh; height: 100vh; } .form-row { flex-direction: column; gap: 16px; } .payment-methods { flex-wrap: wrap; } .payment-method { min-width: calc(50% - 6px); } .one-click-btn { position: static; margin-bottom: 16px; } .product-summary { flex-direction: column; text-align: center; } .product-image { margin: 0 auto; } } /* Animation for form slide */ @keyframes slideIn { from { transform: translateX(20px); opacity: 0; } to { transform: translateX(0); opacity: 1; } } .animate-in { animation: slideIn 0.4s forwards; } /* Animation for check mark */ .checkmark { width: 40px; height: 40px; border-radius: 50%; stroke-width: 2; stroke: #fff; stroke-miterlimit: 10; box-shadow: 0 0 0 rgba(46, 204, 113, 0.4); animation: pulse 2s infinite; } .checkmark__circle { stroke-dasharray: 166; stroke-dashoffset: 166; stroke-width: 2; stroke-miterlimit: 10; stroke: #fff; fill: none; animation: stroke 0.6s cubic-bezier(0.65, 0, 0.45, 1) forwards; } .checkmark__check { transform-origin: 50% 50%; stroke-dasharray: 48; stroke-dashoffset: 48; animation: stroke 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.8s forwards; } @keyframes stroke { 100% { stroke-dashoffset: 0; } } @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(46, 204, 113, 0.4); } 70% { box-shadow: 0 0 0 10px rgba(46, 204, 113, 0); } 100% { box-shadow: 0 0 0 0 rgba(46, 204, 113, 0); } } /* Unique hover effect for product */ .product-image { position: relative; overflow: hidden; transition: transform 0.3s ease; } .product-image:hover { transform: translateY(-3px); } .product-image::after { content: ""; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.2); transform: skewX(-25deg); transition: 0.5s; } .product-image:hover::after { left: 100%; } /* Credit card input enhancements */ .card-input-group { position: relative; } .cc-type { position: absolute; right: 12px; top: 50%; transform: translateY(-50%); } .cc-type svg { width: 32px; height: 20px; opacity: 0.5; transition: opacity 0.3s; } .cc-type.active svg { opacity: 1; } /* Focus state glow effect */ .form-input:focus { box-shadow: 0 0 0 3px rgba(125, 76, 255, 0.2); } /* Active tab indicator */ .payment-method.selected::after { content: ""; position: absolute; bottom: -1px; left: 50%; transform: translateX(-50%); width: 20px; height: 3px; background-color: var(--primary); border-radius: 3px 3px 0 0; } /* Floating hint */ .floating-hint { position: absolute; top: -40px; left: 50%; transform: translateX(-50%); background-color: var(--text); color: white; padding: 8px 12px; border-radius: 6px; font-size: 12px; opacity: 0; transition: opacity 0.3s, transform 0.3s; pointer-events: none; z-index: 10; width: max-content; max-width: 200px; text-align: center; } .floating-hint::after { content: ""; position: absolute; top: 100%; left: 50%; transform: translateX(-50%); border-width: 5px; border-style: solid; border-color: var(--text) transparent transparent transparent; } .floating-hint.show { opacity: 1; transform: translateX(-50%) translateY(-10px); } </style> </head> <body> <div class="checkout-container"> <div class="checkout-header"> <div class="logo"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polygon points="12 2 2 7 12 12 22 7 12 2"></polygon> <polyline points="2 17 12 22 22 17"></polyline> <polyline points="2 12 12 17 22 12"></polyline> </svg> PixelStack </div> <div class="checkout-steps"> <div class="step active"></div> <div class="step"></div> <div class="step"></div> </div> </div> <div class="product-summary"> <div class="product-image"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"></path> <polyline points="7.5 4.21 12 6.81 16.5 4.21"></polyline> <polyline points="7.5 19.79 7.5 14.6 3 12"></polyline> <polyline points="21 12 16.5 14.6 16.5 19.79"></polyline> <polyline points="3.27 6.96 12 12.01 20.73 6.96"></polyline> <line x1="12" y1="22.08" x2="12" y2="12"></line> </svg> </div> <div class="product-details"> <div class="product-name">PixelStack Pro Suite</div> <div class="product-license">Professional License • Lifetime Updates</div> </div> <div class="product-price">$149.00</div> <button class="one-click-btn" id="oneClickBtn"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <circle cx="12" cy="12" r="10"></circle> <path d="M16 12l-4 4-4-4"></path> <path d="M12 8v8"></path> </svg> One-Click Buy <div class="floating-hint" id="oneClickHint">Already purchased? Click for instant checkout</div> </button> </div> <form id="checkoutForm" class="checkout-form"> <div class="form-section"> <div class="section-title"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"></path> <circle cx="12" cy="7" r="4"></circle> </svg> Account Details </div> <div class="form-row"> <div class="form-group"> <label class="form-label" for="email">Email Address</label> <input type="email" id="email" class="form-input" placeholder="[email protected]" required> </div> </div> <div class="form-row"> <div class="form-group"> <label class="form-label" for="fullName">Full Name</label> <input type="text" id="fullName" class="form-input" placeholder="Jane Smith" required> </div> </div> </div> <div class="form-section"> <div class="section-title"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <rect x="1" y="4" width="22" height="16" rx="2" ry="2"></rect> <line x1="1" y1="10" x2="23" y2="10"></line> </svg> Payment Method </div> <div class="payment-methods"> <label class="payment-method selected" for="cardPayment"> <input type="radio" id="cardPayment" name="paymentMethod" value="card" checked> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <rect x="1" y="4" width="22" height="16" rx="2" ry="2"></rect> <line x1="1" y1="10" x2="23" y2="10"></line> </svg> <div class="method-name">Credit Card</div> </label> <label class="payment-method" for="paypalPayment"> <input type="radio" id="paypalPayment" name="paymentMethod" value="paypal"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M7 11C5.34 11 4 9.66 4 8C4 6.34 5.34 5 7 5H14C15.66 5 17 6.34 17 8C17 9.66 15.66 11 14 11"></path> <path d="M10 19C8.34 19 7 17.66 7 16C7 14.34 8.34 13 10 13H17C18.66 13 20 14.34 20 16C20 17.66 18.66 19 17 19"></path> </svg> <div class="method-name">PayPal</div> </label> <label class="payment-method" for="cryptoPayment"> <input type="radio" id="cryptoPayment" name="paymentMethod" value="crypto"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M11.767 19.089c4.924.868 9.613-2.421 10.481-7.345.868-4.924-2.421-9.613-7.345-10.48-4.924-.869-9.613 2.42-10.48 7.344-.868 4.924 2.42 9.613 7.344 10.481z"></path> <path d="M9.134 9.147l2.979-.527c.225-.04.423.166.385.385l-.525 2.971c-.04.224.166.423.385.385l2.979-.527"></path> </svg> <div class="method-name">Crypto</div> </label> <label class="payment-method" for="applePayment"> <input type="radio" id="applePayment" name="paymentMethod" value="apple"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M12.146 6.722c-1.228 0-2.31.679-2.95 1.384-.641.705-1.007 1.665-1.007 2.331 0 .179.038.461.038.461s1.142-.179 2.272-.179c1.131 0 2.234.167 2.234.167s.038-.293.038-.486c0-.666-.366-1.627-1.007-2.33-.641-.706-1.723-1.348-2.95-1.348Z"></path> <path d="M12.147 4a4.386 4.386 0 0 0-3.011 1.194L12.147 4Z"></path> <path d="M9.333 18.469c-.679-.918-1.256-2.022-1.256-3.24 0-1.219.577-2.323 1.256-3.24.679-.919 1.551-1.55 2.462-1.55.91 0 1.782.631 2.46 1.55.68.917 1.257 2.021 1.257 3.24 0 1.218-.578 2.322-1.256 3.24" stroke-linecap="round"></path> </svg> <div class="method-name">Apple Pay</div> </label> </div> <div id="cardPaymentForm" class="animate-in"> <div class="card-visual"> <div class="card-chip"></div> <div class="card-number" id="cardNumberDisplay">•••• •••• •••• ••••</div> <div class="card-details"> <div class="card-holder"> <div class="card-label">Card Holder</div> <div class="card-value" id="cardHolderDisplay">YOUR NAME</div> </div> <div class="card-expires"> <div class="card-label">Expires</div> <div class="card-value" id="cardExpiryDisplay">MM/YY</div> </div> </div> </div> <div class="form-row"> <div class="form-group card-input-group"> <label class="form-label" for="cardNumber">Card Number</label> <input type="text" id="cardNumber" class="form-input" placeholder="1234 5678 9012 3456" maxlength="19" required> <div class="cc-type"> <svg viewBox="0 0 48 48" fill="none"> <rect width="48" height="48" rx="4" fill="#1434CB"/> <path d="M18.269 30.748H14.093L12.268 19.132C12.148 18.587 11.812 18.114 11.332 17.864C10.166 17.286 8.855 16.853 7.4 16.636V16.204H14.093C15.047 16.204 15.783 16.925 15.927 17.864L17.031 25.797L20.671 16.204H24.702L19.085 30.748H18.269ZM26.529 30.748H22.642L25.856 16.204H29.744L26.529 30.748ZM36.781 16.636C35.681 16.636 34.299 17.068 34.299 18.33C34.299 19.375 35.39 19.879 36.291 20.239C37.211 20.6 38.112 20.96 38.112 21.753C38.112 22.906 36.783 23.338 35.681 23.338C34.877 23.336 34.081 23.162 33.356 22.833L32.95 22.618L32.54 26.112C33.786 26.617 35.105 26.863 36.436 26.834C38.678 26.834 41.107 25.607 41.107 23.339C41.107 21.861 40.038 20.815 38.604 20.238C37.776 19.879 37.246 19.592 37.246 19.088C37.246 18.655 37.776 18.222 38.839 18.222C39.545 18.207 40.242 18.356 40.877 18.655L41.178 18.799L41.579 15.486C40.507 15.094 39.375 14.898 38.237 14.91C35.141 14.91 32.971 16.636 32.971 18.727C32.971 20.098 33.822 21.144 35.609 21.861C36.68 22.329 37.229 22.618 37.229 23.195C37.229 23.769 36.546 24.202 35.177 24.202C34.248 24.22 33.333 24.004 32.522 23.574L32.068 23.339L31.667 26.87L36.781 16.636Z" fill="white"/> </svg> </div> </div> </div> <div class="form-row"> <div class="form-group"> <label class="form-label" for="cardHolder">Cardholder Name</label> <input type="text" id="cardHolder" class="form-input" placeholder="Name on card" required> </div> </div> <div class="form-row"> <div class="form-group"> <label class="form-label" for="expiryDate">Expiry Date</label> <input type="text" id="expiryDate" class="form-input" placeholder="MM/YY" maxlength="5" required> </div> <div class="form-group"> <label class="form-label" for="cvv"> <span>Security Code (CVV)</span> <span class="tooltip"> ? <span class="tooltip-text">The 3-digit code found on the back of your card</span> </span> </label> <input type="text" id="cvv" class="form-input" placeholder="123" maxlength="3" required> </div> </div> </div> </div> <div class="security-badge"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path> </svg> <div class="security-text">Your payment is secure. SSL encrypted with 256-bit security.</div> </div> </form> <div class="checkout-footer"> <div class="total-section"> <div class="total-label">Total Payment</div> <div class="total-amount">$149.00</div> </div> <button id="checkoutBtn" class="checkout-btn"> <span>Complete Purchase</span>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> :root { --primary: #4a6fa5; --secondary: #f9a826; --light: #f8f9fa; --dark: #343a40; --success: #28a745; --error: #dc3545; --vendor1: #6c5ce7; --vendor2: #00b894; --vendor3: #e17055; --gray-100: #f8f9fa; --gray-200: #e9ecef; --gray-300: #dee2e6; --gray-400: #ced4da; --gray-500: #adb5bd; --gray-600: #6c757d; --gray-700: #495057; --gray-800: #343a40; --shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); --shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); --border-radius: 0.5rem; --transition: all 0.3s ease; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', system-ui, -apple-system, sans-serif; } body { background-color: var(--light); color: var(--gray-800); font-size: 16px; line-height: 1.5; overflow-x: hidden; } .container { max-width: 700px; margin: 0 auto; height: 700px; display: flex; flex-direction: column; overflow: hidden; } header { padding: 1.5rem; background-color: white; box-shadow: var(--shadow-sm); position: relative; z-index: 10; } .logo { font-weight: 700; font-size: 1.5rem; color: var(--primary); display: flex; align-items: center; gap: 0.5rem; } .checkout-container { display: flex; flex: 1; overflow: hidden; } .checkout-form { flex: 2; padding: 1.5rem; overflow-y: auto; background-color: white; } .cart-summary { flex: 1; padding: 1.5rem; background-color: var(--gray-100); border-left: 1px solid var(--gray-300); overflow-y: auto; transition: var(--transition); position: relative; } h2 { font-size: 1.25rem; margin-bottom: 1.5rem; color: var(--dark); font-weight: 600; } .step { margin-bottom: 2rem; opacity: 1; transform: translateY(0); transition: var(--transition); } .step.hidden { max-height: 0; opacity: 0; margin: 0; overflow: hidden; transform: translateY(1rem); } .step-header { display: flex; align-items: center; margin-bottom: 1rem; cursor: pointer; } .step-number { width: 2rem; height: 2rem; border-radius: 50%; background-color: var(--primary); color: white; display: flex; align-items: center; justify-content: center; font-weight: 600; margin-right: 0.75rem; flex-shrink: 0; } .step.completed .step-number { background-color: var(--success); } .step-title { font-weight: 600; color: var(--dark); flex-grow: 1; } .step-edit { color: var(--primary); background: none; border: none; font-size: 0.875rem; cursor: pointer; padding: 0.25rem 0.5rem; border-radius: var(--border-radius); transition: var(--transition); display: none; } .step.completed .step-edit { display: block; } .step-edit:hover { background-color: var(--gray-200); } .step-content { padding-left: 2.75rem; } .form-group { margin-bottom: 1.25rem; } label { display: block; margin-bottom: 0.5rem; font-weight: 500; font-size: 0.875rem; color: var(--gray-700); } input, select { width: 100%; padding: 0.75rem; border: 1px solid var(--gray-400); border-radius: var(--border-radius); font-size: 1rem; transition: var(--transition); outline: none; } input:focus, select:focus { border-color: var(--primary); box-shadow: 0 0 0 3px rgba(74, 111, 165, 0.2); } .form-row { display: flex; gap: 1rem; margin-bottom: 1.25rem; } .form-row .form-group { flex: 1; margin-bottom: 0; } .vendor-item { padding: 1rem; border-radius: var(--border-radius); margin-bottom: 1rem; border: 1px solid var(--gray-300); transition: var(--transition); display: flex; align-items: center; gap: 1rem; } .vendor-item.vendor1 { border-left: 4px solid var(--vendor1); } .vendor-item.vendor2 { border-left: 4px solid var(--vendor2); } .vendor-item.vendor3 { border-left: 4px solid var(--vendor3); } .vendor-item:hover { box-shadow: var(--shadow-sm); } .vendor-logo { width: 3rem; height: 3rem; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; font-weight: 600; flex-shrink: 0; } .vendor-item.vendor1 .vendor-logo { background-color: var(--vendor1); } .vendor-item.vendor2 .vendor-logo { background-color: var(--vendor2); } .vendor-item.vendor3 .vendor-logo { background-color: var(--vendor3); } .vendor-details { flex-grow: 1; } .vendor-name { font-weight: 600; margin-bottom: 0.25rem; font-size: 0.9375rem; } .vendor-item-name { font-size: 0.875rem; color: var(--gray-700); margin-bottom: 0.25rem; } .vendor-item-price { font-weight: 600; color: var(--dark); } .cart-item { padding: 0.75rem 0; border-bottom: 1px solid var(--gray-300); display: flex; align-items: center; font-size: 0.875rem; } .cart-item-vendor { width: 0.5rem; height: 0.5rem; border-radius: 50%; margin-right: 0.5rem; } .cart-item-vendor.vendor1 { background-color: var(--vendor1); } .cart-item-vendor.vendor2 { background-color: var(--vendor2); } .cart-item-vendor.vendor3 { background-color: var(--vendor3); } .cart-item-details { flex-grow: 1; } .cart-item-name { font-weight: 500; } .cart-item-price { color: var(--gray-700); } .cart-totals { margin-top: 1.5rem; padding-top: 1rem; border-top: 1px solid var(--gray-300); } .cart-total-row { display: flex; justify-content: space-between; margin-bottom: 0.75rem; font-size: 0.875rem; } .cart-total-row.grand-total { font-size: 1rem; font-weight: 600; margin-top: 0.75rem; padding-top: 0.75rem; border-top: 1px solid var(--gray-300); } .btn { display: inline-flex; align-items: center; justify-content: center; padding: 0.75rem 1.5rem; border-radius: var(--border-radius); border: none; font-weight: 600; font-size: 1rem; cursor: pointer; transition: var(--transition); text-decoration: none; gap: 0.5rem; } .btn-primary { background-color: var(--primary); color: white; } .btn-primary:hover { background-color: #3d5d8f; transform: translateY(-1px); } .btn-outline { background-color: transparent; color: var(--gray-700); border: 1px solid var(--gray-400); } .btn-outline:hover { background-color: var(--gray-200); } .actions { display: flex; justify-content: space-between; margin-top: 1.5rem; } .payment-methods { display: flex; gap: 1rem; margin-bottom: 1.5rem; } .payment-method { flex: 1; border: 1px solid var(--gray-300); border-radius: var(--border-radius); padding: 1rem; text-align: center; cursor: pointer; transition: var(--transition); } .payment-method:hover { border-color: var(--gray-500); } .payment-method.selected { border-color: var(--primary); box-shadow: 0 0 0 1px var(--primary); } .payment-icon { font-size: 1.5rem; margin-bottom: 0.5rem; display: block; } .payment-name { font-size: 0.875rem; font-weight: 500; } .completed-summary { display: flex; align-items: center; padding: 0.75rem; background-color: var(--gray-100); border-radius: var(--border-radius); margin-top: 1rem; font-size: 0.875rem; } .completed-summary-icon { margin-right: 0.75rem; width: 1.5rem; height: 1.5rem; border-radius: 50%; background-color: var(--success); color: white; display: flex; align-items: center; justify-content: center; flex-shrink: 0; } .vendor-shipping { margin-top: 1rem; padding: 0.75rem; border-radius: var(--border-radius); background-color: var(--gray-100); font-size: 0.875rem; } .vendor-shipping-header { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem; font-weight: 600; } .vendor-shipping-dot { width: 0.5rem; height: 0.5rem; border-radius: 50%; } .vendor1 .vendor-shipping-dot { background-color: var(--vendor1); } .vendor2 .vendor-shipping-dot { background-color: var(--vendor2); } .vendor3 .vendor-shipping-dot { background-color: var(--vendor3); } .vendor-shipping-option { display: flex; align-items: center; margin-top: 0.5rem; } .vendor-shipping-option input { width: auto; margin-right: 0.5rem; } .tooltip { position: relative; display: inline-block; margin-left: 0.25rem; cursor: help; } .tooltip .tooltiptext { visibility: hidden; width: 200px; background-color: var(--dark); color: white; text-align: center; border-radius: 6px; padding: 0.5rem; position: absolute; z-index: 1; bottom: 125%; left: 50%; transform: translateX(-50%); opacity: 0; transition: opacity 0.3s; font-size: 0.75rem; line-height: 1.2; } .tooltip:hover .tooltiptext { visibility: visible; opacity: 0.9; } .tooltip .tooltiptext::after { content: ""; position: absolute; top: 100%; left: 50%; margin-left: -5px; border-width: 5px; border-style: solid; border-color: var(--dark) transparent transparent transparent; } .back-to-cart { display: flex; align-items: center; color: var(--gray-600); font-size: 0.875rem; margin-bottom: 1rem; text-decoration: none; } .back-to-cart:hover { color: var(--primary); } .back-arrow { margin-right: 0.25rem; } .checkout-progress { display: flex; margin-bottom: 1.5rem; position: relative; } .checkout-progress::before { content: ''; position: absolute; top: 12px; left: 0; right: 0; height: 2px; background-color: var(--gray-300); z-index: 1; } .progress-step { flex: 1; text-align: center; position: relative; z-index: 2; } .progress-marker { width: 25px; height: 25px; border-radius: 50%; background-color: white; border: 2px solid var(--gray-300); display: flex; align-items: center; justify-content: center; margin: 0 auto 0.5rem; transition: var(--transition); position: relative; } .progress-step.active .progress-marker { border-color: var(--primary); background-color: var(--primary); color: white; } .progress-step.completed .progress-marker { border-color: var(--success); background-color: var(--success); color: white; } .progress-step-name { font-size: 0.75rem; color: var(--gray-600); font-weight: 500; } .progress-step.active .progress-step-name { color: var(--primary); font-weight: 600; } .progress-step.completed .progress-step-name { color: var(--success); } .progress-line { position: absolute; top: 12px; height: 2px; background-color: var(--primary); z-index: 1; left: 0; width: 0; transition: width 0.5s ease; } .cart-toggle { display: none; align-items: center; gap: 0.5rem; background-color: var(--primary); color: white; padding: 0.75rem 1rem; border-radius: var(--border-radius); position: fixed; bottom: 1rem; right: 1rem; z-index: 100; cursor: pointer; box-shadow: var(--shadow); } .order-complete { text-align: center; padding: 2rem; display: none; } .order-complete-icon { width: 5rem; height: 5rem; background-color: var(--success); color: white; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 2.5rem; margin: 0 auto 1.5rem; } .vendor-details-toggle { background: none; border: none; color: var(--primary); font-size: 0.875rem; padding: 0; cursor: pointer; margin-top: 0.5rem; text-decoration: underline; } .vendor-details-content { margin-top: 0.75rem; padding: 0.75rem; background-color: var(--gray-100); border-radius: var(--border-radius); font-size: 0.875rem; display: none; } @media (max-width: 768px) { .checkout-container { flex-direction: column; } .cart-summary { display: none; position: fixed; bottom: 0; left: 0; right: 0; height: 60%; z-index: 1000; box-shadow: 0 -4px 10px rgba(0, 0, 0, 0.1); border-top-left-radius: 1rem; border-top-right-radius: 1rem; border-left: none; } .cart-summary.open { display: block; } .cart-toggle { display: flex; } .form-row { flex-direction: column; gap: 0.75rem; } } .cart-summary-close { position: absolute; top: 1rem; right: 1rem; background: none; border: none; font-size: 1.25rem; cursor: pointer; display: none; } @media (max-width: 768px) { .cart-summary-close { display: block; } } /* Animations */ @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } .pulse { animation: pulse 2s infinite; } .fade-in { animation: fadeIn 0.3s ease-out forwards; } .slide-in { animation: slideIn 0.3s ease-out forwards; } @keyframes slideIn { from { transform: translateX(30px); opacity: 0; } to { transform: translateX(0); opacity: 1; } } /* Skeleton loading */ .skeleton { background: linear-gradient(90deg, var(--gray-200) 25%, var(--gray-300) 37%, var(--gray-200) 63%); background-size: 400% 100%; animation: skeleton-loading 1.4s ease infinite; } @keyframes skeleton-loading { 0% { background-position: 100% 50%; } 100% { background-position: 0 50%; } } .skeleton-text { height: 1rem; margin-bottom: 0.5rem; border-radius: 4px; } .skeleton-button { height: 2.5rem; border-radius: var(--border-radius); width: 100%; } </style> </head> <body> <div class="container"> <header> <div class="logo"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M3 6H21V18H3V6Z" stroke="#4a6fa5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M3 10H21" stroke="#4a6fa5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M7 15H7.01" stroke="#4a6fa5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M11 15H13" stroke="#4a6fa5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> MarketSquare </div> </header> <div class="checkout-progress"> <div class="progress-line" id="progressLine"></div> <div class="progress-step active" data-step="1"> <div class="progress-marker">1</div> <div class="progress-step-name">Shipping</div> </div> <div class="progress-step" data-step="2"> <div class="progress-marker">2</div> <div class="progress-step-name">Payment</div> </div> <div class="progress-step" data-step="3"> <div class="progress-marker">3</div> <div class="progress-step-name">Review</div> </div> <div class="progress-step" data-step="4"> <div class="progress-marker">4</div> <div class="progress-step-name">Complete</div> </div> </div> <div class="checkout-container"> <form class="checkout-form" id="checkoutForm"> <a href="#" class="back-to-cart"> <span class="back-arrow">←</span> Back to cart </a> <div class="step" id="step1"> <div class="step-header"> <div class="step-number">1</div> <div class="step-title">Shipping Information</div> <button type="button" class="step-edit">Edit</button> </div> <div class="step-content"> <div class="form-row"> <div class="form-group"> <label for="firstName">First Name</label> <input type="text" id="firstName" name="firstName" required> </div> <div class="form-group"> <label for="lastName">Last Name</label> <input type="text" id="lastName" name="lastName" required> </div> </div> <div class="form-group"> <label for="email">Email Address</label> <input type="email" id="email" name="email" required> </div> <div class="form-group"> <label for="phone">Phone Number</label> <input type="tel" id="phone" name="phone" required> </div> <div class="form-group"> <label for="address">Street Address</label> <input type="text" id="address" name="address" required> </div> <div class="form-row"> <div class="form-group"> <label for="city">City</label> <input type="text" id="city" name="city" required> </div> <div class="form-group"> <label for="state">State/Province</label> <select id="state" name="state" required> <option value="">Select State/Province</option> <option value="CA">California</option> <option value="NY">New York</option> <option value="TX">Texas</option> <option value="FL">Florida</option> <option value="WA">Washington</option> </select> </div> </div> <div class="form-row"> <div class="form-group"> <label for="zip">Zip/Postal Code</label> <input type="text" id="zip" name="zip" required> </div> <div class="form-group"> <label for="country">Country</label> <select id="country" name="country" required> <option value="">Select Country</option> <option value="US">United States</option> <option value="CA">Canada</option> <option value="UK">United Kingdom</option> <option value="AU">Australia</option> </select> </div> </div> <h3 style="margin: 1.5rem 0 1rem; font-size: 1.1rem;">Vendor Shipping Options</h3> <div class="vendor-shipping vendor1"> <div class="vendor-shipping-header"> <span class="vendor-shipping-dot"></span> <span>Artisan Crafts Co.</span> </div> <div class="vendor-shipping-option"> <input type="radio" id="vendor1-standard" name="vendor1-shipping" value="standard" checked> <label for="vendor1-standard" style="display: inline; margin-left: 0.5rem;">Standard (3-5 days) - $5.99</label> </div> <div class="vendor-shipping-option"> <input type="radio" id="vendor1-express" name="vendor1-shipping" value="express"> <label for="vendor1-express" style="display: inline; margin-left: 0.5rem;">Express (1-2 days) - $12.99</label> </div> </div> <div class="vendor-shipping vendor2"> <div class="vendor-shipping-header"> <span class="vendor-shipping-dot"></span> <span>Urban Garden Supply</span> </div> <div class="vendor-shipping-option"> <input type="radio" id="vendor2-standard" name="vendor2-shipping" value="standard" checked> <label for="vendor2-standard" style="display: inline; margin-left: 0.5rem;">Standard (2-4 days) - $4.99</label> </div> <div class="vendor-shipping-option"> <input type="radio" id="vendor2-express" name="vendor2-shipping" value="express"> <label for="vendor2-express" style="display: inline; margin-left: 0.5rem;">Express (1 day) - $9.99</label> </div> </div> <div class="vendor-shipping vendor3"> <div class="vendor-shipping-header"> <span class="vendor-shipping-dot"></span> <span>Tech Gadgets Plus</span> </div> <div class="vendor-shipping-option"> <input type="radio" id="vendor3-free" name="vendor3-shipping" value="free" checked> <label for="vendor3-free" style="display: inline; margin-left: 0.5rem;">Free (5-7 days)</label> </div> <div class="vendor-shipping-option"> <input type="radio" id="vendor3-standard" name="vendor3-shipping" value="standard"> <label for="vendor3-standard" style="display: inline; margin-left: 0.5rem;">Standard (3-4 days) - $3.99</label> </div> <div class="vendor-shipping-option"> <input type="radio" id="vendor3-express" name="vendor3-shipping" value="express"> <label for="vendor3-express" style="display: inline; margin-left: 0.5rem;">Express (1-2 days) - $8.99</label> </div> </div> <div class="actions"> <button type="button" class="btn btn-outline">Save for later</button> <button type="button" class="btn btn-primary" id="step1Next">Continue to Payment</button> </div> </div> </div> <div class="step hidden" id="step2"> <div class="step-header"> <div class="step-number">2</div> <div class="step-title">Payment Method</div> <button type="button" class="step-edit">Edit</button> </div> <div class="step-content"> <div class="payment-methods"> <div class="payment-method selected" data-method="credit-card"> <span class="payment-icon">💳</span> <span class="payment-name">Credit Card</span> </div> <div class="payment-method" data-method="paypal"> <span class="payment-icon">🅿️</span> <span class="payment-name">PayPal</span> </div> <div class="payment-method" data-method="apple-pay"> <span class="payment-icon">🍎</span> <span class="payment-name">Apple Pay</span> </div> </div> <div id="creditCardForm"> <div class="form-group"> <label for="cardNumber">Card Number</label> <input type="text" id="cardNumber" name="cardNumber" placeholder="•••• •••• •••• ••••" required> </div> <div class="form-row"> <div class="form-group"> <label for="cardName">Name on Card</label> <input type="text" id="cardName" name="cardName" required> </div> </div> <div class="form-row"> <div class="form-group"> <label for="expiry">Expiration Date</label> <input type="text" id="expiry" name="expiry" placeholder="MM/YY" required> </div> <div class="form-group"> <label for="cvv">CVV <span class="tooltip">? <span class="tooltiptext">3-4 digit security code on the back of your card</span> </span> </label> <input type="text" id="cvv" name="cvv" required> </div> </div> <div class="form-group"> <label for="billingAddress">Billing Address</label> <select id="billingAddress" name="billingAddress"> <option value="same">Same as shipping address</option> <option value="different">Use different address</option> </select> </div> </div> <div class="actions"> <button type="button" class="btn btn-outline" id="step2Prev">Back to Shipping</button> <button type="button" class="btn btn-primary" id="step2Next">Continue to Review</button> </div> </div> </div> <div class="step hidden" id="step3"> <div class="step-header"> <div class="step-number">3</div> <div class="step-title">Review Order</div> <button type="button" class="step-edit">Edit</button> </div> <div class="step-content"> <h3 style="margin-bottom: 1rem; font-size: 1.1rem;">Order Items</h3> <div class="vendor-item vendor1"> <div class="vendor-logo">AC</div> <div class="vendor-details"> <div class="vendor-name">Artisan Crafts Co.</div> <div class="vendor-item-name">Handmade Ceramic Mug</div> <div class="vendor-item-price">$24.99</div> <button type="button" class="vendor-details-toggle" data-vendor="1">View vendor details</button> <div class="vendor-details-content" id="vendor1Details"> <p><strong>Vendor:</strong> Artisan Crafts Co.</p> <p><strong>Shipping From:</strong> Portland, OR</p> <p><strong>Estimated Delivery:</strong> Aug 18 - Aug 20</p> <p><strong>Returns:</strong> 30-day returns accepted</p> </div> </div> </div> <div class="vendor-item vendor2"> <div class="vendor-logo">UG</div> <div class="vendor-details"> <div class="vendor-name">Urban Garden Supply</div> <div class="vendor-item-name">Indoor Herb Garden Kit</div> <div class="vendor-item-price">$35.50</div> <button type="button" class="vendor-details-toggle" data-vendor="2">View vendor details</button> <div class="vendor-details-content" id="vendor2Details"> <p><strong>Vendor:</strong> Urban Garden Supply</p> <p><strong>Shipping From:</strong> Seattle, WA</p> <p><strong>Estimated Delivery:</strong> Aug 17 - Aug 19</p> <p><strong>Returns:</strong> 14-day returns, buyer pays return shipping</p> </div> </div> </div> <div class="vendor-item vendor3"> <div class="vendor-logo">TG</div> <div class="vendor-details"> <div class="vendor-name">Tech Gadgets Plus</div> <div class="vendor-item-name">Wireless Phone Charger</div> <div class="vendor-item-price">$29.95</div> <button type="button" class="vendor-details-toggle" data-vendor="3">View vendor details</button> <div class="vendor-details-content" id="vendor3Details"> <p><strong>Vendor:</strong> Tech Gadgets Plus</p> <p><strong>Shipping From:</strong> San Jose, CA</p> <p><strong>Estimated Delivery:</strong> Aug 21 - Aug 23</p> <p><strong>Returns:</strong> 60-day no questions asked returns</p> </div> </div> </div> <h3 style="margin: 1.5rem 0 1rem; font-size: 1.1rem;">Shipping Information</h3>