Triangles are one of the most fundamental shapes in geometry, appearing in various forms and applications across different fields. From architecture to art, these three-sided figures are both practical and aesthetically pleasing.
In this article, we will explore ten fascinating examples of triangles, showcasing their versatility and significance in everyday life. Whether you're a math enthusiast or simply curious, these examples will offer a fresh perspective on this classic shape.
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
Designing your own triangle has never been easier with Subframe. Its drag-and-drop interface and intuitive, responsive canvas ensure pixel-perfect UI every time. Loved by designers and developers alike, Subframe makes creativity effortless.
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
Ready to elevate your UI designs? With Subframe, you can create stunning, pixel-perfect interfaces, including triangles, in minutes. Its drag-and-drop editor ensures efficiency and precision.
Don't wait! Start for free and begin designing immediately. Experience the ease and power of Subframe today!
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Finance Dashboard Navigation</title> <style> :root { --primary: #1c2c54; --secondary: #2d4374; --accent: #4285f4; --hover: #0a2463; --text: #e0e7ff; --shadow: rgba(0, 0, 0, 0.3); --success: #34c759; --warning: #ff9500; --danger: #ff3b30; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { background-color: var(--primary); color: var(--text); display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; padding: 20px; overflow-x: hidden; } .dashboard-container { width: 100%; max-width: 650px; background: linear-gradient(145deg, #1e2c4f, #16213d); border-radius: 15px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.25); padding: 20px; position: relative; } .dashboard-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; padding-bottom: 15px; border-bottom: 1px solid rgba(224, 231, 255, 0.1); } .dashboard-title { font-weight: 600; font-size: 1.3rem; } .user-info { display: flex; align-items: center; gap: 10px; } .user-avatar { width: 35px; height: 35px; border-radius: 50%; background: linear-gradient(135deg, #4285f4, #0a2463); display: flex; align-items: center; justify-content: center; font-weight: bold; } .data-summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 15px; margin-bottom: 30px; } .data-card { background: rgba(45, 67, 116, 0.2); border-radius: 10px; padding: 15px; transition: all 0.3s ease; cursor: pointer; position: relative; overflow: hidden; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); } .data-card:hover { transform: translateY(-5px); background: rgba(45, 67, 116, 0.4); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15); } .data-card h3 { font-size: 0.9rem; margin-bottom: 10px; color: rgba(224, 231, 255, 0.8); } .data-card p { font-size: 1.5rem; font-weight: 600; margin-bottom: 5px; } .data-card .trend { display: flex; align-items: center; font-size: 0.8rem; color: var(--success); } .data-card .trend.down { color: var(--danger); } .nav-section { margin-top: 20px; position: relative; } .nav-title { font-size: 1rem; margin-bottom: 15px; color: rgba(224, 231, 255, 0.8); } .nav-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: 15px; } .nav-button { background: linear-gradient(145deg, #2d4374, #1e3058); border-radius: 10px; padding: 20px 15px; cursor: pointer; text-align: center; position: relative; overflow: hidden; transition: all 0.3s ease; display: flex; flex-direction: column; align-items: center; justify-content: center; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); } .nav-button:hover { background: linear-gradient(145deg, #3a5499, #233663); transform: translateY(-3px); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3); } .nav-button.active { background: linear-gradient(145deg, #4285f4, #2d70e7); } .nav-icon { margin-bottom: 10px; position: relative; } .triangle { width: 0; height: 0; border-left: 15px solid transparent; border-right: 15px solid transparent; border-bottom: 25px solid var(--text); transition: all 0.3s ease; transform-origin: center; filter: drop-shadow(0 2px 3px rgba(0, 0, 0, 0.2)); } .right-triangle { transform: rotate(90deg); } .left-triangle { transform: rotate(-90deg); } .down-triangle { transform: rotate(180deg); } .up-triangle { transform: rotate(0deg); } .nav-button:hover .triangle { filter: drop-shadow(0 3px 5px rgba(0, 0, 0, 0.3)); transform-origin: center; } .nav-button:hover .right-triangle { transform: rotate(90deg) scale(1.1); } .nav-button:hover .left-triangle { transform: rotate(-90deg) scale(1.1); } .nav-button:hover .down-triangle { transform: rotate(180deg) scale(1.1); } .nav-button:hover .up-triangle { transform: rotate(0deg) scale(1.1); } .nav-button.active .triangle { border-bottom-color: white; filter: drop-shadow(0 3px 5px rgba(0, 0, 0, 0.4)); } .nav-label { font-size: 0.9rem; font-weight: 500; margin-top: 5px; transition: all 0.3s ease; } .notification-badge { position: absolute; top: 0; right: 0; background-color: var(--danger); color: white; border-radius: 50%; width: 18px; height: 18px; font-size: 0.7rem; display: flex; align-items: center; justify-content: center; transform: translate(30%, -30%); box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); } .tooltip { position: absolute; background: rgba(0, 0, 0, 0.7); color: white; padding: 5px 10px; border-radius: 5px; font-size: 0.8rem; bottom: -40px; left: 50%; transform: translateX(-50%); opacity: 0; transition: opacity 0.3s ease; pointer-events: none; white-space: nowrap; z-index: 100; } .tooltip::before { content: ''; position: absolute; top: -5px; left: 50%; transform: translateX(-50%); border-left: 5px solid transparent; border-right: 5px solid transparent; border-bottom: 5px solid rgba(0, 0, 0, 0.7); } .nav-button:hover .tooltip { opacity: 1; } .quick-access { margin-top: 30px; width: 100%; } .quick-access-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 15px; } .quick-card { background: rgba(45, 67, 116, 0.2); border-radius: 10px; padding: 15px; transition: all 0.3s ease; cursor: pointer; position: relative; overflow: hidden; text-align: center; } .quick-card:hover { background: rgba(45, 67, 116, 0.4); transform: translateY(-3px); } .quick-card-icon { display: flex; justify-content: center; margin-bottom: 10px; } .quick-card-title { font-size: 0.9rem; font-weight: 500; } .quick-card-value { font-size: 1.2rem; font-weight: 600; margin: 5px 0; } .quick-card-description { font-size: 0.8rem; color: rgba(224, 231, 255, 0.7); } .status-indicator { position: absolute; top: 10px; right: 10px; width: 10px; height: 10px; border-radius: 50%; background-color: var(--success); } .status-warning { background-color: var(--warning); } .status-danger { background-color: var(--danger); } /* Animation for the active state feedback */ @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(66, 133, 244, 0.7); } 70% { box-shadow: 0 0 0 10px rgba(66, 133, 244, 0); } 100% { box-shadow: 0 0 0 0 rgba(66, 133, 244, 0); } } .pulse { animation: pulse 1.5s infinite; } /* Screen loader animation */ .screen-loader { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: var(--primary); display: flex; justify-content: center; align-items: center; z-index: 1000; opacity: 1; transition: opacity 0.5s ease-out; } .loader-content { text-align: center; } .loader-triangles { display: flex; justify-content: center; margin-bottom: 20px; } .loader-triangle { margin: 0 5px; animation: bounce 1.5s infinite ease-in-out; } .loader-triangle:nth-child(2) { animation-delay: 0.2s; } .loader-triangle:nth-child(3) { animation-delay: 0.4s; } @keyframes bounce { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-20px); } } /* Responsive adjustments */ @media (max-width: 600px) { .data-summary, .nav-grid, .quick-access-grid { grid-template-columns: repeat(2, 1fr); } .dashboard-container { padding: 15px; } .dashboard-title { font-size: 1.1rem; } .data-card p { font-size: 1.2rem; } } @media (max-width: 400px) { .data-summary, .nav-grid, .quick-access-grid { grid-template-columns: 1fr; } } /* Custom scrollbar */ ::-webkit-scrollbar { width: 8px; } ::-webkit-scrollbar-track { background: var(--primary); } ::-webkit-scrollbar-thumb { background: var(--secondary); border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: var(--accent); } </style> </head> <body> <div class="screen-loader"> <div class="loader-content"> <div class="loader-triangles"> <div class="triangle up-triangle loader-triangle"></div> <div class="triangle right-triangle loader-triangle"></div> <div class="triangle down-triangle loader-triangle"></div> </div> <div>Initializing secure financial dashboard...</div> </div> </div> <div class="dashboard-container"> <div class="dashboard-header"> <div class="dashboard-title">MerchantTrade Analytics</div> <div class="user-info"> <div>Alex Chen</div> <div class="user-avatar">AC</div> </div> </div> <div class="data-summary"> <div class="data-card"> <h3>Daily Revenue</h3> <p>$24,782</p> <div class="trend">+3.4% <span style="margin-left: 5px;">↑</span></div> </div> <div class="data-card"> <h3>Transaction Vol.</h3> <p>1,432</p> <div class="trend">+7.1% <span style="margin-left: 5px;">↑</span></div> </div> <div class="data-card"> <h3>Avg. Trade Size</h3> <p>$1,749</p> <div class="trend down">-1.2% <span style="margin-left: 5px;">↓</span></div> </div> </div> <div class="nav-section"> <div class="nav-title">Financial Navigation</div> <div class="nav-grid"> <div class="nav-button" data-section="forward"> <div class="nav-icon"> <div class="triangle right-triangle"></div> </div> <div class="nav-label">Forward Projections</div> <div class="tooltip">View Q3-Q4 cash flow projections</div> </div> <div class="nav-button" data-section="historical"> <div class="nav-icon"> <div class="triangle left-triangle"></div> </div> <div class="nav-label">Historical Analysis</div> <div class="tooltip">Review 24-month transaction history</div> </div> <div class="nav-button active" data-section="risk"> <div class="nav-icon"> <div class="triangle down-triangle"></div> <div class="notification-badge">3</div> </div> <div class="nav-label">Risk Assessment</div> <div class="tooltip">3 high-priority risk factors detected</div> </div> <div class="nav-button" data-section="growth"> <div class="nav-icon"> <div class="triangle up-triangle"></div> </div> <div class="nav-label">Growth Metrics</div> <div class="tooltip">YoY performance indicators</div> </div> </div> </div> <div class="quick-access"> <div class="nav-title">Critical Indicators</div> <div class="quick-access-grid"> <div class="quick-card"> <div class="status-indicator"></div> <div class="quick-card-icon"> <div class="triangle up-triangle" style="border-bottom-color: var(--success); transform: scale(0.8);"></div> </div> <div class="quick-card-title">Liquidity Ratio</div> <div class="quick-card-value">2.4x</div> <div class="quick-card-description">Healthy operating buffer</div> </div> <div class="quick-card"> <div class="status-indicator status-warning"></div> <div class="quick-card-icon"> <div class="triangle right-triangle" style="border-bottom-color: var(--warning); transform: scale(0.8) rotate(90deg);"></div> </div> <div class="quick-card-title">Pending Settlements</div> <div class="quick-card-value">$147,890</div> <div class="quick-card-description">Due within 48hrs</div> </div> <div class="quick-card"> <div class="status-indicator status-danger"></div> <div class="quick-card-icon"> <div class="triangle down-triangle" style="border-bottom-color: var(--danger); transform: scale(0.8) rotate(180deg);"></div> </div> <div class="quick-card-title">Fraud Detection</div> <div class="quick-card-value">7 Alerts</div> <div class="quick-card-description">Immediate action required</div> </div> </div> </div> </div> <script> // Loader animation document.addEventListener('DOMContentLoaded', () => { setTimeout(() => { const loader = document.querySelector('.screen-loader'); loader.style.opacity = '0'; setTimeout(() => { loader.style.display = 'none'; }, 500); }, 1800); }); // Navigation functionality const navButtons = document.querySelectorAll('.nav-button'); navButtons.forEach(button => { button.addEventListener('click', function() { // Remove active class from all buttons navButtons.forEach(btn => { btn.classList.remove('active'); btn.classList.remove('pulse'); }); // Add active class to clicked button this.classList.add('active'); this.classList.add('pulse'); // Simulate content change (in a real app, this would load different content) const section = this.getAttribute('data-section'); console.log(`Navigating to ${section} section`); // Remove pulse animation after a delay setTimeout(() => { this.classList.remove('pulse'); }, 1500); // If this is the risk assessment button, clear the notification if(section === 'risk') { const badge = this.querySelector('.notification-badge'); if(badge) { badge.style.opacity = '0'; setTimeout(() => { badge.remove(); }, 300); } } }); }); // Data card interaction const dataCards = document.querySelectorAll('.data-card'); dataCards.forEach(card => { card.addEventListener('click', function() { // Add a subtle highlight effect this.style.backgroundColor = 'rgba(66, 133, 244, 0.2)'; setTimeout(() => { this.style.backgroundColor = ''; }, 300); }); }); // Quick cards interaction const quickCards = document.querySelectorAll('.quick-card'); quickCards.forEach(card => { card.addEventListener('click', function() { // Add a subtle highlight effect this.style.transform = 'scale(1.05) translateY(-3px)'; setTimeout(() => { this.style.transform = ''; }, 300); // Get card title for use in a real application const cardTitle = this.querySelector('.quick-card-title').textContent; console.log(`Accessing detailed metrics for: ${cardTitle}`); }); }); // Simulated data refresh (in a real app, this would fetch new data) let refreshInterval; function startDataRefresh() { refreshInterval = setInterval(() => { // Simulate data changes document.querySelectorAll('.data-card p').forEach(value => { const currentVal = parseFloat(value.textContent.replace(/[$,]/g, '')); const change = (Math.random() * 100 - 50).toFixed(0); const newVal = currentVal + Number(change); // Format for currency if it has a dollar sign if(value.textContent.includes('$')) { value.textContent = `$${newVal.toLocaleString()}`; } else { value.textContent = newVal.toLocaleString(); } // Update trend indicators const trend = value.nextElementSibling; const percentChange = ((change / currentVal) * 100).toFixed(1); if(change > 0) { trend.textContent = `+${percentChange}% ↑`; trend.classList.remove('down'); } else { trend.textContent = `${percentChange}% ↓`; trend.classList.add('down'); } }); }, 15000); // Refresh every 15 seconds } startDataRefresh(); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Creative Portfolio Background</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; } :root { --gradient-1: #ff6b6b; --gradient-2: #4ecdc4; --gradient-3: #7971ea; --gradient-4: #ffd166; --text-light: #f9f9f9; --text-dark: #2d3436; --bg-dark: #222831; } body { width: 100%; height: 100vh; overflow: hidden; background-color: var(--bg-dark); display: flex; justify-content: center; align-items: center; color: var(--text-light); } .container { width: 700px; height: 700px; position: relative; overflow: hidden; } .triangles-container { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 1; } .triangle { position: absolute; width: 0; height: 0; opacity: 0.7; transition: transform 0.5s ease-out, opacity 0.5s ease; filter: blur(2px); mix-blend-mode: screen; z-index: 1; } .portfolio-content { position: relative; height: 100%; width: 100%; display: flex; flex-direction: column; justify-content: center; align-items: center; z-index: 5; padding: 2rem; text-align: center; } .glass-panel { background: rgba(255, 255, 255, 0.1); backdrop-filter: blur(10px); border-radius: 16px; padding: 2.5rem; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); border: 1px solid rgba(255, 255, 255, 0.18); max-width: 540px; transform: translateY(20px); opacity: 0; animation: fadeUp 1s 0.5s forwards; } h1 { font-size: 2.5rem; font-weight: 800; margin-bottom: 1rem; background: linear-gradient(to right, var(--gradient-1), var(--gradient-3)); -webkit-background-clip: text; background-clip: text; color: transparent; letter-spacing: -0.02em; } p { margin-bottom: 1.5rem; line-height: 1.6; font-weight: 300; font-size: 1.1rem; } .portfolio-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; margin-top: 2rem; width: 100%; } .portfolio-item { background: rgba(255, 255, 255, 0.1); border-radius: 8px; overflow: hidden; position: relative; aspect-ratio: 1; cursor: pointer; transform: translateY(20px); opacity: 0; animation: fadeUp 0.5s forwards; } .portfolio-item:nth-child(1) { animation-delay: 0.7s; } .portfolio-item:nth-child(2) { animation-delay: 0.8s; } .portfolio-item:nth-child(3) { animation-delay: 0.9s; } .portfolio-item:nth-child(4) { animation-delay: 1.0s; } .portfolio-item:nth-child(5) { animation-delay: 1.1s; } .portfolio-item:nth-child(6) { animation-delay: 1.2s; } .portfolio-item::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(45deg, var(--gradient-1), var(--gradient-3)); opacity: 0.6; transition: opacity 0.3s; } .portfolio-item:hover::before { opacity: 0.2; } .portfolio-item:hover { transform: scale(1.05) translateZ(0); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); z-index: 10; } .portfolio-item-content { position: absolute; bottom: 0; left: 0; width: 100%; padding: 1rem; opacity: 0; transform: translateY(10px); transition: opacity 0.3s, transform 0.3s; font-size: 0.85rem; font-weight: 600; text-align: center; } .portfolio-item:hover .portfolio-item-content { opacity: 1; transform: translateY(0); } .portfolio-item:nth-child(1)::before { background: linear-gradient(45deg, var(--gradient-1), var(--gradient-2)); } .portfolio-item:nth-child(2)::before { background: linear-gradient(45deg, var(--gradient-2), var(--gradient-3)); } .portfolio-item:nth-child(3)::before { background: linear-gradient(45deg, var(--gradient-3), var(--gradient-4)); } .portfolio-item:nth-child(4)::before { background: linear-gradient(45deg, var(--gradient-4), var(--gradient-1)); } .portfolio-item:nth-child(5)::before { background: linear-gradient(45deg, var(--gradient-1), var(--gradient-3)); } .portfolio-item:nth-child(6)::before { background: linear-gradient(45deg, var(--gradient-2), var(--gradient-4)); } .cta-button { margin-top: 2rem; padding: 0.8rem 2rem; background: linear-gradient(45deg, var(--gradient-1), var(--gradient-3)); border: none; border-radius: 30px; color: var(--text-light); font-weight: 600; font-size: 1rem; cursor: pointer; transition: transform 0.3s, box-shadow 0.3s; transform: translateY(20px); opacity: 0; animation: fadeUp 0.5s 1.3s forwards; position: relative; overflow: hidden; } .cta-button::before { content: ''; position: absolute; top: 0; left: -50%; width: 150%; height: 100%; background: rgba(255, 255, 255, 0.2); transform: skewX(-30deg); transition: transform 0.5s; } .cta-button:hover { transform: translateY(-3px); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2); } .cta-button:hover::before { transform: translateX(100%) skewX(-30deg); } @keyframes fadeUp { to { opacity: 1; transform: translateY(0); } } @media (max-width: 600px) { .glass-panel { padding: 1.5rem; max-width: 100%; } h1 { font-size: 2rem; } p { font-size: 0.95rem; } .portfolio-grid { grid-template-columns: repeat(2, 1fr); } } @media (max-width: 400px) { .glass-panel { padding: 1rem; } h1 { font-size: 1.75rem; } .portfolio-grid { grid-template-columns: 1fr; } } </style> </head> <body> <div class="container"> <div class="triangles-container" id="triangles"></div> <div class="portfolio-content"> <div class="glass-panel"> <h1>Geometric Expressions</h1> <p>Where angles meet creativity. This dynamic triangle-based design system adapts to your content, creating a visually stunning backdrop that elevates your portfolio without overwhelming it.</p> <div class="portfolio-grid"> <div class="portfolio-item"> <div class="portfolio-item-content">Faceted UI Design</div> </div> <div class="portfolio-item"> <div class="portfolio-item-content">Geometric Branding</div> </div> <div class="portfolio-item"> <div class="portfolio-item-content">Angular Motion</div> </div> <div class="portfolio-item"> <div class="portfolio-item-content">Prismatic Colors</div> </div> <div class="portfolio-item"> <div class="portfolio-item-content">Triangle Patterns</div> </div> <div class="portfolio-item"> <div class="portfolio-item-content">Gradient Meshes</div> </div> </div> <button class="cta-button">Explore Projects</button> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', () => { const trianglesContainer = document.getElementById('triangles'); const container = document.querySelector('.container'); const gradients = [ '#ff6b6b', // Coral red '#4ecdc4', // Turquoise '#7971ea', // Purple '#ffd166', // Yellow ]; // Number of triangles to create const numberOfTriangles = 15; // Generate triangles function createTriangles() { trianglesContainer.innerHTML = ''; for (let i = 0; i < numberOfTriangles; i++) { const triangle = document.createElement('div'); triangle.classList.add('triangle'); // Randomize triangle size and position const size = Math.random() * 300 + 100; const left = Math.random() * 100 - 20; // % const top = Math.random() * 100 - 20; // % // Randomize triangle color const color1 = gradients[Math.floor(Math.random() * gradients.length)]; const color2 = gradients[Math.floor(Math.random() * gradients.length)]; // Randomize triangle direction (up or down) const direction = Math.random() > 0.5 ? 'up' : 'down'; triangle.style.left = `${left}%`; triangle.style.top = `${top}%`; if (direction === 'up') { triangle.style.borderLeft = `${size}px solid transparent`; triangle.style.borderRight = `${size}px solid transparent`; triangle.style.borderBottom = `${size * 1.5}px solid ${color1}`; } else { triangle.style.borderLeft = `${size}px solid transparent`; triangle.style.borderRight = `${size}px solid transparent`; triangle.style.borderTop = `${size * 1.5}px solid ${color2}`; } triangle.style.transform = `rotate(${Math.random() * 360}deg) scale(${Math.random() * 0.4 + 0.6})`; triangle.style.opacity = Math.random() * 0.3 + 0.3; triangle.style.zIndex = Math.floor(Math.random() * 5); trianglesContainer.appendChild(triangle); // Add initial animation setTimeout(() => { animateTriangle(triangle); }, Math.random() * 2000); } } // Animate triangles periodically function animateTriangle(triangle) { const newX = Math.random() * 20 - 10; const newY = Math.random() * 20 - 10; const newRotate = parseInt(triangle.style.transform.match(/rotate\((\d+)deg\)/)?.[1] || 0) + (Math.random() * 20 - 10); const newScale = Math.random() * 0.2 + 0.9; triangle.style.transform = `translate(${newX}px, ${newY}px) rotate(${newRotate}deg) scale(${newScale})`; triangle.style.opacity = Math.random() * 0.3 + 0.3; setTimeout(() => { animateTriangle(triangle); }, Math.random() * 6000 + 4000); } // Mouse interaction container.addEventListener('mousemove', (e) => { const mouseX = e.clientX - container.getBoundingClientRect().left; const mouseY = e.clientY - container.getBoundingClientRect().top; const triangles = document.querySelectorAll('.triangle'); triangles.forEach(triangle => { const rect = triangle.getBoundingClientRect(); const triangleX = rect.left + rect.width / 2 - container.getBoundingClientRect().left; const triangleY = rect.top + rect.height / 2 - container.getBoundingClientRect().top; const distX = mouseX - triangleX; const distY = mouseY - triangleY; const distance = Math.sqrt(distX * distX + distY * distY); if (distance < 200) { const moveX = distX / distance * 10; const moveY = distY / distance * 10; triangle.style.transform += ` translate(${-moveX}px, ${-moveY}px)`; } }); }); // Handle portfolio item clicks const portfolioItems = document.querySelectorAll('.portfolio-item'); portfolioItems.forEach(item => { item.addEventListener('click', () => { item.style.transform = 'scale(1.05) translateZ(0) rotate(1deg)'; setTimeout(() => { item.style.transform = 'scale(1.05) translateZ(0) rotate(0deg)'; }, 150); }); }); // Initialize triangles createTriangles(); // Button interaction const ctaButton = document.querySelector('.cta-button'); ctaButton.addEventListener('click', (e) => { e.preventDefault(); ctaButton.style.transform = 'scale(0.95)'; setTimeout(() => { ctaButton.style.transform = ''; // Animate all triangles on click for visual effect const triangles = document.querySelectorAll('.triangle'); triangles.forEach(triangle => { animateTriangle(triangle); }); }, 150); }); // Regenerate triangles on window resize let resizeTimeout; window.addEventListener('resize', () => { clearTimeout(resizeTimeout); resizeTimeout = setTimeout(() => { createTriangles(); }, 300); }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Triangle Progress Indicators</title> <style> :root { --primary-color: #121212; --accent-color: #FF6B35; --secondary-accent: #4ECDC4; --tertiary-accent: #7D70BA; --background-color: #F7F7F7; --text-color: #333333; --light-text: #777777; --success-color: #2ECC71; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; } body { background-color: var(--background-color); color: var(--text-color); display: flex; flex-direction: column; align-items: center; justify-content: flex-start; min-height: 100vh; padding: 2rem 1rem; overflow-x: hidden; } .container { max-width: 650px; width: 100%; margin: 0 auto; } header { text-align: center; margin-bottom: 2.5rem; } h1 { font-size: 2rem; margin-bottom: 0.5rem; color: var(--primary-color); letter-spacing: -0.5px; position: relative; display: inline-block; } h1::after { content: ''; position: absolute; width: 40px; height: 3px; background-color: var(--accent-color); bottom: -8px; left: 50%; transform: translateX(-50%); } p.subtitle { color: var(--light-text); margin-top: 1rem; max-width: 500px; margin-left: auto; margin-right: auto; line-height: 1.6; } .progress-container { display: flex; flex-direction: column; position: relative; gap: 1.5rem; margin-bottom: 2rem; } .stages-wrapper { display: flex; justify-content: space-between; position: relative; margin-bottom: 1rem; } .stage { position: relative; display: flex; flex-direction: column; align-items: center; width: 80px; transition: transform 0.3s ease; cursor: pointer; } .stage:hover { transform: translateY(-5px); } .triangle { width: 40px; height: 40px; margin-bottom: 0.75rem; position: relative; transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275); } .triangle svg { width: 100%; height: 100%; } .triangle-outline { stroke: var(--primary-color); stroke-width: 2; fill: transparent; transition: all 0.3s ease; } .triangle-fill { fill: var(--primary-color); stroke: none; clip-path: polygon(50% 0%, 0% 100%, 100% 100%); transform-origin: center bottom; transform: scaleY(0); transition: transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275); } .stage-name { font-size: 0.85rem; font-weight: 600; text-align: center; color: var(--light-text); transition: color 0.3s ease; max-width: 100px; } .connector { position: absolute; top: 20px; left: 80px; right: 80px; height: 2px; background-color: #e0e0e0; z-index: -1; } .connector-progress { position: absolute; top: 0; left: 0; height: 100%; width: 0%; background-color: var(--accent-color); transition: width 0.5s ease-in-out; } .stage.active .triangle { transform: scale(1.1); } .stage.active .triangle-outline { stroke: var(--accent-color); } .stage.active .stage-name { color: var(--accent-color); } .stage.completed .triangle-fill { transform: scaleY(1); fill: var(--accent-color); } .stage.completed .triangle-outline { stroke: var(--accent-color); } .stage.completed .stage-name { color: var(--accent-color); } .controls { display: flex; justify-content: space-between; margin-top: 2rem; } .btn { padding: 0.75rem 1.5rem; border: none; border-radius: 4px; background-color: var(--primary-color); color: white; font-weight: 600; cursor: pointer; transition: all 0.3s ease; outline: none; position: relative; overflow: hidden; } .btn:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0,0,0,0.1); } .btn:active { transform: translateY(0); } .btn-next { background-color: var(--accent-color); } .btn-prev { background-color: transparent; color: var(--text-color); border: 1px solid #e0e0e0; } .btn-prev:hover { background-color: #f0f0f0; } .btn-reset { margin-left: auto; background-color: var(--primary-color); } .process-info { background-color: white; border-radius: 8px; padding: 1.5rem; margin-top: 1rem; box-shadow: 0 4px 15px rgba(0,0,0,0.05); transition: all 0.3s ease; } .process-title { font-size: 1.3rem; font-weight: 600; margin-bottom: 0.75rem; color: var(--primary-color); display: flex; align-items: center; gap: 10px; } .process-title .icon { width: 24px; height: 24px; } .process-details { line-height: 1.6; color: var(--light-text); } .process-tip { margin-top: 1rem; padding: 0.75rem; background-color: rgba(78, 205, 196, 0.1); border-left: 3px solid var(--secondary-accent); font-size: 0.9rem; color: var(--text-color); } .completion-message { display: none; text-align: center; margin-top: 1.5rem; padding: 1rem; background-color: rgba(46, 204, 113, 0.1); border-radius: 4px; color: var(--success-color); font-weight: 600; animation: fadeIn 0.5s ease-out; } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } .pulse { animation: pulse 1s infinite; } @keyframes rotate { from { transform: rotateY(0deg); } to { transform: rotateY(360deg); } } .stage.completed .triangle { animation: rotate 0.6s cubic-bezier(0.455, 0.03, 0.515, 0.955); } /* Responsive adjustments */ @media (max-width: 600px) { .stages-wrapper { flex-direction: column; align-items: flex-start; gap: 1.5rem; } .stage { width: 100%; flex-direction: row; align-items: center; gap: 1rem; } .triangle { margin-bottom: 0; } .connector { left: 20px; right: auto; top: 60px; bottom: 20px; width: 2px; height: auto; } .connector-progress { width: 100%; height: 0%; top: 0; left: 0; } .controls { flex-wrap: wrap; gap: 0.5rem; } .btn { flex: 1; min-width: 100px; text-align: center; } .btn-reset { margin-left: 0; flex-basis: 100%; margin-top: 0.5rem; } } </style> </head> <body> <div class="container"> <header> <h1>Geometric Progress Tracker</h1> <p class="subtitle">Follow your project milestones with our minimalist triangle indicators that visually transform as you advance through each phase.</p> </header> <div class="progress-container"> <div class="stages-wrapper"> <div class="connector"> <div class="connector-progress"></div> </div> <div class="stage" data-stage="1"> <div class="triangle"> <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"> <polygon class="triangle-outline" points="50,10 10,90 90,90"/> <polygon class="triangle-fill" points="50,10 10,90 90,90"/> </svg> </div> <div class="stage-name">Planning</div> </div> <div class="stage" data-stage="2"> <div class="triangle"> <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"> <polygon class="triangle-outline" points="50,10 10,90 90,90"/> <polygon class="triangle-fill" points="50,10 10,90 90,90"/> </svg> </div> <div class="stage-name">Design</div> </div> <div class="stage" data-stage="3"> <div class="triangle"> <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"> <polygon class="triangle-outline" points="50,10 10,90 90,90"/> <polygon class="triangle-fill" points="50,10 10,90 90,90"/> </svg> </div> <div class="stage-name">Development</div> </div> <div class="stage" data-stage="4"> <div class="triangle"> <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"> <polygon class="triangle-outline" points="50,10 10,90 90,90"/> <polygon class="triangle-fill" points="50,10 10,90 90,90"/> </svg> </div> <div class="stage-name">Testing</div> </div> <div class="stage" data-stage="5"> <div class="triangle"> <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"> <polygon class="triangle-outline" points="50,10 10,90 90,90"/> <polygon class="triangle-fill" points="50,10 10,90 90,90"/> </svg> </div> <div class="stage-name">Launch</div> </div> </div> <div class="process-info"> <h3 class="process-title"> <span class="icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"></path> <polyline points="22 4 12 14.01 9 11.01"></polyline> </svg> </span> Planning Phase </h3> <p class="process-details">Begin by establishing project goals, timelines, and resource allocation. Create a detailed roadmap that outlines each milestone and expected deliverable.</p> <div class="process-tip">Tip: Use the triangle indicators above to track your current position in the workflow. Each filled triangle represents a completed phase.</div> </div> <div class="completion-message"> All phases successfully completed! Your project is ready for launch. </div> <div class="controls"> <button class="btn btn-prev" id="prevBtn" disabled>Previous</button> <button class="btn btn-next" id="nextBtn">Next Phase</button> <button class="btn btn-reset" id="resetBtn">Reset Progress</button> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const stages = document.querySelectorAll('.stage'); const connector = document.querySelector('.connector-progress'); const prevBtn = document.getElementById('prevBtn'); const nextBtn = document.getElementById('nextBtn'); const resetBtn = document.getElementById('resetBtn'); const processInfo = document.querySelector('.process-info'); const processTitle = document.querySelector('.process-title'); const processDetails = document.querySelector('.process-details'); const processTip = document.querySelector('.process-tip'); const completionMessage = document.querySelector('.completion-message'); let currentStage = 1; const totalStages = stages.length; // Process content for each stage const stageContent = [ { title: "Planning Phase", details: "Begin by establishing project goals, timelines, and resource allocation. Create a detailed roadmap that outlines each milestone and expected deliverable.", tip: "Tip: Use the triangle indicators above to track your current position in the workflow. Each filled triangle represents a completed phase." }, { title: "Design Phase", details: "Translate requirements into visual concepts and wireframes. Focus on user experience and interface design principles to create an intuitive flow.", tip: "Tip: The filling triangles provide an immediate visual cue of your progress through the project lifecycle." }, { title: "Development Phase", details: "Convert designs into functional components with clean, efficient code. Implement features according to specifications while maintaining high quality standards.", tip: "Tip: Notice how each triangle transforms as you advance, providing a geometric representation of your workflow progress." }, { title: "Testing Phase", details: "Thoroughly validate all functionality against requirements. Perform usability testing, fix bugs, and optimize performance before proceeding to launch.", tip: "Tip: The high-contrast triangular indicators are designed for maximum visibility and accessibility." }, { title: "Launch Phase", details: "Finalize all components and prepare for deployment. Create documentation, train users, and establish monitoring systems for post-launch support.", tip: "Tip: When all triangles are filled, your project has successfully completed all planned phases." } ]; // Initialize the progress display function updateProgressDisplay() { // Update stages appearance stages.forEach((stage, index) => { const stageNum = index + 1; // Reset all classes stage.classList.remove('active', 'completed'); if (stageNum < currentStage) { stage.classList.add('completed'); } else if (stageNum === currentStage) { stage.classList.add('active'); } }); // Update connector progress const progressPercentage = ((currentStage - 1) / (totalStages - 1)) * 100; // Check if we're in responsive view const isVertical = window.innerWidth <= 600; if (isVertical) { connector.style.height = `${progressPercentage}%`; } else { connector.style.width = `${progressPercentage}%`; } // Update buttons state prevBtn.disabled = currentStage === 1; if (currentStage === totalStages) { nextBtn.textContent = "Complete"; nextBtn.classList.add('pulse'); } else { nextBtn.textContent = "Next Phase"; nextBtn.classList.remove('pulse'); } // Update process info const content = stageContent[currentStage - 1]; processTitle.innerHTML = `<span class="icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"></path> <polyline points="22 4 12 14.01 9 11.01"></polyline> </svg> </span>${content.title}`; processDetails.textContent = content.details; processTip.textContent = content.tip; // Show/hide completion message completionMessage.style.display = currentStage > totalStages ? 'block' : 'none'; // If all stages are complete, update UI if (currentStage > totalStages) { nextBtn.disabled = true; processInfo.style.display = 'none'; } else { nextBtn.disabled = false; processInfo.style.display = 'block'; } } // Event listeners for buttons nextBtn.addEventListener('click', function() { if (currentStage <= totalStages) { currentStage++; updateProgressDisplay(); } }); prevBtn.addEventListener('click', function() { if (currentStage > 1) { currentStage--; updateProgressDisplay(); } }); resetBtn.addEventListener('click', function() { currentStage = 1; updateProgressDisplay(); }); // Allow clicking on triangles to navigate stages.forEach(stage => { stage.addEventListener('click', function() { const stageNum = parseInt(this.dataset.stage); // Only allow clicking on stages that are completed or the next one if (stageNum <= currentStage || stageNum === currentStage + 1) { currentStage = stageNum; updateProgressDisplay(); } }); }); // Initialize updateProgressDisplay(); // Handle responsiveness window.addEventListener('resize', updateProgressDisplay); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>TriGrid Analytics Dashboard</title> <style> :root { --primary: #2a3b4c; --secondary: #e6e8ea; --accent: #00b8d4; --gray-light: #f5f7f9; --gray: #d1d5db; --gray-dark: #6b7280; --highlight: #ff6b6b; --highlight-alt: #ffb347; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; } body { background-color: var(--gray-light); color: var(--primary); display: flex; justify-content: center; align-items: center; height: 100vh; overflow: hidden; } .container { width: 650px; height: 650px; background: white; border-radius: 12px; box-shadow: 0 10px 25px rgba(0, 0, 0, 0.05); padding: 24px; position: relative; overflow: hidden; display: flex; flex-direction: column; } .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; } h1 { font-size: 24px; font-weight: 700; margin-bottom: 8px; position: relative; } h1::after { content: ''; position: absolute; bottom: -6px; left: 0; width: 40px; height: 3px; background: var(--accent); border-radius: 2px; } .subtitle { font-size: 14px; color: var(--gray-dark); margin-bottom: 16px; } .controls { display: flex; gap: 12px; } .control-btn { background: var(--gray-light); border: none; border-radius: 8px; padding: 8px 12px; color: var(--primary); font-weight: 500; font-size: 13px; cursor: pointer; transition: all 0.2s ease; display: flex; align-items: center; gap: 6px; } .control-btn:hover { background: var(--secondary); } .control-btn.active { background: var(--primary); color: white; } .tabs { display: flex; gap: 16px; margin-bottom: 20px; border-bottom: 1px solid var(--gray); padding-bottom: 12px; } .tab { font-size: 14px; font-weight: 600; color: var(--gray-dark); cursor: pointer; padding: 4px 0; position: relative; transition: color 0.2s ease; } .tab:hover { color: var(--primary); } .tab.active { color: var(--primary); } .tab.active::after { content: ''; position: absolute; bottom: -13px; left: 0; width: 100%; height: 2px; background: var(--accent); border-radius: 2px; } .dashboard { display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: 230px 180px; gap: 16px; flex-grow: 1; } .chart-container { background: white; border-radius: 10px; border: 1px solid var(--gray); padding: 16px; position: relative; overflow: hidden; transition: transform 0.2s ease, box-shadow 0.2s ease; } .chart-container:hover { transform: translateY(-2px); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05); } .chart-container:first-child { grid-column: 1 / 3; } .chart-title { font-size: 14px; font-weight: 600; margin-bottom: 12px; display: flex; justify-content: space-between; align-items: center; } .chart-value { font-size: 24px; font-weight: 700; margin-bottom: 8px; } .chart-change { font-size: 13px; display: inline-flex; align-items: center; gap: 4px; padding: 3px 8px; border-radius: 12px; margin-left: 8px; } .chart-change.positive { background: rgba(0, 184, 212, 0.1); color: var(--accent); } .chart-change.negative { background: rgba(255, 107, 107, 0.1); color: var(--highlight); } .triangle-grid { position: absolute; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; opacity: 0.04; z-index: 0; } .tooltip { position: absolute; background: var(--primary); color: white; padding: 8px 12px; border-radius: 6px; font-size: 12px; font-weight: 500; pointer-events: none; opacity: 0; transform: translateY(10px); transition: opacity 0.2s ease, transform 0.2s ease; z-index: 10; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); white-space: nowrap; } .tooltip::after { content: ''; position: absolute; bottom: -5px; left: 50%; transform: translateX(-50%); width: 0; height: 0; border-left: 6px solid transparent; border-right: 6px solid transparent; border-top: 6px solid var(--primary); } .tooltip.visible { opacity: 1; transform: translateY(0); } .legend { display: flex; gap: 12px; margin-top: 8px; } .legend-item { display: flex; align-items: center; gap: 4px; font-size: 12px; color: var(--gray-dark); } .legend-color { width: 8px; height: 8px; border-radius: 2px; } .data-point { position: absolute; width: 8px; height: 8px; border-radius: 50%; cursor: pointer; transition: transform 0.2s ease; z-index: 2; } .data-point:hover { transform: scale(1.75); } .chart-container canvas { position: relative; z-index: 1; } .insights { display: flex; align-items: center; gap: 8px; } .insight-icon { width: 20px; height: 20px; display: flex; align-items: center; justify-content: center; background: var(--secondary); border-radius: 4px; } @keyframes pulse { 0% { transform: scale(1); opacity: 0.8; } 50% { transform: scale(1.1); opacity: 1; } 100% { transform: scale(1); opacity: 0.8; } } .highlight-point { position: absolute; background: var(--highlight); width: 10px; height: 10px; border-radius: 50%; z-index: 3; box-shadow: 0 0 0 3px rgba(255, 107, 107, 0.2); animation: pulse 2s infinite; } .toggle-wrapper { position: relative; display: inline-block; width: 40px; height: 20px; } .toggle { opacity: 0; width: 0; height: 0; } .toggle-slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: var(--gray); transition: .4s; border-radius: 34px; } .toggle-slider:before { position: absolute; content: ""; height: 16px; width: 16px; left: 2px; bottom: 2px; background-color: white; transition: .4s; border-radius: 50%; } .toggle:checked + .toggle-slider { background-color: var(--accent); } .toggle:checked + .toggle-slider:before { transform: translateX(20px); } .counter { font-size: 14px; color: var(--gray-dark); display: flex; align-items: center; gap: 5px; } .counter-number { background: var(--gray-light); color: var(--primary); font-weight: 600; padding: 2px 6px; border-radius: 4px; } .chart-info { position: relative; z-index: 1; } </style> </head> <body> <div class="container"> <div class="header"> <div> <h1>TriGrid Analytics</h1> <p class="subtitle">Q3 2023 Performance Metrics</p> </div> <div class="controls"> <button class="control-btn active" id="daily">Daily</button> <button class="control-btn" id="weekly">Weekly</button> <button class="control-btn" id="monthly">Monthly</button> </div> </div> <div class="tabs"> <div class="tab active" data-tab="conversion">Conversion Rates</div> <div class="tab" data-tab="engagement">User Engagement</div> <div class="tab" data-tab="revenue">Revenue Metrics</div> </div> <div class="dashboard"> <div class="chart-container" id="main-chart"> <div class="chart-title"> <span>Conversion Journey Map</span> <div class="insights"> <div class="insight-icon"> <svg width="12" height="12" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22Z" stroke="#2a3b4c" stroke-width="2"/> <path d="M12 16V12" stroke="#2a3b4c" stroke-width="2" stroke-linecap="round"/> <path d="M12 8H12.01" stroke="#2a3b4c" stroke-width="2" stroke-linecap="round"/> </svg> </div> <div class="toggle-wrapper"> <input type="checkbox" id="grid-toggle" class="toggle" checked> <span class="toggle-slider"></span> </div> <span style="font-size: 13px; color: var(--gray-dark)">Grid</span> </div> </div> <div class="chart-info"> <div class="chart-value">62.7%</div> <span>Average Conversion Rate</span> <span class="chart-change positive">+4.2% <svg width="12" height="12" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12 5L12 19" stroke="currentColor" stroke-width="2" stroke-linecap="round"/><path d="M19 12L12 5L5 12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></span> </div> <div class="legend"> <div class="legend-item"> <span class="legend-color" style="background: var(--accent)"></span> <span>Conversion Path</span> </div> <div class="legend-item"> <span class="legend-color" style="background: var(--highlight)"></span> <span>Drop-off Points</span> </div> </div> <canvas id="line-chart" width="580" height="140"></canvas> <div class="triangle-grid" id="main-grid"></div> <div class="highlight-point" style="top: 100px; left: 320px;"></div> <div id="main-tooltip" class="tooltip">Data point information</div> </div> <div class="chart-container"> <div class="chart-title"> <span>User Funnel Steps</span> <div class="counter"> <span>Data points:</span> <span class="counter-number">28</span> </div> </div> <canvas id="funnel-chart" width="270" height="120"></canvas> <div class="triangle-grid" id="funnel-grid"></div> <div id="funnel-tooltip" class="tooltip">Funnel data</div> </div> <div class="chart-container"> <div class="chart-title"> <span>Device Distribution</span> <span class="chart-change positive">+8.3% Mobile</span> </div> <canvas id="device-chart" width="270" height="120"></canvas> <div class="triangle-grid" id="device-grid"></div> <div id="device-tooltip" class="tooltip">Device data</div> </div> </div> </div> <script> // Generate triangle grid pattern function createTriangleGrid(container, size = 20, color = '#2a3b4c') { const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); svg.setAttribute('width', '100%'); svg.setAttribute('height', '100%'); const parentWidth = container.offsetWidth; const parentHeight = container.offsetHeight; const cols = Math.ceil(parentWidth / size); const rows = Math.ceil(parentHeight / size); for (let i = 0; i < rows; i++) { for (let j = 0; j < cols; j++) { const x = j * size; const y = i * size; // For alternating triangles if ((i + j) % 2 === 0) { const triangle = document.createElementNS('http://www.w3.org/2000/svg', 'polygon'); triangle.setAttribute('points', `${x},${y} ${x+size},${y} ${x+size/2},${y+size}`); triangle.setAttribute('fill', color); svg.appendChild(triangle); } else { const triangle = document.createElementNS('http://www.w3.org/2000/svg', 'polygon'); triangle.setAttribute('points', `${x},${y} ${x+size},${y} ${x+size/2},${y-size}`); triangle.setAttribute('fill', color); svg.appendChild(triangle); } } } container.appendChild(svg); } // Draw line chart function drawLineChart() { const canvas = document.getElementById('line-chart'); const ctx = canvas.getContext('2d'); const width = canvas.width; const height = canvas.height; ctx.clearRect(0, 0, width, height); // Draw grid lines if (document.getElementById('grid-toggle').checked) { ctx.beginPath(); ctx.strokeStyle = '#f0f2f5'; ctx.lineWidth = 1; const gridSize = 20; for (let i = 0; i <= height; i += gridSize) { ctx.moveTo(0, i); ctx.lineTo(width, i); } for (let i = 0; i <= width; i += gridSize) { ctx.moveTo(i, 0); ctx.lineTo(i, height); } ctx.stroke(); } // Define data points const data = [ { x: 30, y: 100 }, { x: 80, y: 80 }, { x: 130, y: 90 }, { x: 180, y: 60 }, { x: 230, y: 40 }, { x: 280, y: 50 }, { x: 330, y: 30 }, { x: 380, y: 45 }, { x: 430, y: 25 }, { x: 480, y: 20 }, { x: 530, y: 30 } ]; // Draw line ctx.beginPath(); ctx.moveTo(data[0].x, data[0].y); for (let i = 1; i < data.length; i++) { // Curve the line const xc = (data[i].x + data[i-1].x) / 2; const yc = (data[i].y + data[i-1].y) / 2; ctx.quadraticCurveTo(data[i-1].x, data[i-1].y, xc, yc); } ctx.quadraticCurveTo(data[data.length-2].x, data[data.length-2].y, data[data.length-1].x, data[data.length-1].y); // Style line ctx.strokeStyle = '#00b8d4'; ctx.lineWidth = 3; ctx.stroke(); // Add gradient under the line const gradient = ctx.createLinearGradient(0, 0, 0, height); gradient.addColorStop(0, 'rgba(0, 184, 212, 0.2)'); gradient.addColorStop(1, 'rgba(0, 184, 212, 0)'); ctx.lineTo(data[data.length-1].x, height); ctx.lineTo(data[0].x, height); ctx.fillStyle = gradient; ctx.fill(); // Draw data points data.forEach((point, index) => { ctx.beginPath(); ctx.arc(point.x, point.y, 4, 0, Math.PI * 2); ctx.fillStyle = '#00b8d4'; ctx.fill(); // Create real DOM points for tooltip interaction const dataPoint = document.createElement('div'); dataPoint.className = 'data-point'; dataPoint.style.left = `${point.x}px`; dataPoint.style.top = `${point.y}px`; dataPoint.style.background = '#00b8d4'; // Add tooltip event dataPoint.addEventListener('mouseover', (e) => { const tooltip = document.getElementById('main-tooltip'); tooltip.textContent = `Step ${index + 1}: ${90 - Math.round(point.y / 1.4)}% Conversion Rate`; tooltip.style.left = `${point.x}px`; tooltip.style.top = `${point.y - 30}px`; tooltip.classList.add('visible'); }); dataPoint.addEventListener('mouseout', () => { document.getElementById('main-tooltip').classList.remove('visible'); }); document.getElementById('main-chart').appendChild(dataPoint); }); } // Draw funnel chart function drawFunnelChart() { const canvas = document.getElementById('funnel-chart'); const ctx = canvas.getContext('2d'); const width = canvas.width; const height = canvas.height; ctx.clearRect(0, 0, width, height); const data = [ { label: 'Visitors', value: 100, color: '#00b8d4' }, { label: 'Sign-ups', value: 75, color: '#00abcc' }, { label: 'Activated', value: 50, color: '#0099c0' }, { label: 'Converted', value: 35, color: '#0088b3' } ]; const startX = 20; const endX = width - 20; const startY = 10; const barHeight = 20; const spacing = 10; data.forEach((item, index) => { const barWidth = (endX - startX) * (item.value / 100); const y = startY + (barHeight + spacing) * index; // Draw funnel bar ctx.fillStyle = item.color; ctx.beginPath(); ctx.rect(startX, y, barWidth, barHeight); ctx.fill(); // Add label ctx.fillStyle = '#2a3b4c'; ctx.font = '11px Inter, sans-serif'; ctx.fillText(`${item.label} - ${item.value}%`, startX + 10, y + barHeight / 2 + 4); // Add data point for tooltip const dataPoint = document.createElement('div'); dataPoint.className = 'data-point'; dataPoint.style.left = `${startX + barWidth}px`; dataPoint.style.top = `${y + barHeight / 2}px`; dataPoint.style.background = item.color; dataPoint.addEventListener('mouseover', (e) => { const tooltip = document.getElementById('funnel-tooltip'); tooltip.textContent = `${item.label}: ${item.value}% (${index > 0 ? (item.value / data[index-1].value * 100).toFixed(1) + '% retention' : 'Base'})`; tooltip.style.left = `${startX + barWidth / 2}px`; tooltip.style.top = `${y - 20}px`; tooltip.classList.add('visible'); }); dataPoint.addEventListener('mouseout', () => { document.getElementById('funnel-tooltip').classList.remove('visible'); }); document.getElementById('funnel-chart').parentElement.appendChild(dataPoint); }); } // Draw device distribution chart function drawDeviceChart() { const canvas = document.getElementById('device-chart'); const ctx = canvas.getContext('2d'); const width = canvas.width; const height = canvas.height; ctx.clearRect(0, 0, width, height); const data = [ { label: 'Mobile', value: 60, color: '#00b8d4' }, { label: 'Desktop', value: 30, color: '#ffa726' }, { label: 'Tablet', value: 10, color: '#5e35b1' } ]; const centerX = width / 2; const centerY = height / 2; const radius = Math.min(width, height) / 2 - 20; let startAngle = 0; data.forEach((item, index) => { const sliceAngle = 2 * Math.PI * item.value / 100; ctx.beginPath(); ctx.fillStyle = item.color; ctx.moveTo(centerX, centerY); ctx.arc(centerX, centerY, radius, startAngle, startAngle + sliceAngle); ctx.closePath(); ctx.fill(); // Calculate position for data point (in the middle of the slice) const midAngle = startAngle + sliceAngle / 2; const x = centerX + (radius * 0.7) * Math.cos(midAngle); const y = centerY + (radius * 0.7) * Math.sin(midAngle); // Add interactive data point const dataPoint = document.createElement('div'); dataPoint.className = 'data-point'; dataPoint.style.left = `${x}px`; dataPoint.style.top = `${y}px`; dataPoint.style.background = item.color; dataPoint.addEventListener('mouseover', (e) => { const tooltip = document.getElementById('device-tooltip'); tooltip.textContent = `${item.label}: ${item.value}%`; tooltip.style.left = `${x}px`; tooltip.style.top = `${y - 20}px`; tooltip.classList.add('visible'); }); dataPoint.addEventListener('mouseout', () => { document.getElementById('device-tooltip').classList.remove('visible'); }); document.getElementById('device-chart').parentElement.appendChild(dataPoint); startAngle += sliceAngle; }); // Add center circle for style ctx.beginPath(); ctx.fillStyle = 'white'; ctx.arc(centerX, centerY, radius * 0.4, 0, 2 * Math.PI); ctx.fill(); // Add text in center ctx.fillStyle = '#2a3b4c'; ctx.font = 'bold 16px Inter, sans-serif'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; ctx.fillText(`${data[0].value}%`, centerX, centerY); ctx.font = '10px Inter, sans-serif'; ctx.fillText('Mobile', centerX, centerY + 15); } // Handle tab switching document.querySelectorAll('.tab').forEach(tab => { tab.addEventListener('click', () => { document.querySelectorAll('.tab').forEach(t => t.classList.remove('active')); tab.classList.add('active'); }); }); // Handle time controls document.querySelectorAll('.control-btn').forEach(btn => { btn.addEventListener('click', () => { document.querySelectorAll('.control-btn').forEach(b => b.classList.remove('active')); btn.classList.add('active'); // Redraw charts with slight modifications to simulate different time periods setTimeout(() => { drawLineChart(); drawFunnelChart(); drawDeviceChart(); }, 200); }); }); // Grid toggle document.getElementById('grid-toggle').addEventListener('change', () => { drawLineChart(); }); // Initialize window.addEventListener('DOMContentLoaded', () => { // Create triangle grid backgrounds createTriangleGrid(document.getElementById('main-grid')); createTriangleGrid(document.getElementById('funnel-grid')); createTriangleGrid(document.getElementById('device-grid')); // Draw initial charts drawLineChart(); drawFunnelChart(); drawDeviceChart(); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Prismatic Digital Agency</title> <style> /* Reset & Base Styles */ *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; } :root { --primary: #6200ea; --secondary: #03dac6; --accent: #ff4081; --dark: #121212; --light: #ffffff; --gradient: linear-gradient(135deg, var(--primary), var(--secondary)); } @font-face { font-family: 'Inter'; src: url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;700&display=swap'); } body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background-color: var(--dark); color: var(--light); overflow-x: hidden; line-height: 1.6; height: 100vh; position: relative; } .container { max-width: 700px; height: 700px; margin: 0 auto; padding: 0 1.5rem; overflow-y: auto; position: relative; scroll-behavior: smooth; scrollbar-width: none; } .container::-webkit-scrollbar { display: none; } /* Triangle Decorations */ .triangle { position: absolute; clip-path: polygon(50% 0%, 0% 100%, 100% 100%); transition: transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275); z-index: -1; } .triangle-1 { background: var(--primary); width: 150px; height: 150px; top: 50px; left: -40px; opacity: 0.7; animation: float 8s ease-in-out infinite; } .triangle-2 { background: var(--secondary); width: 100px; height: 100px; bottom: 100px; right: -30px; opacity: 0.5; animation: float 6s ease-in-out infinite reverse; } .triangle-3 { background: var(--accent); width: 80px; height: 80px; top: 250px; right: 60px; opacity: 0.6; animation: float 10s ease-in-out infinite 2s; } @keyframes float { 0% { transform: translateY(0) rotate(0deg); } 50% { transform: translateY(-20px) rotate(10deg); } 100% { transform: translateY(0) rotate(0deg); } } /* Navigation */ .nav { display: flex; justify-content: space-between; align-items: center; padding: 1.5rem 0; margin-bottom: 2rem; position: relative; } .logo { font-weight: 700; font-size: 1.5rem; background: var(--gradient); -webkit-background-clip: text; background-clip: text; color: transparent; display: flex; align-items: center; gap: 0.5rem; } .logo-triangle { width: 20px; height: 20px; background: var(--gradient); clip-path: polygon(50% 0%, 0% 100%, 100% 100%); display: inline-block; transform: rotate(0deg); transition: transform 0.3s ease; } .logo:hover .logo-triangle { transform: rotate(180deg); } .nav-links { display: flex; gap: 2rem; list-style: none; } .nav-link { position: relative; color: var(--light); text-decoration: none; font-weight: 600; font-size: 0.9rem; transition: color 0.3s ease; } .nav-link::after { content: ''; position: absolute; width: 0; height: 2px; bottom: -5px; left: 0; background: var(--gradient); transition: width 0.3s ease; } .nav-link:hover { color: var(--secondary); } .nav-link:hover::after { width: 100%; } /* Hero Section */ .hero { min-height: 500px; display: flex; flex-direction: column; justify-content: center; padding: 2rem 0; position: relative; } .hero h1 { font-size: 3rem; font-weight: 800; line-height: 1.2; margin-bottom: 1.5rem; max-width: 80%; opacity: 0; transform: translateY(30px); animation: fadeIn 0.8s forwards 0.2s; } .hero h1 span { color: var(--secondary); position: relative; display: inline-block; } .hero h1 span::after { content: ''; position: absolute; width: 100%; height: 6px; background-color: var(--accent); bottom: 5px; left: 0; z-index: -1; transform: skewX(-20deg); } .hero p { max-width: 70%; color: rgba(255, 255, 255, 0.8); margin-bottom: 2rem; font-size: 1.1rem; opacity: 0; transform: translateY(30px); animation: fadeIn 0.8s forwards 0.4s; } @keyframes fadeIn { to { opacity: 1; transform: translateY(0); } } /* CTA */ .cta-container { display: flex; gap: 1rem; opacity: 0; transform: translateY(30px); animation: fadeIn 0.8s forwards 0.6s; } .cta { padding: 0.75rem 2rem; border: none; border-radius: 4px; font-weight: 600; cursor: pointer; position: relative; overflow: hidden; z-index: 1; transition: transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); } .cta-primary { background: var(--gradient); color: var(--light); box-shadow: 0 4px 20px rgba(98, 0, 234, 0.3); } .cta-secondary { background: transparent; color: var(--light); border: 2px solid var(--secondary); } .cta::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.1); transform: scaleX(0); transform-origin: right; transition: transform 0.3s ease; z-index: -1; } .cta:hover { transform: translateY(-3px); } .cta:hover::before { transform: scaleX(1); transform-origin: left; } /* Services Section */ .services { padding: 3rem 0; opacity: 0; transition: opacity 0.8s ease; } .section-visible { opacity: 1; } .section-heading { font-size: 1.8rem; margin-bottom: 2.5rem; position: relative; display: inline-block; } .section-heading::after { content: ''; position: absolute; width: 40px; height: 4px; background: var(--gradient); bottom: -12px; left: 0; } .services-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1.5rem; } .service-card { background: rgba(255, 255, 255, 0.05); border-radius: 8px; padding: 1.5rem; transition: transform 0.3s ease, box-shadow 0.3s ease; cursor: pointer; position: relative; overflow: hidden; } .service-card::before { content: ''; position: absolute; top: 0; left: 0; width: 4px; height: 0; background: var(--gradient); transition: height 0.3s ease; } .service-card:hover { transform: translateY(-5px); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); } .service-card:hover::before { height: 100%; } .service-icon { margin-bottom: 1rem; width: 40px; height: 40px; background: var(--gradient); border-radius: 8px; display: flex; align-items: center; justify-content: center; transition: transform 0.3s ease; } .service-card:hover .service-icon { transform: rotate(10deg); } .service-title { font-size: 1.2rem; margin-bottom: 0.5rem; font-weight: 600; } .service-desc { color: rgba(255, 255, 255, 0.7); font-size: 0.9rem; } /* Mobile Optimization */ .menu-toggle { display: none; cursor: pointer; z-index: 100; } .bar { display: block; width: 25px; height: 3px; margin: 5px auto; background-color: var(--light); transition: all 0.3s ease-in-out; } @media (max-width: 768px) { .hero h1 { font-size: 2.5rem; max-width: 100%; } .hero p { max-width: 100%; } .nav-links { position: fixed; top: 0; left: -100%; width: 80%; height: 100vh; flex-direction: column; background: var(--dark); z-index: 99; align-items: center; justify-content: center; transition: 0.5s; padding: 2rem; } .nav-links.active { left: 0; } .menu-toggle { display: block; } .menu-toggle.active .bar:nth-child(1) { transform: translateY(8px) rotate(45deg); } .menu-toggle.active .bar:nth-child(2) { opacity: 0; } .menu-toggle.active .bar:nth-child(3) { transform: translateY(-8px) rotate(-45deg); } .services-grid { grid-template-columns: 1fr; } .triangle-1, .triangle-2, .triangle-3 { width: 80px; height: 80px; } } /* Modal */ .modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.8); display: flex; align-items: center; justify-content: center; z-index: 1000; opacity: 0; visibility: hidden; transition: all 0.3s ease; } .modal.show { opacity: 1; visibility: visible; } .modal-content { background: var(--dark); border-radius: 8px; padding: 2rem; width: 90%; max-width: 500px; transform: translateY(-50px); transition: transform 0.3s ease; position: relative; border: 1px solid rgba(255, 255, 255, 0.1); } .modal.show .modal-content { transform: translateY(0); } .close-modal { position: absolute; top: 1rem; right: 1rem; background: none; border: none; color: var(--light); font-size: 1.5rem; cursor: pointer; } .form-group { margin-bottom: 1.5rem; } .form-label { display: block; margin-bottom: 0.5rem; font-weight: 600; } .form-input { width: 100%; padding: 0.75rem; border-radius: 4px; background: rgba(255, 255, 255, 0.05); border: 1px solid rgba(255, 255, 255, 0.1); color: var(--light); transition: border-color 0.3s ease, box-shadow 0.3s ease; } .form-input:focus { outline: none; border-color: var(--secondary); box-shadow: 0 0 0 3px rgba(3, 218, 198, 0.1); } .form-submit { width: 100%; padding: 0.75rem; background: var(--gradient); color: var(--light); border: none; border-radius: 4px; font-weight: 600; cursor: pointer; transition: opacity 0.3s ease; } .form-submit:hover { opacity: 0.9; } /* Preloader */ .preloader { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: var(--dark); display: flex; justify-content: center; align-items: center; z-index: 9999; transition: opacity 0.5s ease, visibility 0.5s ease; } .preloader.hide { opacity: 0; visibility: hidden; } .loader { width: 50px; height: 50px; background: var(--gradient); clip-path: polygon(50% 0%, 0% 100%, 100% 100%); animation: rotate 1.5s infinite ease-in-out; } @keyframes rotate { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } /* Success message */ .success-message { display: none; text-align: center; padding: 1rem; background: rgba(3, 218, 198, 0.1); border-radius: 4px; margin-top: 1rem; } .success-message.show { display: block; animation: fadeIn 0.5s forwards; } </style> </head> <body> <!-- Preloader --> <div class="preloader"> <div class="loader"></div> </div> <!-- Triangles --> <div class="triangle triangle-1"></div> <div class="triangle triangle-2"></div> <div class="triangle triangle-3"></div> <div class="container"> <!-- Navigation --> <nav class="nav"> <a href="#" class="logo"> <div class="logo-triangle"></div> Prismatic </a> <div class="menu-toggle"> <span class="bar"></span> <span class="bar"></span> <span class="bar"></span> </div> <ul class="nav-links"> <li><a href="#" class="nav-link">Services</a></li> <li><a href="#" class="nav-link">Work</a></li> <li><a href="#" class="nav-link">About</a></li> <li><a href="#" class="nav-link">Contact</a></li> </ul> </nav> <!-- Hero Section --> <section class="hero"> <h1>Transform your <span>digital presence</span> with geometric precision</h1> <p>We blend cutting-edge tech with creative design to craft digital experiences that captivate, convert, and drive your business forward.</p> <div class="cta-container"> <button class="cta cta-primary open-modal">Get Started</button> <button class="cta cta-secondary">Our Process</button> </div> </section> <!-- Services Section --> <section class="services"> <h2 class="section-heading">Our Expertise</h2> <div class="services-grid"> <div class="service-card"> <div class="service-icon"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M20 4H4C2.89543 4 2 4.89543 2 6V18C2 19.1046 2.89543 20 4 20H20C21.1046 20 22 19.1046 22 18V6C22 4.89543 21.1046 4 20 4Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </div> <h3 class="service-title">UI/UX Design</h3> <p class="service-desc">Immersive interfaces with geometric precision and purposeful animations.</p> </div> <div class="service-card"> <div class="service-icon"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12 19L19 12L22 15L15 22L12 19Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M18 13L16.5 5.5L2 2L5.5 16.5L13 18L18 13Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M2 2L9.586 9.586" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M11 13C12.1046 13 13 12.1046 13 11C13 9.89543 12.1046 9 11 9C9.89543 9 9 9.89543 9 11C9 12.1046 9.89543 13 11 13Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </div> <h3 class="service-title">Brand Strategy</h3> <p class="service-desc">Strategic positioning with visual identity that establishes market distinction.</p> </div> <div class="service-card"> <div class="service-icon"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M16 18L22 12L16 6" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M8 6L2 12L8 18" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </div> <h3 class="service-title">Web Development</h3> <p class="service-desc">Performance-driven sites with dynamic experiences and geometric accents.</p> </div> </div> </section> </div> <!-- Modal --> <div class="modal"> <div class="modal-content"> <button class="close-modal">×</button> <h2 class="section-heading">Let's Collaborate</h2> <form id="contact-form"> <div class="form-group"> <label for="name" class="form-label">Name</label> <input type="text" id="name" class="form-input" placeholder="Your name" required> </div> <div class="form-group"> <label for="email" class="form-label">Email</label> <input type="email" id="email" class="form-input" placeholder="Your email" required> </div> <div class="form-group"> <label for="project" class="form-label">Project Brief</label> <textarea id="project" class="form-input" rows="4" placeholder="Tell us about your project" required></textarea> </div> <button type="submit" class="form-submit">Send Message</button> </form> <div class="success-message"> <p>Thanks for reaching out! We'll get back to you within 24 hours.</p> </div> </div> </div> <script> // Preloader window.addEventListener('load', function() { setTimeout(() => { document.querySelector('.preloader').classList.add('hide'); }, 1000); }); // Scroll reveal for sections const revealOnScroll = () => { const services = document.querySelector('.services'); const servicesPosition = services.getBoundingClientRect().top; const screenPosition = window.innerHeight / 1.2; if (servicesPosition < screenPosition) { services.classList.add('section-visible'); } }; window.addEventListener('scroll', revealOnScroll); // Initialize reveal setTimeout(revealOnScroll, 1000); // Mobile menu toggle const menuToggle = document.querySelector('.menu-toggle'); const navLinks = document.querySelector('.nav-links'); menuToggle.addEventListener('click', () => { menuToggle.classList.toggle('active'); navLinks.classList.toggle('active'); }); // Close menu when nav link is clicked document.querySelectorAll('.nav-link').forEach(link => { link.addEventListener('click', () => { menuToggle.classList.remove('active'); navLinks.classList.remove('active'); }); }); // Modal handling const modal = document.querySelector('.modal'); const openModalBtn = document.querySelector('.open-modal'); const closeModalBtn = document.querySelector('.close-modal'); const contactForm = document.getElementById('contact-form'); const successMessage = document.querySelector('.success-message'); openModalBtn.addEventListener('click', () => { modal.classList.add('show'); document.body.style.overflow = 'hidden'; }); closeModalBtn.addEventListener('click', () => { modal.classList.remove('show'); document.body.style.overflow = 'auto'; }); // Close modal when clicking outside modal.addEventListener('click', (e) => { if (e.target === modal) { modal.classList.remove('show'); document.body.style.overflow = 'auto'; } }); // Form submission contactForm.addEventListener('submit', (e) => { e.preventDefault(); // Simulate form submission const formElements = contactForm.elements; let isValid = true; for (let i = 0; i < formElements.length; i++) { if (formElements[i].required && !formElements[i].value) { isValid = false; break; } } if (isValid) { contactForm.style.display = 'none'; successMessage.classList.add('show'); // Reset form after delay setTimeout(() => { contactForm.reset(); }, 1000); } }); // Hover effects for triangles document.querySelectorAll('.triangle').forEach(triangle => { triangle.addEventListener('mouseover', function() { this.style.transform = 'scale(1.1) rotate(10deg)'; }); triangle.addEventListener('mouseout', function() { this.style.transform = 'scale(1) rotate(0deg)'; }); }); // Custom cursor effect for CTAs const ctaButtons = document.querySelectorAll('.cta'); ctaButtons.forEach(button => { button.addEventListener('mousemove', function(e) { const rect = this.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; this.style.background = `radial-gradient(circle at ${x}px ${y}px, rgba(255,255,255,0.2) 0%, rgba(0,0,0,0) 50%)`; }); button.addEventListener('mouseleave', function() { if (this.classList.contains('cta-primary')) { this.style.background = 'var(--gradient)'; } else { this.style.background = 'transparent'; } }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Triangular Architectural Web Experience</title> <style> :root { --earth-1: #d9c5b4; --earth-2: #8a7968; --earth-3: #5d4e3f; --earth-4: #3a302a; --accent: #c17f56; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Montserrat', sans-serif; } body { background-color: #f9f5f2; color: var(--earth-4); overflow-x: hidden; height: 100vh; width: 100%; } .container { max-width: 700px; height: 700px; margin: 0 auto; overflow: hidden; position: relative; } header { padding: 1.5rem; position: relative; z-index: 10; } nav { display: flex; justify-content: space-between; align-items: center; } .logo { font-weight: 700; font-size: 1.5rem; letter-spacing: 1px; display: flex; align-items: center; } .logo svg { margin-right: 8px; } .menu { display: flex; list-style: none; } .menu li { margin-left: 2rem; position: relative; } .menu a { text-decoration: none; color: var(--earth-3); font-size: 0.9rem; transition: color 0.3s; font-weight: 500; } .menu a:hover { color: var(--accent); } .menu a:after { content: ''; position: absolute; width: 0; height: 2px; bottom: -5px; left: 0; background-color: var(--accent); transition: width 0.3s ease; } .menu a:hover:after { width: 100%; } .hero { position: relative; height: 65%; overflow: hidden; display: flex; justify-content: center; align-items: center; } .triangle-container { position: absolute; width: 100%; height: 100%; pointer-events: none; } .triangle { position: absolute; opacity: 0.85; transform-origin: center; transition: all 0.5s ease; } .content { position: relative; z-index: 2; color: white; text-align: center; padding: 0 2rem; max-width: 80%; } h1 { font-size: 2.5rem; font-weight: 800; margin-bottom: 1rem; line-height: 1.2; color: var(--earth-4); position: relative; } h1:after { content: ''; position: absolute; width: 60px; height: 3px; background-color: var(--accent); bottom: -10px; left: 50%; transform: translateX(-50%); } .tagline { font-size: 1.1rem; margin-bottom: 2rem; color: var(--earth-3); font-weight: 400; line-height: 1.6; margin-top: 20px; } .cta-btn { background-color: var(--accent); color: white; padding: 0.8rem 2rem; border: none; border-radius: 2px; font-weight: 600; cursor: pointer; letter-spacing: 1px; transition: all 0.3s ease; text-transform: uppercase; font-size: 0.8rem; display: inline-block; position: relative; overflow: hidden; } .cta-btn:hover { background-color: #a56743; transform: translateY(-2px); box-shadow: 0 5px 15px rgba(193, 127, 86, 0.3); } .cta-btn:before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient( 90deg, transparent, rgba(255, 255, 255, 0.2), transparent ); transition: 0.5s; } .cta-btn:hover:before { left: 100%; } .features { display: flex; justify-content: space-between; padding: 2rem; margin-top: 1rem; } .feature { flex: 1; text-align: center; padding: 1rem; position: relative; transition: transform 0.3s; } .feature:hover { transform: translateY(-5px); } .feature:not(:last-child):after { content: ''; position: absolute; right: 0; top: 20%; height: 60%; width: 1px; background-color: var(--earth-1); } .feature-icon { margin-bottom: 1rem; position: relative; display: inline-block; } .feature-title { font-weight: 600; margin-bottom: 0.5rem; color: var(--earth-3); font-size: 0.95rem; } .feature-desc { font-size: 0.8rem; color: var(--earth-2); line-height: 1.5; } @media (max-width: 768px) { .menu { display: none; } .features { flex-direction: column; } .feature:not(:last-child):after { width: 0; } .feature { margin-bottom: 1.5rem; } h1 { font-size: 2rem; } .tagline { font-size: 1rem; } } .cursor-follower { position: fixed; background: rgba(193, 127, 86, 0.2); width: 30px; height: 30px; border-radius: 50%; transform: translate(-50%, -50%); pointer-events: none; mix-blend-mode: difference; z-index: 9999; transition: transform 0.1s ease; } @keyframes float { 0% { transform: translateY(0px) rotate(0deg); } 50% { transform: translateY(-10px) rotate(1deg); } 100% { transform: translateY(0px) rotate(0deg); } } @keyframes float-reverse { 0% { transform: translateY(0px) rotate(0deg); } 50% { transform: translateY(10px) rotate(-1deg); } 100% { transform: translateY(0px) rotate(0deg); } } .triangle-animate-1 { animation: float 6s ease-in-out infinite; } .triangle-animate-2 { animation: float-reverse 7s ease-in-out infinite; } .triangle-animate-3 { animation: float 8s ease-in-out infinite; } </style> </head> <body> <div class="cursor-follower"></div> <div class="container"> <header> <nav> <div class="logo"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12 2L2 19H22L12 2Z" stroke="#c17f56" stroke-width="2" fill="none"/> </svg> TRILITH </div> <ul class="menu"> <li><a href="#projects">Projects</a></li> <li><a href="#approach">Approach</a></li> <li><a href="#studio">Studio</a></li> <li><a href="#contact">Contact</a></li> </ul> </nav> </header> <div class="hero"> <div class="triangle-container" id="triangle-container"></div> <div class="content"> <h1>Triangular Precision in Architectural Form</h1> <p class="tagline">Exploring the stability of triangular geometry to create innovative structures that balance form, function, and spatial narrative.</p> <button class="cta-btn">Explore Our Projects</button> </div> </div> <div class="features"> <div class="feature"> <div class="feature-icon"> <svg width="36" height="36" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M3 22L12 2L21 22H3Z" stroke="#c17f56" stroke-width="1.5" fill="none"/> <path d="M3 22L21 22" stroke="#c17f56" stroke-width="1.5"/> </svg> </div> <h3 class="feature-title">Structural Integrity</h3> <p class="feature-desc">Triangular forms create inherently strong frameworks that resist deformation under stress.</p> </div> <div class="feature"> <div class="feature-icon"> <svg width="36" height="36" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12 2L2 19H22L12 2Z" stroke="#c17f56" stroke-width="1.5" fill="none"/> <path d="M12 2V19" stroke="#c17f56" stroke-width="1.5"/> </svg> </div> <h3 class="feature-title">Asymmetric Balance</h3> <p class="feature-desc">Our designs use asymmetric patterns to create visual tension while maintaining structural equilibrium.</p> </div> <div class="feature"> <div class="feature-icon"> <svg width="36" height="36" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M2 7L12 2L22 7L12 12L2 7Z" stroke="#c17f56" stroke-width="1.5" fill="none"/> <path d="M12 12L12 22" stroke="#c17f56" stroke-width="1.5"/> <path d="M22 7L22 17L12 22" stroke="#c17f56" stroke-width="1.5"/> <path d="M2 7L2 17L12 22" stroke="#c17f56" stroke-width="1.5"/> </svg> </div> <h3 class="feature-title">Spatial Narrative</h3> <p class="feature-desc">Our triangular motifs create dynamic spaces that guide the eye and movement through environments.</p> </div> </div> </div> <script> // Create and animate triangles document.addEventListener('DOMContentLoaded', function() { const container = document.getElementById('triangle-container'); const colors = ['#d9c5b4', '#8a7968', '#5d4e3f', '#c17f56']; // Create multiple triangles with different sizes and positions for (let i = 0; i < 12; i++) { const size = Math.random() * 100 + 50; const triangle = document.createElement('div'); triangle.classList.add('triangle'); // Alternate animation classes if (i % 3 === 0) { triangle.classList.add('triangle-animate-1'); } else if (i % 3 === 1) { triangle.classList.add('triangle-animate-2'); } else { triangle.classList.add('triangle-animate-3'); } // Create SVG triangles const color = colors[Math.floor(Math.random() * colors.length)]; const opacity = Math.random() * 0.3 + 0.05; triangle.innerHTML = ` <svg width="${size}" height="${size * 0.866}" viewBox="0 0 100 86.6" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M50 0L100 86.6H0L50 0Z" fill="${color}" fill-opacity="${opacity}" /> <path d="M50 0L100 86.6H0L50 0Z" stroke="${color}" stroke-width="1" stroke-opacity="0.8" /> </svg> `; // Random position triangle.style.left = `${Math.random() * 100}%`; triangle.style.top = `${Math.random() * 100}%`; triangle.style.transform = `rotate(${Math.random() * 360}deg)`; container.appendChild(triangle); } // Parallax effect document.addEventListener('mousemove', function(e) { const container = document.querySelector('.container'); const containerRect = container.getBoundingClientRect(); // Check if mouse is inside the container if ( e.clientX >= containerRect.left && e.clientX <= containerRect.right && e.clientY >= containerRect.top && e.clientY <= containerRect.bottom ) { const xAxis = (e.clientX - containerRect.left) / containerRect.width - 0.5; const yAxis = (e.clientY - containerRect.top) / containerRect.height - 0.5; const triangles = document.querySelectorAll('.triangle'); triangles.forEach((triangle, index) => { const factor = (index % 4 + 1) * 5; triangle.style.transform = `translate(${xAxis * factor}px, ${yAxis * factor}px) rotate(${Math.random() * 360}deg)`; }); } }); // Custom cursor follower const cursorFollower = document.querySelector('.cursor-follower'); document.addEventListener('mousemove', function(e) { cursorFollower.style.left = e.clientX + 'px'; cursorFollower.style.top = e.clientY + 'px'; }); document.addEventListener('mousedown', function() { cursorFollower.style.transform = 'translate(-50%, -50%) scale(0.7)'; }); document.addEventListener('mouseup', function() { cursorFollower.style.transform = 'translate(-50%, -50%) scale(1)'; }); // CTA button effects const ctaBtn = document.querySelector('.cta-btn'); ctaBtn.addEventListener('click', function(e) { e.preventDefault(); // Create ripple effect let ripple = document.createElement('span'); ripple.style.position = 'absolute'; ripple.style.background = 'rgba(255, 255, 255, 0.7)'; ripple.style.transform = 'translate(-50%, -50%)'; ripple.style.pointerEvents = 'none'; ripple.style.borderRadius = '50%'; ripple.style.width = '0'; ripple.style.height = '0'; ripple.style.left = (e.offsetX) + 'px'; ripple.style.top = (e.offsetY) + 'px'; this.appendChild(ripple); let size = Math.max(this.offsetWidth, this.offsetHeight); ripple.style.width = size * 2 + 'px'; ripple.style.height = size * 2 + 'px'; ripple.style.opacity = '0'; ripple.style.transition = 'all 0.6s ease-out'; setTimeout(() => { ripple.remove(); }, 600); }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Educational Platform Hierarchy</title> <style> :root { --primary: #5B8FB9; --secondary: #B9D7EA; --accent: #FF8787; --dark: #301E67; --light: #f5f7fa; --success: #84B082; --warning: #F6C90E; --box-shadow: 0 10px 30px rgba(48, 30, 103, 0.12); --transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; } body { background-color: var(--light); color: var(--dark); display: flex; flex-direction: column; align-items: center; min-height: 100vh; padding: 1rem; overflow-x: hidden; } .container { max-width: 700px; width: 100%; margin: 0 auto; padding: 1rem; display: flex; flex-direction: column; gap: 2rem; position: relative; } header { text-align: center; margin-bottom: 1rem; } h1 { font-size: 2rem; margin-bottom: 0.5rem; position: relative; display: inline-block; } h1::after { content: ''; position: absolute; bottom: -5px; left: 0; width: 100%; height: 3px; background: linear-gradient(90deg, var(--primary), var(--accent)); border-radius: 3px; } p.intro { font-size: 1rem; color: #666; max-width: 600px; margin: 0 auto; line-height: 1.6; } .hierarchy-container { display: flex; flex-direction: column; gap: 2rem; position: relative; perspective: 1000px; } .level { display: flex; flex-direction: column; gap: 1rem; transform-style: preserve-3d; transition: var(--transition); } .level-title { display: flex; align-items: center; gap: 0.5rem; font-weight: 600; margin-bottom: 0.5rem; } .triangle-marker { width: 0; height: 0; border-left: 10px solid transparent; border-right: 10px solid transparent; transform-origin: center; transform-style: preserve-3d; transition: var(--transition); } .level-advanced .triangle-marker { border-bottom: 17px solid var(--accent); transform: translateZ(5px) rotate(0deg); } .level-intermediate .triangle-marker { border-bottom: 14px solid var(--primary); transform: translateZ(3px) rotate(0deg); } .level-beginner .triangle-marker { border-bottom: 12px solid var(--secondary); transform: translateZ(1px) rotate(0deg); } .module-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 1rem; margin-left: 1rem; } .module-card { background: white; border-radius: 8px; padding: 1.2rem; box-shadow: var(--box-shadow); cursor: pointer; position: relative; overflow: hidden; transform-style: preserve-3d; transition: var(--transition); border: 1px solid rgba(0, 0, 0, 0.05); } .module-card:hover { transform: translateY(-5px) translateZ(10px); box-shadow: 0 15px 35px rgba(48, 30, 103, 0.15); } .module-icon { position: absolute; top: 0; right: 0; width: 24px; height: 24px; padding: 0.5rem; opacity: 0.2; transition: var(--transition); } .module-card:hover .module-icon { opacity: 1; transform: rotate(15deg); } .card-triangle { position: absolute; width: 0; height: 0; border-style: solid; opacity: 0.1; transition: var(--transition); z-index: -1; } .triangle-1 { top: -20px; left: -20px; border-width: 0 40px 40px 0; border-color: transparent var(--primary) transparent transparent; transform: rotate(45deg); } .triangle-2 { bottom: -10px; right: -10px; border-width: 20px 0 0 20px; border-color: transparent transparent transparent var(--accent); } .module-card:hover .card-triangle { opacity: 0.2; } .module-card.active { border-color: var(--primary); background: linear-gradient(135deg, rgba(91, 143, 185, 0.05), rgba(255, 255, 255, 1)); } .module-title { font-weight: 600; margin-bottom: 0.5rem; font-size: 1rem; } .module-desc { font-size: 0.85rem; color: #666; line-height: 1.5; } .module-meta { display: flex; align-items: center; gap: 0.5rem; margin-top: 1rem; font-size: 0.8rem; color: #888; } .module-difficulty { display: flex; align-items: center; gap: 0.2rem; } .difficulty-dot { width: 6px; height: 6px; border-radius: 50%; background-color: #ddd; } .active-dot { background-color: var(--primary); } .level-advanced .module-card { border-top: 3px solid var(--accent); } .level-intermediate .module-card { border-top: 3px solid var(--primary); } .level-beginner .module-card { border-top: 3px solid var(--secondary); } .progress-container { margin-top: 2rem; background: white; border-radius: 8px; padding: 1rem; box-shadow: var(--box-shadow); } .progress-title { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; } .progress-bar { height: 8px; width: 100%; background-color: #f0f0f0; border-radius: 4px; overflow: hidden; position: relative; } .progress-fill { height: 100%; background: linear-gradient(90deg, var(--secondary), var(--primary), var(--accent)); width: 35%; border-radius: 4px; transition: width 1s ease; } .pathway-triangle { position: absolute; width: 0; height: 0; border-style: solid; border-width: 0 10px 15px 10px; border-color: transparent transparent var(--light) transparent; top: 50%; z-index: 2; opacity: 0.8; transform: translateY(-50%); transition: left 1s ease, opacity 0.3s ease; } .progress-labels { display: flex; justify-content: space-between; margin-top: 0.5rem; font-size: 0.75rem; color: #888; } .pathway-milestone { position: absolute; width: 12px; height: 12px; background-color: white; border: 2px solid var(--primary); border-radius: 50%; top: 50%; transform: translateY(-50%); z-index: 1; } .milestone-beginner { left: 25%; } .milestone-intermediate { left: 50%; } .milestone-advanced { left: 75%; } .milestone-completed { background-color: var(--primary); } .isometric-decoration { position: absolute; width: 100px; height: 100px; right: -30px; top: 15%; transform: rotateX(45deg) rotateZ(45deg); transform-style: preserve-3d; opacity: 0.2; z-index: -1; } .iso-triangle { position: absolute; width: 0; height: 0; transition: var(--transition); } .iso-1 { border-left: 50px solid transparent; border-right: 50px solid transparent; border-bottom: 86.6px solid var(--primary); top: 0; left: 0; transform: translateZ(10px); } .iso-2 { border-left: 30px solid transparent; border-right: 30px solid transparent; border-bottom: 52px solid var(--secondary); top: 20px; left: 20px; transform: translateZ(20px); } .iso-3 { border-left: 20px solid transparent; border-right: 20px solid transparent; border-bottom: 34.6px solid var(--accent); top: 40px; left: 30px; transform: translateZ(30px); } .pathway-controls { display: flex; margin-top: 1rem; gap: 0.5rem; justify-content: flex-end; } .pathway-btn { background: white; border: 1px solid #eee; padding: 0.5rem 1rem; border-radius: 4px; cursor: pointer; font-size: 0.85rem; transition: var(--transition); } .pathway-btn:hover { background: var(--secondary); color: var(--dark); } .tooltip { position: absolute; background: white; box-shadow: var(--box-shadow); padding: 0.5rem; border-radius: 4px; font-size: 0.8rem; pointer-events: none; opacity: 0; transition: opacity 0.2s ease; z-index: 100; max-width: 200px; } @media (max-width: 600px) { h1 { font-size: 1.5rem; } .module-grid { grid-template-columns: 1fr; } .isometric-decoration { display: none; } } </style> </head> <body> <div class="container"> <header> <h1>Learning Pathway</h1> <p class="intro">Navigate your educational journey with personalized content paths. Our triangle system clearly marks content difficulty and relevance to guide your learning experience.</p> </header> <div class="hierarchy-container"> <div class="level level-advanced"> <div class="level-title"> <div class="triangle-marker"></div> <span>Advanced Topics</span> </div> <div class="module-grid"> <div class="module-card" data-level="advanced"> <div class="card-triangle triangle-1"></div> <div class="card-triangle triangle-2"></div> <h3 class="module-title">Machine Learning Integration</h3> <p class="module-desc">Apply algorithmic systems to educational outcomes through predictive analysis and personalized learning paths.</p> <div class="module-meta"> <div class="module-difficulty"> <div class="difficulty-dot active-dot"></div> <div class="difficulty-dot active-dot"></div> <div class="difficulty-dot active-dot"></div> </div> <span>8 lessons</span> </div> </div> <div class="module-card" data-level="advanced"> <div class="card-triangle triangle-1"></div> <div class="card-triangle triangle-2"></div> <h3 class="module-title">Educational Data Science</h3> <p class="module-desc">Learn how to process large datasets to identify learning patterns and improve course effectiveness.</p> <div class="module-meta"> <div class="module-difficulty"> <div class="difficulty-dot active-dot"></div> <div class="difficulty-dot active-dot"></div> <div class="difficulty-dot active-dot"></div> </div> <span>6 lessons</span> </div> </div> </div> </div> <div class="level level-intermediate"> <div class="level-title"> <div class="triangle-marker"></div> <span>Intermediate Content</span> </div> <div class="module-grid"> <div class="module-card active" data-level="intermediate"> <div class="card-triangle triangle-1"></div> <div class="card-triangle triangle-2"></div> <h3 class="module-title">Interactive Assessment Design</h3> <p class="module-desc">Create engaging evaluations that adapt to learner responses and provide meaningful feedback.</p> <div class="module-meta"> <div class="module-difficulty"> <div class="difficulty-dot active-dot"></div> <div class="difficulty-dot active-dot"></div> <div class="difficulty-dot"></div> </div> <span>5 lessons</span> </div> </div> <div class="module-card" data-level="intermediate"> <div class="card-triangle triangle-1"></div> <div class="card-triangle triangle-2"></div> <h3 class="module-title">Collaborative Learning Tools</h3> <p class="module-desc">Implement systems that facilitate group work and peer-to-peer knowledge exchange.</p> <div class="module-meta"> <div class="module-difficulty"> <div class="difficulty-dot active-dot"></div> <div class="difficulty-dot active-dot"></div> <div class="difficulty-dot"></div> </div> <span>4 lessons</span> </div> </div> <div class="module-card" data-level="intermediate"> <div class="card-triangle triangle-1"></div> <div class="card-triangle triangle-2"></div> <h3 class="module-title">Multimedia Content Creation</h3> <p class="module-desc">Develop effective video, audio, and interactive elements that enhance learning outcomes.</p> <div class="module-meta"> <div class="module-difficulty"> <div class="difficulty-dot active-dot"></div> <div class="difficulty-dot active-dot"></div> <div class="difficulty-dot"></div> </div> <span>7 lessons</span> </div> </div> </div> </div> <div class="level level-beginner"> <div class="level-title"> <div class="triangle-marker"></div> <span>Beginner Foundations</span> </div> <div class="module-grid"> <div class="module-card completed" data-level="beginner"> <div class="card-triangle triangle-1"></div> <div class="card-triangle triangle-2"></div> <h3 class="module-title">Learning Platform Basics</h3> <p class="module-desc">Understand the core elements of digital educational environments and user interaction models.</p> <div class="module-meta"> <div class="module-difficulty"> <div class="difficulty-dot active-dot"></div> <div class="difficulty-dot"></div> <div class="difficulty-dot"></div> </div> <span>3 lessons</span> </div> </div> <div class="module-card completed" data-level="beginner"> <div class="card-triangle triangle-1"></div> <div class="card-triangle triangle-2"></div> <h3 class="module-title">Content Hierarchies</h3> <p class="module-desc">Learn to structure information logically for optimal learning progression and knowledge retention.</p> <div class="module-meta"> <div class="module-difficulty"> <div class="difficulty-dot active-dot"></div> <div class="difficulty-dot"></div> <div class="difficulty-dot"></div> </div> <span>4 lessons</span> </div> </div> </div> </div> <div class="isometric-decoration"> <div class="iso-triangle iso-1"></div> <div class="iso-triangle iso-2"></div> <div class="iso-triangle iso-3"></div> </div> </div> <div class="progress-container"> <div class="progress-title"> <h3>Your Learning Journey</h3> <span>35% Complete</span> </div> <div class="progress-bar"> <div class="progress-fill"></div> <div class="pathway-triangle" style="left: 35%"></div> <div class="pathway-milestone milestone-beginner milestone-completed"></div> <div class="pathway-milestone milestone-intermediate"></div> <div class="pathway-milestone milestone-advanced"></div> </div> <div class="progress-labels"> <span>Beginner</span> <span>Intermediate</span> <span>Advanced</span> <span>Expert</span> </div> <div class="pathway-controls"> <button class="pathway-btn" id="recommend-btn">Recommended Path</button> <button class="pathway-btn" id="custom-btn">Customize Path</button> </div> </div> </div> <div class="tooltip" id="tooltip"></div> <script> // Interactive module cards const moduleCards = document.querySelectorAll('.module-card'); const tooltip = document.getElementById('tooltip'); let activeCard = document.querySelector('.module-card.active'); const triangleMarkers = document.querySelectorAll('.triangle-marker'); const isometricTriangles = document.querySelectorAll('.iso-triangle'); const progressFill = document.querySelector('.progress-fill'); const pathwayTriangle = document.querySelector('.pathway-triangle'); // Animation for isometric triangles function animateIsometricTriangles() { isometricTriangles.forEach((triangle, index) => { const delay = index * 200; const z = 10 + (index * 10); setTimeout(() => { triangle.style.transform = `translateZ(${z + 10}px)`; setTimeout(() => { triangle.style.transform = `translateZ(${z}px)`; }, 300); }, delay); }); } // Run the animation periodically setInterval(animateIsometricTriangles, 5000); animateIsometricTriangles(); // Initial animation // Animate triangle markers on page load triangleMarkers.forEach((marker, index) => { setTimeout(() => { marker.style.transform = 'translateZ(10px) rotate(180deg)'; setTimeout(() => { if (index === 0) marker.style.transform = 'translateZ(5px) rotate(0deg)'; if (index === 1) marker.style.transform = 'translateZ(3px) rotate(0deg)'; if (index === 2) marker.style.transform = 'translateZ(1px) rotate(0deg)'; }, 300); }, index * 200); }); // Module card interaction moduleCards.forEach(card => { card.addEventListener('mouseenter', () => { const rect = card.getBoundingClientRect(); const level = card.getAttribute('data-level'); let tooltipContent = ''; if (level === 'beginner') { tooltipContent = 'Foundational concepts for new learners'; } else if (level === 'intermediate') { tooltipContent = 'Build on core concepts with practical applications'; } else if (level === 'advanced') { tooltipContent = 'Expert topics for specialized knowledge'; } tooltip.textContent = tooltipContent; tooltip.style.top = `${rect.top - 40}px`; tooltip.style.left = `${rect.left + rect.width / 2 - 100}px`; tooltip.style.opacity = '1'; // Animate card triangles const triangles = card.querySelectorAll('.card-triangle'); triangles.forEach(triangle => { triangle.style.opacity = '0.3'; triangle.style.transform = 'scale(1.2)'; setTimeout(() => { triangle.style.transform = 'scale(1)'; }, 300); }); }); card.addEventListener('mouseleave', () => { tooltip.style.opacity = '0'; // Reset card triangles const triangles = card.querySelectorAll('.card-triangle'); triangles.forEach(triangle => { triangle.style.opacity = '0.1'; triangle.style.transform = 'scale(1)'; }); }); card.addEventListener('click', () => { if (activeCard) { activeCard.classList.remove('active'); } card.classList.add('active'); activeCard = card; // Simulate progress update const level = card.getAttribute('data-level'); let progressPercent = 0; if (level === 'beginner') { progressPercent = 25; } else if (level === 'intermediate') { progressPercent = 55; } else if (level === 'advanced') { progressPercent = 75; } progressFill.style.width = `${progressPercent}%`; pathwayTriangle.style.left = `${progressPercent}%`; }); }); // Progress bar interaction document.getElementById('recommend-btn').addEventListener('click', () => { progressFill.style.width = '55%'; pathwayTriangle.style.left = '55%'; // Update active module if (activeCard) { activeCard.classList.remove('active'); } // Find an intermediate module to activate const intermediateModules = document.querySelectorAll('.module-card[data-level="intermediate"]'); if (intermediateModules.length > 0) { intermediateModules[0].classList.add('active'); activeCard = intermediateModules[0]; } // Animate milestone const intermediateMilestone = document.querySelector('.milestone-intermediate'); intermediateMilestone.classList.add('milestone-completed'); setTimeout(() => { intermediateMilestone.style.transform = 'translateY(-50%) scale(1.3)'; setTimeout(() => { intermediateMilestone.style.transform = 'translateY(-50%) scale(1)'; }, 300); }, 100); }); document.getElementById('custom-btn').addEventListener('click', () => { progressFill.style.width = '35%'; pathwayTriangle.style.left = '35%'; // Reset milestone document.querySelector('.milestone-intermediate').classList.remove('milestone-completed'); // Update active module if (activeCard) { activeCard.classList.remove('active'); } // Find an intermediate module to activate const intermediateModules = document.querySelectorAll('.module-card[data-level="intermediate"]'); if (intermediateModules.length > 0) { intermediateModules[0].classList.add('active'); activeCard = intermediateModules[0]; } }); // Initial animation for the progress fill setTimeout(() => { progressFill.style.width = '35%'; pathwayTriangle.style.left = '35%'; }, 1000); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Project Management Sidebar</title> <style> :root { --primary: #4A6FFF; --success: #21D07B; --warning: #FFBE3D; --danger: #FF5B5B; --dark: #2A324B; --grey: #758096; --light: #F4F7FC; --sidebar-width: 280px; --transition-speed: 300ms; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; } body { background: var(--light); color: var(--dark); height: 100vh; display: flex; overflow: hidden; } .container { display: flex; width: 100%; height: 100%; max-width: 700px; max-height: 700px; margin: auto; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); border-radius: 12px; overflow: hidden; position: relative; } .sidebar { width: var(--sidebar-width); background: var(--dark); color: white; height: 100%; transition: transform var(--transition-speed); display: flex; flex-direction: column; position: relative; z-index: 10; } .sidebar-header { padding: 20px; border-bottom: 1px solid rgba(255, 255, 255, 0.1); display: flex; align-items: center; justify-content: space-between; } .brand { display: flex; align-items: center; gap: 10px; font-weight: 700; font-size: 18px; } .brand-triangle { width: 0; height: 0; border-left: 10px solid transparent; border-right: 10px solid transparent; border-bottom: 18px solid var(--primary); position: relative; } .brand-triangle::after { content: ""; position: absolute; top: 3px; left: -6px; width: 0; height: 0; border-left: 6px solid transparent; border-right: 6px solid transparent; border-bottom: 12px solid var(--dark); } .sidebar-toggle { background: none; border: none; cursor: pointer; color: white; display: none; } .nav-section { padding: 20px 0; } .nav-header { padding: 0 20px 10px; font-size: 12px; text-transform: uppercase; color: var(--grey); letter-spacing: 1px; } .nav-list { list-style: none; } .nav-item { position: relative; transition: background-color 0.2s; } .nav-item:hover { background-color: rgba(255, 255, 255, 0.05); } .nav-item.active { background-color: rgba(74, 111, 255, 0.15); } .nav-item.active .nav-link { color: var(--primary); } .nav-item.active .triangle-icon { transform: rotate(0deg) scale(1.1); } .nav-link { display: flex; align-items: center; padding: 12px 20px; color: white; text-decoration: none; font-size: 14px; position: relative; } .icon-wrapper { margin-right: 12px; position: relative; width: 22px; height: 22px; display: flex; align-items: center; justify-content: center; } .triangle-icon { width: 0; height: 0; display: block; transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); transform-origin: center; } .triangle-dashboard { border-left: 6px solid transparent; border-right: 6px solid transparent; border-bottom: 12px solid var(--primary); transform: rotate(0deg); } .triangle-tasks { border-top: 6px solid transparent; border-bottom: 6px solid transparent; border-left: 12px solid var(--success); transform: rotate(0deg); } .triangle-timeline { border-top: 12px solid var(--warning); border-left: 6px solid transparent; border-right: 6px solid transparent; transform: rotate(0deg); } .triangle-reports { border-top: 10px solid transparent; border-left: 10px solid var(--danger); border-bottom: 10px solid transparent; transform: rotate(0deg); } .triangle-team { width: 0; height: 0; border-top: 6px solid transparent; border-right: 12px solid var(--primary); border-bottom: 6px solid transparent; transform: rotate(0deg); } .triangle-settings { border-left: 6px solid transparent; border-right: 6px solid transparent; border-top: 12px solid var(--grey); transform: rotate(0deg); } .tooltip { position: absolute; left: calc(100% + 10px); top: 50%; transform: translateY(-50%); background: rgba(42, 50, 75, 0.95); color: white; padding: 8px 12px; border-radius: 4px; font-size: 12px; opacity: 0; pointer-events: none; transition: opacity 0.2s, transform 0.2s; transform-origin: left center; z-index: 20; white-space: nowrap; box-shadow: 0 3px 10px rgba(0, 0, 0, 0.2); } .tooltip::before { content: ""; position: absolute; left: -5px; top: 50%; transform: translateY(-50%); width: 0; height: 0; border-top: 5px solid transparent; border-bottom: 5px solid transparent; border-right: 5px solid rgba(42, 50, 75, 0.95); } .tooltip-feature { font-weight: 600; color: var(--primary); } .nav-link:hover .tooltip { opacity: 1; transform: translateY(-50%) scale(1); } .sidebar-footer { padding: 15px 20px; border-top: 1px solid rgba(255, 255, 255, 0.1); margin-top: auto; } .user-info { display: flex; align-items: center; gap: 10px; } .user-avatar { width: 34px; height: 34px; border-radius: 8px; background: var(--primary); display: flex; align-items: center; justify-content: center; font-weight: bold; color: white; position: relative; overflow: hidden; } .user-avatar::before { content: ""; position: absolute; width: 100%; height: 100%; background: linear-gradient(45deg, transparent 50%, rgba(255, 255, 255, 0.1) 50%); } .user-details { flex-grow: 1; } .user-name { font-size: 14px; font-weight: 600; } .user-role { font-size: 12px; color: var(--grey); } .content { flex-grow: 1; overflow-y: auto; background: white; padding: 30px; transition: opacity var(--transition-speed); } .page-header { margin-bottom: 24px; } .page-title { font-size: 24px; font-weight: 700; margin-bottom: 8px; color: var(--dark); } .page-subtitle { color: var(--grey); font-size: 14px; } .cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 20px; margin-bottom: 30px; } .card { background: var(--light); border-radius: 10px; padding: 20px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); transition: transform 0.2s, box-shadow 0.2s; } .card:hover { transform: translateY(-3px); box-shadow: 0 6px 15px rgba(0, 0, 0, 0.1); } .card-title { font-size: 14px; color: var(--grey); margin-bottom: 8px; } .card-value { font-size: 24px; font-weight: 700; color: var(--dark); } .tasks-progress { margin-bottom: 30px; } .progress-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; } .progress-title { font-size: 18px; font-weight: 600; } .progress-legend { display: flex; gap: 16px; } .legend-item { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--grey); } .legend-color { width: 10px; height: 10px; border-radius: 2px; } .color-todo { background: var(--primary); } .color-progress { background: var(--warning); } .color-done { background: var(--success); } .progress-bars { display: grid; grid-template-columns: 1fr; gap: 12px; } .progress-item { background: var(--light); border-radius: 8px; overflow: hidden; } .progress-info { display: flex; justify-content: space-between; padding: 12px 16px; } .progress-name { font-size: 14px; font-weight: 500; } .progress-percentage { font-size: 14px; font-weight: 600; color: var(--primary); } .progress-bar { height: 8px; display: flex; } .progress-segment { height: 100%; transition: width 1s ease-in-out; } .segment-todo { background: var(--primary); } .segment-progress { background: var(--warning); } .segment-done { background: var(--success); } .recent-updates { background: var(--light); border-radius: 10px; padding: 20px; } .updates-header { margin-bottom: 16px; font-size: 16px; font-weight: 600; } .update-list { display: flex; flex-direction: column; gap: 12px; } .update-item { display: flex; gap: 12px; padding-bottom: 12px; border-bottom: 1px solid rgba(0, 0, 0, 0.05); } .update-item:last-child { border-bottom: none; padding-bottom: 0; } .update-icon { width: 32px; height: 32px; border-radius: 8px; display: flex; align-items: center; justify-content: center; } .update-icon-tasks { background: rgba(33, 208, 123, 0.1); color: var(--success); } .update-icon-comment { background: rgba(74, 111, 255, 0.1); color: var(--primary); } .update-icon-timeline { background: rgba(255, 190, 61, 0.1); color: var(--warning); } .update-content { flex-grow: 1; } .update-text { font-size: 14px; line-height: 1.5; } .update-time { font-size: 12px; color: var(--grey); margin-top: 4px; } .highlight { font-weight: 600; color: var(--primary); } /* Mobile Responsiveness */ @media (max-width: 767px) { .sidebar { position: absolute; transform: translateX(-100%); width: 240px; } .sidebar.active { transform: translateX(0); } .sidebar-toggle { display: block; } .content { padding: 20px; width: 100%; } .mobile-nav-toggle { position: absolute; top: 20px; left: 20px; z-index: 5; background: var(--primary); border: none; width: 40px; height: 40px; border-radius: 8px; color: white; display: flex; align-items: center; justify-content: center; cursor: pointer; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); } .has-sidebar-open .mobile-nav-toggle { left: 260px; } .cards { grid-template-columns: 1fr 1fr; } } @media (max-width: 480px) { .cards { grid-template-columns: 1fr; } } /* Animations */ @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .nav-item.active .triangle-icon { animation: pulse 1.5s infinite; } /* Custom Scrollbar */ .content::-webkit-scrollbar { width: 8px; } .content::-webkit-scrollbar-track { background: var(--light); } .content::-webkit-scrollbar-thumb { background-color: var(--grey); border-radius: 4px; } </style> </head> <body> <div class="container"> <aside class="sidebar"> <div class="sidebar-header"> <div class="brand"> <div class="brand-triangle"></div> <span>ProjectPulse</span> </div> <button class="sidebar-toggle"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <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-section"> <div class="nav-header">Main</div> <ul class="nav-list"> <li class="nav-item active"> <a href="#" class="nav-link"> <div class="icon-wrapper"> <span class="triangle-icon triangle-dashboard"></span> </div> <span>Dashboard</span> <div class="tooltip"> <span class="tooltip-feature">360° Project View</span> - Get a complete overview of all your projects, tasks, and team performance </div> </a> </li> <li class="nav-item"> <a href="#" class="nav-link"> <div class="icon-wrapper"> <span class="triangle-icon triangle-tasks"></span> </div> <span>Tasks</span> <div class="tooltip"> <span class="tooltip-feature">Drag & Drop Kanban</span> - Visualize workflow and manage priorities with customizable task boards </div> </a> </li> <li class="nav-item"> <a href="#" class="nav-link"> <div class="icon-wrapper"> <span class="triangle-icon triangle-timeline"></span> </div> <span>Timeline</span> <div class="tooltip"> <span class="tooltip-feature">Interactive Gantt Charts</span> - Schedule tasks with dependencies and critical path visualization </div> </a> </li> <li class="nav-item"> <a href="#" class="nav-link"> <div class="icon-wrapper"> <span class="triangle-icon triangle-reports"></span> </div> <span>Reports</span> <div class="tooltip"> <span class="tooltip-feature">Real-time Analytics</span> - Generate custom reports on velocity, burndown charts and team capacity </div> </a> </li> </ul> </div> <div class="nav-section"> <div class="nav-header">Team</div> <ul class="nav-list"> <li class="nav-item"> <a href="#" class="nav-link"> <div class="icon-wrapper"> <span class="triangle-icon triangle-team"></span> </div> <span>Members</span> <div class="tooltip"> <span class="tooltip-feature">Resource Allocation</span> - Visualize team workload and optimize resource distribution </div> </a> </li> <li class="nav-item"> <a href="#" class="nav-link"> <div class="icon-wrapper"> <span class="triangle-icon triangle-settings"></span> </div> <span>Settings</span> <div class="tooltip"> <span class="tooltip-feature">Workflow Automation</span> - Create custom rules to automate task status changes and notifications </div> </a> </li> </ul> </div> <div class="sidebar-footer"> <div class="user-info"> <div class="user-avatar">JD</div> <div class="user-details"> <div class="user-name">Jane Doe</div> <div class="user-role">Project Manager</div> </div> </div> </div> </aside> <button class="mobile-nav-toggle"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <line x1="3" y1="12" x2="21" y2="12"></line> <line x1="3" y1="6" x2="21" y2="6"></line> <line x1="3" y1="18" x2="21" y2="18"></line> </svg> </button> <main class="content"> <div class="page-header"> <h1 class="page-title">Project Dashboard</h1> <p class="page-subtitle">Track progress and performance across all active projects</p> </div> <div class="cards"> <div class="card"> <div class="card-title">Active Projects</div> <div class="card-value">14</div> </div> <div class="card"> <div class="card-title">Tasks Due Today</div> <div class="card-value">8</div> </div> <div class="card"> <div class="card-title">On-time Delivery</div> <div class="card-value">92%</div> </div> </div> <div class="tasks-progress"> <div class="progress-header"> <h2 class="progress-title">Project Status</h2> <div class="progress-legend"> <div class="legend-item"> <span class="legend-color color-todo"></span> <span>To Do</span> </div> <div class="legend-item"> <span class="legend-color color-progress"></span> <span>In Progress</span> </div> <div class="legend-item"> <span class="legend-color color-done"></span> <span>Completed</span> </div> </div> </div> <div class="progress-bars"> <div class="progress-item"> <div class="progress-info"> <span class="progress-name">Website Redesign</span> <span class="progress-percentage">75% Complete</span> </div> <div class="progress-bar"> <div class="progress-segment segment-todo" style="width: 10%"></div> <div class="progress-segment segment-progress" style="width: 15%"></div> <div class="progress-segment segment-done" style="width: 75%"></div> </div> </div> <div class="progress-item"> <div class="progress-info"> <span class="progress-name">Mobile App Development</span> <span class="progress-percentage">42% Complete</span> </div> <div class="progress-bar"> <div class="progress-segment segment-todo" style="width: 23%"></div> <div class="progress-segment segment-progress" style="width: 35%"></div> <div class="progress-segment segment-done" style="width: 42%"></div> </div> </div> <div class="progress-item"> <div class="progress-info"> <span class="progress-name">Marketing Campaign</span> <span class="progress-percentage">89% Complete</span> </div> <div class="progress-bar"> <div class="progress-segment segment-todo" style="width: 5%"></div> <div class="progress-segment segment-progress" style="width: 6%"></div> <div class="progress-segment segment-done" style="width: 89%"></div> </div> </div> </div> </div> <div class="recent-updates"> <h3 class="updates-header">Recent Activity</h3> <div class="update-list"> <div class="update-item"> <div class="update-icon update-icon-tasks"> <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="M9 11l3 3L22 4"></path> <path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"></path> </svg> </div> <div class="update-content"> <div class="update-text"><span class="highlight">Alex Chen</span> completed 5 tasks in <span class="highlight">Website Redesign</span> project</div> <div class="update-time">10 minutes ago</div> </div> </div> <div class="update-item"> <div class="update-icon update-icon-comment"> <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 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path> </svg> </div> <div class="update-content"> <div class="update-text"><span class="highlight">Morgan Lee</span> commented on API integration issues in <span class="highlight">Mobile App</span> project</div> <div class="update-time">45 minutes ago</div> </div> </div> <div class="update-item"> <div class="update-icon update-icon-timeline"> <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"> <circle cx="12" cy="12" r="10"></circle> <polyline points="12 6 12 12 16 14"></polyline> </svg> </div> <div class="update-content"> <div class="update-text"><span class="highlight">Marketing Campaign</span> timeline extended by 3 days due to additional client requirements</div> <div class="update-time">2 hours ago</div> </div> </div> </div> </div> </main> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Mobile navigation toggle const mobileToggle = document.querySelector('.mobile-nav-toggle'); const sidebar = document.querySelector('.sidebar'); const body = document.body; if (mobileToggle) { mobileToggle.addEventListener('click', function() { sidebar.classList.toggle('active'); body.classList.toggle('has-sidebar-open'); }); } // Close sidebar when clicking outside document.addEventListener('click', function(event) { if (body.classList.contains('has-sidebar-open') && !sidebar.contains(event.target) && event.target !== mobileToggle) { sidebar.classList.remove('active'); body.classList.remove('has-sidebar-open'); } }); // Navigation items click handler const navItems = document.querySelectorAll('.nav-item'); navItems.forEach(item => { item.addEventListener('click', function(e) { // Remove active class from all items navItems.forEach(navItem => { navItem.classList.remove('active'); }); // Add active class to clicked item this.classList.add('active'); // Prevent default link behavior e.preventDefault(); // Close sidebar on mobile after navigation if (window.innerWidth < 768) { sidebar.classList.remove('active'); body.classList.remove('has-sidebar-open'); } }); }); // Animate progress bars on load const progressSegments = document.querySelectorAll('.progress-segment'); setTimeout(() => { progressSegments.forEach(segment => { segment.style.transition = 'width 1s ease-in-out'; }); }, 100); // Triangle icon hover effect const triangleIcons = document.querySelectorAll('.triangle-icon'); triangleIcons.forEach(icon => { icon.parentElement.parentElement.addEventListener('mouseenter', function() { if (!this.classList.contains('active')) { icon.style.transform = 'rotate(360deg) scale(1.1)'; } }); icon.parentElement.parentElement.addEventListener('mouseleave', function() { if (!this.classList.contains('active')) { icon.style.transform = 'rotate(0deg)'; } }); }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> :root { --primary-color: #0066cc; --secondary-color: #004d99; --accent-color: #ff6633; --text-color: #333333; --background-color: #f5f7fa; --border-color: #e1e4e8; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { background-color: var(--background-color); color: var(--text-color); line-height: 1.6; font-size: 16px; height: 100%; width: 100%; overflow-x: hidden; padding: 20px; } .container { max-width: 700px; margin: 0 auto; background: linear-gradient(145deg, #ffffff, #f0f4f8); border-radius: 12px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08); overflow: hidden; position: relative; height: 660px; display: flex; flex-direction: column; } .triangle-border { position: absolute; width: 100%; height: 100%; pointer-events: none; overflow: hidden; } .triangle { position: absolute; width: 0; height: 0; opacity: 0.1; z-index: 1; transition: all 0.5s ease; } .triangle-1 { top: -20px; left: -20px; border-left: 100px solid var(--primary-color); border-top: 100px solid transparent; border-bottom: 100px solid transparent; transform: rotate(45deg); } .triangle-2 { top: -40px; right: -40px; border-right: 120px solid var(--accent-color); border-top: 120px solid transparent; border-bottom: 120px solid transparent; transform: rotate(-45deg); } .triangle-3 { bottom: -30px; left: 50%; border-left: 80px solid transparent; border-right: 80px solid transparent; border-bottom: 80px solid var(--secondary-color); transform: translateX(-50%); } .triangle-4 { bottom: 40px; left: -40px; border-left: 80px solid var(--primary-color); border-top: 80px solid transparent; border-bottom: 80px solid transparent; transform: rotate(135deg); } .triangle-5 { bottom: 30px; right: -40px; border-right: 80px solid var(--secondary-color); border-top: 80px solid transparent; border-bottom: 80px solid transparent; transform: rotate(-135deg); } .header { padding: 30px; text-align: center; position: relative; z-index: 2; } .title { font-size: 28px; font-weight: 700; margin-bottom: 5px; background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)); -webkit-background-clip: text; background-clip: text; color: transparent; } .subtitle { font-size: 16px; color: #666; margin-bottom: 15px; } .content { flex: 1; overflow-y: auto; padding: 0 30px 30px; position: relative; z-index: 2; scrollbar-width: thin; scrollbar-color: var(--primary-color) var(--background-color); } .content::-webkit-scrollbar { width: 6px; } .content::-webkit-scrollbar-track { background: var(--background-color); } .content::-webkit-scrollbar-thumb { background-color: var(--primary-color); border-radius: 6px; } .section { margin-bottom: 30px; background: rgba(255, 255, 255, 0.7); border-radius: 10px; padding: 20px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05); position: relative; transition: transform 0.3s, box-shadow 0.3s; overflow: hidden; } .section:hover { transform: translateY(-5px); box-shadow: 0 6px 16px rgba(0, 0, 0, 0.1); } .section-header { display: flex; align-items: center; margin-bottom: 15px; position: relative; } .section-title { font-size: 20px; font-weight: 600; color: var(--primary-color); margin-left: 35px; position: relative; } .section-title::before { content: ''; position: absolute; width: 24px; height: 24px; left: -35px; top: 50%; transform: translateY(-50%) rotate(45deg); background-color: var(--primary-color); opacity: 0.2; border-radius: 4px; transition: all 0.3s ease; } .section:hover .section-title::before { transform: translateY(-50%) rotate(0deg); opacity: 0.3; } .section-line { height: 2px; flex: 1; margin-left: 15px; background: linear-gradient(90deg, var(--primary-color), transparent); opacity: 0.3; } .data-grid { display: flex; flex-wrap: wrap; gap: 20px; margin-top: 20px; } .data-card { flex: 1 1 calc(33.333% - 20px); min-width: 120px; background: linear-gradient(145deg, #ffffff, #f0f4f8); border-radius: 8px; padding: 15px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); text-align: center; transition: all 0.3s ease; position: relative; overflow: hidden; } .data-card:hover { transform: translateY(-3px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); } .data-card::before { content: ''; position: absolute; width: 0; height: 0; border-style: solid; border-width: 0 20px 20px 0; border-color: transparent var(--accent-color) transparent transparent; top: 0; right: 0; opacity: 0.5; transition: all 0.3s ease; } .data-card:hover::before { border-width: 0 30px 30px 0; opacity: 0.7; } .data-value { font-size: 28px; font-weight: 700; color: var(--primary-color); margin-bottom: 5px; line-height: 1.2; } .data-label { font-size: 14px; color: #666; } .chart-container { width: 100%; height: 200px; margin-top: 20px; position: relative; } .bar-chart { height: 100%; width: 100%; display: flex; align-items: flex-end; justify-content: space-between; padding-top: 30px; } .chart-bar { flex: 1; margin: 0 5px; background: linear-gradient(to top, var(--primary-color), var(--accent-color)); border-radius: 5px 5px 0 0; transition: height 1s cubic-bezier(0.23, 1, 0.32, 1); position: relative; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); height: 0; } .chart-bar::before { content: attr(data-value); position: absolute; top: -25px; left: 50%; transform: translateX(-50%); color: var(--primary-color); font-weight: 600; font-size: 12px; } .chart-bar::after { content: attr(data-label); position: absolute; bottom: -30px; left: 50%; transform: translateX(-50%); color: #666; font-size: 12px; white-space: nowrap; } .chart-grid-line { position: absolute; left: 0; right: 0; height: 1px; background-color: rgba(0, 0, 0, 0.1); } .tabs { display: flex; border-bottom: 1px solid var(--border-color); margin-bottom: 20px; } .tab { padding: 10px 20px; cursor: pointer; font-weight: 500; color: #666; position: relative; transition: color 0.3s; } .tab.active { color: var(--primary-color); } .tab::after { content: ''; position: absolute; bottom: -1px; left: 0; right: 0; height: 3px; background-color: var(--primary-color); transform: scaleX(0); transition: transform 0.3s; } .tab.active::after { transform: scaleX(1); } .tab-content { display: none; } .tab-content.active { display: block; animation: fadeIn 0.5s forwards; } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .publication { display: flex; align-items: flex-start; margin-bottom: 15px; padding-bottom: 15px; border-bottom: 1px dashed var(--border-color); } .publication:last-child { border-bottom: none; margin-bottom: 0; padding-bottom: 0; } .publication-icon { width: 40px; height: 40px; background-color: var(--primary-color); opacity: 0.2; border-radius: 8px; margin-right: 15px; flex-shrink: 0; position: relative; transition: all 0.3s ease; } .publication-icon::before, .publication-icon::after { content: ''; position: absolute; background-color: var(--primary-color); } .publication-icon::before { width: 20px; height: 2px; top: 50%; left: 50%; transform: translate(-50%, -50%); } .publication-icon::after { width: 2px; height: 20px; top: 50%; left: 50%; transform: translate(-50%, -50%); } .publication:hover .publication-icon { opacity: 0.4; transform: rotate(45deg); } .publication-details { flex: 1; } .publication-title { font-weight: 600; margin-bottom: 4px; color: var(--text-color); transition: color 0.3s; } .publication:hover .publication-title { color: var(--primary-color); } .publication-authors { font-size: 14px; color: #666; margin-bottom: 4px; } .publication-journal { font-size: 12px; font-style: italic; color: #888; } .methods-step { display: flex; align-items: center; margin-bottom: 15px; } .step-number { width: 28px; height: 28px; background-color: var(--primary-color); border-radius: 50%; color: white; display: flex; align-items: center; justify-content: center; font-weight: bold; margin-right: 15px; flex-shrink: 0; } .step-text { flex: 1; } @media (max-width: 600px) { .header { padding: 20px; } .title { font-size: 22px; } .content { padding: 0 20px 20px; } .section { padding: 15px; } .data-grid { flex-direction: column; } .data-card { flex: 1 1 100%; } .chart-bar::after { font-size: 10px; transform: translateX(-50%) rotate(-45deg); transform-origin: top left; bottom: -40px; } } </style> </head> <body> <div class="container"> <div class="triangle-border"> <div class="triangle triangle-1"></div> <div class="triangle triangle-2"></div> <div class="triangle triangle-3"></div> <div class="triangle triangle-4"></div> <div class="triangle triangle-5"></div> </div> <div class="header"> <h1 class="title">Quantum Entanglement Research Portal</h1> <p class="subtitle">Advanced Particle Physics Laboratory</p> </div> <div class="content"> <div class="section"> <div class="section-header"> <h2 class="section-title">Research Overview</h2> <div class="section-line"></div> </div> <p>Our lab is conducting cutting-edge research on quantum entanglement, specifically focused on multipartite systems and their applications in quantum computing and secure communications networks. Recent experiments have yielded significant breakthroughs in maintaining coherence times in qubit pairs.</p> <div class="data-grid"> <div class="data-card"> <div class="data-value" id="data1">93.7%</div> <div class="data-label">Entanglement Fidelity</div> </div> <div class="data-card"> <div class="data-value" id="data2">247</div> <div class="data-label">Qubits Entangled</div> </div> <div class="data-card"> <div class="data-value" id="data3">5.2s</div> <div class="data-label">Coherence Time</div> </div> </div> </div> <div class="section"> <div class="section-header"> <h2 class="section-title">Experimental Results</h2> <div class="section-line"></div> </div> <div class="tabs"> <div class="tab active" data-tab="efficiency">Efficiency</div> <div class="tab" data-tab="publications">Publications</div> <div class="tab" data-tab="methods">Methods</div> </div> <div class="tab-content active" id="efficiency"> <p>Our latest quantum entanglement measurements show remarkable stability across different material substrates, with silicon-based systems outperforming other alternatives:</p> <div class="chart-container"> <div class="bar-chart" id="efficiencyChart"> <div class="chart-bar" data-value="87%" data-label="Silicon" style="height: 0%"></div> <div class="chart-bar" data-value="76%" data-label="Germanium" style="height: 0%"></div> <div class="chart-bar" data-value="63%" data-label="GaAs" style="height: 0%"></div> <div class="chart-bar" data-value="94%" data-label="Diamond NV" style="height: 0%"></div> <div class="chart-bar" data-value="82%" data-label="Topological" style="height: 0%"></div> </div> <div class="chart-grid-line" style="bottom: 25%"></div> <div class="chart-grid-line" style="bottom: 50%"></div> <div class="chart-grid-line" style="bottom: 75%"></div> </div> </div> <div class="tab-content" id="publications"> <div class="publication"> <div class="publication-icon"></div> <div class="publication-details"> <div class="publication-title">Multipartite Entanglement in Photonic Quantum Systems</div> <div class="publication-authors">Chen, J., Takahashi, H., & Roberts, S.</div> <div class="publication-journal">Nature Quantum Information, 14(3), 238-245 (2023)</div> </div> </div> <div class="publication"> <div class="publication-icon"></div> <div class="publication-details"> <div class="publication-title">Extended Coherence Times in Diamond NV Centers</div> <div class="publication-authors">Roberts, S., Park, M., & Franklin, D.</div> <div class="publication-journal">Physical Review Letters, 128(7), 070503 (2023)</div> </div> </div> <div class="publication"> <div class="publication-icon"></div> <div class="publication-details"> <div class="publication-title">Quantum Teleportation Between Non-Adjacent Nodes</div> <div class="publication-authors">Franklin, D., Chen, J., & Smith, K.</div> <div class="publication-journal">Science, 376(6589), 122-126 (2022)</div> </div> </div> </div> <div class="tab-content" id="methods"> <div class="methods-step"> <div class="step-number">1</div> <div class="step-text">Sample preparation using high-purity isotopically purified silicon substrates (99.9998% Si-28)</div> </div> <div class="methods-step"> <div class="step-number">2</div> <div class="step-text">Ion implantation of phosphorus donors at 15 keV with precision positioning (±2.7 nm)</div> </div> <div class="methods-step"> <div class="step-number">3</div> <div class="step-text">Rapid thermal annealing at 1000°C for 5 seconds in N₂ environment to repair lattice damage</div> </div> <div class="methods-step"> <div class="step-number">4</div> <div class="step-text">Cryogenic cooling to 20 mK in dilution refrigerator with magnetic shielding</div> </div> <div class="methods-step"> <div class="step-number">5</div> <div class="step-text">Microwave pulse sequences delivered via coplanar waveguides for qubit manipulation</div> </div> </div> </div> <div class="section"> <div class="section-header"> <h2 class="section-title">Upcoming Milestones</h2> <div class="section-line"></div> </div> <p>Our research team is working toward several critical objectives in the next phase of our quantum entanglement studies:</p> <ul style="margin-left: 20px; margin-top: 10px;"> <li>Testing of topological protection methods to extend coherence beyond 10 seconds</li> <li>Integration with superconducting transmission lines for long-distance entanglement</li> <li>Development of error-correction protocols specific to entangled qubit pairs</li> <li>Demonstration of quantum advantage in complex simulation tasks using our entangled systems</li> </ul> </div> </div> </div> <script> // Animate triangle decorations document.addEventListener('DOMContentLoaded', function() { const triangles = document.querySelectorAll('.triangle'); setTimeout(() => { triangles.forEach(triangle => { triangle.style.opacity = '0.2'; }); }, 300); // Animate data numbers animateValue('data1', '0.0%', '93.7%', 2000); animateValue('data2', '0', '247', 2000); animateValue('data3', '0.0s', '5.2s', 2000); // Animate bars setTimeout(() => { const bars = document.querySelectorAll('.chart-bar'); const heights = [87, 76, 63, 94, 82]; // percentages bars.forEach((bar, index) => { bar.style.height = heights[index] + '%'; }); }, 500); // Tab functionality const tabs = document.querySelectorAll('.tab'); tabs.forEach(tab => { tab.addEventListener('click', () => { // Remove active class from all tabs tabs.forEach(t => t.classList.remove('active')); // Add active class to clicked tab tab.classList.add('active'); // Hide all tab content const tabContents = document.querySelectorAll('.tab-content'); tabContents.forEach(content => content.classList.remove('active')); // Show corresponding content const tabId = tab.getAttribute('data-tab'); document.getElementById(tabId).classList.add('active'); }); }); // Triangle hover effects const container = document.querySelector('.container'); container.addEventListener('mousemove', (e) => { const x = e.clientX; const y = e.clientY; const rect = container.getBoundingClientRect(); const containerX = rect.left + rect.width / 2; const containerY = rect.top + rect.height / 2; const offsetX = (x - containerX) / 30; const offsetY = (y - containerY) / 30; triangles.forEach((triangle, index) => { const factor = index % 2 === 0 ? 1 : -1; triangle.style.transform = `${getInitialTransform(index)} translate(${offsetX * factor}px, ${offsetY * factor}px)`; }); }); container.addEventListener('mouseleave', () => { triangles.forEach((triangle, index) => { triangle.style.transform = getInitialTransform(index); }); }); // Add hover effect for sections const sections = document.querySelectorAll('.section'); sections.forEach(section => { section.addEventListener('mouseenter', () => { const triangleIndex = Math.floor(Math.random() * triangles.length); triangles[triangleIndex].style.opacity = '0.35'; }); section.addEventListener('mouseleave', () => { triangles.forEach(triangle => { triangle.style.opacity = '0.2'; }); }); }); }); function getInitialTransform(index) { switch(index) { case 0: return 'rotate(45deg)'; case 1: return 'rotate(-45deg)'; case 2: return 'translateX(-50%)'; case 3: return 'rotate(135deg)'; case 4: return 'rotate(-135deg)'; default: return ''; } } function animateValue(id, start, end, duration) { const obj = document.getElementById(id); let startTime = null; // Parse numbers from strings const startVal = parseFloat(start.replace(/[^\d.-]/g, '')); const endVal = parseFloat(end.replace(/[^\d.-]/g, '')); const isPercentage = end.includes('%'); const isSeconds = end.includes('s'); const decimalPlaces = end.includes('.') ? end.split('.')[1].replace(/[^0-9]/g, '').length : 0; const step = (timestamp) => { if (!startTime) startTime = timestamp; const progress = Math.min((timestamp - startTime) / duration, 1); const value = startVal + (endVal - startVal) * easeOutCubic(progress); // Format the value appropriately let formattedValue; if (isPercentage) { formattedValue = value.toFixed(decimalPlaces) + '%'; } else if (isSeconds) { formattedValue = value.toFixed(decimalPlaces) + 's'; } else { // Round to whole number if it's supposed to be an integer formattedValue = decimalPlaces > 0 ? value.toFixed(decimalPlaces) : Math.round(value); } obj.textContent = formattedValue; if (progress < 1) { window.requestAnimationFrame(step); } }; window.requestAnimationFrame(step); } function easeOutCubic(x) { return 1 - Math.pow(1 - x, 3); } </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Triangle Achievement Badges</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Poppins', sans-serif; } :root { --primary: #ff6b6b; --secondary: #4ecdc4; --tertiary: #ffe66d; --quaternary: #6772e5; --quinary: #4b3f72; --background: #f8f9fa; --text: #2d3436; } body { background-color: var(--background); color: var(--text); height: 100vh; display: flex; flex-direction: column; justify-content: center; align-items: center; overflow-x: hidden; padding: 20px; } .container { max-width: 650px; width: 100%; background-color: white; border-radius: 16px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); padding: 24px; position: relative; overflow: hidden; } h1 { text-align: center; margin-bottom: 16px; font-weight: 700; font-size: 2rem; background: linear-gradient(45deg, var(--primary), var(--quaternary)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; position: relative; } .subtitle { text-align: center; margin-bottom: 30px; font-size: 1rem; color: #666; } .progress-container { display: flex; justify-content: space-between; margin-bottom: 30px; position: relative; } .progress-container::before { content: ''; position: absolute; width: 100%; height: 4px; background-color: #e0e0e0; top: 50%; left: 0; transform: translateY(-50%); z-index: 0; } .progress-bar { position: absolute; height: 4px; background: linear-gradient(90deg, var(--secondary), var(--quaternary)); top: 50%; left: 0; transform: translateY(-50%); z-index: 1; transition: width 0.8s cubic-bezier(0.34, 1.56, 0.64, 1); } .badge-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; margin-bottom: 30px; } .badge-wrapper { position: relative; cursor: pointer; transition: all 0.3s ease; } .badge-wrapper:hover { transform: translateY(-5px); } .badge { position: relative; width: 100%; aspect-ratio: 1; display: flex; justify-content: center; align-items: center; flex-direction: column; border-radius: 12px; background-color: #f3f4f6; overflow: hidden; transition: all 0.5s ease; } .badge-triangle { width: 60%; height: 60%; display: flex; justify-content: center; align-items: center; position: relative; margin-bottom: 10px; filter: grayscale(100%) opacity(0.4); transition: all 0.5s ease; } .badge-triangle svg { width: 100%; height: 100%; transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); } .badge-name { font-size: 0.85rem; font-weight: 600; text-align: center; color: #777; transition: color 0.3s ease; } .badge-info { position: absolute; bottom: 0; left: 0; width: 100%; padding: 10px; background: rgba(255, 255, 255, 0.9); transform: translateY(100%); transition: transform 0.3s ease; text-align: center; font-size: 0.8rem; } .badge-wrapper:hover .badge-info { transform: translateY(0); } .badge-locked { position: absolute; top: 10px; right: 10px; width: 20px; height: 20px; display: flex; justify-content: center; align-items: center; color: #aaa; z-index: 2; } .badge.achieved { box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1); background-color: #fff; } .badge.achieved .badge-triangle { filter: grayscale(0%) opacity(1); } .badge.achieved .badge-name { color: var(--text); } .badge-counter { position: absolute; top: -8px; right: -8px; width: 24px; height: 24px; border-radius: 50%; background-color: var(--quaternary); color: white; display: flex; justify-content: center; align-items: center; font-size: 0.75rem; font-weight: bold; z-index: 2; transform: scale(0); transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); } .badge-wrapper:has(.badge.achieved) .badge-counter { transform: scale(1); } .achievement-popup { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%) scale(0); width: 300px; background: white; border-radius: 16px; padding: 30px; text-align: center; box-shadow: 0 15px 40px rgba(0, 0, 0, 0.2); z-index: 10; transition: transform 0.5s cubic-bezier(0.34, 1.56, 0.64, 1); } .achievement-popup.show { transform: translate(-50%, -50%) scale(1); } .achievement-popup .badge-triangle { width: 80px; height: 80px; margin: 0 auto 20px; filter: none; } .achievement-popup h3 { font-size: 1.5rem; margin-bottom: 10px; color: var(--text); } .achievement-popup p { color: #666; margin-bottom: 20px; } .achievement-popup button { background: linear-gradient(45deg, var(--secondary), var(--quaternary)); color: white; border: none; padding: 10px 20px; border-radius: 30px; font-weight: 600; cursor: pointer; transition: transform 0.3s ease, box-shadow 0.3s ease; box-shadow: 0 5px 15px rgba(78, 205, 196, 0.3); } .achievement-popup button:hover { transform: translateY(-2px); box-shadow: 0 7px 20px rgba(78, 205, 196, 0.4); } .overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); backdrop-filter: blur(3px); opacity: 0; visibility: hidden; transition: all 0.3s ease; z-index: 5; } .overlay.show { opacity: 1; visibility: visible; } .completed-tag { position: absolute; top: 0; right: 0; background: linear-gradient(45deg, var(--secondary), var(--quaternary)); color: white; padding: 5px 10px; font-size: 0.7rem; font-weight: bold; border-bottom-left-radius: 8px; transform: translateY(-100%); transition: transform 0.3s ease; } .badge.achieved:hover .completed-tag { transform: translateY(0); } .confetti { position: absolute; width: 10px; height: 10px; background-color: var(--primary); opacity: 0; } .unlock-all { margin-top: 20px; background: linear-gradient(45deg, var(--quaternary), #9f7aea); color: white; border: none; padding: 12px 24px; border-radius: 30px; font-weight: 600; cursor: pointer; transition: transform 0.3s ease, box-shadow 0.3s ease; box-shadow: 0 5px 15px rgba(103, 114, 229, 0.3); } .unlock-all:hover { transform: translateY(-2px); box-shadow: 0 7px 20px rgba(103, 114, 229, 0.4); } .achievement-level { display: flex; align-items: center; justify-content: center; margin-top: 16px; gap: 5px; } .level-indicator { width: 40px; height: 8px; background-color: #e0e0e0; border-radius: 4px; transition: background-color 0.3s ease; } .level-indicator.active { background-color: var(--quaternary); } @media (max-width: 600px) { .badge-grid { grid-template-columns: repeat(2, 1fr); } h1 { font-size: 1.8rem; } .container { padding: 16px; } } /* Pulse Animation for New Badges */ @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(78, 205, 196, 0.6); } 70% { box-shadow: 0 0 0 15px rgba(78, 205, 196, 0); } 100% { box-shadow: 0 0 0 0 rgba(78, 205, 196, 0); } } .badge.new-achievement { animation: pulse 1.5s infinite; } </style> </head> <body> <div class="container"> <h1>Triangle Achievement System</h1> <p class="subtitle">Collect all badges by completing challenges and level up your profile!</p> <div class="progress-container"> <div class="progress-bar" id="progressBar"></div> </div> <div class="badge-grid" id="badgeGrid"></div> <div class="achievement-level"> <div class="level-indicator" id="level1"></div> <div class="level-indicator" id="level2"></div> <div class="level-indicator" id="level3"></div> </div> <button class="unlock-all" id="unlockAll">Simulate Badge Unlock</button> </div> <div class="achievement-popup" id="achievementPopup"> <div class="badge-triangle" id="popupTriangle"></div> <h3 id="achievementTitle">New Badge Unlocked!</h3> <p id="achievementDesc">You've mastered a new skill and earned a badge.</p> <button id="closePopup">Awesome!</button> </div> <div class="overlay" id="overlay"></div> <script> document.addEventListener('DOMContentLoaded', function() { // Badge data const badges = [ { id: 1, name: "First Steps", color: "#ff6b6b", description: "Complete your first challenge", achieved: false, level: 1 }, { id: 2, name: "Quick Learner", color: "#4ecdc4", description: "Complete 5 daily challenges in a row", achieved: false, level: 1 }, { id: 3, name: "Problem Solver", color: "#ffe66d", description: "Solve 10 difficult problems", achieved: false, level: 1 }, { id: 4, name: "Team Player", color: "#6772e5", description: "Collaborate with 3 other users", achieved: false, level: 2 }, { id: 5, name: "Creative Thinker", color: "#4b3f72", description: "Submit 5 original ideas", achieved: false, level: 2 }, { id: 6, name: "Master Strategist", color: "#fc5c65", description: "Complete all advanced challenges", achieved: false, level: 3 } ]; // Create badges const badgeGrid = document.getElementById('badgeGrid'); badges.forEach(badge => { const badgeEl = createBadgeElement(badge); badgeGrid.appendChild(badgeEl); }); // Update progress bar updateProgress(); updateLevelIndicators(); // Add event listener to unlock all button document.getElementById('unlockAll').addEventListener('click', simulateUnlock); // Close popup document.getElementById('closePopup').addEventListener('click', function() { document.getElementById('achievementPopup').classList.remove('show'); document.getElementById('overlay').classList.remove('show'); }); // Create badge element function createBadgeElement(badge) { const wrapper = document.createElement('div'); wrapper.className = 'badge-wrapper'; wrapper.dataset.id = badge.id; const badgeEl = document.createElement('div'); badgeEl.className = badge.achieved ? 'badge achieved' : 'badge'; const triangleSvg = ` <div class="badge-triangle"> <svg viewBox="0 0 100 100"> <polygon points="50,15 85,85 15,85" fill="${badge.color}" /> </svg> </div> `; const badgeName = `<div class="badge-name">${badge.name}</div>`; const badgeInfo = `<div class="badge-info">${badge.description}</div>`; const completedTag = `<div class="completed-tag">COMPLETED</div>`; const badgeCounter = `<div class="badge-counter">${badge.id}</div>`; const badgeLockedIcon = !badge.achieved ? ` <div class="badge-locked"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M19 11H5C3.89543 11 3 11.8954 3 13V20C3 21.1046 3.89543 22 5 22H19C20.1046 22 21 21.1046 21 20V13C21 11.8954 20.1046 11 19 11Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M7 11V7C7 5.93913 7.42143 4.92172 8.17157 4.17157C8.92172 3.42143 9.93913 3 11 3H13C14.0609 3 15.0783 3.42143 15.8284 4.17157C16.5786 4.92172 17 5.93913 17 7V11" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </div> ` : ''; badgeEl.innerHTML = triangleSvg + badgeName + badgeInfo + completedTag + badgeLockedIcon; wrapper.innerHTML = badgeEl.outerHTML + badgeCounter; // Add click event listener wrapper.addEventListener('click', function() { const badgeId = parseInt(this.dataset.id); const badge = badges.find(b => b.id === badgeId); if (!badge.achieved) { unlockBadge(badgeId); } }); return wrapper; } // Update progress bar function updateProgress() { const achievedCount = badges.filter(badge => badge.achieved).length; const progress = (achievedCount / badges.length) * 100; document.getElementById('progressBar').style.width = `${progress}%`; } // Update level indicators function updateLevelIndicators() { const level1Badges = badges.filter(b => b.level === 1 && b.achieved).length; const level2Badges = badges.filter(b => b.level === 2 && b.achieved).length; const level3Badges = badges.filter(b => b.level === 3 && b.achieved).length; const level1Total = badges.filter(b => b.level === 1).length; const level2Total = badges.filter(b => b.level === 2).length; document.getElementById('level1').className = level1Badges === level1Total ? 'level-indicator active' : 'level-indicator'; document.getElementById('level2').className = level2Badges === level2Total ? 'level-indicator active' : 'level-indicator'; document.getElementById('level3').className = level3Badges > 0 ? 'level-indicator active' : 'level-indicator'; } // Unlock badge function unlockBadge(badgeId) { const badge = badges.find(b => b.id === badgeId); if (badge && !badge.achieved) { badge.achieved = true; const badgeElement = document.querySelector(`.badge-wrapper[data-id="${badgeId}"] .badge`); badgeElement.classList.add('achieved'); badgeElement.classList.add('new-achievement'); // Animate the triangle const triangle = badgeElement.querySelector('.badge-triangle svg'); triangle.style.transform = 'rotate(360deg) scale(1.2)'; setTimeout(() => { triangle.style.transform = 'rotate(0deg) scale(1)'; badgeElement.classList.remove('new-achievement'); }, 1000); // Update progress updateProgress(); updateLevelIndicators(); // Show achievement popup showAchievementPopup(badge); // Create confetti effect createConfetti(badgeElement); } } // Show achievement popup function showAchievementPopup(badge) { const popup = document.getElementById('achievementPopup'); const overlay = document.getElementById('overlay'); // Set popup content document.getElementById('popupTriangle').innerHTML = ` <svg viewBox="0 0 100 100"> <polygon points="50,15 85,85 15,85" fill="${badge.color}" /> </svg> `; document.getElementById('achievementTitle').textContent = `${badge.name} Unlocked!`; document.getElementById('achievementDesc').textContent = badge.description; // Show popup popup.classList.add('show'); overlay.classList.add('show'); } // Create confetti effect function createConfetti(element) { const colors = ['#ff6b6b', '#4ecdc4', '#ffe66d', '#6772e5', '#4b3f72']; const rect = element.getBoundingClientRect(); for (let i = 0; i < 30; i++) { const confetti = document.createElement('div'); confetti.className = 'confetti'; confetti.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)]; confetti.style.left = `${rect.left + rect.width / 2}px`; confetti.style.top = `${rect.top + rect.height / 2}px`; document.body.appendChild(confetti); // Animate confetti const angle = Math.random() * Math.PI * 2; const distance = 50 + Math.random() * 60; const destinationX = rect.left + rect.width / 2 + Math.cos(angle) * distance; const destinationY = rect.top + rect.height / 2 + Math.sin(angle) * distance; confetti.animate([ { transform: 'translate(-50%, -50%) scale(0) rotate(0deg)', opacity: 1 }, { transform: `translate(${destinationX - rect.left - rect.width / 2}px, ${destinationY - rect.top - rect.height / 2}px) scale(${0.5 + Math.random() * 0.5}) rotate(${Math.random() * 360}deg)`, opacity: 0 } ], { duration: 1000 + Math.random() * 1000, easing: 'cubic-bezier(0.1, 0.8, 0.2, 1)' }); setTimeout(() => { confetti.remove(); }, 2000); } } // Simulate unlocking a random badge function simulateUnlock() { const unachievedBadges = badges.filter(badge => !badge.achieved); if (unachievedBadges.length > 0) { const randomIndex = Math.floor(Math.random() * unachievedBadges.length); const badgeToUnlock = unachievedBadges[randomIndex]; unlockBadge(badgeToUnlock.id); } else { // All badges are unlocked alert("Congratulations! You've unlocked all badges!"); } } }); </script> </body> </html>