Accordions are a versatile UI component that can enhance user experience by organizing content in a compact, accessible manner. They are particularly useful for displaying FAQs, product details, and other information-rich sections.
In this article, we will explore 10 accordion examples that demonstrate various design approaches and functionalities. These examples will inspire you to create engaging and efficient interfaces for your projects.
CODE1
Here's the code:
CODETEXT1
CODE2
Here's the code:
CODETEXT2
CODE3
Here's the code:
CODETEXT3
CODE4
Here's the code:
CODETEXT4
CODE5
Here's the code:
CODETEXT5
Designers and developers love Subframe for its drag-and-drop interface and intuitive, responsive canvas. Create pixel-perfect UI effortlessly, ensuring every detail is just right.
Ready to elevate your design game? Start for free and experience the magic of Subframe today!
CODE6
Here's the code:
CODETEXT6
CODE7
Here's the code:
CODETEXT7
CODE8
Here's the code:
CODETEXT8
CODE9
Here's the code:
CODETEXT9
CODE10
Here's the code:
CODETEXT10
Unlock the power of Subframe and design stunning UIs, including accordions, with unmatched efficiency. Create pixel-perfect interfaces effortlessly and see your ideas come to life instantly.
Ready to transform your design process? Start for free and begin creating right away!
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Support FAQ Accordion</title> <style> :root { --primary-color: #2a3f54; --secondary-color: #f5f7fa; --accent-color: #5e8ed1; --text-color: #333; --light-text: #6c757d; --border-color: #e7e9ec; --shadow-color: rgba(0, 0, 0, 0.05); --animation-timing: 300ms; } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background-color: #f9fafc; color: var(--text-color); line-height: 1.6; padding: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; overflow-x: hidden; } .container { width: 100%; max-width: 680px; padding: 2rem 1.5rem; margin: 0 auto; } .faq-header { text-align: center; margin-bottom: 2.5rem; position: relative; } .faq-header::after { content: ""; position: absolute; width: 80px; height: 4px; background: var(--accent-color); bottom: -12px; left: 50%; transform: translateX(-50%); border-radius: 4px; } .faq-title { font-size: 2.2rem; color: var(--primary-color); margin-bottom: 0.5rem; font-weight: 700; } .faq-subtitle { font-size: 1.1rem; color: var(--light-text); max-width: 500px; margin: 0 auto; font-weight: 400; } .search-container { margin-bottom: 2rem; position: relative; } .search-input { width: 100%; padding: 1rem 1.2rem 1rem 3rem; border: 2px solid var(--border-color); border-radius: 8px; font-size: 1rem; transition: all var(--animation-timing) ease; background-color: white; } .search-input:focus { outline: none; border-color: var(--accent-color); box-shadow: 0 0 0 3px rgba(94, 142, 209, 0.2); } .search-icon { position: absolute; left: 1rem; top: 50%; transform: translateY(-50%); color: var(--light-text); } .faq-accordion { list-style: none; margin: 0; padding: 0; } .faq-item { background: white; border-radius: 8px; margin-bottom: 1rem; box-shadow: 0 4px 12px var(--shadow-color); overflow: hidden; transition: box-shadow var(--animation-timing) ease, transform var(--animation-timing) ease; } .faq-item:hover { box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08); transform: translateY(-2px); } .faq-item:last-child { margin-bottom: 0; } .faq-question { font-weight: 600; color: var(--primary-color); padding: 1.2rem 4rem 1.2rem 1.5rem; cursor: pointer; position: relative; display: flex; align-items: center; font-size: 1.1rem; transition: background-color var(--animation-timing) ease; } .faq-question::after { content: ""; position: absolute; right: 1.5rem; top: 50%; transform: translateY(-50%) rotate(0deg); width: 20px; height: 20px; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232a3f54' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); background-size: contain; background-repeat: no-repeat; transition: transform var(--animation-timing) ease; } .faq-item.active .faq-question::after { transform: translateY(-50%) rotate(180deg); } .faq-item.active .faq-question { background-color: rgba(94, 142, 209, 0.04); } .faq-answer { max-height: 0; overflow: hidden; padding: 0 1.5rem; opacity: 0; transform: translateY(-10px); transition: max-height var(--animation-timing) ease, opacity calc(var(--animation-timing) * 1.2) ease, transform calc(var(--animation-timing) * 1.2) ease, padding var(--animation-timing) ease; } .faq-item.active .faq-answer { max-height: 500px; opacity: 1; transform: translateY(0); padding: 0 1.5rem 1.5rem; } .faq-answer p { margin-bottom: 1rem; color: var(--text-color); } .faq-answer p:last-child { margin-bottom: 0; } .faq-answer a { color: var(--accent-color); text-decoration: none; font-weight: 500; position: relative; transition: color var(--animation-timing) ease; } .faq-answer a::after { content: ""; position: absolute; width: 100%; height: 1px; background-color: var(--accent-color); bottom: -2px; left: 0; transform: scaleX(0); transform-origin: right; transition: transform var(--animation-timing) ease; } .faq-answer a:hover { color: #4a75b3; } .faq-answer a:hover::after { transform: scaleX(1); transform-origin: left; } .tag { display: inline-block; font-size: 0.75rem; color: var(--accent-color); background-color: rgba(94, 142, 209, 0.1); padding: 0.25rem 0.75rem; border-radius: 4px; margin-right: 0.5rem; font-weight: 500; } .question-meta { display: flex; align-items: center; font-size: 0.85rem; color: var(--light-text); margin-top: 1rem; } .question-meta i { margin-right: 0.25rem; } .helpful-text { margin-right: 1.5rem; } .helpful-buttons { display: flex; } .helpful-btn { background: none; border: 1px solid var(--border-color); border-radius: 4px; padding: 0.25rem 0.75rem; margin-right: 0.5rem; cursor: pointer; display: flex; align-items: center; font-size: 0.85rem; color: var(--light-text); transition: all var(--animation-timing) ease; } .helpful-btn:hover { background-color: var(--secondary-color); border-color: var(--accent-color); color: var(--accent-color); } .helpful-btn i { margin-right: 0.35rem; } @media (max-width: 640px) { .faq-title { font-size: 1.8rem; } .faq-subtitle { font-size: 1rem; } .container { padding: 1.5rem 1rem; } .faq-question { font-size: 1rem; padding: 1rem 3.5rem 1rem 1.2rem; } .faq-question::after { right: 1.2rem; } .faq-item.active .faq-answer { padding: 0 1.2rem 1.2rem; } } /* Pulse animation for new items */ @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(94, 142, 209, 0.4); } 70% { box-shadow: 0 0 0 10px rgba(94, 142, 209, 0); } 100% { box-shadow: 0 0 0 0 rgba(94, 142, 209, 0); } } .faq-item.new { position: relative; } .faq-item.new::before { content: "NEW"; position: absolute; top: -10px; right: -10px; background-color: var(--accent-color); color: white; font-size: 0.7rem; font-weight: bold; padding: 0.25rem 0.5rem; border-radius: 4px; z-index: 1; animation: pulse 2s infinite; } /* Dark mode toggle */ .theme-toggle { position: absolute; top: 1rem; right: 1rem; background: none; border: none; cursor: pointer; color: var(--light-text); font-size: 1.2rem; transition: color var(--animation-timing) ease; } .theme-toggle:hover { color: var(--accent-color); } /* Footer */ .faq-footer { margin-top: 2.5rem; text-align: center; } .footer-text { font-size: 0.95rem; color: var(--light-text); } .contact-btn { display: inline-flex; align-items: center; background-color: var(--accent-color); color: white; border: none; border-radius: 6px; padding: 0.75rem 1.5rem; font-size: 1rem; font-weight: 500; margin-top: 1rem; cursor: pointer; transition: all var(--animation-timing) ease; box-shadow: 0 4px 12px rgba(94, 142, 209, 0.2); } .contact-btn:hover { background-color: #4a75b3; transform: translateY(-2px); box-shadow: 0 6px 16px rgba(94, 142, 209, 0.3); } .contact-btn i { margin-right: 0.5rem; } /* Tags filter */ .tags-filter { display: flex; flex-wrap: wrap; margin-bottom: 1.5rem; gap: 0.5rem; } .tag-filter { background: none; border: 1px solid var(--border-color); border-radius: 4px; padding: 0.5rem 1rem; font-size: 0.9rem; color: var(--light-text); cursor: pointer; transition: all var(--animation-timing) ease; } .tag-filter:hover, .tag-filter.active { background-color: var(--accent-color); border-color: var(--accent-color); color: white; } /* Progress bar for accordion expansion */ .progress-container { height: 4px; width: 100%; background-color: var(--border-color); position: relative; border-radius: 2px; overflow: hidden; margin-bottom: 1.2rem; } .progress-bar { position: absolute; height: 100%; background-color: var(--accent-color); border-radius: 2px; width: 0; transition: width var(--animation-timing) ease; } </style> </head> <body> <div class="container"> <div class="faq-header"> <h1 class="faq-title">Support FAQ</h1> <p class="faq-subtitle">Find answers to frequently asked questions about our product and services</p> </div> <div class="search-container"> <span class="search-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <circle cx="11" cy="11" r="8"></circle> <line x1="21" y1="21" x2="16.65" y2="16.65"></line> </svg> </span> <input type="text" id="search-input" class="search-input" placeholder="Search for questions..."> </div> <div class="tags-filter"> <button class="tag-filter active" data-tag="all">All</button> <button class="tag-filter" data-tag="account">Account</button> <button class="tag-filter" data-tag="billing">Billing</button> <button class="tag-filter" data-tag="features">Features</button> <button class="tag-filter" data-tag="security">Security</button> </div> <div class="progress-container"> <div class="progress-bar" id="progress-bar"></div> </div> <ul class="faq-accordion"> <li class="faq-item" data-tags="account"> <div class="faq-question">How do I reset my password?</div> <div class="faq-answer"> <p>To reset your password, follow these steps:</p> <p>1. Click the "Forgot Password" link on the login page<br> 2. Enter the email address associated with your account<br> 3. Check your email for a password reset link<br> 4. Click the link and create a new password</p> <p>For security reasons, password reset links expire after 24 hours. If you don't see the email, check your spam folder or <a href="#">contact support</a>.</p> <span class="tag">Account</span> <div class="question-meta"> <span class="helpful-text">Was this helpful?</span> <div class="helpful-buttons"> <button class="helpful-btn"> <i> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path> </svg> </i> Yes </button> <button class="helpful-btn"> <i> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path> </svg> </i> No </button> </div> </div> </div> </li> <li class="faq-item new" data-tags="features"> <div class="faq-question">What's included in the Premium plan?</div> <div class="faq-answer"> <p>Our Premium plan includes the following enhanced features:</p> <p>• Unlimited projects and collaborators<br> • Priority customer support with 4-hour response time<br> • Advanced analytics dashboard with custom reporting<br> • AI-powered insights and recommendations<br> • Custom branding and white labeling options<br> • API access with 5,000 requests per day</p> <p>You can view a detailed comparison of all plans on our <a href="#">pricing page</a>. Current users can upgrade anytime through their account settings.</p> <span class="tag">Features</span> <span class="tag">Billing</span> <div class="question-meta"> <span class="helpful-text">Was this helpful?</span> <div class="helpful-buttons"> <button class="helpful-btn"> <i> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path> </svg> </i> Yes </button> <button class="helpful-btn"> <i> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path> </svg> </i> No </button> </div> </div> </div> </li> <li class="faq-item" data-tags="billing"> <div class="faq-question">How do I update my billing information?</div> <div class="faq-answer"> <p>You can update your billing information at any time by following these steps:</p> <p>1. Log in to your account dashboard<br> 2. Navigate to "Settings" in the left sidebar<br> 3. Select the "Billing" tab<br> 4. Click "Edit Payment Method"<br> 5. Enter your new billing details<br> 6. Click "Save Changes"</p> <p>Your next invoice will automatically use the updated payment method. For assistance with specific billing questions, please contact our <a href="#">billing department</a>.</p> <span class="tag">Billing</span> <div class="question-meta"> <span class="helpful-text">Was this helpful?</span> <div class="helpful-buttons"> <button class="helpful-btn"> <i> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path> </svg> </i> Yes </button> <button class="helpful-btn"> <i> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path> </svg> </i> No </button> </div> </div> </div> </li> <li class="faq-item" data-tags="security"> <div class="faq-question">How secure is my data on your platform?</div> <div class="faq-answer"> <p>We take data security extremely seriously and implement multiple layers of protection:</p> <p>• All data is encrypted at-rest using AES-256 encryption<br> • Data in transit is protected with TLS 1.3 encryption<br> • Regular security audits and penetration testing<br> • SOC 2 Type II and GDPR compliant infrastructure<br> • Multi-factor authentication for all accounts<br> • Advanced threat detection systems</p> <p>We also maintain comprehensive access controls and follow the principle of least privilege. For more details, refer to our <a href="#">Security Whitepaper</a> and <a href="#">Privacy Policy</a>.</p> <span class="tag">Security</span> <div class="question-meta"> <span class="helpful-text">Was this helpful?</span> <div class="helpful-buttons"> <button class="helpful-btn"> <i> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path> </svg> </i> Yes </button> <button class="helpful-btn"> <i> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path> </svg> </i> No </button> </div> </div> </div> </li> <li class="faq-item" data-tags="account"> <div class="faq-question">Can I transfer my account to another email address?</div> <div class="faq-answer"> <p>Yes, you can transfer your account to a different email address while maintaining all your data and settings.</p> <p>To change your account email:</p> <p>1. Log in to your current account<br> 2. Go to "Account Settings"<br> 3. Select "Profile Information"<br> 4. Click "Change Email"<br> 5. Enter the new email address<br> 6. Verify the new email by clicking the confirmation link</p> <p>Note that you'll need to verify your identity for security purposes. Enterprise customers should contact their dedicated account manager for assistance with bulk email changes.</p> <span class="tag">Account</span> <div class="question-meta"> <span class="helpful-text">Was this helpful?</span> <div class="helpful-buttons"> <button class="helpful-btn"> <i> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path> </svg> </i> Yes </button> <button class="helpful-btn"> <i> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path> </svg> </i> No </button> </div> </div> </div> </li> <li class="faq-item" data-tags="features"> <div class="faq-question">How do I integrate with other tools and services?</div> <div class="faq-answer"> <p>Our platform offers several integration options:</p> <p>• Native integrations with 50+ popular tools including Slack, Google Workspace, Microsoft 365, Salesforce, and more<br> • Zapier integration for connecting with 3,000+ additional applications<br> • RESTful API with comprehensive documentation<br> • Webhook support for custom event notifications<br> • SCIM provisioning for enterprise identity management</p> <p>To set up integrations, go to Settings > Integrations in your dashboard. For API documentation and developer resources, visit our <a href="#">Developer Portal</a>. Custom integration support is available for Enterprise plan customers.</p> <span class="tag">Features</span> <div class="question-meta"> <span class="helpful-text">Was this helpful?</span> <div class="helpful-buttons"> <button class="helpful-btn"> <i> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path> </svg> </i> Yes </button> <button class="helpful-btn"> <i> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path> </svg> </i> No </button> </div> </div> </div> </li> </ul> <div class="faq-footer"> <p class="footer-text">Still have questions? We're here to help.</p> <button class="contact-btn"> <i> <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"> <path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"></path> </svg> </i> Contact Support </button> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const searchInput = document.getElementById('search-input'); const faqItems = document.querySelectorAll('.faq-item'); const progressBar = document.getElementById('progress-bar'); const tagFilters = document.querySelectorAll('.tag-filter'); let activeTag = 'all'; // Initialize accordion faqItems.forEach(item => { const question = item.querySelector('.faq-question'); question.addEventListener('click', () => { const isActive = item.classList.contains('active'); // Close all items faqItems.forEach(faqItem => { faqItem.classList.remove('active'); }); // If the clicked item wasn't active, open it if (!isActive) { item.classList.add('active'); updateProgressBar(); } else { updateProgressBar(0); } }); }); // Add hover effect faqItems.forEach(item => { item.addEventListener('mouseenter', () => { if (!item.classList.contains('active')) { item.style.backgroundColor = 'rgba(94, 142, 209, 0.03)'; } }); item.addEventListener('mouseleave', () => { if (!item.classList.contains('active')) { item.style.backgroundColor = ''; } }); }); // Search functionality searchInput.addEventListener('input', () => { const searchTerm = searchInput.value.toLowerCase().trim(); faqItems.forEach(item => { const question = item.querySelector('.faq-question').textContent.toLowerCase(); const answer = item.querySelector('.faq-answer').textContent.toLowerCase(); const matchesSearch = question.includes(searchTerm) || answer.includes(searchTerm); const matchesTag = activeTag === 'all' || item.dataset.tags.includes(activeTag); if (matchesSearch && matchesTag) { item.style.display = ''; } else { item.style.display = 'none'; } }); }); // Tag filtering tagFilters.forEach(filter => { filter.addEventListener('click', () => { // Update active states tagFilters.forEach(btn => btn.classList.remove('active')); filter.classList.add('active'); // Get selected tag activeTag = filter.dataset.tag; // Filter items faqItems.forEach(item => { const searchTerm = searchInput.value.toLowerCase().trim(); const question = item.querySelector('.faq-question').textContent.toLowerCase(); const answer = item.querySelector('.faq-answer').textContent.toLowerCase(); const matchesSearch = !searchTerm || question.includes(searchTerm) || answer.includes(searchTerm); const matchesTag = activeTag === 'all' || item.dataset.tags.includes(activeTag); if (matchesSearch && matchesTag) { item.style.display = ''; } else { item.style.display = 'none'; } }); }); }); // Progress bar function updateProgressBar(progress = null) { if (progress !== null) { progressBar.style.width = `${progress}%`; return; } const totalItems = faqItems.length; const openItems = document.querySelectorAll('.faq-item.active').length; const percentage = (openItems / totalItems) * 100; progressBar.style.width = `${percentage}%`; } // Handle helpful buttons const helpfulButtons = document.querySelectorAll('.helpful-btn'); helpfulButtons.forEach(button => { button.addEventListener('click', (e) => { e.stopPropagation(); const parentButtons = button.parentElement.querySelectorAll('.helpful-btn'); parentButtons.forEach(btn => {
<html> <head> <style> :root { --primary-color: #0b3954; --secondary-color: #ff6b35; --accent-color: #bfd7ea; --light-color: #f9f9f9; --dark-color: #2c2c2c; --border-radius: 8px; --shadow: 0 4px 12px rgba(0, 0, 0, 0.08); --transition: all 0.3s cubic-bezier(0.25, 1, 0.5, 1); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; } body { background-color: var(--light-color); color: var(--dark-color); line-height: 1.6; font-size: 16px; padding: 20px; max-width: 700px; margin: 0 auto; height: 100vh; display: flex; flex-direction: column; } .product-container { max-width: 100%; margin: 0 auto; background: white; border-radius: var(--border-radius); overflow: hidden; box-shadow: var(--shadow); } .product-header { display: flex; align-items: center; padding: 20px; border-bottom: 1px solid rgba(0, 0, 0, 0.1); position: relative; background-color: var(--primary-color); color: white; } .product-title { font-size: 1.5rem; font-weight: 700; flex-grow: 1; } .product-price { font-size: 1.4rem; font-weight: 700; color: var(--secondary-color); background: rgba(255, 255, 255, 0.15); padding: 5px 15px; border-radius: 30px; } .product-image { width: 100%; height: 180px; object-fit: cover; border-bottom: 1px solid rgba(0, 0, 0, 0.1); } .product-badge { position: absolute; top: -10px; right: 20px; background: var(--secondary-color); color: white; padding: 5px 15px; border-radius: 30px; font-weight: 600; font-size: 0.8rem; box-shadow: var(--shadow); transform-origin: center; animation: pulse 2s infinite; } @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } .accordion { overflow: hidden; } .accordion-item { border-bottom: 1px solid rgba(0, 0, 0, 0.1); } .accordion-item:last-child { border-bottom: none; } .accordion-header { display: flex; align-items: center; padding: 15px 20px; cursor: pointer; transition: var(--transition); position: relative; background-color: white; } .accordion-header:hover { background-color: var(--accent-color); } .accordion-title { font-weight: 600; font-size: 1.1rem; flex-grow: 1; } .accordion-icon { width: 24px; height: 24px; display: flex; align-items: center; justify-content: center; border-radius: 50%; background-color: var(--primary-color); color: white; transition: var(--transition); transform-origin: center; } .accordion-icon::before, .accordion-icon::after { content: ""; position: absolute; background-color: white; transition: var(--transition); } .accordion-icon::before { width: 12px; height: 2px; } .accordion-icon::after { width: 2px; height: 12px; } .accordion-item.active .accordion-icon::after { transform: rotate(90deg); opacity: 0; } .accordion-content { max-height: 0; overflow: hidden; transition: var(--transition); padding: 0 20px; background-color: rgba(11, 57, 84, 0.03); } .accordion-item.active .accordion-header { background-color: var(--primary-color); color: white; } .accordion-item.active .accordion-icon { background-color: var(--secondary-color); transform: rotate(180deg); } .specs-table { width: 100%; border-collapse: collapse; margin: 15px 0; } .specs-table tr:nth-child(even) { background-color: rgba(11, 57, 84, 0.05); } .specs-table td { padding: 10px; border-bottom: 1px solid rgba(0, 0, 0, 0.05); } .specs-table td:first-child { font-weight: 500; width: 40%; } .review { display: flex; gap: 15px; margin: 15px 0; padding-bottom: 15px; border-bottom: 1px solid rgba(0, 0, 0, 0.05); } .review:last-child { border-bottom: none; } .review-avatar { width: 50px; height: 50px; border-radius: 50%; background-color: var(--accent-color); display: flex; align-items: center; justify-content: center; font-weight: 700; color: var(--primary-color); flex-shrink: 0; } .review-content { flex-grow: 1; } .review-header { display: flex; justify-content: space-between; margin-bottom: 5px; } .review-author { font-weight: 600; } .review-date { font-size: 0.9rem; color: rgba(0, 0, 0, 0.5); } .stars { color: var(--secondary-color); margin-bottom: 8px; } .policy-item { display: flex; align-items: flex-start; gap: 10px; margin: 15px 0; } .policy-icon { width: 24px; height: 24px; background-color: var(--primary-color); border-radius: 50%; display: flex; align-items: center; justify-content: center; flex-shrink: 0; color: white; font-size: 0.8rem; } .buy-now { display: block; width: 100%; background-color: var(--secondary-color); color: white; font-weight: 600; text-align: center; padding: 15px; border: none; border-radius: var(--border-radius); cursor: pointer; transition: var(--transition); margin-top: 20px; box-shadow: 0 4px 10px rgba(255, 107, 53, 0.3); position: relative; overflow: hidden; } .buy-now:hover { background-color: #e85a2a; transform: translateY(-2px); box-shadow: 0 8px 15px rgba(255, 107, 53, 0.4); } .buy-now::after { content: ""; position: absolute; width: 30px; height: 100%; top: 0; left: -50px; background: linear-gradient(to right, transparent, rgba(255, 255, 255, 0.3), transparent); animation: shine 2s infinite; } @keyframes shine { 0% { left: -50px; } 50% { left: 110%; } 100% { left: 110%; } } .color-options { display: flex; gap: 10px; margin: 15px 0; } .color-option { width: 30px; height: 30px; border-radius: 50%; cursor: pointer; transition: var(--transition); position: relative; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); border: 2px solid white; } .color-option.active { transform: scale(1.2); box-shadow: 0 0 0 2px var(--primary-color); } .color-option:nth-child(1) { background-color: #2c2c2c; } .color-option:nth-child(2) { background-color: #bfd7ea; } .color-option:nth-child(3) { background-color: #ff6b35; } @media (max-width: 480px) { body { padding: 10px; } .product-header { flex-direction: column; align-items: flex-start; gap: 10px; } .product-price { align-self: flex-end; } .accordion-title { font-size: 1rem; } } </style> </head> <body> <div class="product-container"> <div class="product-badge">LIMITED EDITION</div> <img src="https://images.unsplash.com/photo-1600375104627-c94c416deefa?ixlib=rb-1.2.1&auto=format&fit=crop&w=1000&q=80" alt="Noise Cancelling Headphones" class="product-image"> <div class="product-header"> <h1 class="product-title">AcousticWave Pro X7</h1> <div class="product-price">$249.99</div> </div> <div class="accordion"> <div class="accordion-item"> <div class="accordion-header"> <div class="accordion-title">Product Specifications</div> <div class="accordion-icon"></div> </div> <div class="accordion-content"> <table class="specs-table"> <tr> <td>Noise Cancellation</td> <td>Adaptive 4-mic hybrid ANC (up to 35dB)</td> </tr> <tr> <td>Driver Size</td> <td>40mm Titanium-coated dynamic drivers</td> </tr> <tr> <td>Frequency Response</td> <td>5Hz - 40kHz (extended range)</td> </tr> <tr> <td>Battery Life</td> <td>32 hours (ANC on), 45 hours (ANC off)</td> </tr> <tr> <td>Charging Time</td> <td>2 hours full charge, 15 min for 5 hours playback</td> </tr> <tr> <td>Bluetooth</td> <td>Bluetooth 5.2 with multipoint connection</td> </tr> <tr> <td>Water Resistance</td> <td>IPX4 rated (splash resistant)</td> </tr> <tr> <td>Weight</td> <td>285 grams</td> </tr> </table> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="accordion-title">Customer Reviews</div> <div class="accordion-icon"></div> </div> <div class="accordion-content"> <div class="review"> <div class="review-avatar">MJ</div> <div class="review-content"> <div class="review-header"> <div class="review-author">Michael Johnson</div> <div class="review-date">2 days ago</div> </div> <div class="stars">★★★★★</div> <p>The ANC performance is incredible - I tested these on a cross-country flight and couldn't hear the engines at all. Battery life exceeds the advertised specs, I got almost 35 hours with ANC enabled. The app equalizer gives you granular control over your sound profile.</p> </div> </div> <div class="review"> <div class="review-avatar">SL</div> <div class="review-content"> <div class="review-header"> <div class="review-author">Sarah Lin</div> <div class="review-date">1 week ago</div> </div> <div class="stars">★★★★☆</div> <p>Sound quality is excellent with crisp highs and deep, controlled bass. The comfort level is good but gets a bit tight after 3-4 hours of wear. The spatial audio feature is a game-changer for movies. My only complaint is the touch controls can be a bit finicky.</p> </div> </div> <div class="review"> <div class="review-avatar">DT</div> <div class="review-content"> <div class="review-header"> <div class="review-author">David Thompson</div> <div class="review-date">1 month ago</div> </div> <div class="stars">★★★★★</div> <p>These replaced my old Sony WH-1000XM4s and the difference is noticeable. The microphone quality during calls is significantly better, with multiple people commenting on how clear I sound. The transparent mode feels natural, almost like you're not wearing headphones at all.</p> </div> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="accordion-title">Shipping & Returns</div> <div class="accordion-icon"></div> </div> <div class="accordion-content"> <div class="policy-item"> <div class="policy-icon">✓</div> <div> <h4>Free Express Shipping</h4> <p>Orders over $100 qualify for free expedited shipping (2-3 business days). All other orders ship standard (4-6 business days) for a flat rate of $8.99.</p> </div> </div> <div class="policy-item"> <div class="policy-icon">↺</div> <div> <h4>45-Day Risk-Free Trial</h4> <p>Try the AcousticWave Pro X7 for up to 45 days. If you're not completely satisfied, return for a full refund. We'll even cover return shipping.</p> </div> </div> <div class="policy-item"> <div class="policy-icon">⚡</div> <div> <h4>2-Year Extended Warranty</h4> <p>Your purchase includes our standard 2-year warranty covering manufacturing defects. Register your product within 30 days to extend to 3 years at no extra cost.</p> </div> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="accordion-title">Color Options</div> <div class="accordion-icon"></div> </div> <div class="accordion-content"> <p>Select your preferred color:</p> <div class="color-options"> <div class="color-option active" data-color="Midnight Black"></div> <div class="color-option" data-color="Ocean Blue"></div> <div class="color-option" data-color="Sunset Orange"></div> </div> <p class="selected-color">Selected: <strong>Midnight Black</strong></p> <button class="buy-now">Add to Cart</button> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Accordion functionality const accordionItems = document.querySelectorAll('.accordion-item'); accordionItems.forEach(item => { const header = item.querySelector('.accordion-header'); const content = item.querySelector('.accordion-content'); header.addEventListener('click', () => { // Check if current item is active const isActive = item.classList.contains('active'); // Close all items accordionItems.forEach(accItem => { accItem.classList.remove('active'); accItem.querySelector('.accordion-content').style.maxHeight = null; }); // If clicked item wasn't active, open it if (!isActive) { item.classList.add('active'); content.style.maxHeight = content.scrollHeight + 'px'; } }); }); // Color selection functionality const colorOptions = document.querySelectorAll('.color-option'); const selectedColorText = document.querySelector('.selected-color strong'); colorOptions.forEach(option => { option.addEventListener('click', () => { // Remove active class from all options colorOptions.forEach(opt => opt.classList.remove('active')); // Add active class to clicked option option.classList.add('active'); // Update selected color text const colorName = option.getAttribute('data-color'); selectedColorText.textContent = colorName; // Add a little animation to show selection option.animate([ { transform: 'scale(1.2)' }, { transform: 'scale(1.4)' }, { transform: 'scale(1.2)' } ], { duration: 300, easing: 'ease-in-out' }); }); }); // Open the first accordion by default const firstItem = accordionItems[0]; firstItem.classList.add('active'); firstItem.querySelector('.accordion-content').style.maxHeight = firstItem.querySelector('.accordion-content').scrollHeight + 'px'; // Buy now button effect const buyButton = document.querySelector('.buy-now'); buyButton.addEventListener('click', function(e) { e.preventDefault(); // Create ripple effect const circle = document.createElement('div'); const x = e.clientX - e.target.getBoundingClientRect().left; const y = e.clientY - e.target.getBoundingClientRect().top; circle.style.position = 'absolute'; circle.style.top = y + 'px'; circle.style.left = x + 'px'; circle.style.width = '1px'; circle.style.height = '1px'; circle.style.backgroundColor = 'rgba(255, 255, 255, 0.5)'; circle.style.borderRadius = '50%'; circle.style.transform = 'scale(0)'; circle.style.transition = 'all 0.5s ease-out'; this.appendChild(circle); setTimeout(() => { circle.style.transform = 'scale(150)'; circle.style.opacity = '0'; }, 10); setTimeout(() => { circle.remove(); }, 500); // Simulate add to cart buyButton.textContent = 'Added to Cart!'; buyButton.style.backgroundColor = '#4CAF50'; setTimeout(() => { buyButton.textContent = 'Add to Cart'; buyButton.style.backgroundColor = ''; }, 1500); }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Mobile Navigation Accordion</title> <style> :root { --primary: #5C2DFE; --primary-dark: #4318E0; --secondary: #FF6B6B; --accent: #FFE66D; --text: #333333; --text-light: #666666; --background: #F9F9F9; --white: #FFFFFF; --border-radius: 16px; --shadow: 0 8px 30px rgba(92, 45, 254, 0.15); --transition: all 0.3s cubic-bezier(0.68, -0.6, 0.32, 1.6); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { background-color: var(--background); display: flex; justify-content: center; align-items: center; min-height: 100vh; padding: 20px; overflow-x: hidden; } .mobile-container { position: relative; width: 320px; height: 600px; background-color: var(--white); border-radius: 30px; box-shadow: var(--shadow); overflow: hidden; padding: 20px 0; margin: 0 auto; } .menu-header { display: flex; justify-content: space-between; align-items: center; padding: 20px; border-bottom: 1px solid rgba(0, 0, 0, 0.05); } .menu-header h2 { font-size: 1.3rem; color: var(--text); font-weight: 600; } .close-btn { background: var(--primary); color: white; border: none; width: 36px; height: 36px; border-radius: 50%; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: var(--transition); } .close-btn:hover { background: var(--primary-dark); transform: rotate(90deg); } .nav-accordion { margin-top: 10px; padding: 0 10px; } .accordion-item { margin-bottom: 15px; border-radius: var(--border-radius); overflow: hidden; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.05); transition: var(--transition); } .accordion-header { display: flex; align-items: center; padding: 16px 20px; background-color: var(--white); cursor: pointer; border-radius: var(--border-radius); transition: var(--transition); position: relative; z-index: 1; } .accordion-header:before { content: ''; position: absolute; top: 0; left: 0; width: 5px; height: 100%; background-color: var(--primary); border-radius: 4px 0 0 4px; transform: scaleY(0); transition: transform 0.3s ease; } .accordion-item.active .accordion-header:before { transform: scaleY(1); } .icon-container { width: 40px; height: 40px; border-radius: 12px; background-color: rgba(92, 45, 254, 0.1); display: flex; align-items: center; justify-content: center; margin-right: 15px; transition: var(--transition); } .accordion-item.active .icon-container { background-color: var(--primary); transform: scale(1.1); } .accordion-item.active .icon { filter: brightness(5); } .icon { width: 20px; height: 20px; transition: var(--transition); } .accordion-title { flex-grow: 1; font-size: 1rem; font-weight: 500; color: var(--text); } .accordion-arrow { width: 24px; height: 24px; transition: var(--transition); color: var(--text-light); transform-origin: center; } .accordion-item.active .accordion-arrow { transform: rotate(180deg); color: var(--primary); } .accordion-content { max-height: 0; overflow: hidden; background-color: var(--white); transition: max-height 0.4s ease-in-out, padding 0.2s ease; padding: 0 20px; border-radius: 0 0 var(--border-radius) var(--border-radius); } .accordion-item.active .accordion-content { max-height: 300px; padding: 15px 20px 20px; } .submenu-link { display: flex; align-items: center; padding: 12px 15px; color: var(--text-light); text-decoration: none; border-radius: 10px; transition: var(--transition); margin-bottom: 8px; position: relative; overflow: hidden; } .submenu-link:before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: var(--primary); opacity: 0; transform: translateX(-100%); transition: transform 0.3s ease, opacity 0.2s ease; z-index: -1; border-radius: 10px; } .submenu-link:hover { color: var(--white); } .submenu-link:hover:before { transform: translateX(0); opacity: 1; } .submenu-icon { margin-right: 10px; transition: var(--transition); } .submenu-link:hover .submenu-icon { transform: translateX(5px); filter: brightness(5); } .user-section { position: absolute; bottom: 0; left: 0; width: 100%; padding: 15px 20px; background-color: var(--white); display: flex; align-items: center; border-top: 1px solid rgba(0, 0, 0, 0.05); } .user-avatar { width: 45px; height: 45px; border-radius: 50%; background-color: var(--secondary); margin-right: 15px; display: flex; align-items: center; justify-content: center; color: white; font-weight: bold; font-size: 1.2rem; box-shadow: 0 4px 10px rgba(255, 107, 107, 0.3); } .user-info { flex-grow: 1; } .user-name { font-size: 0.9rem; font-weight: 600; color: var(--text); } .user-status { font-size: 0.75rem; color: var(--secondary); } .logout-btn { width: 36px; height: 36px; border-radius: 12px; background-color: rgba(255, 107, 107, 0.1); display: flex; align-items: center; justify-content: center; cursor: pointer; transition: var(--transition); border: none; } .logout-btn:hover { background-color: var(--secondary); } .logout-btn:hover svg { filter: brightness(5); } /* Backdrop blur when menu is open */ .backdrop { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.3); backdrop-filter: blur(5px); z-index: -1; opacity: 0; transition: opacity 0.3s ease; } .backdrop.active { opacity: 1; } /* Responsive design */ @media (max-width: 375px) { .mobile-container { width: 100%; height: 100vh; border-radius: 0; } } /* Animation for the initial load */ @keyframes slideIn { from { transform: translateX(-100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } .mobile-container { animation: slideIn 0.5s ease forwards; } .accordion-item { animation: slideIn 0.5s ease forwards; opacity: 0; } .accordion-item:nth-child(1) { animation-delay: 0.1s; } .accordion-item:nth-child(2) { animation-delay: 0.2s; } .accordion-item:nth-child(3) { animation-delay: 0.3s; } .accordion-item:nth-child(4) { animation-delay: 0.4s; } /* Pulse animation for active states */ @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(92, 45, 254, 0.4); } 70% { box-shadow: 0 0 0 10px rgba(92, 45, 254, 0); } 100% { box-shadow: 0 0 0 0 rgba(92, 45, 254, 0); } } .accordion-item.active { animation: pulse 1.5s infinite; } </style> </head> <body> <div class="backdrop"></div> <div class="mobile-container"> <div class="menu-header"> <h2>SnapNav Menu</h2> <button class="close-btn"> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <line x1="18" y1="6" x2="6" y2="18"></line> <line x1="6" y1="6" x2="18" y2="18"></line> </svg> </button> </div> <div class="nav-accordion"> <div class="accordion-item"> <div class="accordion-header"> <div class="icon-container"> <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#5C2DFE" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path> <polyline points="9 22 9 12 15 12 15 22"></polyline> </svg> </div> <span class="accordion-title">Dashboard</span> <svg class="accordion-arrow" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </div> <div class="accordion-content"> <a href="#" class="submenu-link"> <svg class="submenu-icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18" 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> </svg> Overview </a> <a href="#" class="submenu-link"> <svg class="submenu-icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="22 12 18 12 15 21 9 3 6 12 2 12"></polyline> </svg> Analytics </a> <a href="#" class="submenu-link"> <svg class="submenu-icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18" 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> <line x1="12" y1="8" x2="12" y2="16"></line> <line x1="8" y1="12" x2="16" y2="12"></line> </svg> Create New </a> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="icon-container"> <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#5C2DFE" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path> <circle cx="9" cy="7" r="4"></circle> <path d="M23 21v-2a4 4 0 0 0-3-3.87"></path> <path d="M16 3.13a4 4 0 0 1 0 7.75"></path> </svg> </div> <span class="accordion-title">Social Connect</span> <svg class="accordion-arrow" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </div> <div class="accordion-content"> <a href="#" class="submenu-link"> <svg class="submenu-icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"></path> <path d="M13.73 21a2 2 0 0 1-3.46 0"></path> </svg> Notifications </a> <a href="#" class="submenu-link"> <svg class="submenu-icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"></path> </svg> Messages </a> <a href="#" class="submenu-link"> <svg class="submenu-icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="23 6 13.5 15.5 8.5 10.5 1 18"></polyline> <polyline points="17 6 23 6 23 12"></polyline> </svg> Trending </a> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="icon-container"> <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#5C2DFE" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect> <line x1="3" y1="9" x2="21" y2="9"></line> <line x1="9" y1="21" x2="9" y2="9"></line> </svg> </div> <span class="accordion-title">Explore Content</span> <svg class="accordion-arrow" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </div> <div class="accordion-content"> <a href="#" class="submenu-link"> <svg class="submenu-icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"></polygon> </svg> Featured </a> <a href="#" class="submenu-link"> <svg class="submenu-icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18" 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> <polygon points="16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76"></polygon> </svg> Discover </a> <a href="#" class="submenu-link"> <svg class="submenu-icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"></path> </svg> Favorites </a> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="icon-container"> <svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#5C2DFE" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <circle cx="12" cy="12" r="3"></circle> <path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path> </svg> </div> <span class="accordion-title">Settings</span> <svg class="accordion-arrow" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </div> <div class="accordion-content"> <a href="#" class="submenu-link"> <svg class="submenu-icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18" 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 </a> <a href="#" class="submenu-link"> <svg class="submenu-icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18" 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> Privacy & Security </a> <a href="#" class="submenu-link"> <svg class="submenu-icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"></path> <path d="M13.73 21a2 2 0 0 1-3.46 0"></path> </svg> Notifications </a> <a href="#" class="submenu-link"> <svg class="submenu-icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18" 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> <line x1="12" y1="16" x2="12" y2="12"></line> <line x1="12" y1="8" x2="12.01" y2="8"></line> </svg> Help & Support </a> </div> </div> </div> <div class="user-section"> <div class="user-avatar">AG</div> <div class="user-info"> <div class="user-name">Alex Green</div> <div class="user-status">Premium Member</div> </div> <button class="logout-btn"> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#FF6B6B" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"></path> <polyline points="16 17 21 12 16 7"></polyline> <line x1="21" y1="12" x2="9" y2="12"></line> </svg> </button> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const accordionItems = document.querySelectorAll('.accordion-item'); const closeBtn = document.querySelector('.close-btn'); const backdrop = document.querySelector('.backdrop'); const mobileContainer = document.querySelector('.mobile-container'); // Toggle accordion function accordionItems.forEach(item => { const header = item.querySelector('.accordion-header'); header.addEventListener('click', () => { // Close all other items accordionItems.forEach(otherItem => { if (otherItem !== item && otherItem.classList.contains('active')) { otherItem.classList.remove('active'); } }); // Toggle the clicked item item.classList.toggle('active'); // Add a nice ripple effect const ripple = document.createElement('span'); ripple.style.position = 'absolute'; ripple.style.borderRadius = '50%'; ripple.style.backgroundColor = 'rgba(92, 45, 254, 0.2)'; ripple.style.width = '100px'; ripple.style.height = '100px'; ripple.style.top = '50%'; ripple.style.left = '50%'; ripple.style.transform = 'translate(-50%, -50%) scale(0)'; ripple.style.transition = 'transform 0.6s ease-out, opacity 0.6s ease-out'; ripple.style.opacity = '1'; header.appendChild(ripple); setTimeout(() => { ripple.style.transform = 'translate(-50%, -50%) scale(3)'; ripple.style.opacity = '0'; }, 10); setTimeout(() => { header.removeChild(ripple); }, 600); }); }); // Close menu button (simulates going back to the main app) closeBtn.addEventListener('click', () => { backdrop.classList.add('active'); setTimeout(() => { mobileContainer.style.transform = 'translateX(-100%)'; mobileContainer.style.opacity = '0'; }, 300); setTimeout(() => { mobileContainer.style.transform = 'translateX(0)'; mobileContainer.style.opacity = '1'; backdrop.classList.remove('active'); }, 1000); }); // For demonstration - show first accordion item as active initially setTimeout(() => { accordionItems[0].classList.add('active'); }, 1000); // Handle submenu links const submenuLinks = document.querySelectorAll('.submenu-link'); submenuLinks.forEach(link => { link.addEventListener('click', (e) => { e.preventDefault(); // Highlight effect link.style.fontWeight = 'bold'; link.style.color = 'var(--primary)'; setTimeout(() => { link.style.fontWeight = ''; link.style.color = ''; }, 500); }); }); // Logout button effect const logoutBtn = document.querySelector('.logout-btn'); logoutBtn.addEventListener('click', () => { logoutBtn.style.transform = 'scale(0.9)'; setTimeout(() => { logoutBtn.style.transform = 'scale(1)'; }, 200); }); }); </script> </body> </html>
<html> <head> <style> :root { --primary-color: #0e2a3b; --secondary-color: #1a4b6e; --accent-color: #3a7ca5; --hover-color: #2c5f7c; --text-color: #e2e8ed; --code-bg: #152e3d; --shadow-color: rgba(0, 0, 0, 0.2); --gradient-start: #0e2a3b; --gradient-end: #1a4b6e; --font-mono: 'Roboto Mono', monospace; --font-sans: 'Inter', system-ui, sans-serif; } * { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: var(--font-sans); background: var(--primary-color); color: var(--text-color); line-height: 1.6; padding: 20px; max-width: 700px; margin: 0 auto; height: 100vh; overflow-y: auto; display: flex; flex-direction: column; } .header { margin-bottom: 25px; position: relative; } .header::after { content: ''; position: absolute; bottom: -10px; left: 0; width: 100%; height: 1px; background: linear-gradient(to right, transparent, var(--accent-color), transparent); } h1 { font-size: 2.2rem; margin-bottom: 10px; font-weight: 600; letter-spacing: -0.03em; background: linear-gradient(to right, var(--text-color), #a3c9e9); -webkit-background-clip: text; background-clip: text; color: transparent; } .subtitle { font-size: 0.9rem; opacity: 0.8; margin-bottom: 15px; } .search-container { position: relative; margin-bottom: 30px; width: 100%; } .search-input { width: 100%; padding: 12px 45px 12px 15px; border-radius: 6px; border: 1px solid var(--accent-color); background-color: var(--primary-color); color: var(--text-color); font-family: var(--font-sans); font-size: 0.9rem; transition: all 0.3s ease; } .search-input:focus { outline: none; box-shadow: 0 0 0 2px var(--accent-color); } .search-icon { position: absolute; right: 12px; top: 50%; transform: translateY(-50%); pointer-events: none; opacity: 0.7; } .accordion-container { display: flex; flex-direction: column; gap: 8px; width: 100%; overflow-y: auto; flex-grow: 1; padding-right: 5px; } .accordion-container::-webkit-scrollbar { width: 6px; } .accordion-container::-webkit-scrollbar-track { background: var(--primary-color); } .accordion-container::-webkit-scrollbar-thumb { background: var(--accent-color); border-radius: 3px; } .accordion-item { border-radius: 6px; overflow: hidden; box-shadow: 0 2px 8px var(--shadow-color); background: linear-gradient(to bottom, var(--gradient-start), var(--gradient-end)); transition: transform 0.2s ease, box-shadow 0.2s ease; } .accordion-item:hover { transform: translateY(-2px); box-shadow: 0 4px 12px var(--shadow-color); } .accordion-header { padding: 16px 20px; display: flex; justify-content: space-between; align-items: center; cursor: pointer; user-select: none; border-left: 3px solid transparent; transition: background 0.3s ease, border-left 0.3s ease; } .accordion-header:hover { background: var(--hover-color); border-left: 3px solid var(--accent-color); } .accordion-header h3 { font-size: 1.1rem; font-weight: 500; display: flex; align-items: center; gap: 8px; } .accordion-header h3 svg { opacity: 0.8; flex-shrink: 0; } .accordion-header .icon { transition: transform 0.3s ease; } .accordion-header.active .icon { transform: rotate(180deg); } .accordion-content { max-height: 0; overflow: hidden; transition: max-height 0.5s cubic-bezier(0.4, 0, 0.2, 1), padding 0.3s ease; padding: 0 20px; background-color: rgba(0, 0, 0, 0.1); border-left: 3px solid transparent; } .accordion-content.active { padding: 20px; border-left: 3px solid var(--accent-color); } .accordion-content p { margin-bottom: 15px; font-size: 0.95rem; } .content-section { margin-bottom: 20px; } .content-section:last-child { margin-bottom: 0; } .content-section h4 { margin-bottom: 10px; font-size: 1.05rem; font-weight: 500; color: #a3c9e9; } .nested-section { margin-left: 15px; padding-left: 15px; border-left: 1px solid rgba(255, 255, 255, 0.1); margin-bottom: 15px; } code { font-family: var(--font-mono); background-color: var(--code-bg); padding: 2px 6px; border-radius: 4px; font-size: 0.9em; white-space: pre-wrap; word-break: break-word; } pre { font-family: var(--font-mono); background-color: var(--code-bg); padding: 15px; border-radius: 6px; overflow-x: auto; margin: 15px 0; border: 1px solid rgba(255, 255, 255, 0.1); position: relative; } pre code { background-color: transparent; padding: 0; } .code-header { display: flex; justify-content: space-between; padding: 8px 15px; background-color: rgba(0, 0, 0, 0.2); border-radius: 6px 6px 0 0; font-size: 0.8rem; color: #a3c9e9; position: absolute; top: 0; left: 0; right: 0; } .copy-button { background: none; border: none; color: var(--text-color); cursor: pointer; font-size: 0.8rem; display: flex; align-items: center; gap: 5px; opacity: 0.7; transition: opacity 0.2s ease; } .copy-button:hover { opacity: 1; } .copy-success { position: absolute; bottom: 10px; right: 10px; background-color: var(--accent-color); color: white; padding: 5px 10px; border-radius: 4px; font-size: 0.8rem; opacity: 0; transition: opacity 0.3s ease; } .code-with-header { margin-top: 35px; position: relative; } .version-tag { display: inline-block; padding: 2px 8px; border-radius: 10px; background-color: var(--accent-color); color: white; font-size: 0.7rem; margin-left: 10px; vertical-align: middle; } .tip-box { background-color: rgba(58, 124, 165, 0.2); border-left: 3px solid var(--accent-color); padding: 12px 15px; margin: 15px 0; border-radius: 4px; position: relative; } .tip-box::before { content: "💡 Tip"; font-weight: 600; display: block; margin-bottom: 8px; color: #a3c9e9; } .warning-box { background-color: rgba(209, 154, 61, 0.2); border-left: 3px solid #d19a3d; padding: 12px 15px; margin: 15px 0; border-radius: 4px; position: relative; } .warning-box::before { content: "⚠️ Warning"; font-weight: 600; display: block; margin-bottom: 8px; color: #f0c674; } @media (max-width: 600px) { body { padding: 15px; } h1 { font-size: 1.8rem; } .accordion-header { padding: 12px 15px; } .accordion-content.active { padding: 15px; } .accordion-header h3 { font-size: 1rem; } } /* Animation for accordion expansion */ @keyframes fadeIn { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } .accordion-content.animate-in > * { animation: fadeIn 0.3s ease forwards; opacity: 0; } .accordion-content.animate-in > *:nth-child(1) { animation-delay: 0.1s; } .accordion-content.animate-in > *:nth-child(2) { animation-delay: 0.15s; } .accordion-content.animate-in > *:nth-child(3) { animation-delay: 0.2s; } .accordion-content.animate-in > *:nth-child(4) { animation-delay: 0.25s; } .accordion-content.animate-in > *:nth-child(5) { animation-delay: 0.3s; } </style> </head> <body> <div class="header"> <h1>API Documentation</h1> <p class="subtitle">Technical reference for the CloudSync Data Platform v2.4</p> </div> <div class="search-container"> <input type="text" class="search-input" placeholder="Search documentation..." id="search-docs"> <svg class="search-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M21 21L16.65 16.65M19 11C19 15.4183 15.4183 19 11 19C6.58172 19 3 15.4183 3 11C3 6.58172 6.58172 3 11 3C15.4183 3 19 6.58172 19 11Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </div> <div class="accordion-container"> <div class="accordion-item"> <div class="accordion-header" data-accordion="authentication"> <h3> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12 15V17M6 21H18C19.1046 21 20 20.1046 20 19V13C20 11.8954 19.1046 11 18 11H6C4.89543 11 4 11.8954 4 13V19C4 20.1046 4.89543 21 6 21ZM16 11V7C16 4.79086 14.2091 3 12 3C9.79086 3 8 4.79086 8 7V11H16Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> Authentication <span class="version-tag">v2.4</span> </h3> <svg class="icon" width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M19 9L12 16L5 9" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </div> <div class="accordion-content" data-content="authentication"> <div class="content-section"> <h4>Overview</h4> <p>The CloudSync API uses bearer token authentication. All API requests must include an <code>Authorization</code> header with a valid access token.</p> </div> <div class="content-section"> <h4>Obtaining Access Tokens</h4> <p>There are two methods to obtain an access token:</p> <div class="nested-section"> <h4>Method 1: OAuth 2.0 Authorization Flow</h4> <p>For user-context operations, implement the full OAuth 2.0 flow:</p> <ol> <li>Redirect users to <code>https://api.cloudsync.dev/oauth/authorize</code></li> <li>User authenticates and authorizes your application</li> <li>Exchange the returned authorization code for an access token</li> </ol> </div> <div class="nested-section"> <h4>Method 2: Client Credentials</h4> <p>For server-to-server authentication, use the client credentials flow:</p> <div class="code-with-header"> <div class="code-header"> <span>POST Request</span> <button class="copy-button" data-code="curl -X POST https://api.cloudsync.dev/oauth/token \ -H 'Content-Type: application/json' \ -d '{ \"client_id\": \"your_client_id\", \"client_secret\": \"your_client_secret\", \"grant_type\": \"client_credentials\" }'"> <svg width="14" height="14" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M8 5H6C4.89543 5 4 5.89543 4 7V19C4 20.1046 4.89543 21 6 21H16C17.1046 21 18 20.1046 18 19V17M8 5V7C8 8.10457 8.89543 9 10 9H14C15.1046 9 16 8.10457 16 7V5M8 5C8 3.89543 8.89543 3 10 3H14C15.1046 3 16 3.89543 16 5M16 5H20C21.1046 5 22 5.89543 22 7V15C22 16.1046 21.1046 17 20 17H16" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> Copy </button> </div> <pre><code>curl -X POST https://api.cloudsync.dev/oauth/token \ -H 'Content-Type: application/json' \ -d '{ "client_id": "your_client_id", "client_secret": "your_client_secret", "grant_type": "client_credentials" }'</code></pre> <div class="copy-success">Copied!</div> </div> </div> </div> <div class="content-section"> <h4>Using Access Tokens</h4> <p>Include the token in every API request:</p> <pre><code>Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...</code></pre> </div> <div class="tip-box"> Store your client secrets securely. Never expose them in client-side code or public repositories. </div> </div> </div> <div class="accordion-item"> <div class="accordion-header" data-accordion="endpoints"> <h3> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M9 3H5C3.89543 3 3 3.89543 3 5V9M9 3H15M9 3V9M15 3H19C20.1046 3 21 3.89543 21 5V9M15 3V9M3 9V15M3 9H9M9 9V15M9 9H15M21 9V15M21 9H15M15 9V15M15 9H9M3 15V19C3 20.1046 3.89543 21 5 21H9M3 15H9M9 15V21M9 15H15M15 15V21M15 15H21M21 15V19C21 20.1046 20.1046 21 19 21H15M9 21H15" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> API Endpoints </h3> <svg class="icon" width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M19 9L12 16L5 9" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </div> <div class="accordion-content" data-content="endpoints"> <div class="content-section"> <h4>Base URL</h4> <p>All API endpoints are relative to: <code>https://api.cloudsync.dev/v2</code></p> </div> <div class="content-section"> <h4>Data Retrieval</h4> <div class="nested-section"> <h4>List Data Collections</h4> <p>Returns all data collections available to the authenticated user.</p> <pre><code>GET /collections</code></pre> <p>Query Parameters:</p> <ul> <li><code>limit</code>: Maximum number of items to return (default: 20, max: 100)</li> <li><code>offset</code>: Pagination offset (default: 0)</li> <li><code>sort</code>: Sort field (options: created_at, name, size)</li> <li><code>order</code>: Sort order (asc or desc)</li> </ul> </div> <div class="nested-section"> <h4>Get Collection Details</h4> <p>Returns metadata about a specific collection.</p> <pre><code>GET /collections/{collection_id}</code></pre> </div> <div class="nested-section"> <h4>Query Collection Data</h4> <p>Search and filter data within a collection.</p> <div class="code-with-header"> <div class="code-header"> <span>POST Request</span> <button class="copy-button" data-code="POST /collections/{collection_id}/query { \"filters\": { \"timestamp\": { \"$gte\": \"2023-01-01T00:00:00Z\", \"$lt\": \"2023-02-01T00:00:00Z\" }, \"status\": \"active\" }, \"fields\": [\"id\", \"name\", \"status\", \"timestamp\"], \"limit\": 50, \"sort\": {\"timestamp\": \"desc\"} }"> <svg width="14" height="14" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M8 5H6C4.89543 5 4 5.89543 4 7V19C4 20.1046 4.89543 21 6 21H16C17.1046 21 18 20.1046 18 19V17M8 5V7C8 8.10457 8.89543 9 10 9H14C15.1046 9 16 8.10457 16 7V5M8 5C8 3.89543 8.89543 3 10 3H14C15.1046 3 16 3.89543 16 5M16 5H20C21.1046 5 22 5.89543 22 7V15C22 16.1046 21.1046 17 20 17H16" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> Copy </button> </div> <pre><code>POST /collections/{collection_id}/query { "filters": { "timestamp": { "$gte": "2023-01-01T00:00:00Z", "$lt": "2023-02-01T00:00:00Z" }, "status": "active" }, "fields": ["id", "name", "status", "timestamp"], "limit": 50, "sort": {"timestamp": "desc"} }</code></pre> <div class="copy-success">Copied!</div> </div> </div> </div> <div class="content-section"> <h4>Data Modification</h4> <div class="nested-section"> <h4>Create Collection</h4> <pre><code>POST /collections Content-Type: application/json { "name": "sensor_readings", "description": "IoT sensor data from production floor", "schema": { "type": "object", "properties": { "device_id": { "type": "string" }, "temperature": { "type": "number" }, "humidity": { "type": "number" }, "timestamp": { "type": "string", "format": "date-time" } }, "required": ["device_id", "timestamp"] } }</code></pre> </div> <div class="nested-section"> <h4>Insert Data</h4> <pre><code>POST /collections/{collection_id}/data Content-Type: application/json { "records": [ { "device_id": "sensor-2945A", "temperature": 24.7, "humidity": 32.1, "timestamp": "2023-09-13T15:40:22Z" }, { "device_id": "sensor-3856B", "temperature": 23.9, "humidity": 33.5, "timestamp": "2023-09-13T15:40:29Z" } ] }</code></pre> </div> </div> <div class="warning-box"> The bulk update and delete operations are potentially destructive. Always confirm your filter criteria before execution. </div> </div> </div> <div class="accordion-item"> <div class="accordion-header" data-accordion="rate-limits"> <h3> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12 8V12L14 14M12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> Rate Limits </h3> <svg class="icon" width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M19 9L12 16L5 9" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </div> <div class="accordion-content" data-content="rate-limits"> <div class="content-section"> <h4>Standard Rate Limits</h4> <p>The API implements rate limiting to ensure a consistent experience for all users. Limits vary by endpoint category:</p> <ul> <li><strong>Read operations:</strong> 500 requests per minute</li> <li><strong>Write operations:</strong> 120 requests per minute</li> <li><strong>Data queries:</strong> 60 complex queries per minute</li> <li><strong>Bulk operations:</strong> 10 requests per minute</li> </ul> </div> <div class="content-section"> <h4>Rate Limit Headers</h4> <p>Each response includes headers to help track your rate limit status:</p> <pre><code>X-RateLimit-Limit: 500 X-RateLimit-Remaining: 437 X-RateLimit-Reset: 1631563200</code></pre> <p>When a rate limit is exceeded, requests will receive a <code>429 Too Many Requests</code> response with a <code>Retry-After</code> header indicating when you can resume requests.</p> </div> <div class="tip-box"> Implement exponential backoff in your clients when handling rate limit errors. Start with a small delay and increase it for subsequent retries. </div> <div class="content-section"> <h4>Request Optimization</h4> <p>To minimize rate limit impact:</p> <ul> <li>Use batch operations when possible</li> <li>Implement caching for frequently accessed data</li> <li>Stream large result sets rather than requesting all records at once</li> <li>Request only the fields you need using projection parameters</li> </ul> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header" data-accordion="error-handling"> <h3> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12 9V13M12 17H12.01M5.07183 19H18.9282C20.4678 19 21.4301 17.3333 20.6603 16L13.7321 4C12.9623 2.66667 11.0378 2.66667 10.268 4L3.33978 16C2.56998 17.3333 3.53223 19 5.07183 19Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> Error Handling </h3> <svg class="icon" width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M19 9L12 16L5 9" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </div> <div class="accordion-content" data-content="error-handling"> <div class="content-section"> <h4>Error Format</h4> <p>All API errors follow a consistent JSON format:</p> <pre><code>{ "error": { "code": "invalid_request", "message": "Required parameter 'collection_id' is missing", "details": [{ "field": "collection_id", "issue": "required" }], "request_id": "req_7PxEzpQH2iL8Vy", "documentation_url": "https://docs.cloudsync.dev/api/errors#invalid_request" } }</code></pre> </div> <div class="content-section"> <h4>Common Error Codes</h4> <table style="width: 100%; border-collapse: collapse; margin: 15px 0;"> <tr style="border-bottom: 1px solid rgba(255,255,255,0.1);"> <th style="text-align: left; padding: 8px 0;">Status Code</th> <th style="text-align: left; padding: 8px 0;">Error Code</th> <th style="text-align: left; padding: 8px 0;">Description</th> </tr> <tr style="border-bottom: 1px solid rgba(255,255,255,0.05);"> <td style="padding: 8px 0;">400</td> <td><code>invalid_request</code></td> <td>Malformed request or missing parameters</td> </tr> <tr style="border-bottom: 1px solid rgba(255,255,255,0.05);"> <td style="padding: 8px 0;">401</td> <td><code>unauthorized</code></td> <td>Invalid or expired authentication token</td> </tr> <tr style="border-bottom: 1px solid rgba(255,255,255,0.05);"> <td style="padding: 8px 0;">403</td> <td><code>forbidden</code></td> <td>Valid authentication but insufficient permissions</td> </tr> <tr style="border-bottom: 1px solid rgba(255,255,255,0.05);"> <td style="padding: 8px 0;">404</td> <td><code>not_found</code></td> <td>Requested resource does not exist</td> </tr> <tr style="border-bottom: 1px solid rgba(255,255,255,0.05);"> <td style="padding: 8px 0;">409</td> <td><code>conflict</code></td> <td>Request conflicts with current state of the resource</td> </tr> <tr style="border-bottom: 1px solid rgba(255,255,255,0.05);"> <td style="padding: 8px 0;">422</td> <td><code>validation_failed</code></td> <td>Request data failed validation rules</td> </tr> <tr> <td style="padding: 8px 0;">429</td> <td><code>rate_limited</code></td> <td>Too many requests, rate limit exceeded</td> </tr> </table> </div> <div class="content-section"> <h4>Handling Errors</h4> <p>Best practices for client-side error handling:</p> <ol> <li>Always check the HTTP status code and parse the error response.</li> <li>Implement retry logic with exponential backoff for 429 errors and some 5xx errors.</li> <li>Log the <code>request_id</code> for troubleshooting with support.</li> <li>Provide meaningful error messages to end-users.</li> </ol> </div> <div class="warning-box"> Never retry authentication failures (401) with the same credentials, as this may trigger account lockouts after multiple failed attempts. </div> </div> </div> <div class="accordion-item"> <div class="accordion-header" data-accordion="schema-validation"> <h3> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M9 5H7C5.89543 5 5 5.89543 5 7V19C5 20.1046 5.89543 21 7 21H17C18.1046 21 19 20.1046 19 19V7C19 5.89543 18.1046 5 17 5H15M9 5C9 6.10457 9.89543 7 11 7H13C14.1046 7 15 6.10457 15 5M9 5C9 3.89543 9.89543 3 11 3H13C14.1046 3 15 3.89543 15 5M12 12H15M12 16H15M9 12H9.01M9 16H9.01" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> Schema Validation </h3> <svg class="icon" width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M19 9L12 16L5 9" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </div> <div class="accordion-content" data-content="schema-validation"> <div class="content-section"> <h4>Overview</h4> <p>CloudSync uses JSON Schema to validate data before insertion. Each collection requires a schema definition that describes the structure of documents it can contain.</p> </div> <div class="content-section"> <h4>Schema Definition</h4> <p>Schemas are defined using JSON Schema draft-07 format. Here's an example schema for a sensor readings collection:</p> <div class="code-with-header"> <div class="code-header"> <span>JSON Schema Example</span> <button class="copy-button" data-code="{ \"type\": \"object\", \"properties\": { \"device_id\": { \"type\": \"string\", \"pattern\": \"^sensor-[A-Z0-9]{5}$\", \"description\": \"Unique sensor identifier\" }, \"readings\": { \"type\": \"object\", \"properties\": { \"temperature\": { \"type\": \"number\", \"minimum\": -40, \"maximum\": 125 }, \"humidity\": { \"type\": \"number\", \"minimum\": 0, \"maximum\": 100 }, \"pressure\": { \"type\": \"number\", \"minimum\": 800, \"maximum\": 1200 } }, \"required\": [\"temperature\", \"humidity\"] }, \"timestamp\": { \"type\": \"string\", \"format\": \"date-time\" }, \"status\": { \"type\": \"string\", \"enum\": [\"active\", \"maintenance\", \"error
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> :root { --primary: #4A6FFF; --secondary: #6C3CE9; --dark: #1A1D2C; --light: #F8F9FC; --subtle: #8D92A3; --success: #32D583; --warning: #FFB020; --danger: #FF4D6A; --shadow: 0 4px 20px rgba(0, 0, 0, 0.15); --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; } body { background-color: var(--light); color: var(--dark); transition: var(--transition); display: flex; flex-direction: column; align-items: center; justify-content: flex-start; min-height: 100vh; padding: 1.5rem; width: 100%; overflow-x: hidden; } body.dark-mode { background-color: var(--dark); color: var(--light); } .dashboard-container { max-width: 650px; width: 100%; margin: 0 auto; } .dashboard-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.5rem; padding-bottom: 1rem; border-bottom: 1px solid rgba(141, 146, 163, 0.2); } .dashboard-title { font-size: 1.5rem; font-weight: 700; background: linear-gradient(90deg, var(--primary), var(--secondary)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .theme-toggle { background: none; border: none; cursor: pointer; width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; transition: var(--transition); background-color: rgba(106, 117, 160, 0.1); } .theme-toggle:hover { background-color: rgba(106, 117, 160, 0.2); } .theme-toggle svg { width: 20px; height: 20px; fill: none; stroke: var(--dark); stroke-width: 2; transition: var(--transition); } .dark-mode .theme-toggle svg { stroke: var(--light); } .accordion { list-style: none; width: 100%; } .accordion-item { margin-bottom: 1rem; border-radius: 12px; overflow: hidden; box-shadow: var(--shadow); transition: var(--transition); background: rgba(255, 255, 255, 0.9); backdrop-filter: blur(10px); } .dark-mode .accordion-item { background: rgba(38, 41, 56, 0.9); } .accordion-item:hover { transform: translateY(-2px); box-shadow: 0 6px 25px rgba(0, 0, 0, 0.18); } .accordion-button { display: flex; align-items: center; justify-content: space-between; width: 100%; padding: 1.25rem 1.5rem; border: none; background: none; cursor: pointer; text-align: left; color: inherit; transition: var(--transition); } .accordion-header { display: flex; align-items: center; gap: 0.75rem; } .accordion-icon { width: 2.5rem; height: 2.5rem; border-radius: 8px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; } .accordion-icon.revenue { background: rgba(74, 111, 255, 0.15); color: var(--primary); } .accordion-icon.users { background: rgba(108, 60, 233, 0.15); color: var(--secondary); } .accordion-icon.performance { background: rgba(50, 213, 131, 0.15); color: var(--success); } .accordion-icon.alerts { background: rgba(255, 176, 32, 0.15); color: var(--warning); } .accordion-icon.security { background: rgba(255, 77, 106, 0.15); color: var(--danger); } .accordion-title { font-weight: 600; font-size: 1.05rem; margin-bottom: 0.25rem; } .accordion-subtitle { font-size: 0.85rem; color: var(--subtle); max-width: 340px; } .accordion-arrow { flex-shrink: 0; width: 24px; height: 24px; transition: transform 0.3s ease; } .accordion-arrow svg { width: 100%; height: 100%; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; } .accordion-content { max-height: 0; overflow: hidden; transition: max-height 0.4s ease-in-out; padding: 0 1.5rem; } .accordion-item.active .accordion-content { max-height: 500px; padding-bottom: 1.5rem; } .accordion-item.active .accordion-arrow { transform: rotate(180deg); } .chart-container { width: 100%; height: 220px; margin-top: 1rem; border-radius: 8px; overflow: hidden; position: relative; } .chart-placeholder { width: 100%; height: 100%; display: grid; grid-template-columns: repeat(14, 1fr); grid-template-rows: repeat(6, 1fr); gap: 6px; } .chart-bar { border-radius: 4px; background: linear-gradient(180deg, var(--primary), var(--secondary)); opacity: 0; transform: scaleY(0); transform-origin: bottom; animation: barGrow 1s forwards ease-out; } .chart-dot { width: 8px; height: 8px; border-radius: 50%; background-color: var(--success); position: absolute; transform: scale(0); animation: dotPulse 1.5s infinite alternate ease-in-out; } .chart-line { position: absolute; height: 2px; background: linear-gradient(90deg, transparent, var(--success), transparent); transform-origin: left; transform: scaleX(0); animation: lineGrow 0.8s forwards ease-out; } .stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 1rem; margin-top: 1rem; } .stat-card { background: rgba(74, 111, 255, 0.08); border-radius: 8px; padding: 1rem; transition: var(--transition); } .dark-mode .stat-card { background: rgba(74, 111, 255, 0.15); } .stat-card:hover { transform: translateY(-2px); } .stat-title { font-size: 0.8rem; color: var(--subtle); margin-bottom: 0.5rem; } .stat-value { font-size: 1.5rem; font-weight: 700; margin-bottom: 0.25rem; } .stat-badge { display: inline-flex; align-items: center; font-size: 0.75rem; padding: 0.25rem 0.5rem; border-radius: 4px; font-weight: 500; } .badge-up { background-color: rgba(50, 213, 131, 0.15); color: var(--success); } .badge-down { background-color: rgba(255, 77, 106, 0.15); color: var(--danger); } .badge-neutral { background-color: rgba(141, 146, 163, 0.15); color: var(--subtle); } .user-list { list-style: none; margin-top: 1rem; } .user-item { display: flex; align-items: center; padding: 0.75rem 0; border-bottom: 1px solid rgba(141, 146, 163, 0.1); } .user-item:last-child { border-bottom: none; } .user-avatar { width: 36px; height: 36px; border-radius: 50%; margin-right: 0.75rem; background: linear-gradient(135deg, var(--primary), var(--secondary)); display: flex; align-items: center; justify-content: center; color: white; font-weight: 600; font-size: 0.8rem; } .user-info { flex: 1; } .user-name { font-weight: 500; font-size: 0.95rem; margin-bottom: 0.25rem; } .user-activity { font-size: 0.8rem; color: var(--subtle); } .user-status { font-size: 0.8rem; font-weight: 500; padding: 0.25rem 0.75rem; border-radius: 4px; margin-left: 0.5rem; } .status-active { background-color: rgba(50, 213, 131, 0.15); color: var(--success); } .status-idle { background-color: rgba(255, 176, 32, 0.15); color: var(--warning); } .performance-metrics { margin-top: 1rem; } .metric-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 0.75rem; } .metric-label { font-size: 0.9rem; } .metric-value { font-size: 0.9rem; font-weight: 600; } .progress-bar { width: 100%; height: 8px; background-color: rgba(141, 146, 163, 0.15); border-radius: 4px; margin-top: 0.25rem; overflow: hidden; } .progress-fill { height: 100%; border-radius: 4px; width: 0; transition: width 1s ease-out; } .fill-excellent { background: linear-gradient(90deg, #32D583, #40C3A2); } .fill-good { background: linear-gradient(90deg, #4A6FFF, #6C3CE9); } .fill-average { background: linear-gradient(90deg, #FFB020, #FFA443); } .fill-poor { background: linear-gradient(90deg, #FF4D6A, #FF6A92); } .alert-list { list-style: none; margin-top: 1rem; } .alert-item { display: flex; align-items: flex-start; padding: 0.75rem; border-radius: 8px; margin-bottom: 0.75rem; background-color: rgba(141, 146, 163, 0.08); transition: var(--transition); } .alert-item:hover { background-color: rgba(141, 146, 163, 0.15); } .alert-icon { width: 28px; height: 28px; border-radius: 6px; margin-right: 0.75rem; display: flex; align-items: center; justify-content: center; flex-shrink: 0; } .alert-critical { background-color: rgba(255, 77, 106, 0.15); color: var(--danger); } .alert-warning { background-color: rgba(255, 176, 32, 0.15); color: var(--warning); } .alert-info { background-color: rgba(74, 111, 255, 0.15); color: var(--primary); } .alert-content { flex: 1; } .alert-title { font-size: 0.9rem; font-weight: 500; margin-bottom: 0.25rem; } .alert-message { font-size: 0.8rem; color: var(--subtle); } .alert-time { font-size: 0.75rem; color: var(--subtle); margin-top: 0.25rem; } .security-stats { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1rem; margin-top: 1rem; } .security-card { padding: 1rem; border-radius: 8px; background-color: rgba(141, 146, 163, 0.08); display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; transition: var(--transition); } .security-card:hover { background-color: rgba(141, 146, 163, 0.15); transform: translateY(-2px); } .security-icon { width: 36px; height: 36px; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin-bottom: 0.5rem; background: linear-gradient(135deg, var(--primary), var(--secondary)); color: white; } .security-value { font-size: 1.25rem; font-weight: 700; margin-bottom: 0.25rem; } .security-label { font-size: 0.8rem; color: var(--subtle); } .security-timeline { margin-top: 1.5rem; position: relative; padding-left: 1.5rem; } .security-timeline::before { content: ''; position: absolute; left: 6px; top: 0; bottom: 0; width: 2px; background-color: rgba(141, 146, 163, 0.2); } .timeline-item { position: relative; padding-bottom: 1rem; } .timeline-dot { position: absolute; left: -1.5rem; top: 0.25rem; width: 14px; height: 14px; border-radius: 50%; background-color: var(--primary); border: 3px solid var(--light); transition: var(--transition); } .dark-mode .timeline-dot { border-color: var(--dark); } .timeline-content { font-size: 0.85rem; margin-bottom: 0.25rem; } .timeline-time { font-size: 0.75rem; color: var(--subtle); } @keyframes barGrow { 0% { opacity: 0; transform: scaleY(0); } 100% { opacity: 1; transform: scaleY(1); } } @keyframes dotPulse { 0% { transform: scale(0.8); } 100% { transform: scale(1.2); } } @keyframes lineGrow { 0% { transform: scaleX(0); } 100% { transform: scaleX(1); } } @media (max-width: 600px) { .accordion-button { padding: 1rem; } .accordion-content { padding: 0 1rem; } .accordion-item.active .accordion-content { padding-bottom: 1rem; } .accordion-subtitle { display: none; } .stats-grid { grid-template-columns: repeat(2, 1fr); } .security-stats { grid-template-columns: 1fr; } .chart-container { height: 180px; } } .data-badges { display: flex; margin-top: 1rem; flex-wrap: wrap; gap: 0.5rem; } .data-badge { font-size: 0.75rem; padding: 0.25rem 0.75rem; border-radius: 20px; background: rgba(74, 111, 255, 0.1); color: var(--primary); transition: var(--transition); cursor: pointer; } .data-badge:hover { background: rgba(74, 111, 255, 0.2); transform: translateY(-2px); } .data-badge.active { background: var(--primary); color: white; } </style> </head> <body> <div class="dashboard-container"> <header class="dashboard-header"> <h1 class="dashboard-title">Analytics Dashboard</h1> <button class="theme-toggle" aria-label="Toggle dark mode"> <svg viewBox="0 0 24 24"> <path class="sun-icon" d="M12 3v1m0 16v1m-9-9H2m19 0h-1M5.6 5.6l.7.7m12.1-.7l-.7.7m-12.1 12.1l.7-.7m12.1.7l-.7-.7M16 12a4 4 0 11-8 0 4 4 0 018 0z"></path> <path class="moon-icon" d="M12 3a6 6 0 00-6 9 6 6 0 0010.5 4 9 9 0 01-4.5-13z" style="display: none;"></path> </svg> </button> </header> <ul class="accordion"> <!-- Revenue Metrics --> <li class="accordion-item" data-section="revenue"> <button class="accordion-button"> <div class="accordion-header"> <div class="accordion-icon revenue"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <line x1="12" y1="1" x2="12" y2="23"></line> <path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"></path> </svg> </div> <div> <h3 class="accordion-title">Revenue Metrics</h3> <p class="accordion-subtitle">Track financial performance with key revenue indicators</p> </div> </div> <div class="accordion-arrow"> <svg viewBox="0 0 24 24"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </div> </button> <div class="accordion-content"> <div class="data-badges"> <span class="data-badge active">Last 7 days</span> <span class="data-badge">Last 30 days</span> <span class="data-badge">This quarter</span> <span class="data-badge">Year to date</span> </div> <div class="chart-container" id="revenue-chart"> <div class="chart-placeholder"></div> </div> <div class="stats-grid"> <div class="stat-card"> <p class="stat-title">Total Revenue</p> <p class="stat-value">$127,493</p> <span class="stat-badge badge-up">+12.3%</span> </div> <div class="stat-card"> <p class="stat-title">Avg. Order</p> <p class="stat-value">$94.28</p> <span class="stat-badge badge-up">+5.7%</span> </div> <div class="stat-card"> <p class="stat-title">Conversion</p> <p class="stat-value">3.18%</p> <span class="stat-badge badge-down">-0.4%</span> </div> </div> </div> </li> <!-- User Activity --> <li class="accordion-item" data-section="users"> <button class="accordion-button"> <div class="accordion-header"> <div class="accordion-icon users"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path> <circle cx="9" cy="7" r="4"></circle> <path d="M23 21v-2a4 4 0 0 0-3-3.87"></path> <path d="M16 3.13a4 4 0 0 1 0 7.75"></path> </svg> </div> <div> <h3 class="accordion-title">User Activity</h3> <p class="accordion-subtitle">Monitor user engagement and active status</p> </div> </div> <div class="accordion-arrow"> <svg viewBox="0 0 24 24"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </div> </button> <div class="accordion-content"> <div class="stats-grid"> <div class="stat-card"> <p class="stat-title">Active Users</p> <p class="stat-value">2,847</p> <span class="stat-badge badge-up">+216</span> </div> <div class="stat-card"> <p class="stat-title">Avg. Session</p> <p class="stat-value">6:42</p> <span class="stat-badge badge-up">+0:36</span> </div> </div> <ul class="user-list"> <li class="user-item"> <div class="user-avatar">JD</div> <div class="user-info"> <p class="user-name">Jamie Dornan</p> <p class="user-activity">Viewing transaction history</p> </div> <span class="user-status status-active">Active</span> </li> <li class="user-item"> <div class="user-avatar">KL</div> <div class="user-info"> <p class="user-name">Keira Lawson</p> <p class="user-activity">Browsing dashboard</p> </div> <span class="user-status status-active">Active</span> </li> <li class="user-item"> <div class="user-avatar">RM</div> <div class="user-info"> <p class="user-name">Ryan Maxwell</p> <p class="user-activity">Last active 14 minutes ago</p> </div> <span class="user-status status-idle">Idle</span> </li> </ul> </div> </li> <!-- Performance Metrics --> <li class="accordion-item" data-section="performance"> <button class="accordion-button"> <div class="accordion-header"> <div class="accordion-icon performance"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="22 12 18 12 15 21 9 3 6 12 2 12"></polyline> </svg> </div> <div> <h3 class="accordion-title">Performance Metrics</h3> <p class="accordion-subtitle">System performance and resource utilization</p> </div> </div> <div class="accordion-arrow"> <svg viewBox="0 0 24 24"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </div> </button> <div class="accordion-content"> <div class="performance-metrics"> <div class="metric-row"> <div class="metric-label">Server Response Time</div> <div class="metric-value">78ms</div> </div> <div class="progress-bar"> <div class="progress-fill fill-excellent" data-width="92"></div> </div> <div class="metric-row" style="margin-top: 1rem;"> <div class="metric-label">CPU Utilization</div> <div class="metric-value">42%</div> </div> <div class="progress-bar"> <div class="progress-fill fill-good" data-width="42"></div> </div> <div class="metric-row" style="margin-top: 1rem;"> <div class="metric-label">Memory Usage</div> <div class="metric-value">68%</div> </div> <div class="progress-bar"> <div class="progress-fill fill-average" data-width="68"></div> </div> <div class="metric-row" style="margin-top: 1rem;"> <div class="metric-label">Database Query Time</div> <div class="metric-value">215ms</div> </div> <div class="progress-bar"> <div class="progress-fill fill-poor" data-width="76"></div> </div> </div> </div> </li> <!-- System Alerts --> <li class="accordion-item" data-section="alerts"> <button class="accordion-button"> <div class="accordion-header"> <div class="accordion-icon alerts"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"></path> <line x1="12" y1="9" x2="12" y2="13"></line> <line x1="12" y1="17" x2="12.01" y2="17"></line> </svg> </div> <div> <h3 class="accordion-title">System Alerts</h3> <p class="accordion-subtitle">Critical notifications and system warnings</p> </div> </div> <div class="accordion-arrow"> <svg viewBox="0 0 24 24"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </div> </button> <div class="accordion-content"> <ul class="alert-list"> <li class="alert-item"> <div class="alert-icon alert-critical"> <svg width="16" height="16" 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> <line x1="12" y1="8" x2="12" y2="12"></line> <line x1="12" y1="16" x2="12.01" y2="16"></line> </svg> </div> <div class="alert-content"> <h4 class="alert-title">Database Connection Error</h4> <p class="alert-message">Intermittent connection failures detected on production database cluster</p> <p class="alert-time">32 minutes ago</p> </div> </li> <li class="alert-item"> <div class="alert-icon alert-warning"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"></path> <line x1="12" y1="9" x2="12" y2="13"></line> <line x1="12" y1="17" x2="12.01" y2="17"></line> </svg> </div> <div class="alert-content"> <h4 class="alert-title">Memory Usage High</h4> <p class="alert-message">Application server memory usage exceeds 85% threshold</p> <p class="alert-time">1 hour ago</p> </div> </li> <li class="alert-item"> <div class="alert-icon alert-info"> <svg width="16" height="16" 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> <line x1="12" y1="16" x2="12" y2="12"></line> <line x1="12" y1="8" x2="12.01" y2="8"></line> </svg> </div> <div class="alert-content"> <h4 class="alert-title">API Response Slow</h4> <p class="alert-message">Third-party payment API responses exceeding 2s SLA</p> <p class="alert-time">3 hours ago</p> </div> </li> </ul> </div> </li> <!-- Security Overview --> <li class="accordion-item" data-section="security"> <button class="accordion-button"> <div class="accordion-header"> <div class="accordion-icon security"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path> </svg> </div> <div> <h3 class="accordion-title">Security Overview</h3> <p class="accordion-subtitle">System security status and recent activities</p> </div> </div> <div class="accordion-arrow"> <svg viewBox="0 0 24 24"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </div> </button> <div class="accordion-content"> <div class="security-stats"> <div class="security-card"> <div class="security-icon"> <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M21 2l-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4"></path> </svg> </div> <p class="security-value">3</p> <p class="security-label">Failed Login Attempts</p> </div> <div class="security-card"> <div class="security-icon"> <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect> <path d="M7 11V7a5 5 0 0 1 10 0v4"></path> </svg> </div> <p class="security-value">98%</p> <p class="security-label">Security Score</p> </div> <div class="security-card"> <div class="security-icon"> <svg width="18" height="18" 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> <path d="M9 12l2 2 4-4"></path> </svg> </div> <p class="security-value">0</p> <p class="security-label">Vulnerabilities</p> </div> <div class="security-card"> <div class="security-icon"> <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Media Library Accordion</title> <style> :root { --pastel-blue: #e0f2fe; --pastel-pink: #fce7f3; --pastel-green: #dcfce7; --pastel-yellow: #fef9c3; --accent-blue: #38bdf8; --accent-pink: #ec4899; --accent-green: #22c55e; --accent-yellow: #facc15; --text-dark: #1e293b; --text-light: #94a3b8; --shadow: rgba(0, 0, 0, 0.05); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', sans-serif; } body { background: linear-gradient(135deg, var(--pastel-blue) 0%, var(--pastel-pink) 100%); height: 100%; display: flex; justify-content: center; align-items: center; padding: 1rem; } .container { max-width: 700px; width: 100%; height: 100%; max-height: 700px; overflow-y: auto; padding: 1.5rem; background-color: rgba(255, 255, 255, 0.9); border-radius: 16px; box-shadow: 0 12px 24px var(--shadow); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); } .header { text-align: center; margin-bottom: 1.5rem; } .header h1 { font-size: 2rem; color: var(--text-dark); margin-bottom: 0.5rem; background: linear-gradient(90deg, var(--accent-blue), var(--accent-pink)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .header p { color: var(--text-light); font-size: 0.9rem; max-width: 80%; margin: 0 auto; } .accordion { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1rem; } .accordion-item { position: relative; border-radius: 12px; overflow: hidden; box-shadow: 0 4px 12px var(--shadow); transition: transform 0.3s ease, box-shadow 0.3s ease; cursor: pointer; height: 200px; } .accordion-item:hover { transform: translateY(-5px); box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1); } .accordion-header { position: relative; height: 200px; overflow: hidden; } .accordion-header img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.5s ease; } .accordion-item:hover .accordion-header img { transform: scale(1.05); } .accordion-title { position: absolute; bottom: 0; left: 0; right: 0; padding: 1rem; background: linear-gradient(to top, rgba(0, 0, 0, 0.8), transparent); color: white; font-weight: 600; font-size: 1.1rem; opacity: 1; transition: opacity 0.3s ease; } .accordion-content { height: 0; opacity: 0; overflow: hidden; transition: height 0.5s ease, opacity 0.3s ease; background-color: white; padding: 0 1rem; } .accordion-item.active { height: auto; } .accordion-item.active .accordion-content { height: auto; padding: 1rem; opacity: 1; } .accordion-item.active .accordion-title { opacity: 0; } .content-inner { display: flex; flex-direction: column; gap: 1rem; } .content-header { display: flex; justify-content: space-between; align-items: center; } .content-header h3 { color: var(--text-dark); font-size: 1.2rem; } .content-header .close-btn { background: none; border: none; color: var(--text-light); cursor: pointer; font-size: 1.5rem; transition: color 0.3s; } .content-header .close-btn:hover { color: var(--accent-pink); } .content-body { color: var(--text-light); font-size: 0.9rem; line-height: 1.5; } .content-preview { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.5rem; margin-top: 0.5rem; } .preview-img { border-radius: 8px; overflow: hidden; aspect-ratio: 1/1; position: relative; } .preview-img img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.3s ease; } .preview-img:hover img { transform: scale(1.1); } .content-footer { display: flex; justify-content: space-between; align-items: center; margin-top: 1rem; padding-top: 1rem; border-top: 1px solid #f1f5f9; } .tags { display: flex; gap: 0.5rem; } .tag { font-size: 0.7rem; padding: 0.25rem 0.5rem; border-radius: 40px; color: white; } .tag.photo { background-color: var(--accent-blue); } .tag.video { background-color: var(--accent-pink); } .tag.design { background-color: var(--accent-green); } .tag.audio { background-color: var(--accent-yellow); } .view-button { background: none; border: 1px solid var(--accent-blue); color: var(--accent-blue); padding: 0.35rem 0.75rem; border-radius: 40px; cursor: pointer; font-size: 0.8rem; transition: all 0.3s ease; } .view-button:hover { background-color: var(--accent-blue); color: white; } @media (max-width: 600px) { .accordion { grid-template-columns: 1fr; } .container { padding: 1rem; } .header h1 { font-size: 1.5rem; } } /* Loading animation for images */ .image-container { position: relative; overflow: hidden; } .image-container::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); animation: shimmer 1.5s infinite; z-index: 1; } @keyframes shimmer { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } } .loaded .image-container::before { display: none; } /* Custom scrollbar */ .container::-webkit-scrollbar { width: 8px; } .container::-webkit-scrollbar-track { background: rgba(241, 245, 249, 0.5); border-radius: 10px; } .container::-webkit-scrollbar-thumb { background: linear-gradient(var(--accent-blue), var(--accent-pink)); border-radius: 10px; } .container::-webkit-scrollbar-thumb:hover { background: linear-gradient(var(--accent-pink), var(--accent-blue)); } /* Grid pattern overlay */ .container::after { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-image: linear-gradient(to right, var(--shadow) 1px, transparent 1px), linear-gradient(to bottom, var(--shadow) 1px, transparent 1px); background-size: 20px 20px; pointer-events: none; opacity: 0.3; z-index: -1; border-radius: 16px; } </style> </head> <body> <div class="container"> <div class="header"> <h1>Creative Portfolio</h1> <p>Explore our curated collection of visual stories, motion graphics, and design projects</p> </div> <div class="accordion"> <div class="accordion-item"> <div class="accordion-header"> <div class="image-container"> <img src="https://images.unsplash.com/photo-1520209759809-a9bcb6cb3241?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=600&q=80" alt="Urban Photography"> </div> <div class="accordion-title">Urban Photography</div> </div> <div class="accordion-content"> <div class="content-inner"> <div class="content-header"> <h3>Urban Photography</h3> <button class="close-btn">×</button> </div> <div class="content-body"> <p>A visual exploration of urban landscapes and street compositions from the world's most vibrant cities. Each image captures the rhythm and flow of city life.</p> </div> <div class="content-preview"> <div class="preview-img"> <img src="https://images.unsplash.com/photo-1449824913935-59a10b8d2000?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=200&q=80" alt="Urban 1"> </div> <div class="preview-img"> <img src="https://images.unsplash.com/photo-1444723121867-7a241cacace9?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=200&q=80" alt="Urban 2"> </div> <div class="preview-img"> <img src="https://images.unsplash.com/photo-1493246507139-91e8fad9978e?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=200&q=80" alt="Urban 3"> </div> </div> <div class="content-footer"> <div class="tags"> <span class="tag photo">Photography</span> <span class="tag design">Urban</span> </div> <button class="view-button">View Collection</button> </div> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="image-container"> <img src="https://images.unsplash.com/photo-1551269901-5c5e14c25df7?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=600&q=80" alt="Motion Graphics"> </div> <div class="accordion-title">Motion Graphics</div> </div> <div class="accordion-content"> <div class="content-inner"> <div class="content-header"> <h3>Motion Graphics</h3> <button class="close-btn">×</button> </div> <div class="content-body"> <p>Dynamic animated visuals that transform concepts into captivating stories. Our motion graphics blend illustration, typography, and sound for immersive experiences.</p> </div> <div class="content-preview"> <div class="preview-img"> <img src="https://images.unsplash.com/photo-1550745165-9bc0b252726f?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=200&q=80" alt="Motion 1"> </div> <div class="preview-img"> <img src="https://images.unsplash.com/photo-1518136247453-74e7b5265980?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=200&q=80" alt="Motion 2"> </div> <div class="preview-img"> <img src="https://images.unsplash.com/photo-1633507104446-7f6bf2a99d93?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=200&q=80" alt="Motion 3"> </div> </div> <div class="content-footer"> <div class="tags"> <span class="tag video">Video</span> <span class="tag design">Animation</span> </div> <button class="view-button">View Collection</button> </div> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="image-container"> <img src="https://images.unsplash.com/photo-1558655146-d09347e92766?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=600&q=80" alt="Print Design"> </div> <div class="accordion-title">Print Design</div> </div> <div class="accordion-content"> <div class="content-inner"> <div class="content-header"> <h3>Print Design</h3> <button class="close-btn">×</button> </div> <div class="content-body"> <p>Tactile and expressive print materials that marry form and function. From editorial layouts to packaging design, our print portfolio showcases the enduring power of physical media.</p> </div> <div class="content-preview"> <div class="preview-img"> <img src="https://images.unsplash.com/photo-1571498664957-fde285d79881?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=200&q=80" alt="Print 1"> </div> <div class="preview-img"> <img src="https://images.unsplash.com/photo-1635594701516-e8da65da5d89?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=200&q=80" alt="Print 2"> </div> <div class="preview-img"> <img src="https://images.unsplash.com/photo-1576075796033-848c2a5f3696?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=200&q=80" alt="Print 3"> </div> </div> <div class="content-footer"> <div class="tags"> <span class="tag design">Design</span> <span class="tag photo">Editorial</span> </div> <button class="view-button">View Collection</button> </div> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="image-container"> <img src="https://images.unsplash.com/photo-1470225620780-dba8ba36b745?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=600&q=80" alt="Sound Design"> </div> <div class="accordion-title">Sound Design</div> </div> <div class="accordion-content"> <div class="content-inner"> <div class="content-header"> <h3>Sound Design</h3> <button class="close-btn">×</button> </div> <div class="content-body"> <p>Immersive audio landscapes that engage the senses and enhance storytelling. Our sound design work spans ambient compositions, sonic branding, and podcast production.</p> </div> <div class="content-preview"> <div class="preview-img"> <img src="https://images.unsplash.com/photo-1485579149621-3123dd979885?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=200&q=80" alt="Sound 1"> </div> <div class="preview-img"> <img src="https://images.unsplash.com/photo-1558584673-c834fb1cc3ca?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=200&q=80" alt="Sound 2"> </div> <div class="preview-img"> <img src="https://images.unsplash.com/photo-1511379938547-c1f69419868d?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=200&q=80" alt="Sound 3"> </div> </div> <div class="content-footer"> <div class="tags"> <span class="tag audio">Audio</span> <span class="tag design">Composition</span> </div> <button class="view-button">View Collection</button> </div> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="image-container"> <img src="https://images.unsplash.com/photo-1617050318658-a9a22424d791?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=600&q=80" alt="Digital Art"> </div> <div class="accordion-title">Digital Art</div> </div> <div class="accordion-content"> <div class="content-inner"> <div class="content-header"> <h3>Digital Art</h3> <button class="close-btn">×</button> </div> <div class="content-body"> <p>Boundary-pushing digital illustrations and conceptual artwork that blend traditional techniques with cutting-edge tools. Each piece reflects our studio's experimental approach.</p> </div> <div class="content-preview"> <div class="preview-img"> <img src="https://images.unsplash.com/photo-1554188248-986adbb73be4?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=200&q=80" alt="Digital 1"> </div> <div class="preview-img"> <img src="https://images.unsplash.com/photo-1563089145-599997674d42?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=200&q=80" alt="Digital 2"> </div> <div class="preview-img"> <img src="https://images.unsplash.com/photo-1618005182384-a83a8bd57fbe?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=200&q=80" alt="Digital 3"> </div> </div> <div class="content-footer"> <div class="tags"> <span class="tag design">Digital</span> <span class="tag photo">Illustration</span> </div> <button class="view-button">View Collection</button> </div> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="image-container"> <img src="https://images.unsplash.com/photo-1461749280684-dccba630e2f6?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=600&q=80" alt="Interactive Media"> </div> <div class="accordion-title">Interactive Media</div> </div> <div class="accordion-content"> <div class="content-inner"> <div class="content-header"> <h3>Interactive Media</h3> <button class="close-btn">×</button> </div> <div class="content-body"> <p>Responsive user experiences that invite participation and discovery. Our interactive projects combine creative coding, thoughtful UX, and data visualization to engage audiences.</p> </div> <div class="content-preview"> <div class="preview-img"> <img src="https://images.unsplash.com/photo-1517292987719-0369a794ec0f?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=200&q=80" alt="Interactive 1"> </div> <div class="preview-img"> <img src="https://images.unsplash.com/photo-1581092335397-9583eb92d232?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=200&q=80" alt="Interactive 2"> </div> <div class="preview-img"> <img src="https://images.unsplash.com/photo-1561736778-92e52a7769ef?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=200&q=80" alt="Interactive 3"> </div> </div> <div class="content-footer"> <div class="tags"> <span class="tag design">Interactive</span> <span class="tag video">Web</span> </div> <button class="view-button">View Collection</button> </div> </div> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const accordionItems = document.querySelectorAll('.accordion-item'); const images = document.querySelectorAll('img'); // Add loaded class once images are loaded images.forEach(img => { if (img.complete) { img.parentElement.classList.add('loaded'); } else { img.addEventListener('load', function() { this.parentElement.classList.add('loaded'); }); } }); // Handle accordion item click accordionItems.forEach(item => { item.addEventListener('click', function(e) { // If close button was clicked, just close this item if (e.target.classList.contains('close-btn')) { this.classList.remove('active'); return; } // If view button was clicked, prevent toggling if (e.target.classList.contains('view-button')) { e.stopPropagation(); // Add custom handling for the view button click const collection = e.target.closest('.accordion-item').querySelector('.accordion-title').textContent; console.log(`Viewing ${collection} collection`); return; } // Check if clicking inside content area but not on a button if (e.target.closest('.content-inner') && !e.target.classList.contains('close-btn')) { return; } // First close all other accordion items accordionItems.forEach(otherItem => { if (otherItem !== this) { otherItem.classList.remove('active'); } }); // Then toggle the clicked item this.classList.toggle('active'); // If the item is now active, scroll it into view if (this.classList.contains('active')) { // Use a slight delay to allow the accordion to expand setTimeout(() => { this.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }, 300); } }); }); // Add subtle hover effect for preview images const previewImages = document.querySelectorAll('.preview-img'); previewImages.forEach(preview => { preview.addEventListener('mouseenter', function() { this.style.zIndex = '2'; }); preview.addEventListener('mouseleave', function() { this.style.zIndex = '1'; }); }); // Custom interaction for view buttons const viewButtons = document.querySelectorAll('.view-button'); viewButtons.forEach(button => { button.addEventListener('mouseenter', function() { this.style.transform = 'translateY(-2px)'; }); button.addEventListener('mouseleave', function() { this.style.transform = 'translateY(0)'; }); button.addEventListener('click', function(e) { e.stopPropagation(); const ripple = document.createElement('span'); ripple.style.position = 'absolute'; ripple.style.borderRadius = '50%'; ripple.style.backgroundColor = 'rgba(56, 189, 248, 0.3)'; ripple.style.width = '100px'; ripple.style.height = '100px'; ripple.style.transform = 'translate(-50%, -50%) scale(0)'; ripple.style.animation = 'ripple 0.6s linear'; this.style.position = 'relative'; this.style.overflow = 'hidden'; const rect = this.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; ripple.style.left = x + 'px'; ripple.style.top = y + 'px'; this.appendChild(ripple); setTimeout(() => { ripple.remove(); }, 600); }); }); // Add ripple animation const style = document.createElement('style'); style.textContent = ` @keyframes ripple { to { transform: translate(-50%, -50%) scale(3); opacity: 0; } } `; document.head.appendChild(style); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Enterprise Intranet Accordion</title> <style> :root { --primary-color: #2c3e50; --secondary-color: #34495e; --accent-color: #3498db; --success-color: #27ae60; --warning-color: #f39c12; --danger-color: #e74c3c; --light-gray: #ecf0f1; --dark-gray: #7f8c8d; --white: #ffffff; --box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); --transition: all 0.3s ease; } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f5f7fa; color: var(--primary-color); line-height: 1.6; padding: 20px; max-width: 700px; margin: 0 auto; height: 100vh; display: flex; flex-direction: column; } .intranet-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 20px; padding-bottom: 15px; border-bottom: 1px solid var(--light-gray); } .intranet-title { font-size: 24px; font-weight: 600; color: var(--primary-color); display: flex; align-items: center; } .intranet-title svg { margin-right: 10px; fill: var(--accent-color); } .portal-info { display: flex; align-items: center; font-size: 13px; color: var(--dark-gray); } .portal-info .status { display: flex; align-items: center; margin-right: 15px; } .status-indicator { width: 10px; height: 10px; border-radius: 50%; margin-right: 5px; background-color: var(--success-color); position: relative; display: inline-block; } .status-indicator::after { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; border-radius: 50%; background-color: var(--success-color); opacity: 0.5; animation: pulse 2s infinite; } @keyframes pulse { 0% { transform: scale(1); opacity: 0.5; } 50% { transform: scale(1.5); opacity: 0; } 100% { transform: scale(1); opacity: 0; } } .accordion-container { border-radius: 8px; overflow: hidden; box-shadow: var(--box-shadow); background-color: var(--white); flex-grow: 1; display: flex; flex-direction: column; } .accordion-item { border-bottom: 1px solid var(--light-gray); transition: var(--transition); } .accordion-item:last-child { border-bottom: none; } .accordion-header { padding: 15px 20px; display: flex; align-items: center; justify-content: space-between; cursor: pointer; transition: var(--transition); position: relative; overflow: hidden; background-color: var(--white); } .accordion-header:hover { background-color: #f8f9fa; } .accordion-header::before { content: ""; position: absolute; left: 0; top: 0; height: 100%; width: 5px; background-color: transparent; transition: var(--transition); } .accordion-item.active .accordion-header::before { background-color: var(--accent-color); } .accordion-title { font-weight: 600; display: flex; align-items: center; gap: 10px; } .accordion-title svg { width: 20px; height: 20px; fill: var(--dark-gray); transition: var(--transition); } .accordion-item.active .accordion-title svg { fill: var(--accent-color); } .meta-info { display: flex; align-items: center; gap: 12px; } .badge { padding: 2px 8px; border-radius: 12px; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; } .badge-success { background-color: rgba(39, 174, 96, 0.1); color: var(--success-color); } .badge-warning { background-color: rgba(243, 156, 18, 0.1); color: var(--warning-color); } .badge-info { background-color: rgba(52, 152, 219, 0.1); color: var(--accent-color); } .badge-danger { background-color: rgba(231, 76, 60, 0.1); color: var(--danger-color); } .notification-count { display: inline-flex; align-items: center; justify-content: center; width: 20px; height: 20px; background-color: var(--accent-color); color: var(--white); font-size: 11px; font-weight: 600; border-radius: 50%; } .chevron { transition: var(--transition); fill: var(--dark-gray); } .accordion-item.active .chevron { transform: rotate(180deg); fill: var(--accent-color); } .accordion-content { max-height: 0; overflow: hidden; transition: max-height 0.3s ease; background-color: #fafbfc; padding: 0 20px; } .accordion-item.active .accordion-content { max-height: 500px; } .content-inner { padding: 20px 0; opacity: 0; transform: translateY(-10px); transition: opacity 0.3s ease, transform 0.3s ease; transition-delay: 0.1s; } .accordion-item.active .content-inner { opacity: 1; transform: translateY(0); } .action-links { display: flex; gap: 10px; margin-top: 15px; } .action-link { display: inline-flex; align-items: center; gap: 5px; color: var(--accent-color); text-decoration: none; font-weight: 500; font-size: 14px; padding: 5px 10px; border-radius: 4px; transition: var(--transition); } .action-link:hover { background-color: rgba(52, 152, 219, 0.1); } .action-link svg { width: 16px; height: 16px; fill: var(--accent-color); } .inline-notification { padding: 10px 15px; border-radius: 6px; margin-top: 15px; display: flex; align-items: flex-start; gap: 10px; } .notification-warning { background-color: rgba(243, 156, 18, 0.1); border-left: 3px solid var(--warning-color); } .notification-info { background-color: rgba(52, 152, 219, 0.1); border-left: 3px solid var(--accent-color); } .notification-success { background-color: rgba(39, 174, 96, 0.1); border-left: 3px solid var(--success-color); } .notification-icon { margin-top: 3px; } .notification-icon svg { width: 16px; height: 16px; } .notification-warning .notification-icon svg { fill: var(--warning-color); } .notification-info .notification-icon svg { fill: var(--accent-color); } .notification-success .notification-icon svg { fill: var(--success-color); } .notification-content { flex: 1; } .notification-title { font-weight: 600; font-size: 14px; margin-bottom: 3px; } .notification-warning .notification-title { color: var(--warning-color); } .notification-info .notification-title { color: var(--accent-color); } .notification-success .notification-title { color: var(--success-color); } .notification-message { font-size: 13px; color: var(--secondary-color); } .search-container { margin-bottom: 20px; position: relative; } .search-input { width: 100%; padding: 10px 15px 10px 40px; border: 1px solid var(--light-gray); border-radius: 6px; font-size: 14px; color: var(--primary-color); background-color: var(--white); transition: var(--transition); } .search-input:focus { outline: none; border-color: var(--accent-color); box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.2); } .search-icon { position: absolute; left: 15px; top: 50%; transform: translateY(-50%); fill: var(--dark-gray); width: 16px; height: 16px; } .accordion-footer { display: flex; justify-content: flex-end; padding: 15px 20px; background-color: #f8f9fa; border-top: 1px solid var(--light-gray); } .load-more-btn { background-color: transparent; border: 1px solid var(--accent-color); color: var(--accent-color); padding: 6px 12px; border-radius: 4px; font-size: 13px; font-weight: 500; cursor: pointer; transition: var(--transition); display: flex; align-items: center; gap: 5px; } .load-more-btn:hover { background-color: rgba(52, 152, 219, 0.1); } /* Responsive */ @media (max-width: 500px) { .intranet-header { flex-direction: column; align-items: flex-start; gap: 10px; } .portal-info { width: 100%; justify-content: space-between; } .accordion-header { padding: 15px; } .accordion-title { font-size: 15px; } .meta-info { gap: 8px; } } </style> </head> <body> <div class="intranet-header"> <div class="intranet-title"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path d="M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm6 13h-5v5h-2v-5h-5v-2h5v-5h2v5h5v2z"/> </svg> GlobalTech Intranet </div> <div class="portal-info"> <div class="status"> <span class="status-indicator"></span> System Online </div> <div>Last Updated: 15 minutes ago</div> </div> </div> <div class="search-container"> <svg class="search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/> </svg> <input type="text" class="search-input" placeholder="Search portal resources..."> </div> <div class="accordion-container"> <div class="accordion-item active"> <div class="accordion-header"> <div class="accordion-title"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm-2 8v8h7v-2h-5v-6h-2z"/> </svg> Quarterly Reports </div> <div class="meta-info"> <span class="badge badge-success">Updated</span> <span class="notification-count">3</span> <svg class="chevron" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24"> <path d="M0 7.33l2.829-2.83 9.175 9.339 9.167-9.339 2.829 2.83-11.996 12.17z"/> </svg> </div> </div> <div class="accordion-content"> <div class="content-inner"> <p>Access the latest financial reports, performance metrics and departmental analytics for Q3 2023.</p> <div class="inline-notification notification-info"> <div class="notification-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm-.001 5.75c.69 0 1.251.56 1.251 1.25s-.561 1.25-1.251 1.25-1.249-.56-1.249-1.25.559-1.25 1.249-1.25zm2.001 12.25h-4v-1c.484-.179 1-.201 1-.735v-4.467c0-.534-.516-.618-1-.797v-1h3v6.265c0 .535.517.558 1 .735v.999z"/> </svg> </div> <div class="notification-content"> <div class="notification-title">Finance Update</div> <div class="notification-message">Q3 financial reports have been audited and approved by the executive board.</div> </div> </div> <div class="action-links"> <a href="#" class="action-link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"/> </svg> View All Reports </a> <a href="#" class="action-link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M6 12c0 1.657-1.343 3-3 3s-3-1.343-3-3 1.343-3 3-3 3 1.343 3 3zm9 0c0 1.657-1.343 3-3 3s-3-1.343-3-3 1.343-3 3-3 3 1.343 3 3zm9 0c0 1.657-1.343 3-3 3s-3-1.343-3-3 1.343-3 3-3 3 1.343 3 3z"/> </svg> More Actions </a> </div> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="accordion-title"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M22 3v13h-11.643l-4.357 3.105v-3.105h-4v-13h20zm2-2h-24v16.981h4v5.019l7-5.019h13v-16.981zm-5 6h-14v-1h14v1zm0 2h-14v1h14v-1zm-6 3h-8v1h8v-1z"/> </svg> IT Announcements </div> <div class="meta-info"> <span class="badge badge-warning">Action Required</span> <svg class="chevron" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24"> <path d="M0 7.33l2.829-2.83 9.175 9.339 9.167-9.339 2.829 2.83-11.996 12.17z"/> </svg> </div> </div> <div class="accordion-content"> <div class="content-inner"> <p>Important updates from the IT department including system maintenance schedules and security advisories.</p> <div class="inline-notification notification-warning"> <div class="notification-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm-1.5 6h3v8h-3v-8zm0 10h3v2h-3v-2z"/> </svg> </div> <div class="notification-content"> <div class="notification-title">Scheduled Maintenance</div> <div class="notification-message">System downtime planned for Friday, Oct 15 from 8PM-11PM EST. Please save all work beforehand.</div> </div> </div> <div class="action-links"> <a href="#" class="action-link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M14 19v-.083c-1.178.685-2.542 1.083-4 1.083-4.411 0-8-3.589-8-8s3.589-8 8-8c1.458 0 2.822.398 4 1.083v-2.245c-1.226-.536-2.576-.838-4-.838-5.522 0-10 4.477-10 10s4.478 10 10 10c1.424 0 2.774-.302 4-.838v-2.162zm4-9h2v-2h-2v-2h-2v2h-2v2h2v2h2v-2zm-6-4.867v-2.133l6 3v-3l6 4-6 4v-3l-6 3v-2.132c0-3.287-2.713-6-6-6v2c2.206 0 4 1.794 4 4v15h2v-15c0-.747-.11-1.461-.295-2.135.602-.422 1.192-.877 1.76-1.364.522.802.85 1.735.95 2.732.193-.964.53-1.864.975-2.696-.224-.302-.459-.596-.707-.883-.634-.71-1.353-1.326-2.122-1.851-.291-.195-.587-.39-.892-.56.665.083 1.323.234 1.958.441.634-.815 1.061-1.823 1.213-2.924-1.175-.638-2.509-.989-3.883-.844-.27.527-.428 1.135-.428 1.766 0 1.273.613 2.396 1.548 3.122-.906.336-1.743.842-2.473 1.495-.146.133-.285.272-.419.417.226-.623.338-1.301.338-2.001z"/> </svg> Submit IT Request </a> </div> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="accordion-title"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M12 0c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm0 22c-5.514 0-10-4.486-10-10s4.486-10 10-10 10 4.486 10 10-4.486 10-10 10zm.5-15h-1v6.5l4.5 2.736.809-1.321-4.309-2.615v-5.3z"/> </svg> HR Policies </div> <div class="meta-info"> <span class="badge badge-info">For Review</span> <svg class="chevron" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24"> <path d="M0 7.33l2.829-2.83 9.175 9.339 9.167-9.339 2.829 2.83-11.996 12.17z"/> </svg> </div> </div> <div class="accordion-content"> <div class="content-inner"> <p>Access the latest human resources policies, employee handbooks, and workplace guidelines.</p> <div class="inline-notification notification-success"> <div class="notification-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm6.25 8.891l-1.421-1.409-6.105 6.218-3.078-2.937-1.396 1.436 4.5 4.319 7.5-7.627z"/> </svg> </div> <div class="notification-content"> <div class="notification-title">Remote Work Policy Updated</div> <div class="notification-message">The remote work policy has been updated to include new flexible arrangements effective Nov 1, 2023.</div> </div> </div> <div class="action-links"> <a href="#" class="action-link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M5 8.5c0-.828.672-1.5 1.5-1.5s1.5.672 1.5 1.5c0 .829-.672 1.5-1.5 1.5s-1.5-.671-1.5-1.5zm9 .5l-2.519 4-2.481-1.96-4 5.96h14l-5-8zm8-4v14h-20v-14h20zm2-2h-24v18h24v-18z"/> </svg> View Policy Documents </a> <a href="#" class="action-link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M13.744 8s1.522-8-3.335-8h-8.409v24h20v-13h-8.256zm-8.744 11v-17.199h5.199c1.685 0 3.376 1.114 3.198 3.199l-.179 2h7.782v12h-16z"/> </svg> Download HR Forms </a> </div> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="accordion-title"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm-1.834 9.686l-4.166.575 3.032 2.914-.74 4.139 3.708-1.982 3.708 1.983-.74-4.139 3.032-2.915-4.166-.575-1.834-3.784-1.834 3.784z"/> </svg> Company Events </div> <div class="meta-info"> <span class="badge badge-danger">New</span> <svg class="chevron" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24"> <path d="M0 7.33l2.829-2.83 9.175 9.339 9.167-9.339 2.829 2.83-11.996 12.17z"/> </svg> </div> </div> <div class="accordion-content"> <div class="content-inner"> <p>Stay updated on upcoming company events, team building activities, and workshops.</p> <div class="inline-notification notification-info"> <div class="notification-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M17 3v-2c0-.552.447-1 1-1s1 .448 1 1v2c0 .552-.447 1-1 1s-1-.448-1-1zm-12 1c.553 0 1-.448 1-1v-2c0-.552-.447-1-1-1-.553 0-1 .448-1 1v2c0 .552.447 1 1 1zm13 13v-3h-1v4h3v-1h-2zm-5 .5c0 2.481 2.019 4.5 4.5 4.5s4.5-2.019 4.5-4.5-2.019-4.5-4.5-4.5-4.5 2.019-4.5 4.5zm11 0c0 3.59-2.91 6.5-6.5 6.5s-6.5-2.91-6.5-6.5 2.91-6.5 6.5-6.5 6.5 2.91 6.5 6.5zm-14.237 3.5h-7.763v-13h19v1.763c.727.33 1.399.757 2 1.268v-9.031h-3v1c0 1.316-1.278 2.339-2.658 1.894-.831-.268-1.342-1.111-1.342-1.984v-.91h-9v1c0 1.316-1.278 2.339-2.658 1.894-.831-.268-1.342-1.111-1.342-1.984v-.91h-3v21h11.031c-.511-.601-.938-1.273-1.268-2z"/> </svg> </div> <div class="notification-content"> <div class="notification-title">Annual Company Retreat</div> <div class="notification-message">Registration for the annual retreat (Dec 10-12) is now open. Limited spots available.</div> </div> </div> <div class="action-links"> <a href="#" class="action-link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M24 2v22h-24v-22h3v1c0 1.103.897 2 2 2s2-.897 2-2v-1h10v1c0 1.103.897 2 2 2s2-.897 2-2v-1h3zm-2 6h-20v14h20v-14zm-2-7c0-.552-.447-1-1-1s-1 .448-1 1v2c0 .552.447 1 1 1s1-.448 1-1v-2zm-14 2c0 .552-.447 1-1 1s-1-.448-1-1v-2c0-.552.447-1 1-1s1 .448 1 1v2zm1 11.729l.855-.791c1 .484 1.635.852 2.76 1.654 2.113-2.399 3.511-3.616 6.106-5.231l.279.64c-2.141 1.869-3.709 3.949-5.967 7.999-1.393-1.64-2.322-2.686-4.033-4.271z"/> </svg> View Calendar </a> <a href="#" class="action-link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M10 13h-4v-1h4v1zm2.318-4.288l3.301 3.299-4.369.989.989-4.369 3.926-3.926s.937-.936 2.117.243l1.501 1.501s1.188 1.188.235 2.141l-3.926 3.926-6.866 1.97c-.078.022-.157.033-.236.033-.636 0-1.176-.455-1.287-1.081l-1.968-6.869 3.926-3.926c.702-.703 1.612-1.072 2.552-1.052 1.002.021 2.048.52 2.826 1.297l1.506 1.506c.778.777 1.276 1.823 1.3 2.829.022.948-.36 1.877-1.067 2.589l-4.36 4.36-3.301-3.3 4.176-4.177zm7.682 5.288c2.206 0 4 1.794 4 4s-1.794 4-4 4-4-1.794-4-4 1.794-4 4-4zm0 6c1.103 0 2-.897 2-2s-.897-2-2-2-2 .897-2 2 .897 2 2 2z"/> </svg> Register for Events </a> </div> </div> </div> </div> <div class="accordion-footer"> <button class="load-more-btn"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="#3498db"> <path d="M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm6 13h-5v5h-2v-5h-5v-2h5v-5h2v5h5v2z"/> </svg> Load More </button> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Accordion functionality const accordionHeaders = document.querySelectorAll('.accordion-header'); accordionHeaders.forEach(header => { header.addEventListener('click', function() { const item = this.parentElement; const isActive = item.classList.contains('active'); // Create ripple effect const ripple = document.createElement('span'); ripple.classList.add('ripple'); this.appendChild(ripple); // Position the ripple where clicked const rect = this.getBoundingClientRect(); const x = event.clientX - rect.left; const y = event.clientY - rect.top; ripple.style.cssText = ` position: absolute; background-color: rgba(52, 152, 219, 0.2); border-radius: 50%; width: 5px; height: 5px; top: ${y}px; left: ${x}px; transform: scale(0); animation: ripple-animation 0.6s linear; `; // Close all
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Academic Learning Management Accordion</title> <style> @import url('https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;500;600;700&family=Source+Sans+Pro:wght@300;400;600&display=swap'); * { box-sizing: border-box; margin: 0; padding: 0; } :root { --primary-blue: #243B55; --secondary-blue: #141E30; --highlight-blue: #4682B4; --light-blue: #E3EBF2; --cream: #F5F5F0; --gray: #555555; --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } body { font-family: 'Source Sans Pro', sans-serif; background-color: var(--cream); color: var(--gray); line-height: 1.6; display: flex; align-items: center; justify-content: center; min-height: 100vh; padding: 20px; } .lms-container { max-width: 650px; width: 100%; background: white; border-radius: 8px; box-shadow: 0 10px 30px rgba(36, 59, 85, 0.1); overflow: hidden; position: relative; } .lms-header { background: linear-gradient(135deg, var(--secondary-blue), var(--primary-blue)); color: white; padding: 25px 30px; border-bottom: 1px solid rgba(255, 255, 255, 0.1); position: relative; overflow: hidden; } .lms-header::before { content: ""; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: url("data:image/svg+xml,%3Csvg width='100' height='100' viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 18c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm48 25c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm-43-7c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm63 31c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM34 90c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm56-76c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM12 86c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm28-65c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm23-11c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-6 60c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm29 22c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zM32 63c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm57-13c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-9-21c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM60 91c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM35 41c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM12 60c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2z' fill='%23ffffff' fill-opacity='0.05' fill-rule='evenodd'/%3E%3C/svg%3E"); opacity: 0.3; } .lms-title { font-family: 'Playfair Display', serif; font-weight: 700; font-size: 28px; margin-bottom: 6px; position: relative; } .lms-subtitle { font-size: 16px; opacity: 0.8; font-weight: 300; } .academic-term { position: absolute; top: 20px; right: 30px; background-color: rgba(255, 255, 255, 0.15); padding: 5px 12px; border-radius: 20px; font-size: 14px; font-weight: 600; letter-spacing: 0.5px; } .course-progress-container { margin-top: 15px; display: flex; align-items: center; } .course-progress-bar { flex-grow: 1; height: 6px; background-color: rgba(255, 255, 255, 0.2); border-radius: 3px; overflow: hidden; margin-right: 15px; } .course-progress-fill { height: 100%; width: 45%; background-color: #7DC2AD; border-radius: 3px; transition: width 1.5s ease-in-out; position: relative; } .course-progress-fill::after { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient( 90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.3) 50%, rgba(255, 255, 255, 0) 100% ); animation: shimmer 2s infinite; } @keyframes shimmer { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } } .course-progress-label { font-size: 14px; color: rgba(255, 255, 255, 0.9); min-width: 50px; text-align: right; } .accordion-container { padding: 0; max-height: 450px; overflow-y: auto; scrollbar-width: thin; scrollbar-color: var(--highlight-blue) #eee; } .accordion-container::-webkit-scrollbar { width: 6px; } .accordion-container::-webkit-scrollbar-track { background: #eee; } .accordion-container::-webkit-scrollbar-thumb { background-color: var(--highlight-blue); border-radius: 20px; } .accordion-item { border-bottom: 1px solid rgba(0, 0, 0, 0.08); transition: var(--transition); } .accordion-item:last-child { border-bottom: none; } .accordion-header { display: flex; justify-content: space-between; align-items: center; padding: 20px 30px; cursor: pointer; transition: var(--transition); position: relative; } .accordion-header:hover { background-color: var(--light-blue); } .module-info { display: flex; align-items: center; flex-grow: 1; } .module-number { width: 36px; height: 36px; border-radius: 50%; background-color: var(--primary-blue); color: white; display: flex; align-items: center; justify-content: center; font-family: 'Playfair Display', serif; font-weight: 700; margin-right: 15px; position: relative; flex-shrink: 0; } .completed .module-number { background-color: #7DC2AD; } .module-number::after { content: ''; position: absolute; top: -3px; left: -3px; width: calc(100% + 6px); height: calc(100% + 6px); border-radius: 50%; border: 1px solid rgba(36, 59, 85, 0.2); transition: var(--transition); } .completed .module-number::after { border-color: rgba(125, 194, 173, 0.3); } .module-title { font-family: 'Playfair Display', serif; font-weight: 600; color: var(--primary-blue); font-size: 18px; margin-bottom: 2px; } .module-meta { display: flex; font-size: 13px; color: var(--gray); } .meta-item { display: flex; align-items: center; margin-right: 15px; } .meta-item svg { width: 14px; height: 14px; margin-right: 5px; fill: var(--highlight-blue); } .accordion-icon { width: 24px; height: 24px; position: relative; transition: transform 0.3s ease; } .accordion-icon::before, .accordion-icon::after { content: ''; position: absolute; background-color: var(--highlight-blue); transition: var(--transition); } .accordion-icon::before { width: 18px; height: 2px; top: 11px; left: 3px; } .accordion-icon::after { width: 2px; height: 18px; top: 3px; left: 11px; } .active .accordion-icon::after { transform: rotate(90deg); opacity: 0; } .accordion-content { max-height: 0; overflow: hidden; transition: max-height 0.5s ease, padding 0.5s ease; background-color: var(--light-blue); padding: 0 30px; } .accordion-content.active { max-height: 500px; padding: 0 30px 20px; } .lecture-list { list-style-type: none; margin-left: 51px; border-left: 1px dashed rgba(36, 59, 85, 0.2); } .lecture-item { position: relative; padding: 12px 0 12px 25px; transition: var(--transition); } .lecture-item:hover { background-color: rgba(255, 255, 255, 0.6); } .lecture-item::before { content: ''; position: absolute; left: -5px; top: 18px; width: 9px; height: 9px; border-radius: 50%; background-color: var(--light-blue); border: 1px solid var(--highlight-blue); transition: var(--transition); } .lecture-item:hover::before { background-color: var(--highlight-blue); transform: scale(1.2); } .lecture-completed::before { background-color: #7DC2AD; border-color: #7DC2AD; } .lecture-title { font-weight: 600; color: var(--primary-blue); margin-bottom: 2px; display: flex; align-items: center; justify-content: space-between; } .lecture-desc { font-size: 14px; color: var(--gray); padding-right: 20px; } .resource-tag { display: inline-block; font-size: 11px; padding: 2px 8px; border-radius: 12px; margin-left: 8px; font-weight: 600; color: white; background-color: var(--highlight-blue); } .resource-pdf { background-color: #E74C3C; } .resource-video { background-color: #3498DB; } .resource-quiz { background-color: #9B59B6; } .module-progress { position: absolute; bottom: 0; left: 0; height: 3px; background-color: #7DC2AD; transition: width 0.5s ease-in-out; } @media (max-width: 600px) { .lms-header { padding: 20px; } .academic-term { position: static; display: inline-block; margin-top: 10px; } .accordion-header { padding: 15px 20px; flex-wrap: wrap; } .module-info { width: 100%; margin-bottom: 10px; } .accordion-content.active { padding: 0 20px 15px; } .lecture-list { margin-left: 36px; } .module-title { font-size: 16px; } .module-meta { flex-wrap: wrap; } .meta-item { margin-bottom: 5px; } } .helpful-banner { margin: 20px 30px 0; padding: 15px; background-color: rgba(70, 130, 180, 0.1); border-radius: 6px; border-left: 4px solid var(--highlight-blue); font-size: 14px; display: flex; align-items: center; } .helpful-banner svg { width: 20px; height: 20px; margin-right: 10px; fill: var(--highlight-blue); } .action-buttons { display: flex; justify-content: space-between; padding: 0 30px 20px; } .action-btn { font-family: 'Source Sans Pro', sans-serif; font-weight: 600; padding: 10px 18px; border-radius: 4px; border: none; cursor: pointer; transition: var(--transition); display: flex; align-items: center; background: transparent; } .next-module-btn { color: white; background-color: var(--primary-blue); margin-left: auto; } .next-module-btn:hover { background-color: var(--secondary-blue); } .previous-module-btn { color: var(--primary-blue); border: 1px solid var(--primary-blue); } .previous-module-btn:hover { background-color: var(--light-blue); } .action-btn svg { width: 16px; height: 16px; fill: currentColor; } .previous-module-btn svg { margin-right: 8px; } .next-module-btn svg { margin-left: 8px; } .animation-fade-in { animation: fadeIn 0.6s ease forwards; } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .dot-pulse { position: relative; display: inline-block; width: 6px; height: 6px; border-radius: 50%; background-color: var(--highlight-blue); margin-left: 10px; } .dot-pulse::before, .dot-pulse::after { content: ''; position: absolute; display: inline-block; width: 6px; height: 6px; border-radius: 50%; background-color: var(--highlight-blue); opacity: 0.6; } .dot-pulse::before { left: -10px; animation: pulse 1.5s infinite ease-in-out; } .dot-pulse::after { left: 10px; animation: pulse 1.5s infinite ease-in-out 0.3s; } @keyframes pulse { 0%, 100% { opacity: 0.6; } 50% { opacity: 0.2; } } </style> </head> <body> <div class="lms-container"> <div class="lms-header"> <span class="academic-term">Fall Semester 2023</span> <h1 class="lms-title">Digital Psychology Methods</h1> <p class="lms-subtitle">PSYC304 - Dr. Aliyah Bennett</p> <div class="course-progress-container"> <div class="course-progress-bar"> <div class="course-progress-fill"></div> </div> <div class="course-progress-label">45% Complete</div> </div> </div> <div class="helpful-banner animation-fade-in"> <svg viewBox="0 0 24 24"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"/></svg> <span>Continue where you left off: Lecture 3.2 - Research Design Models</span> <span class="dot-pulse"></span> </div> <div class="accordion-container"> <div class="accordion-item completed"> <div class="accordion-header"> <div class="module-info"> <div class="module-number">1</div> <div> <div class="module-title">Introduction to Research Methods</div> <div class="module-meta"> <div class="meta-item"> <svg viewBox="0 0 24 24"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z"/></svg> <span>6 lectures • 95 min</span> </div> <div class="meta-item"> <svg viewBox="0 0 24 24"><path d="M18 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM6 4h5v8l-2.5-1.5L6 12V4z"/></svg> <span>4 readings</span> </div> </div> </div> </div> <div class="accordion-icon"></div> <div class="module-progress" style="width: 100%;"></div> </div> <div class="accordion-content"> <ul class="lecture-list"> <li class="lecture-item lecture-completed"> <div class="lecture-title"> <span>Course Overview & Scientific Method</span> <span class="resource-tag resource-pdf">PDF</span> </div> <div class="lecture-desc">Introduction to course objectives and the scientific method framework.</div> </li> <li class="lecture-item lecture-completed"> <div class="lecture-title"> <span>Empirical Research Foundations</span> <span class="resource-tag resource-video">Video</span> </div> <div class="lecture-desc">Understanding empirical approaches and evidence-based psychology.</div> </li> <li class="lecture-item lecture-completed"> <div class="lecture-title"> <span>Ethics in Psychological Research</span> </div> <div class="lecture-desc">Ethical guidelines, informed consent, and participant rights.</div> </li> <li class="lecture-item lecture-completed"> <div class="lecture-title"> <span>APA Style & Academic Writing</span> <span class="resource-tag">Template</span> </div> <div class="lecture-desc">Guidelines for scholarly writing in psychology.</div> </li> <li class="lecture-item lecture-completed"> <div class="lecture-title"> <span>Literature Review Techniques</span> <span class="resource-tag resource-pdf">PDF</span> </div> <div class="lecture-desc">Strategies for reviewing and synthesizing existing research.</div> </li> <li class="lecture-item lecture-completed"> <div class="lecture-title"> <span>Module 1 Assessment</span> <span class="resource-tag resource-quiz">Quiz</span> </div> <div class="lecture-desc">Comprehensive assessment covering foundational concepts.</div> </li> </ul> </div> </div> <div class="accordion-item completed"> <div class="accordion-header"> <div class="module-info"> <div class="module-number">2</div> <div> <div class="module-title">Qualitative Research Approaches</div> <div class="module-meta"> <div class="meta-item"> <svg viewBox="0 0 24 24"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z"/></svg> <span>5 lectures • 120 min</span> </div> <div class="meta-item"> <svg viewBox="0 0 24 24"><path d="M18 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM6 4h5v8l-2.5-1.5L6 12V4z"/></svg> <span>3 readings</span> </div> </div> </div> </div> <div class="accordion-icon"></div> <div class="module-progress" style="width: 100%;"></div> </div> <div class="accordion-content"> <ul class="lecture-list"> <li class="lecture-item lecture-completed"> <div class="lecture-title"> <span>Introduction to Qualitative Research</span> <span class="resource-tag resource-pdf">PDF</span> </div> <div class="lecture-desc">Overview of interpretive approaches and their epistemological foundations.</div> </li> <li class="lecture-item lecture-completed"> <div class="lecture-title"> <span>Phenomenological Approaches</span> <span class="resource-tag resource-video">Video</span> </div> <div class="lecture-desc">Understanding lived experiences through phenomenological research methods.</div> </li> <li class="lecture-item lecture-completed"> <div class="lecture-title"> <span>Interview & Focus Group Techniques</span> </div> <div class="lecture-desc">Designing effective interview protocols and conducting focus groups.</div> </li> <li class="lecture-item lecture-completed"> <div class="lecture-title"> <span>Thematic Analysis Workshop</span> <span class="resource-tag">Workshop</span> </div> <div class="lecture-desc">Hands-on practice with coding and developing thematic frameworks.</div> </li> <li class="lecture-item lecture-completed"> <div class="lecture-title"> <span>Module 2 Assessment</span> <span class="resource-tag resource-quiz">Quiz</span> </div> <div class="lecture-desc">Evaluation of qualitative research method comprehension.</div> </li> </ul> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="module-info"> <div class="module-number">3</div> <div> <div class="module-title">Quantitative Research Design</div> <div class="module-meta"> <div class="meta-item"> <svg viewBox="0 0 24 24"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z"/></svg> <span>7 lectures • 145 min</span> </div> <div class="meta-item"> <svg viewBox="0 0 24 24"><path d="M18 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM6 4h5v8l-2.5-1.5L6 12V4z"/></svg> <span>5 readings</span> </div> </div> </div> </div> <div class="accordion-icon"></div> <div class="module-progress" style="width: 30%;"></div> </div> <div class="accordion-content"> <ul class="lecture-list"> <li class="lecture-item lecture-completed"> <div class="lecture-title"> <span>Variables & Measurement Scales</span> <span class="resource-tag resource-pdf">PDF</span> </div> <div class="lecture-desc">Understanding independent and dependent variables, operational definitions.</div> </li> <li class="lecture-item lecture-completed"> <div class="lecture-title"> <span>Experimental Design Principles</span> <span class="resource-tag resource-video">Video</span> </div> <div class="lecture-desc">Core principles of control, randomization, and manipulation in experiments.</div> </li> <li class="lecture-item"> <div class="lecture-title"> <span>Research Design Models</span> <span class="resource-tag">Interactive</span> </div> <div class="lecture-desc">Between-subjects, within-subjects, and factorial design approaches.</div> </li> <li class="lecture-item"> <div class="lecture-title"> <span>Survey Design & Scale Development</span> </div> <div class="lecture-desc">Creating effective psychological scales and questionnaires.</div> </li> <li class="lecture-item"> <div class="lecture-title"> <span>Reliability & Validity Concepts</span> <span class="resource-tag resource-pdf">PDF</span> </div> <div class="lecture-desc">Understanding measurement quality through reliability and validity.</div> </li> <li class="lecture-item"> <div class="lecture-title"> <span>Sampling Methodologies</span> </div> <div class="lecture-desc">Random and non-random sampling approaches and considerations.</div> </li> <li class="lecture-item"> <div class="lecture-title"> <span>Module 3 Assessment</span> <span class="resource-tag resource-quiz">Quiz</span> </div> <div class="lecture-desc">Evaluation of quantitative research design comprehension.</div> </li> </ul> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="module-info"> <div class="module-number">4</div> <div> <div class="module-title">Statistical Analysis Fundamentals</div> <div class="module-meta"> <div class="meta-item"> <svg viewBox="0 0 24 24"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z"/></svg> <span>8 lectures • 180 min</span> </div> <div class="meta-item"> <svg viewBox="0 0 24 24"><path d="M18 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM6 4h5v8l-2.5-1.5L6 12V4z"/></svg> <span>6 readings</span> </div> </div> </div> </div> <div class="accordion-icon"></div> <div class="module-progress" style="width: 0%;"></div> </div> <div class="accordion-content"> <ul class="lecture-list"> <li class="lecture-item"> <div class="lecture-title"> <span>Descriptive Statistics Overview</span> <span class="resource-tag resource-pdf">PDF</span> </div> <div class="lecture-desc">Measures of central tendency and variability in psychological data.</div> </li> <li class="lecture-item"> <div class="lecture-title"> <span>Probability & Normal Distribution</span> <span class="resource-tag resource-video">Video</span> </div> <div class="lecture-desc">Understanding probability concepts and the normal curve in psychology.</div> </li> <li class="lecture-item"> <div class="lecture-title"> <span>Hypothesis Testing Principles</span> </div> <div class="lecture-desc">Null hypothesis significance testing framework and interpretation.</div> </li> <li class="lecture-item"> <div class="lecture-title"> <span>t-Tests & ANOVA Applications</span> <span class="resource-tag">Lab Session</span> </div> <div class="lecture-desc">Applying t-tests and analysis of variance in psychological research.</div> </li> <li class="lecture-item"> <div class="lecture-title"> <span>Correlation & Regression Methods</span> </div> <div class="lecture-desc">Understanding relationships between variables through correlation and regression.</div> </li> <li class="lecture-item"> <div class="lecture-title"> <span>Statistical Software Workshop</span> <span class="resource-tag">Workshop</span> </div> <div class="lecture-desc">Hands-on practice with SPSS and R for psychological data analysis.</div> </li> <li class="lecture-item"> <div class="lecture-title"> <span>Effect Size & Power Analysis</span> <span class="resource-tag resource-pdf">PDF</span> </div> <div class="lecture-desc">Understanding practical significance and statistical power in research.</div> </li> <li class="lecture-item"> <div class="lecture-title"> <span>Module 4 Assessment</span> <span class="resource-tag resource-quiz">Quiz</span> </div> <div class="lecture-desc">Comprehensive evaluation of statistical analysis concepts and application.</div> </li> </ul> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="module-info"> <div class="module-number">5</div> <div> <div class="module-title">Advanced Methods & Applications</div> <div class="module-meta"> <div class="meta-item"> <svg viewBox="0 0 24 24"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Nomad Paradise Travel Booking</title> <style> :root { --cyan: #00D8FF; --purple: #925FFE; --coral: #FF6D59; --yellow: #FFD166; --teal: #06D6A0; --dark: #2A265F; --light: #F9F9F9; --transition: all 0.35s cubic-bezier(0.65, 0, 0.35, 1); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { background-color: var(--light); color: #333; padding: 20px; height: 100%; width: 100%; overflow-x: hidden; display: flex; flex-direction: column; } .container { max-width: 660px; margin: 0 auto; width: 100%; } .travel-header { margin-bottom: 30px; text-align: center; position: relative; } .travel-header h1 { font-size: 32px; color: var(--dark); margin-bottom: 15px; position: relative; z-index: 1; } .travel-header p { color: #555; margin-bottom: 10px; font-size: 16px; } .decorative-element { position: absolute; top: -15px; right: 15%; width: 60px; height: 60px; border-radius: 50%; background: linear-gradient(135deg, var(--yellow), var(--coral)); opacity: 0.8; z-index: 0; animation: float 6s ease-in-out infinite; } .decorative-element::before { content: ""; position: absolute; top: -10px; left: -30px; width: 40px; height: 40px; border-radius: 50%; background: linear-gradient(135deg, var(--teal), var(--cyan)); opacity: 0.6; animation: float 8s ease-in-out infinite reverse; } @keyframes float { 0% { transform: translateY(0) rotate(0deg); } 50% { transform: translateY(-15px) rotate(5deg); } 100% { transform: translateY(0) rotate(0deg); } } .accordion { width: 100%; overflow: hidden; border-radius: 15px; box-shadow: 0 15px 30px rgba(0, 0, 0, 0.1); background: white; } .accordion-item { margin-bottom: 1px; overflow: hidden; transition: var(--transition); } .accordion-item:last-child { margin-bottom: 0; } .accordion-header { cursor: pointer; padding: 20px; display: flex; align-items: center; position: relative; transition: var(--transition); overflow: hidden; } /* Gradient backgrounds for each item */ .accordion-item:nth-child(1) .accordion-header { background: linear-gradient(135deg, var(--teal), var(--cyan)); } .accordion-item:nth-child(2) .accordion-header { background: linear-gradient(135deg, var(--cyan), var(--purple)); } .accordion-item:nth-child(3) .accordion-header { background: linear-gradient(135deg, var(--purple), var(--coral)); } .accordion-item:nth-child(4) .accordion-header { background: linear-gradient(135deg, var(--coral), var(--yellow)); } .accordion-icon { width: 32px; height: 32px; margin-right: 16px; display: flex; align-items: center; justify-content: center; background: rgba(255, 255, 255, 0.25); border-radius: 50%; transition: var(--transition); } .accordion-icon svg { width: 18px; height: 18px; fill: white; transition: var(--transition); } .accordion-title { flex: 1; color: white; font-size: 18px; font-weight: 600; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); transition: var(--transition); } .accordion-arrow { width: 24px; height: 24px; position: relative; transition: var(--transition); } .accordion-arrow::before, .accordion-arrow::after { content: ''; position: absolute; background-color: white; border-radius: 2px; transition: var(--transition); } .accordion-arrow::before { width: 2px; height: 12px; top: 6px; left: 11px; opacity: 1; } .accordion-arrow::after { width: 12px; height: 2px; top: 11px; left: 6px; } .accordion-content { max-height: 0; padding: 0 20px; overflow: hidden; transition: max-height 0.5s cubic-bezier(0.4, 0, 0.2, 1), padding 0.3s ease; background-color: white; } .accordion-inner { padding: 10px 0 25px; opacity: 0; transform: translateY(10px); transition: opacity 0.3s ease, transform 0.3s ease; } .accordion-item.active .accordion-content { max-height: 800px; padding: 0 20px; } .accordion-item.active .accordion-inner { opacity: 1; transform: translateY(0); transition-delay: 0.2s; } .accordion-item.active .accordion-arrow::before { opacity: 0; } .accordion-item.active .accordion-arrow { transform: rotate(180deg); } .accordion-item.active .accordion-icon { background: rgba(255, 255, 255, 0.4); transform: scale(1.1); } .accordion-header:hover .accordion-icon { transform: scale(1.1); } .accordion-ripple { position: absolute; background: rgba(255, 255, 255, 0.25); border-radius: 50%; transform: scale(0); animation: ripple 0.6s linear; pointer-events: none; } @keyframes ripple { to { transform: scale(4); opacity: 0; } } /* Content Styling */ h3 { margin: 15px 0 10px; color: var(--dark); font-size: 18px; } p { margin-bottom: 15px; color: #555; line-height: 1.6; } ul { list-style-type: none; margin-bottom: 15px; } ul li { position: relative; padding-left: 20px; margin-bottom: 8px; line-height: 1.5; } ul li::before { content: ""; position: absolute; left: 0; top: 8px; width: 8px; height: 8px; border-radius: 50%; background: linear-gradient(135deg, var(--teal), var(--cyan)); } .itinerary-list li { display: flex; align-items: flex-start; margin-bottom: 15px; padding-left: 0; } .itinerary-list li::before { display: none; } .day-marker { background: linear-gradient(135deg, var(--purple), var(--coral)); color: white; min-width: 60px; height: 26px; display: flex; align-items: center; justify-content: center; border-radius: 13px; font-size: 14px; font-weight: 600; margin-right: 12px; margin-top: 3px; } .itinerary-list li:nth-child(odd) .day-marker { background: linear-gradient(135deg, var(--teal), var(--cyan)); } .day-details { flex: 1; } .day-title { font-weight: 600; margin-bottom: 5px; color: var(--dark); } .fare-tag { display: inline-block; padding: 4px 10px; border-radius: 20px; font-size: 14px; margin-right: 8px; margin-bottom: 8px; font-weight: 500; } .fare-tag.refundable { background-color: rgba(6, 214, 160, 0.15); color: var(--teal); } .fare-tag.non-refundable { background-color: rgba(255, 109, 89, 0.15); color: var(--coral); } .fare-tag.flexible { background-color: rgba(146, 95, 254, 0.15); color: var(--purple); } .table-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-bottom: 15px; } .grid-header { font-weight: 600; color: var(--dark); padding: 8px; text-align: center; background-color: rgba(42, 38, 95, 0.05); border-radius: 6px; } .grid-item { padding: 8px; text-align: center; border-radius: 6px; } .grid-item:nth-child(3n+2) { background-color: rgba(0, 216, 255, 0.05); } .policy-item { display: flex; align-items: flex-start; margin-bottom: 15px; background-color: rgba(249, 249, 249, 0.5); padding: 12px; border-radius: 8px; transition: var(--transition); } .policy-item:hover { background-color: rgba(249, 249, 249, 0.9); transform: translateX(5px); } .policy-icon { min-width: 36px; height: 36px; background: linear-gradient(135deg, var(--teal), var(--cyan)); border-radius: 50%; display: flex; align-items: center; justify-content: center; margin-right: 12px; } .policy-icon svg { width: 18px; height: 18px; fill: white; } .policy-title { font-weight: 600; color: var(--dark); margin-bottom: 3px; } .policy-item:nth-child(2) .policy-icon { background: linear-gradient(135deg, var(--cyan), var(--purple)); } .policy-item:nth-child(3) .policy-icon { background: linear-gradient(135deg, var(--purple), var(--coral)); } .policy-item:nth-child(4) .policy-icon { background: linear-gradient(135deg, var(--coral), var(--yellow)); } /* Footer */ .decorative-footer { display: flex; justify-content: center; margin-top: 30px; gap: 8px; } .dot { width: 8px; height: 8px; border-radius: 50%; background-color: #ddd; transition: var(--transition); } .dot.active { width: 20px; border-radius: 4px; } .dot:nth-child(1).active { background: var(--teal); } .dot:nth-child(2).active { background: var(--cyan); } .dot:nth-child(3).active { background: var(--purple); } .dot:nth-child(4).active { background: var(--coral); } @media (max-width: 480px) { .travel-header h1 { font-size: 26px; } .accordion-title { font-size: 16px; } .table-grid { grid-template-columns: 1fr 1fr; } .grid-header:nth-child(3) { grid-column: span 2; } .grid-item:nth-child(6n+6) { grid-column: span 2; } } </style> </head> <body> <div class="container"> <div class="travel-header"> <div class="decorative-element"></div> <h1>Nomad Paradise Travel</h1> <p>Discover your next adventure with our curated travel experiences</p> </div> <div class="accordion"> <div class="accordion-item"> <div class="accordion-header"> <div class="accordion-icon"> <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <path d="M14.59 7.41L18.17 11H6v2h12.17l-3.59 3.59L16 18l6-6-6-6-1.41 1.41zM2 6v12h2V6H2z"/> </svg> </div> <div class="accordion-title">Bali Bliss Itinerary</div> <div class="accordion-arrow"></div> </div> <div class="accordion-content"> <div class="accordion-inner"> <p>A 7-day escape to Indonesia's paradise island. Experience stunning beaches, lush rice terraces, and vibrant cultural immersion.</p> <h3>Day-by-Day Plan:</h3> <ul class="itinerary-list"> <li> <div class="day-marker">Day 1</div> <div class="day-details"> <div class="day-title">Arrive in Denpasar & Seminyak</div> <p>Airport pickup, welcome drinks at beachfront villa, sunset dinner at La Lucciola.</p> </div> </li> <li> <div class="day-marker">Day 2</div> <div class="day-details"> <div class="day-title">Ubud Cultural Day</div> <p>Sacred Monkey Forest, traditional dance performance, local art markets.</p> </div> </li> <li> <div class="day-marker">Day 3</div> <div class="day-details"> <div class="day-title">Tegalalang & Coffee Plantation</div> <p>UNESCO rice terraces, luwak coffee tasting, organic farm lunch experience.</p> </div> </li> <li> <div class="day-marker">Day 4</div> <div class="day-details"> <div class="day-title">Nusa Penida Island Tour</div> <p>Kelingking Beach, Crystal Bay snorkeling, Angel's Billabong natural pools.</p> </div> </li> <li> <div class="day-marker">Day 5</div> <div class="day-details"> <div class="day-title">Mount Batur Sunrise Trek</div> <p>Pre-dawn hike, volcanic breakfast, hot springs relaxation.</p> </div> </li> <li> <div class="day-marker">Day 6</div> <div class="day-details"> <div class="day-title">Uluwatu & Fire Dance</div> <p>Sea temple visit, kecak fire dance, seafood dinner at Jimbaran Bay.</p> </div> </li> <li> <div class="day-marker">Day 7</div> <div class="day-details"> <div class="day-title">Departure Day</div> <p>Morning yoga, traditional Balinese massage, airport transfer.</p> </div> </li> </ul> <h3>Package Includes:</h3> <ul> <li>Private airport transfers</li> <li>6 nights accommodation (4-star villa/resort)</li> <li>Daily breakfast & 3 special dinners</li> <li>All activities with English-speaking guide</li> <li>Transportation between destinations</li> </ul> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="accordion-icon"> <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <path d="M11.8 10.9c-2.27-.59-3-1.2-3-2.15 0-1.09 1.01-1.85 2.7-1.85 1.78 0 2.44.85 2.5 2.1h2.21c-.07-1.72-1.12-3.3-3.21-3.81V3h-3v2.16c-1.94.42-3.5 1.68-3.5 3.61 0 2.31 1.91 3.46 4.7 4.13 2.5.6 3 1.48 3 2.41 0 .69-.49 1.79-2.7 1.79-2.06 0-2.87-.92-2.98-2.1h-2.2c.12 2.19 1.76 3.42 3.68 3.83V21h3v-2.15c1.95-.37 3.5-1.5 3.5-3.55 0-2.84-2.43-3.81-4.7-4.4z"/> </svg> </div> <div class="accordion-title">Fare Rules & Options</div> <div class="accordion-arrow"></div> </div> <div class="accordion-content"> <div class="accordion-inner"> <p>Our transparent fare structure gives you flexibility and options to match your travel needs. Compare our fare classes below:</p> <div class="fare-tags"> <span class="fare-tag refundable">Fully Refundable</span> <span class="fare-tag non-refundable">Non-Refundable</span> <span class="fare-tag flexible">Date Flexible</span> </div> <h3>Economy Class Options:</h3> <div class="table-grid"> <div class="grid-header">Fare Type</div> <div class="grid-header">Price Range</div> <div class="grid-header">Features</div> <div class="grid-item">Economy Light</div> <div class="grid-item">$899-1,299</div> <div class="grid-item">Non-refundable, carry-on only</div> <div class="grid-item">Economy Standard</div> <div class="grid-item">$1,099-1,499</div> <div class="grid-item">50% refundable, 1 checked bag</div> <div class="grid-item">Economy Flex</div> <div class="grid-item">$1,399-1,799</div> <div class="grid-item">Fully refundable, 2 checked bags</div> </div> <h3>Premium Options:</h3> <div class="table-grid"> <div class="grid-header">Fare Type</div> <div class="grid-header">Price Range</div> <div class="grid-header">Features</div> <div class="grid-item">Business Value</div> <div class="grid-item">$2,399-2,899</div> <div class="grid-item">75% refundable, priority boarding</div> <div class="grid-item">Business Flex</div> <div class="grid-item">$2,899-3,499</div> <div class="grid-item">Fully refundable, lounge access</div> <div class="grid-item">First Class</div> <div class="grid-item">$4,299-5,999</div> <div class="grid-item">Ultimate flexibility, exclusive service</div> </div> <h3>Cancellation & Change Policy:</h3> <ul> <li>Economy Light: Changes for $150 fee plus fare difference</li> <li>Economy Standard: Free changes up to 72 hours before departure</li> <li>Economy Flex/Premium: Unlimited free changes and cancellations</li> <li>Insurance option adds $89 for additional coverage</li> <li>Group bookings (8+) have special flexible terms</li> </ul> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="accordion-icon"> <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <path d="M12 3L1 9l4 2.18v6L12 21l7-3.82v-6l2-1.09V17h2V9L12 3zm6.82 6L12 12.72 5.18 9 12 5.28 18.82 9zM17 15.99l-5 2.73-5-2.73v-3.72L12 15l5-2.73v3.72z"/> </svg> </div> <div class="accordion-title">Travel Policies</div> <div class="accordion-arrow"></div> </div> <div class="accordion-content"> <div class="accordion-inner"> <p>Our policies are designed to ensure a smooth, worry-free travel experience. Here's what you need to know before your journey:</p> <div class="policy-item"> <div class="policy-icon"> <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <path d="M20.5 6c-2.61.7-5.67 1-8.5 1s-5.89-.3-8.5-1L3 8c1.86.5 4 .83 6 1v13h2v-6h2v6h2V9c2-.17 4.14-.5 6-1l-.5-2zM12 6c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z"/> </svg> </div> <div> <div class="policy-title">Visa & Documentation</div> <p>Travelers are responsible for valid passports (6+ months) and required visas. Free pre-check service available 30 days before departure. Digital document verification system lets you confirm requirements via our app.</p> </div> </div> <div class="policy-item"> <div class="policy-icon"> <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <path d="M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm2 14H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z"/> </svg> </div> <div> <div class="policy-title">Health & Vaccination</div> <p>Comprehensive travel insurance required for all international bookings. Our smart health advisory system alerts you to destination-specific requirements. Digital vaccination record storage available through secure portal.</p> </div> </div> <div class="policy-item"> <div class="policy-icon"> <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"/> </svg> </div> <div> <div class="policy-title">Baggage Guidelines</div> <p>Standard packages include 1 carry-on (7kg) and 1 checked bag (23kg). Premium fare includes 2 checked bags. Overweight fees apply at $15/kg. Smart baggage tracking with Bluetooth luggage tags available for premium members.</p> </div> </div> <div class="policy-item"> <div class="policy-icon"> <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z"/> </svg> </div> <div> <div class="policy-title">Check-in Procedures</div> <p>Digital check-in opens 48 hours before departure. Skip-the-line service for premium fares. Biometric check-in available at select airports. Automatic flight updates via SMS or our mobile app.</p> </div> </div> <h3>Special Assistance</h3> <ul> <li>Accessibility needs must be requested at least 72 hours in advance</li> <li>Unaccompanied minor service available for children ages 5-15</li> <li>Special meal requests can be made up to 48 hours before departure</li> <li>24/7 emergency assistance hotline: +1-800-NOMAD-HELP</li> </ul> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="accordion-icon"> <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm-1-5h2v2h-2zm0-8h2v6h-2z"/> </svg> </div> <div class="accordion-title">Frequently Asked Questions</div> <div class="accordion-arrow"></div> </div> <div class="accordion-content"> <div class="accordion-inner"> <h3>Booking & Payment</h3> <ul> <li><strong>What payment methods do you accept?</strong><br> We accept all major credit cards, PayPal, Apple Pay, Google Pay, and bank transfers for deposits.</li> <li><strong>Is there a deposit required?</strong><br> Yes, 30% deposit secures your booking with the balance due 60 days prior to departure.</li> <li><strong>Can I book now and pay later?</strong><br> Yes, our "Reserve Now, Pay Later" option allows you to hold your spot with no deposit for 48 hours.</li> </ul> <h3>Pre-Departure</h3> <ul> <li><strong>When will I receive my final itinerary?</strong><br> Detailed itineraries are sent 21 days before departure, with digital access through our app immediately after booking.</li> <li><strong>What if I have dietary restrictions?</strong><br> All dietary needs can be accommodated with 72-hour advance notice through your online travel portal.</li> <li><strong>Is transportation between activities included?</strong><br> Yes, all intra-destination transport is included. Optional upgrades to private transfers available.</li> </ul> <h3>During Your Trip</h3> <ul> <li><strong>Will I have a dedicated guide?</strong><br> Our Signature experiences include a dedicated guide. Explorer packages feature expert local guides at each location.</li> <li><strong>Is Wi-Fi available at accommodations?</strong><br> All properties feature high-speed Wi-Fi. Premium packages include portable Wi-Fi device.</li> <li><strong>What's your policy on sustainable tourism?</strong><br> We offset 100% of carbon emissions and partner exclusively with accommodations meeting our sustainable certification standards.</li> </ul> <h3>Post-Trip Matters</h3> <ul> <li><strong>How do I provide feedback about my experience?</strong><br> Our app features in-the-moment feedback capability, plus a comprehensive post-trip survey that earns you loyalty points.</li> <li><strong>What is your loyalty program?</strong><br> Nomad Paradise Rewards members earn 5% back in travel credits, plus exclusive benefits like VIP airport lounges and room upgrades.</li> <li><strong>Can I share my itinerary with friends?</strong><br> Yes! Our social sharing feature creates a beautiful shareable digital postcard of your journey with a group booking discount code.</li> </ul> </div> </div> </div> </div> <div class="decorative-footer"> <div class="dot"></div> <div class="dot"></div> <div class="dot"></div> <div class="dot"></div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const accordionItems = document.querySelectorAll('.accordion-item'); const dots = document.querySelectorAll('.dot'); // Function to create ripple effect function createRipple(e) { const header = e.currentTarget; const rect = header.getBoundingClientRect(); const ripple = document.createElement('span'); const diameter = Math.max(header.clientWidth, header.clientHeight); const radius = diameter / 2; ripple.style.width = ripple.style.height = `${diameter}px`; ripple.style.left = `${e.clientX - rect.left - radius}px`; ripple.style.top = `${e.clientY - rect.top - radius}px`; ripple.classList.add('accordion-ripple'); const rippleContainer = header.querySelector('.accordion-ripple'); if (rippleContainer) { rippleContainer.remove(); } header.appendChild(ripple); setTimeout(() => { ripple.remove(); }, 600); } // Add click event to accordion headers accordionItems.forEach((item, index) => { const header = item.querySelector('.accordion-header'); const content = item.querySelector('.accordion-content'); header.addEventListener('click', function(e) { createRipple(e); // Toggle the current item const isActive = item.classList.contains('active'); // Close all items accordionItems.forEach(i => { i.classList.remove('active'); }); // Update dots dots.forEach(dot => dot.classList.remove('active')); // If the clicked item wasn't active, activate it if (!isActive) { item.classList.add('active'); dots[index].classList.add('active'); } }); }); // Auto-open the first item on page load if (accordionItems.length > 0) { setTimeout(() => { accordionItems[0].classList.add('active'); dots[0].classList.add('active'); }, 500); } }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Health Data Accordion</title> <style> :root { --primary-color: #4291c9; --secondary-color: #75c6ef; --accent-color: #e3f2fd; --text-color: #2c3e50; --light-text: #6c7a89; --success-color: #5cb85c; --warning-color: #f0ad4e; --danger-color: #d9534f; --border-radius: 12px; --box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); --transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Nunito', 'Segoe UI', sans-serif; } body { background-color: #f9fafc; color: var(--text-color); display: flex; align-items: center; justify-content: center; min-height: 100vh; padding: 20px; } .container { max-width: 700px; width: 100%; background: white; border-radius: var(--border-radius); box-shadow: var(--box-shadow); overflow: hidden; } .header { background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)); color: white; padding: 20px 30px; text-align: center; position: relative; overflow: hidden; } .header::after { content: ''; position: absolute; top: -50%; left: -50%; width: 200%; height: 200%; background: rgba(255, 255, 255, 0.1); transform: rotate(30deg); pointer-events: none; } .header h1 { font-size: 24px; margin-bottom: 10px; position: relative; z-index: 1; } .header p { font-size: 14px; opacity: 0.9; position: relative; z-index: 1; } .data-summary { display: flex; flex-wrap: wrap; gap: 15px; padding: 20px 30px; background-color: #ffffff; border-bottom: 1px solid rgba(0, 0, 0, 0.05); } .summary-item { flex: 1; min-width: 120px; background-color: var(--accent-color); padding: 15px; border-radius: var(--border-radius); text-align: center; transition: var(--transition); cursor: pointer; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.05); position: relative; overflow: hidden; } .summary-item:hover { transform: translateY(-3px); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); } .summary-item h3 { font-size: 16px; margin-bottom: 8px; color: var(--primary-color); } .summary-item .value { font-size: 24px; font-weight: bold; color: var(--text-color); } .summary-item .indicator { position: absolute; top: 10px; right: 10px; width: 8px; height: 8px; border-radius: 50%; } .indicator.normal { background-color: var(--success-color); box-shadow: 0 0 5px var(--success-color); } .indicator.caution { background-color: var(--warning-color); box-shadow: 0 0 5px var(--warning-color); } .indicator.alert { background-color: var(--danger-color); box-shadow: 0 0 5px var(--danger-color); } .accordion { padding: 0 20px; } .accordion-item { margin-bottom: 15px; border-radius: var(--border-radius); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); overflow: hidden; background-color: white; transition: var(--transition); } .accordion-item:last-child { margin-bottom: 20px; } .accordion-header { padding: 18px 20px; display: flex; justify-content: space-between; align-items: center; background-color: white; cursor: pointer; position: relative; border-left: 4px solid transparent; transition: var(--transition); } .accordion-header:hover { background-color: var(--accent-color); } .accordion-header.active { border-left-color: var(--primary-color); background-color: var(--accent-color); } .accordion-title { font-size: 16px; font-weight: 600; color: var(--text-color); display: flex; align-items: center; } .accordion-icon { width: 24px; height: 24px; margin-right: 12px; display: flex; align-items: center; justify-content: center; background-color: rgba(66, 145, 201, 0.1); border-radius: 50%; padding: 5px; } .accordion-icon svg { width: 16px; height: 16px; fill: var(--primary-color); } .accordion-arrow { transition: transform 0.3s ease; } .accordion-header.active .accordion-arrow { transform: rotate(180deg); } .accordion-content { max-height: 0; overflow: hidden; transition: max-height 0.4s cubic-bezier(0, 1, 0, 1); background-color: white; border-top: 1px solid rgba(0, 0, 0, 0.05); } .accordion-header.active + .accordion-content { max-height: 1000px; transition: max-height 0.6s ease-in-out; } .accordion-body { padding: 20px; font-size: 14px; color: var(--light-text); line-height: 1.6; } .secure-data { position: relative; background-color: rgba(0, 0, 0, 0.02); border-radius: 8px; padding: 15px; margin-top: 15px; } .secure-data::before { content: '🔒 Sensitive Information'; display: block; font-size: 12px; color: var(--primary-color); margin-bottom: 8px; font-weight: 600; } .secure-data-content { filter: blur(5px); transition: filter 0.3s ease; user-select: none; } .secure-data-content.revealed { filter: blur(0); } .reveal-btn { position: absolute; top: 12px; right: 12px; background-color: var(--primary-color); color: white; border: none; border-radius: 4px; padding: 4px 8px; font-size: 12px; cursor: pointer; transition: var(--transition); } .reveal-btn:hover { background-color: var(--secondary-color); } .data-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-top: 15px; } .data-item { padding: 10px; background-color: rgba(0, 0, 0, 0.02); border-radius: 8px; } .data-item .label { font-size: 12px; color: var(--light-text); margin-bottom: 4px; } .data-item .data-value { font-size: 14px; font-weight: 600; color: var(--text-color); } .chart-container { height: 150px; margin: 20px 0; position: relative; } .chart-bar { display: inline-block; width: 30px; background-color: var(--secondary-color); border-radius: 4px 4px 0 0; position: absolute; bottom: 25px; transition: height 0.8s cubic-bezier(0.25, 0.8, 0.25, 1); } .chart-bar-1 { left: 10%; height: 40%; } .chart-bar-2 { left: 25%; height: 70%; } .chart-bar-3 { left: 40%; height: 50%; } .chart-bar-4 { left: 55%; height: 90%; } .chart-bar-5 { left: 70%; height: 60%; } .chart-bar-6 { left: 85%; height: 75%; } .chart-label { position: absolute; bottom: 0; left: 0; width: 100%; height: 25px; display: flex; justify-content: space-around; align-items: center; font-size: 10px; color: var(--light-text); } .chart-label span { flex: 1; text-align: center; } .medication-list { list-style: none; margin-top: 15px; } .medication-item { display: flex; padding: 12px; margin-bottom: 8px; background-color: rgba(0, 0, 0, 0.02); border-radius: 8px; transition: var(--transition); } .medication-item:hover { background-color: var(--accent-color); } .medication-color { width: 16px; height: 16px; border-radius: 50%; margin-right: 12px; margin-top: 3px; } .medication-info { flex-grow: 1; } .medication-name { font-weight: 600; margin-bottom: 4px; font-size: 14px; } .medication-details { font-size: 12px; color: var(--light-text); } .badge { display: inline-block; padding: 3px 8px; border-radius: 12px; font-size: 11px; font-weight: 600; margin-left: 8px; } .badge-new { background-color: rgba(92, 184, 92, 0.1); color: var(--success-color); } .badge-alert { background-color: rgba(217, 83, 79, 0.1); color: var(--danger-color); } .timeline { position: relative; margin: 20px 0; padding-left: 30px; } .timeline::before { content: ''; position: absolute; left: 10px; top: 5px; bottom: 5px; width: 2px; background-color: rgba(66, 145, 201, 0.2); } .timeline-item { position: relative; margin-bottom: 15px; } .timeline-item::before { content: ''; position: absolute; left: -24px; top: 5px; width: 12px; height: 12px; border-radius: 50%; background-color: var(--primary-color); box-shadow: 0 0 0 3px rgba(66, 145, 201, 0.2); } .timeline-date { font-size: 12px; color: var(--light-text); margin-bottom: 4px; } .timeline-content { font-size: 14px; } .footer { padding: 15px 30px; background-color: #f9fafc; font-size: 12px; color: var(--light-text); text-align: center; border-top: 1px solid rgba(0, 0, 0, 0.05); } .pulse-animation { animation: pulse 2s infinite; } @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(66, 145, 201, 0.4); } 70% { box-shadow: 0 0 0 10px rgba(66, 145, 201, 0); } 100% { box-shadow: 0 0 0 0 rgba(66, 145, 201, 0); } } /* Media Queries for Responsive Design */ @media (max-width: 600px) { .header h1 { font-size: 20px; } .data-summary { gap: 10px; padding: 15px; } .summary-item { min-width: 100px; padding: 10px; } .summary-item .value { font-size: 20px; } .data-grid { grid-template-columns: 1fr; } .accordion-header { padding: 15px; } .accordion-title { font-size: 14px; } } </style> </head> <body> <div class="container"> <div class="header"> <h1>Your Health Dashboard</h1> <p>Last updated: <span id="last-update-time">Today, 11:23 AM</span></p> </div> <div class="data-summary"> <div class="summary-item pulse-animation"> <h3>Heart Rate</h3> <div class="value">72 bpm</div> <div class="indicator normal"></div> </div> <div class="summary-item"> <h3>Blood Pressure</h3> <div class="value">120/80</div> <div class="indicator normal"></div> </div> <div class="summary-item"> <h3>Glucose</h3> <div class="value">108 mg/dL</div> <div class="indicator caution"></div> </div> </div> <div class="accordion"> <div class="accordion-item"> <div class="accordion-header"> <div class="accordion-title"> <div class="accordion-icon"> <svg viewBox="0 0 24 24"> <path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/> </svg> </div> Vital Measurements <span class="badge badge-new">Updated</span> </div> <div class="accordion-arrow">▼</div> </div> <div class="accordion-content"> <div class="accordion-body"> <p>Your vital signs have been consistently stable over the past 3 months. Your latest readings are within healthy ranges, though your glucose levels are slightly elevated.</p> <div class="chart-container"> <div class="chart-bar chart-bar-1"></div> <div class="chart-bar chart-bar-2"></div> <div class="chart-bar chart-bar-3"></div> <div class="chart-bar chart-bar-4"></div> <div class="chart-bar chart-bar-5"></div> <div class="chart-bar chart-bar-6"></div> <div class="chart-label"> <span>Jan</span> <span>Feb</span> <span>Mar</span> <span>Apr</span> <span>May</span> <span>Jun</span> </div> </div> <div class="data-grid"> <div class="data-item"> <div class="label">Cholesterol</div> <div class="data-value">185 mg/dL</div> </div> <div class="data-item"> <div class="label">BMI</div> <div class="data-value">24.3</div> </div> <div class="data-item"> <div class="label">Oxygen Saturation</div> <div class="data-value">98%</div> </div> <div class="data-item"> <div class="label">Resting Heart Rate</div> <div class="data-value">65 bpm</div> </div> </div> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="accordion-title"> <div class="accordion-icon"> <svg viewBox="0 0 24 24"> <path d="M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm2 14H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z"/> </svg> </div> Lab Results </div> <div class="accordion-arrow">▼</div> </div> <div class="accordion-content"> <div class="accordion-body"> <p>Your most recent laboratory tests show values within normal ranges. Your doctor has noted that your vitamin D levels have improved since your last check.</p> <div class="secure-data"> <button class="reveal-btn">Reveal</button> <div class="secure-data-content"> <div class="data-grid"> <div class="data-item"> <div class="label">White Blood Cell Count</div> <div class="data-value">6.8 x10^9/L</div> </div> <div class="data-item"> <div class="label">Hemoglobin</div> <div class="data-value">14.2 g/dL</div> </div> <div class="data-item"> <div class="label">Platelet Count</div> <div class="data-value">250 x10^9/L</div> </div> <div class="data-item"> <div class="label">Creatinine</div> <div class="data-value">0.9 mg/dL</div> </div> </div> </div> </div> <div class="timeline"> <div class="timeline-item"> <div class="timeline-date">June 15, 2023</div> <div class="timeline-content">Complete Blood Count - Normal results</div> </div> <div class="timeline-item"> <div class="timeline-date">April 3, 2023</div> <div class="timeline-content">Lipid Panel - Cholesterol slightly elevated</div> </div> <div class="timeline-item"> <div class="timeline-date">January 22, 2023</div> <div class="timeline-content">Vitamin D Test - Deficiency detected (Treatment prescribed)</div> </div> </div> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="accordion-title"> <div class="accordion-icon"> <svg viewBox="0 0 24 24"> <path d="M19 3H5c-1.1 0-1.99.9-1.99 2L3 19c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 11h-4v4h-4v-4H6v-4h4V6h4v4h4v4z"/> </svg> </div> Medications <span class="badge badge-alert">Refill Needed</span> </div> <div class="accordion-arrow">▼</div> </div> <div class="accordion-content"> <div class="accordion-body"> <p>Your current medication regimen includes the following prescriptions. Please note that your Lisinopril prescription needs to be refilled within the next 5 days.</p> <ul class="medication-list"> <li class="medication-item"> <div class="medication-color" style="background-color: #4291c9;"></div> <div class="medication-info"> <div class="medication-name">Lisinopril 10mg</div> <div class="medication-details">1 tablet daily - 5 days remaining</div> </div> </li> <li class="medication-item"> <div class="medication-color" style="background-color: #5cb85c;"></div> <div class="medication-info"> <div class="medication-name">Vitamin D3 2000 IU</div> <div class="medication-details">1 capsule daily - 23 days remaining</div> </div> </li> <li class="medication-item"> <div class="medication-color" style="background-color: #f0ad4e;"></div> <div class="medication-info"> <div class="medication-name">Atorvastatin 20mg</div> <div class="medication-details">1 tablet at bedtime - 15 days remaining</div> </div> </li> </ul> <div class="secure-data"> <button class="reveal-btn">Reveal</button> <div class="secure-data-content"> <p><strong>Medication Notes:</strong></p> <p>Dr. Wilson has adjusted your Lisinopril dosage from 5mg to 10mg during your last visit on May 28. Please monitor for any side effects such as dizziness or dry cough and report them at your next appointment.</p> </div> </div> </div> </div> </div> <div class="accordion-item"> <div class="accordion-header"> <div class="accordion-title"> <div class="accordion-icon"> <svg viewBox="0 0 24 24"> <path d="M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm0 15l-5-5h3V9h4v4h3l-5 5z"/> </svg> </div> Upcoming Appointments </div> <div class="accordion-arrow">▼</div> </div> <div class="accordion-content"> <div class="accordion-body"> <p>You have the following appointments scheduled with your healthcare providers:</p> <div class="timeline"> <div class="timeline-item"> <div class="timeline-date">July 12, 2023 - 10:30 AM</div> <div class="timeline-content">Dr. Sarah Wilson - Primary Care Follow-up</div> </div> <div class="timeline-item"> <div class="timeline-date">August 3, 2023 - 2:15 PM</div> <div class="timeline-content">Annual Eye Examination - Dr. Robert Chen</div> </div> <div class="timeline-item"> <div class="timeline-date">September 18, 2023 - 9:00 AM</div> <div class="timeline-content">Routine Blood Work - Main Lab, Floor 2</div> </div> </div> <p style="margin-top: 15px; font-style: italic;">To reschedule or cancel an appointment, please call (555) 123-4567 at least 24 hours in advance.</p> </div> </div> </div> </div> <div class="footer"> All health data is securely stored and encrypted according to HIPAA regulations. </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Format the current time for "Last Updated" const updateTimeEl = document.getElementById('last-update-time'); const now = new Date(); const hours = now.getHours() % 12 || 12; const minutes = now.getMinutes().toString().padStart(2, '0'); const ampm = now.getHours() >= 12 ? 'PM' : 'AM'; updateTimeEl.textContent = `Today, ${hours}:${minutes} ${ampm}`; // Accordion functionality const accordionHeaders = document.querySelectorAll('.accordion-header'); accordionHeaders.forEach(header => { header.addEventListener('click', function() { this.classList.toggle('active'); // Add ripple effect const ripple = document.createElement('span'); ripple.classList.add('ripple'); this.appendChild(ripple); // Ensure only one accordion is open at a time (comment out for multiple open) /* accordionHeaders.forEach(otherHeader => { if(otherHeader !== this) { otherHeader.classList.remove('active'); } }); */ }); }); // Reveal secure data const revealButtons = document.querySelectorAll('.reveal-btn'); revealButtons.forEach(button => { button.addEventListener('click', function() { const secureContent = this.nextElementSibling; secureContent.classList.toggle('revealed'); if(secureContent.classList.contains('revealed')) { this.textContent = 'Hide'; } else { this.textContent = 'Reveal'; } }); }); // Animate chart bars on scroll into view const chartBars = document.querySelectorAll('.chart-bar'); const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { setTimeout(() => { entry.target.style.height = entry.target.className.split(' ')[1].split('-')[2] + '%'; }, 200); } }); }, { threshold: 0.5 }); chartBars.forEach(bar => { bar.style.height = '0%'; observer.observe(bar); }); // Open the first accordion by default if(accordionHeaders.length > 0) { setTimeout(() => { accordionHeaders[0].click(); }, 500); } // Add hover effect to medication items const medicationItems = document.querySelectorAll('.medication-item'); medicationItems.forEach(item => { item.addEventListener('mouseenter', function() { this.style.transform = 'translateX(5px)'; }); item.addEventListener('mouseleave', function() { this.style.transform = 'translateX(0)'; }); }); }); </script> </body> </html>