Glitch effects have become a popular design trend, adding a touch of digital chaos to otherwise polished visuals. These effects can transform ordinary images and text into eye-catching, dynamic elements.
In this article, we will explore 10 stunning glitch effect examples that showcase the versatility and creativity of this unique design technique.
CODE1
Here's the code:
CODETEXT1
CODE2
Here's the code:
CODETEXT2
CODE3
Here's the code:
CODETEXT3
CODE4
Here's the code:
CODETEXT4
CODE5
Here's the code:
CODETEXT5
Designers and developers, elevate your glitch effect designs with Subframe's drag-and-drop interface and intuitive, responsive canvas. Create pixel-perfect UI effortlessly, every time.
Loved by creatives across the board, Subframe makes stunning design accessible to all. Start for free today!
CODE6
Here's the code:
CODETEXT6
CODE7
Here's the code:
CODETEXT7
CODE8
Here's the code:
CODETEXT8
CODE9
Here's the code:
CODETEXT9
CODE10
Here's the code:
CODETEXT10
Ready to elevate your UI designs? With Subframe, you can create pixel-perfect interfaces, including stunning glitch effects, in minutes. Our drag-and-drop editor ensures efficiency and precision.
Don't wait—start creating beautiful, responsive designs right away. Start for free today!
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>NEXUS-7 | Digital Liberation Front</title> <style> :root { --neon-pink: #ff2e77; --neon-blue: #00f0ff; --neon-purple: #8a2be2; --neon-green: #39ff14; --dark-bg: #0a0a12; --darker-bg: #050508; --text-color: #e0e0e0; --header-font: 'Rajdhani', sans-serif; --body-font: 'Inconsolata', monospace; } @import url('https://fonts.googleapis.com/css2?family=Rajdhani:wght@400;500;600;700&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Inconsolata:wght@300;400;500;600&display=swap'); * { margin: 0; padding: 0; box-sizing: border-box; } body { background-color: var(--dark-bg); color: var(--text-color); font-family: var(--body-font); overflow-x: hidden; background-image: radial-gradient(circle at 10% 20%, rgba(138, 43, 226, 0.05) 0%, transparent 25%), radial-gradient(circle at 90% 80%, rgba(0, 240, 255, 0.05) 0%, transparent 25%), linear-gradient(180deg, var(--darker-bg) 0%, var(--dark-bg) 100%); position: relative; } body::before { content: ''; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: repeating-linear-gradient( 0deg, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1) 1px, transparent 1px, transparent 2px ); pointer-events: none; z-index: 100; opacity: 0.3; } .noise { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-image: url('data:image/png;base64,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'); opacity: 0.05; z-index: 101; pointer-events: none; } header { position: fixed; top: 0; left: 0; width: 100%; padding: 1.5rem; z-index: 10; display: flex; justify-content: space-between; align-items: center; backdrop-filter: blur(10px); background: rgba(10, 10, 18, 0.7); border-bottom: 1px solid rgba(255, 46, 119, 0.2); } .logo { font-family: var(--header-font); font-weight: 700; font-size: 1.5rem; position: relative; color: var(--neon-blue); text-transform: uppercase; letter-spacing: 2px; } .logo::after { content: 'NEXUS-7'; position: absolute; left: 0; top: 0; color: var(--neon-pink); opacity: 0.5; transform: translate(2px, 2px); z-index: -1; } nav ul { display: flex; list-style: none; gap: 1.5rem; } nav a { color: var(--text-color); text-decoration: none; font-family: var(--header-font); font-weight: 500; text-transform: uppercase; letter-spacing: 1px; font-size: 0.9rem; position: relative; transition: all 0.3s ease; } nav a::before { content: ''; position: absolute; bottom: -5px; left: 0; width: 0; height: 1px; background: var(--neon-blue); transition: width 0.3s ease; } nav a:hover { color: var(--neon-blue); } nav a:hover::before { width: 100%; } .main-container { display: flex; flex-direction: column; height: 100vh; padding: 6rem 1.5rem 2rem; max-width: 700px; margin: 0 auto; } .hero-section { flex: 1; display: flex; flex-direction: column; justify-content: center; position: relative; } .glitch-title { font-family: var(--header-font); font-size: 3.5rem; font-weight: 700; margin-bottom: 1rem; line-height: 1; text-transform: uppercase; position: relative; animation: textShadow 2s infinite alternate; } .glitch-title span { display: block; } .glitch-title .line1 { color: var(--neon-pink); } .glitch-title .line2 { color: var(--neon-blue); margin-left: 1rem; } .subtitle { font-size: 1.1rem; font-weight: 400; margin-bottom: 2rem; opacity: 0.8; max-width: 90%; text-shadow: 0 0 5px rgba(255, 255, 255, 0.3); line-height: 1.4; } .glitch-btn { position: relative; display: inline-block; padding: 0.8rem 2rem; margin-right: 1rem; background-color: transparent; color: var(--neon-blue); border: 1px solid var(--neon-blue); font-family: var(--header-font); text-transform: uppercase; font-weight: 600; letter-spacing: 1px; cursor: pointer; overflow: hidden; transition: all 0.3s ease; text-decoration: none; } .glitch-btn::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(0, 240, 255, 0.4), transparent); transition: all 0.5s ease; } .glitch-btn:hover { background-color: rgba(0, 240, 255, 0.1); box-shadow: 0 0 15px var(--neon-blue); } .glitch-btn:hover::before { left: 100%; } .secondary-btn { color: var(--neon-pink); border-color: var(--neon-pink); } .secondary-btn:hover { background-color: rgba(255, 46, 119, 0.1); box-shadow: 0 0 15px var(--neon-pink); } .secondary-btn::before { background: linear-gradient(90deg, transparent, rgba(255, 46, 119, 0.4), transparent); } .features-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 1.5rem; margin: 4rem 0 2rem; } .feature-card { border: 1px solid rgba(0, 240, 255, 0.2); padding: 1.5rem; background: rgba(10, 10, 18, 0.5); position: relative; overflow: hidden; transition: all 0.3s ease; } .feature-card:hover { transform: translateY(-5px); box-shadow: 0 5px 15px rgba(0, 240, 255, 0.2); } .feature-card::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 2px; background: linear-gradient(90deg, var(--neon-blue), var(--neon-purple)); } .feature-card:nth-child(even)::before { background: linear-gradient(90deg, var(--neon-pink), var(--neon-purple)); } .feature-icon { font-size: 1.8rem; margin-bottom: 1rem; color: var(--neon-blue); } .feature-card:nth-child(even) .feature-icon { color: var(--neon-pink); } .feature-title { font-family: var(--header-font); font-size: 1.2rem; margin-bottom: 0.5rem; color: var(--text-color); } .feature-desc { font-size: 0.9rem; opacity: 0.8; line-height: 1.4; } .terminal-section { margin-top: 3rem; background: rgba(5, 5, 8, 0.8); border: 1px solid rgba(138, 43, 226, 0.3); padding: 1.5rem; border-radius: 4px; font-family: 'Inconsolata', monospace; position: relative; } .terminal-header { border-bottom: 1px solid rgba(138, 43, 226, 0.3); margin-bottom: 1rem; padding-bottom: 0.5rem; display: flex; align-items: center; gap: 0.5rem; } .terminal-dot { width: 12px; height: 12px; border-radius: 50%; background-color: var(--neon-pink); } .terminal-dot:nth-child(2) { background-color: var(--neon-purple); } .terminal-dot:nth-child(3) { background-color: var(--neon-blue); } .terminal-content { color: var(--neon-green); line-height: 1.6; font-size: 0.9rem; } .cursor { display: inline-block; width: 10px; height: 1.1em; background-color: var(--neon-green); animation: blink 1s infinite; vertical-align: middle; margin-left: 5px; } .footer { margin-top: 2rem; text-align: center; font-size: 0.8rem; opacity: 0.7; padding: 1rem; border-top: 1px solid rgba(255, 46, 119, 0.1); } .social-icons { display: flex; justify-content: center; gap: 1rem; margin: 1rem 0; } .social-icons a { color: var(--text-color); font-size: 1.2rem; transition: all 0.3s ease; } .social-icons a:hover { color: var(--neon-blue); transform: translateY(-3px); } @keyframes textShadow { 0% { text-shadow: 0.4px 0 1px rgba(0, 240, 255, 0.5), -0.4px 0 1px rgba(255, 46, 119, 0.5); } 33% { text-shadow: 2px 0 1px rgba(0, 240, 255, 0.7), -1px 0 1px rgba(255, 46, 119, 0.7); } 66% { text-shadow: -0.5px 0 1px rgba(0, 240, 255, 0.6), 0.5px 0 1px rgba(255, 46, 119, 0.6); } 100% { text-shadow: -1px 0 1px rgba(0, 240, 255, 0.5), 1px 0 1px rgba(255, 46, 119, 0.5); } } @keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } } @media (max-width: 768px) { .logo { font-size: 1.2rem; } nav ul { gap: 0.8rem; } nav a { font-size: 0.8rem; } .glitch-title { font-size: 2.5rem; } .subtitle { font-size: 1rem; } .features-grid { grid-template-columns: 1fr; } .main-container { padding-top: 5rem; } } @media (max-width: 480px) { header { padding: 1rem; } .glitch-title { font-size: 2rem; } .subtitle { font-size: 0.9rem; } .glitch-btn { padding: 0.7rem 1.5rem; font-size: 0.85rem; margin-bottom: 1rem; } } /* Custom scrollbar */ ::-webkit-scrollbar { width: 6px; } ::-webkit-scrollbar-track { background: var(--darker-bg); } ::-webkit-scrollbar-thumb { background: var(--neon-purple); border-radius: 3px; } ::-webkit-scrollbar-thumb:hover { background: var(--neon-pink); } </style> </head> <body> <div class="noise"></div> <header> <div class="logo">NEXUS-7</div> <nav> <ul> <li><a href="#" class="nav-link">Home</a></li> <li><a href="#" class="nav-link">Features</a></li> <li><a href="#" class="nav-link">Download</a></li> <li><a href="#" class="nav-link">Contact</a></li> </ul> </nav> </header> <div class="main-container"> <section class="hero-section"> <h1 class="glitch-title"> <span class="line1">DIGITAL</span> <span class="line2">LIBERATION</span> </h1> <p class="subtitle"> Breaking the chains of corporate surveillance. Our quantum-encrypted mesh network operates beyond the reach of MegaCorp tracking systems. </p> <div class="cta-buttons"> <a href="#" class="glitch-btn">Join The Resistance</a> <a href="#" class="glitch-btn secondary-btn">Learn More</a> </div> </section> <section class="features-grid"> <div class="feature-card"> <div class="feature-icon">⚡</div> <h3 class="feature-title">Neural Encryption</h3> <p class="feature-desc">Military-grade encryption algorithms with bio-neural key generation keeps your data invisible to corporate scanners.</p> </div> <div class="feature-card"> <div class="feature-icon">🛡️</div> <h3 class="feature-title">Ghost Protocol</h3> <p class="feature-desc">Leave no digital footprint. Our proprietary routing masks your identity across 27 decentralized nodes.</p> </div> <div class="feature-card"> <div class="feature-icon">🔮</div> <h3 class="feature-title">Reality Filters</h3> <p class="feature-desc">Block corporate AR advertisements and surveillance with our patented visual scrambling technology.</p> </div> </section> <section class="terminal-section"> <div class="terminal-header"> <div class="terminal-dot"></div> <div class="terminal-dot"></div> <div class="terminal-dot"></div> </div> <div class="terminal-content"> <div id="typed-text"></div> <span class="cursor"></span> </div> </section> <footer class="footer"> <div class="social-icons"> <a href="#">◈</a> <a href="#">◇</a> <a href="#">◎</a> <a href="#">◉</a> </div> <p>© 2077 Digital Liberation Front | Sector 9, Lower District</p> </footer> </div> <script> // Glitch effect on hover for navigation const navLinks = document.querySelectorAll('.nav-link'); navLinks.forEach(link => { link.addEventListener('mouseenter', function() { this.style.textShadow = ` 2px 0 2px rgba(255, 46, 119, 0.8), -2px 0 2px rgba(0, 240, 255, 0.8), 0 0 8px rgba(138, 43, 226, 0.8) `; this.style.letterSpacing = '2px'; // Chromatic aberration effect setTimeout(() => { this.style.textShadow = ''; this.style.letterSpacing = '1px'; }, 300); }); }); // Terminal typing effect const terminalContent = document.getElementById('typed-text'); const textToType = `> CONNECTING TO SECURE SERVER... > ACCESS GRANTED > DECRYPTING MESSAGE... > "The resistance grows stronger. MegaCorp's new neural implants contain backdoors. Spread the word. Next drop point: Sector 7G. Bring the EMP disruptors." > CONNECTION TERMINATED`; let i = 0; const typeWriter = () => { if (i < textToType.length) { terminalContent.innerHTML += textToType.charAt(i); i++; // Random typing speed for realistic effect const randomDelay = Math.floor(Math.random() * 50) + 20; setTimeout(typeWriter, randomDelay); // Auto-scroll to bottom terminalContent.scrollTop = terminalContent.scrollHeight; } }; setTimeout(typeWriter, 1000); // Random glitch effect on the title const glitchTitle = document.querySelector('.glitch-title'); setInterval(() => { if (Math.random() > 0.92) { glitchTitle.style.transform = `translate(${Math.random() * 4 - 2}px, ${Math.random() * 4 - 2}px)`; setTimeout(() => { glitchTitle.style.transform = 'translate(0, 0)'; }, 100); } }, 300); // Add chromatic aberration on button hover const buttons = document.querySelectorAll('.glitch-btn'); buttons.forEach(button => { button.addEventListener('mouseenter', function() { const color = this.classList.contains('secondary-btn') ? 'rgba(255, 46, 119, 0.5)' : 'rgba(0, 240, 255, 0.5)'; this.style.textShadow = ` 2px 0 3px ${color}, -2px 0 3px ${color}, 0 0 5px ${color} `; setTimeout(() => { this.style.textShadow = ''; }, 300); }); }); // Add scan line animation const body = document.querySelector('body'); const scanLine = document.createElement('div'); scanLine.style.position = 'absolute'; scanLine.style.top = '0'; scanLine.style.left = '0'; scanLine.style.width = '100%'; scanLine.style.height = '5px'; scanLine.style.background = 'rgba(0, 240, 255, 0.1)'; scanLine.style.boxShadow = '0 0 15px rgba(0, 240, 255, 0.5)'; scanLine.style.zIndex = '99'; scanLine.style.pointerEvents = 'none'; body.appendChild(scanLine); let scanPosition = 0; const animateScanLine = () => { scanPosition += 2; if (scanPosition > window.innerHeight) { scanPosition = 0; } scanLine.style.top = `${scanPosition}px`; requestAnimationFrame(animateScanLine); }; requestAnimationFrame(animateScanLine); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Cyberdrift: Race Complete</title> <style> :root { --primary: #ff2a6d; --secondary: #05d9e8; --tertiary: #d1f7ff; --dark: #0f0822; --light: #f6f6f6; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { background-color: var(--dark); color: var(--light); overflow: hidden; width: 100%; height: 100vh; display: flex; justify-content: center; align-items: center; } .game-end-container { position: relative; width: 700px; height: 700px; display: flex; flex-direction: column; align-items: center; justify-content: center; overflow: hidden; } .glitch-bg { position: absolute; width: 100%; height: 100%; top: 0; left: 0; background: var(--dark); z-index: -1; opacity: 0.8; } .glitch-scanline { position: absolute; width: 100%; height: 2px; background: rgba(255, 42, 109, 0.3); opacity: 0.8; z-index: 0; animation: scanline 6s linear infinite; } .glitch-container { background: rgba(15, 8, 34, 0.7); border-radius: 10px; padding: 30px; width: 80%; max-width: 500px; position: relative; box-shadow: 0 0 20px rgba(5, 217, 232, 0.3); border: 1px solid rgba(5, 217, 232, 0.4); z-index: 1; } .header { text-align: center; margin-bottom: 20px; position: relative; } .header h1 { font-size: 2.5rem; color: var(--light); text-transform: uppercase; margin-bottom: 10px; position: relative; display: inline-block; } .header h1::before, .header h1::after { content: 'RACE COMPLETE'; position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0.8; } .header h1::before { color: var(--primary); animation: glitch-1 2.5s infinite; } .header h1::after { color: var(--secondary); animation: glitch-2 2.5s infinite; } .header p { color: var(--tertiary); font-size: 1rem; opacity: 0.8; } .score-container { position: relative; border: 1px solid rgba(255, 42, 109, 0.4); border-radius: 8px; padding: 20px; margin-bottom: 20px; background: rgba(15, 8, 34, 0.6); } .score-row { display: flex; justify-content: space-between; margin-bottom: 10px; padding: 8px; position: relative; z-index: 1; } .score-row:last-child { margin-bottom: 0; border-top: 1px dashed rgba(5, 217, 232, 0.5); padding-top: 15px; margin-top: 5px; } .score-label { font-weight: bold; color: var(--tertiary); } .score-value { color: var(--secondary); font-weight: bold; font-family: monospace; font-size: 1.1rem; } .total .score-value { color: var(--primary); font-size: 1.4rem; } .rank { text-align: center; margin: 20px 0; position: relative; } .rank span { font-size: 3rem; font-weight: bold; background: linear-gradient(45deg, var(--primary), var(--secondary)); -webkit-background-clip: text; background-clip: text; color: transparent; display: inline-block; position: relative; padding: 0 20px; } .rank span::before { content: ""; position: absolute; left: -10px; top: 50%; transform: translateY(-50%); width: 25px; height: 2px; background: var(--primary); } .rank span::after { content: ""; position: absolute; right: -10px; top: 50%; transform: translateY(-50%); width: 25px; height: 2px; background: var(--secondary); } .actions { display: flex; justify-content: center; gap: 15px; margin-top: 25px; } .btn { padding: 12px 24px; border: none; border-radius: 4px; cursor: pointer; font-weight: bold; font-size: 1rem; text-transform: uppercase; position: relative; overflow: hidden; transition: all 0.3s; z-index: 1; } .btn::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(45deg, var(--primary), var(--secondary)); opacity: 0; transition: opacity 0.3s; z-index: -1; } .btn-primary { background-color: var(--primary); color: var(--light); } .btn-secondary { background-color: transparent; color: var(--tertiary); border: 1px solid var(--tertiary); } .btn:hover { transform: translateY(-3px); box-shadow: 0 5px 15px rgba(5, 217, 232, 0.4); } .btn:hover::before { opacity: 0.8; } .btn-primary:hover { box-shadow: 0 0 15px rgba(255, 42, 109, 0.6); } .btn-secondary:hover { box-shadow: 0 0 15px rgba(5, 217, 232, 0.6); color: var(--light); } .pixel-noise { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-image: url('data:image/svg+xml;utf8,<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg"><filter id="noise"><feTurbulence type="fractalNoise" baseFrequency="0.65" numOctaves="3" stitchTiles="stitch"/><feColorMatrix type="saturate" values="0"/></filter><rect width="100%" height="100%" filter="url(%23noise)" opacity="0.1"/></svg>'); opacity: 0.1; pointer-events: none; } .achievement { background: rgba(255, 42, 109, 0.1); border-radius: 8px; padding: 15px; margin-top: 20px; border-left: 3px solid var(--primary); } .achievement h3 { color: var(--secondary); margin-bottom: 5px; font-size: 1rem; display: flex; align-items: center; } .achievement h3::before { content: '✓'; display: inline-block; margin-right: 8px; color: var(--primary); font-weight: bold; } .achievement p { font-size: 0.9rem; color: var(--tertiary); opacity: 0.9; } .star-container { display: flex; justify-content: center; margin: 15px 0; position: relative; } .star { width: 30px; height: 30px; margin: 0 5px; position: relative; display: inline-block; color: rgba(255, 255, 255, 0.3); font-size: 30px; line-height: 1; } .star.filled { color: #ffcc33; } .star.filled::after { content: '★'; position: absolute; left: 0; top: 0; } .star::before { content: '★'; } @keyframes scanline { 0% { top: 0%; } 100% { top: 100%; } } @keyframes glitch-1 { 0%, 100% { transform: translate(0); } 20% { transform: translate(-2px, 1px); } 40% { transform: translate(2px, -1px); } 60% { transform: translate(1px, 1px); } 80% { transform: translate(-1px, -1px); } } @keyframes glitch-2 { 0%, 100% { transform: translate(0); } 25% { transform: translate(1px, -1px); } 50% { transform: translate(-3px, 2px); } 75% { transform: translate(1px, -2px); } } @keyframes shake { 0%, 100% { transform: translate(0, 0) rotate(0); } 20% { transform: translate(-4px, 0) rotate(-2deg); } 40% { transform: translate(4px, 0) rotate(2deg); } 60% { transform: translate(-2px, 0) rotate(0deg); } 80% { transform: translate(2px, 0) rotate(-1deg); } } @keyframes pixelate { 0%, 100% { filter: url('#pixelate') brightness(1); } 50% { filter: url('#pixelate') brightness(1.5); } } @keyframes scoreCount { from { opacity: 0.5; transform: scale(0.8); } to { opacity: 1; transform: scale(1); } } @media (max-width: 700px) { .glitch-container { width: 90%; padding: 20px; } .header h1 { font-size: 1.8rem; } .score-row { padding: 5px; } .rank span { font-size: 2.5rem; } .actions { flex-direction: column; } .btn { width: 100%; margin-bottom: 10px; } } </style> </head> <body> <svg style="position:absolute; width:0; height:0;"> <filter id="pixelate"> <feFlood x="4" y="4" height="2" width="2"/> <feComposite width="10" height="10"/> <feTile result="a"/> <feComposite in="SourceGraphic" in2="a" operator="in"/> <feMorphology operator="dilate" radius="5"/> </filter> </svg> <div class="game-end-container"> <div class="glitch-scanline"></div> <div class="glitch-bg"></div> <div class="pixel-noise"></div> <div class="glitch-container" id="score-display"> <div class="header"> <h1>RACE COMPLETE</h1> <p>CYBERDRIFT: NEO CIRCUIT</p> </div> <div class="star-container"> <div class="star filled"></div> <div class="star filled"></div> <div class="star filled"></div> <div class="star"></div> <div class="star"></div> </div> <div class="score-container" id="score-breakdown"> <div class="score-row"> <div class="score-label">LAP TIME</div> <div class="score-value" id="lap-time">02:34.78</div> </div> <div class="score-row"> <div class="score-label">DRIFT POINTS</div> <div class="score-value" id="drift-points">3,450</div> </div> <div class="score-row"> <div class="score-label">COLLECTIBLES</div> <div class="score-value" id="collectibles">13/20</div> </div> <div class="score-row"> <div class="score-label">BOOST EFFICIENCY</div> <div class="score-value" id="boost-efficiency">78%</div> </div> <div class="score-row total"> <div class="score-label">TOTAL SCORE</div> <div class="score-value" id="total-score">12,345</div> </div> </div> <div class="rank"> <span id="rank-text">A+</span> </div> <div class="achievement"> <h3>DRIFT MASTER</h3> <p>Maintained drift for over 10 seconds on Hairpin Turn</p> </div> <div class="actions"> <button class="btn btn-primary" id="btn-next-level">NEXT TRACK</button> <button class="btn btn-secondary" id="btn-retry">RETRY</button> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Apply glitch effect function applyGlitchEffect(intensity = 1) { const container = document.querySelector('.glitch-container'); const scoreValues = document.querySelectorAll('.score-value'); const headerText = document.querySelector('.header h1'); // Random displacement of elements container.style.transform = `translate(${(Math.random() * 4 - 2) * intensity}px, ${(Math.random() * 4 - 2) * intensity}px)`; // Add a subtle color shift to text scoreValues.forEach(value => { if (Math.random() > 0.7) { value.style.color = Math.random() > 0.5 ? 'var(--primary)' : 'var(--secondary)'; setTimeout(() => { value.style.color = ''; }, 150); } }); // Create scanlines effect const scanlines = document.querySelectorAll('.glitch-scanline'); scanlines.forEach(scanline => { scanline.style.opacity = 0.3 + (Math.random() * 0.5 * intensity); }); // Apply color shift to header if (Math.random() > 0.8) { headerText.style.filter = `hue-rotate(${Math.random() * 30}deg)`; setTimeout(() => { headerText.style.filter = ''; }, 150); } } // Function for counting up score values function countUpScore(elementId, finalValue, duration = 1000, prefix = '', suffix = '') { const element = document.getElementById(elementId); const start = 0; const increment = finalValue > 100 ? 10 : 1; const stepTime = Math.abs(Math.floor(duration / (finalValue / increment))); let current = 0; const timer = setInterval(() => { current += increment; element.textContent = `${prefix}${current.toLocaleString()}${suffix}`; // Small chance of glitch during counting if (Math.random() > 0.9) { element.style.transform = 'translate(1px, 0)'; element.style.opacity = 0.8; setTimeout(() => { element.style.transform = ''; element.style.opacity = 1; }, 50); } if (current >= finalValue) { element.textContent = `${prefix}${finalValue.toLocaleString()}${suffix}`; clearInterval(timer); // Apply animation once counting is done element.style.animation = 'scoreCount 0.3s forwards'; } }, stepTime); } // Create random glitches function startRandomGlitches() { setInterval(() => { if (Math.random() > 0.7) { applyGlitchEffect(Math.random() * 0.5); } }, 500); } // Initialize animations function init() { // Initial glitch effect applyGlitchEffect(2); // Start random glitches startRandomGlitches(); // Count up scores with delay between each setTimeout(() => countUpScore('lap-time', 234.78, 800, '', ''), 400); setTimeout(() => countUpScore('drift-points', 3450, 1200), 800); setTimeout(() => countUpScore('collectibles', 13, 600, '', '/20'), 1200); setTimeout(() => countUpScore('boost-efficiency', 78, 800, '', '%'), 1600); setTimeout(() => countUpScore('total-score', 12345, 1500), 2000); } // Handle button interactions document.querySelectorAll('.btn').forEach(btn => { btn.addEventListener('mouseenter', () => { applyGlitchEffect(0.5); }); btn.addEventListener('click', (e) => { e.preventDefault(); // Strong glitch effect on click applyGlitchEffect(3); // Shake the container const container = document.querySelector('.glitch-container'); container.style.animation = 'shake 0.5s'; setTimeout(() => { container.style.animation = ''; }, 500); // Change score display temporarily to simulate glitch document.querySelectorAll('.score-value').forEach(value => { const originalText = value.textContent; const glitchChars = '!@#$%^&*<>?/'; value.textContent = Array.from(originalText) .map(char => Math.random() > 0.7 ? glitchChars[Math.floor(Math.random() * glitchChars.length)] : char) .join(''); setTimeout(() => { value.textContent = originalText; }, 300); }); }); }); // Animate the stars on load document.querySelectorAll('.star.filled').forEach((star, index) => { setTimeout(() => { star.style.transform = 'scale(1.3)'; setTimeout(() => { star.style.transform = 'scale(1)'; }, 200); }, index * 300); }); // Initialize init(); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>GLITCHWAVE '24 Festival</title> <style> @import url('https://fonts.googleapis.com/css2?family=Audiowide&family=Roboto+Mono:wght@400;700&display=swap'); :root { --neon-pink: #ff00ff; --neon-blue: #00ffff; --neon-green: #00ff00; --neon-yellow: #ffff00; --dark-bg: #080818; } * { margin: 0; padding: 0; box-sizing: border-box; } body { background-color: var(--dark-bg); color: white; font-family: 'Roboto Mono', monospace; height: 100vh; overflow-x: hidden; position: relative; line-height: 1.6; } body::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: repeating-linear-gradient( 90deg, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0.15) 1px, transparent 1px, transparent 2px ); pointer-events: none; z-index: 10; } .noise { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMDAiIGhlaWdodD0iMzAwIj48ZmlsdGVyIGlkPSJhIiB4PSIwIiB5PSIwIj48ZmVUdXJidWxlbmNlIHR5cGU9ImZyYWN0YWxOb2lzZSIgYmFzZUZyZXF1ZW5jeT0iLjc1IiBzdGl0Y2hUaWxlcz0ic3RpdGNoIi8+PGZlQ29sb3JNYXRyaXggdHlwZT0ic2F0dXJhdGUiIHZhbHVlcz0iMCIvPjwvZmlsdGVyPjxwYXRoIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjA1IiBkPSJNMCAwaDMwMHYzMDBIMHoiLz48L3N2Zz4='); opacity: 0.3; mix-blend-mode: overlay; pointer-events: none; z-index: 9; } .container { max-width: 700px; padding: 1rem; margin: 0 auto; position: relative; overflow-y: auto; max-height: 700px; scrollbar-width: thin; scrollbar-color: var(--neon-pink) var(--dark-bg); } .container::-webkit-scrollbar { width: 5px; } .container::-webkit-scrollbar-thumb { background-color: var(--neon-pink); } .container::-webkit-scrollbar-track { background-color: var(--dark-bg); } header { text-align: center; margin-bottom: 2rem; position: relative; } .logo { font-family: 'Audiowide', cursive; font-size: 3rem; margin-bottom: 0.5rem; position: relative; text-shadow: 0 0 10px var(--neon-pink), 0 0 20px var(--neon-blue); display: inline-block; transform: skewX(-5deg); letter-spacing: 2px; color: white; } .glitch-text { position: relative; display: inline-block; } .glitch-text::before, .glitch-text::after { content: attr(data-text); position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0.8; } .glitch-text::before { color: var(--neon-blue); z-index: -1; animation: glitch-anim-1 2s infinite linear alternate-reverse; } .glitch-text::after { color: var(--neon-pink); z-index: -2; animation: glitch-anim-2 3s infinite linear alternate-reverse; } @keyframes glitch-anim-1 { 0%, 100% { transform: none; opacity: 0.8; } 20% { transform: translate(-3px, 2px); opacity: 0.6; } 40% { transform: translate(-2px, -2px); opacity: 0.8; } 60% { transform: translate(1px, 2px); opacity: 0.5; } 80% { transform: translate(2px, -1px); opacity: 0.7; } } @keyframes glitch-anim-2 { 0%, 100% { transform: none; opacity: 0.8; } 25% { transform: translate(2px, -1px); opacity: 0.7; } 50% { transform: translate(-3px, 1px); opacity: 0.6; } 75% { transform: translate(1px, -2px); opacity: 0.5; } } .date { font-family: 'Roboto Mono', monospace; color: var(--neon-green); font-size: 1.2rem; letter-spacing: 3px; animation: pulse 4s infinite; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.6; } } nav { display: flex; justify-content: center; flex-wrap: wrap; gap: 1rem; margin: 2rem 0; } .nav-btn { padding: 0.7rem 1.5rem; background: transparent; border: 1px solid var(--neon-blue); color: white; font-family: 'Roboto Mono', monospace; text-transform: uppercase; font-size: 0.9rem; cursor: pointer; position: relative; overflow: hidden; transition: all 0.3s; letter-spacing: 1px; box-shadow: 0 0 10px rgba(0, 255, 255, 0.3); } .nav-btn:hover { background: rgba(0, 255, 255, 0.2); transform: scale(1.05) skewX(-5deg); } .nav-btn:active { transform: scale(0.95); } main { margin-top: 2rem; } .section { margin-bottom: 3rem; padding: 1.5rem; background: rgba(8, 8, 24, 0.7); border: 1px solid rgba(255, 0, 255, 0.3); border-radius: 5px; position: relative; overflow: hidden; } .section::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 3px; background: linear-gradient(90deg, var(--neon-blue), var(--neon-pink), var(--neon-green), var(--neon-blue)); background-size: 300% 100%; animation: gradient-slide 3s linear infinite; } @keyframes gradient-slide { 0% { background-position: 0% 50%; } 100% { background-position: 300% 50%; } } h2 { font-family: 'Audiowide', cursive; color: var(--neon-blue); margin-bottom: 1rem; text-transform: uppercase; font-size: 1.5rem; letter-spacing: 1px; } .lineup { display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 1rem; } .dj { text-align: center; padding: 1rem; background: rgba(0, 0, 0, 0.3); border-radius: 5px; transition: all 0.3s; cursor: pointer; } .dj:hover { transform: translateY(-5px); box-shadow: 0 0 20px rgba(255, 0, 255, 0.5); } .dj-img { width: 80px; height: 80px; object-fit: cover; border-radius: 50%; margin-bottom: 0.5rem; border: 2px solid var(--neon-pink); filter: grayscale(50%) contrast(120%); transition: all 0.3s; } .dj:hover .dj-img { filter: grayscale(0%) contrast(120%); transform: scale(1.1); } .dj-name { font-weight: bold; color: white; font-size: 0.9rem; } .dj-genre { font-size: 0.7rem; color: var(--neon-green); } .schedule { display: flex; flex-direction: column; gap: 1rem; } .day { margin-bottom: 1rem; } .day-title { font-family: 'Audiowide', cursive; color: var(--neon-yellow); margin-bottom: 0.5rem; font-size: 1.2rem; } .set { display: flex; justify-content: space-between; border-bottom: 1px dashed rgba(0, 255, 255, 0.3); padding: 0.5rem 0; } .set-time { color: var(--neon-green); font-size: 0.9rem; min-width: 80px; } .set-dj { font-weight: bold; } .set-stage { color: var(--neon-pink); font-size: 0.8rem; text-align: right; } .tickets { text-align: center; } .ticket-types { display: flex; justify-content: space-around; flex-wrap: wrap; gap: 1rem; margin-top: 1.5rem; } .ticket { background: rgba(0, 0, 0, 0.4); border: 1px solid var(--neon-green); padding: 1.5rem; border-radius: 5px; width: 100%; max-width: 180px; position: relative; overflow: hidden; transition: all 0.3s; } .ticket:hover { transform: translateY(-10px) rotate(1deg); box-shadow: 0 0 20px rgba(0, 255, 0, 0.5); } .ticket::after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, transparent 50%, transparent 100%); pointer-events: none; } .ticket-name { font-family: 'Audiowide', cursive; color: var(--neon-green); font-size: 1.1rem; margin-bottom: 0.5rem; } .ticket-price { font-size: 1.8rem; font-weight: bold; margin-bottom: 0.5rem; } .ticket-info { font-size: 0.8rem; color: rgba(255, 255, 255, 0.7); margin-bottom: 1rem; } .buy-btn { background: var(--neon-green); color: black; border: none; padding: 0.5rem 1rem; border-radius: 3px; font-family: 'Roboto Mono', monospace; text-transform: uppercase; font-weight: bold; cursor: pointer; transition: all 0.3s; letter-spacing: 1px; } .buy-btn:hover { background: white; transform: scale(1.05); box-shadow: 0 0 15px var(--neon-green); } .buy-btn:active { transform: scale(0.95); } .location-info { display: flex; flex-direction: column; gap: 1rem; } .map { height: 200px; background-color: rgba(0, 0, 0, 0.5); border: 1px solid var(--neon-blue); border-radius: 5px; position: relative; overflow: hidden; } .map img { width: 100%; height: 100%; object-fit: cover; opacity: 0.8; transition: all 0.3s; } .map:hover img { opacity: 1; transform: scale(1.05); } .address { background: rgba(0, 0, 0, 0.4); padding: 1rem; border-radius: 5px; text-align: center; } .address h3 { color: var(--neon-yellow); margin-bottom: 0.5rem; font-family: 'Audiowide', cursive; } .pulse-circle { position: fixed; bottom: 1rem; right: 1rem; width: 50px; height: 50px; border-radius: 50%; background-color: rgba(255, 0, 255, 0.2); animation: pulse-beat 1s infinite; cursor: pointer; z-index: 100; display: flex; align-items: center; justify-content: center; } .pulse-circle::before { content: ''; position: absolute; width: 100%; height: 100%; border-radius: 50%; background-color: rgba(255, 0, 255, 0.3); animation: pulse-beat 1s infinite 0.3s; } .pulse-circle::after { content: '♫'; color: white; font-size: 1.5rem; } @keyframes pulse-beat { 0% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.3); opacity: 0.7; } 100% { transform: scale(1); opacity: 1; } } .active-section { display: block; } .hidden-section { display: none; } footer { text-align: center; margin-top: 2rem; padding: 1rem; border-top: 1px solid rgba(0, 255, 255, 0.3); font-size: 0.8rem; color: rgba(255, 255, 255, 0.7); } .social-icons { display: flex; justify-content: center; gap: 1rem; margin-top: 1rem; } .social-icon { width: 30px; height: 30px; display: flex; align-items: center; justify-content: center; border-radius: 50%; background: rgba(255, 255, 255, 0.1); color: white; transition: all 0.3s; font-size: 1rem; } .social-icon:hover { transform: translateY(-3px); background: var(--neon-pink); box-shadow: 0 0 10px var(--neon-pink); } /* Responsive adjustments */ @media (max-width: 600px) { .logo { font-size: 2.5rem; } .lineup { grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); } .ticket-types { flex-direction: column; align-items: center; } .ticket { max-width: 100%; } nav { flex-direction: column; align-items: center; } .nav-btn { width: 100%; text-align: center; } } </style> </head> <body> <div class="noise"></div> <div class="container"> <header> <h1 class="logo"> <span class="glitch-text" data-text="GLITCHWAVE">GLITCHWAVE</span> '24 </h1> <p class="date">JULY 15-17, 2024 • DIGITAL DUNES, LA</p> </header> <nav> <button class="nav-btn" data-section="lineup">LINEUP</button> <button class="nav-btn" data-section="schedule">SCHEDULE</button> <button class="nav-btn" data-section="tickets">TICKETS</button> <button class="nav-btn" data-section="location">LOCATION</button> </nav> <main> <section id="lineup" class="section active-section"> <h2>LINEUP</h2> <div class="lineup"> <div class="dj"> <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGNpcmNsZSBjeD0iNDAiIGN5PSI0MCIgcj0iNDAiIGZpbGw9IiMxMTEiLz48cGF0aCBkPSJNMjAgMjBoNDB2NDBIMjB6IiBmaWxsPSIjMjIyIi8+PHBhdGggZD0iTTMwIDI1aDIwdjMwSDMweiIgZmlsbD0iIzMzMyIvPjxjaXJjbGUgY3g9IjQwIiBjeT0iMzAiIHI9IjUiIGZpbGw9IiM0NDQiLz48Y2lyY2xlIGN4PSIzMCIgY3k9IjUwIiByPSI1IiBmaWxsPSIjNDQ0Ii8+PGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgcj0iNSIgZmlsbD0iIzQ0NCIvPjwvc3ZnPg==" class="dj-img" alt="Neural Noize"> <p class="dj-name">Neural Noize</p> <p class="dj-genre">Techno</p> </div> <div class="dj"> <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGNpcmNsZSBjeD0iNDAiIGN5PSI0MCIgcj0iNDAiIGZpbGw9IiMxNTE1MjUiLz48cGF0aCBkPSJNMjUgMjBoMzB2NDBIMjV6IiBmaWxsPSIjMjAyMDM1Ii8+PHBhdGggZD0iTTMwIDI1aDIwdjMwSDMweiIgZmlsbD0iIzI1MjU0MCIvPjxjaXJjbGUgY3g9IjQwIiBjeT0iMzUiIHI9IjgiIGZpbGw9IiMzMDMwNTAiLz48L3N2Zz4=" class="dj-img" alt="BassMatrix"> <p class="dj-name">BassMatrix</p> <p class="dj-genre">Drum & Bass</p> </div> <div class="dj"> <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGNpcmNsZSBjeD0iNDAiIGN5PSI0MCIgcj0iNDAiIGZpbGw9IiMxNTA1MTUiLz48cGF0aCBkPSJNMTUgMzBoNTB2MjBIMTV6IiBmaWxsPSIjMjUwNTI1Ii8+PHBhdGggZD0iTTIwIDIwaDQwdjQwSDIweiIgZmlsbD0iIzM1MTUzNSIvPjxjaXJjbGUgY3g9IjQwIiBjeT0iNDAiIHI9IjEwIiBmaWxsPSIjNDUxNTQ1Ii8+PC9zdmc+" class="dj-img" alt="Pixel Witch"> <p class="dj-name">Pixel Witch</p> <p class="dj-genre">Witch House</p> </div> <div class="dj"> <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGNpcmNsZSBjeD0iNDAiIGN5PSI0MCIgcj0iNDAiIGZpbGw9IiMwNTE1MjUiLz48cGF0aCBkPSJNMjAgMjBoNDB2NDBIMjB6IiBmaWxsPSIjMTAyNTM1Ii8+PHBhdGggZD0iTTI1IDI1aDMwdjMwSDI1eiIgZmlsbD0iIzE1MzU0NSIvPjxwYXRoIGQ9Ik0zMCAzMGgyMHYyMEgzMHoiIGZpbGw9IiMyMDQ1NTUiLz48L3N2Zz4=" class="dj-img" alt="VortX"> <p class="dj-name">VortX</p> <p class="dj-genre">Future Bass</p> </div> <div class="dj"> <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGNpcmNsZSBjeD0iNDAiIGN5PSI0MCIgcj0iNDAiIGZpbGw9IiMxNTA1MjUiLz48cGF0aCBkPSJNMjAgMjBoNDB2NDBIMjB6IiBmaWxsPSIjMjUxNTM1Ii8+PHBhdGggZD0iTTMwIDMwaDIwdjIwSDMweiIgZmlsbD0iIzM1MjU0NSIvPjxwYXRoIGQ9Ik0zNSAzNWgxMHYxMEgzNXoiIGZpbGw9IiM0NTM1NTUiLz48L3N2Zz4=" class="dj-img" alt="GLITCH:MODE"> <p class="dj-name">GLITCH:MODE</p> <p class="dj-genre">Breakcore</p> </div> <div class="dj"> <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGNpcmNsZSBjeD0iNDAiIGN5PSI0MCIgcj0iNDAiIGZpbGw9IiMxNTE1MzUiLz48cGF0aCBkPSJNMTUgMjVoNTB2MzBIMTV6IiBmaWxsPSIjMjUyNTQ1Ii8+PHBhdGggZD0iTTI1IDE1aDMwdjUwSDI1eiIgZmlsbD0iIzI1MjU0NSIvPjxjaXJjbGUgY3g9IjQwIiBjeT0iNDAiIHI9IjE1IiBmaWxsPSIjMzUzNTU1Ii8+PC9zdmc+" class="dj-img" alt="Cyber Shaman"> <p class="dj-name">Cyber Shaman</p> <p class="dj-genre">Psytrance</p> </div> <div class="dj"> <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGNpcmNsZSBjeD0iNDAiIGN5PSI0MCIgcj0iNDAiIGZpbGw9IiMwNTA1MTUiLz48cGF0aCBkPSJNMTAgMjBoNjB2NDBIMTB6IiBmaWxsPSIjMTUxNTI1Ii8+PHBhdGggZD0iTTIwIDMwaDQwdjIwSDIweiIgZmlsbD0iIzI1MjUzNSIvPjxwYXRoIGQ9Ik0zMCAyMGgyMHY0MEgzMHoiIGZpbGw9IiMyNTI1MzUiLz48L3N2Zz4=" class="dj-img" alt="Waveform"> <p class="dj-name">Waveform</p> <p class="dj-genre">Ambient</p> </div> <div class="dj"> <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGNpcmNsZSBjeD0iNDAiIGN5PSI0MCIgcj0iNDAiIGZpbGw9IiMzNTA1MTUiLz48cGF0aCBkPSJNMjAgMTBoNDB2NjBIMjB6IiBmaWxsPSIjNDUxNTI1Ii8+PHBhdGggZD0iTTMwIDIwaDIwdjQwSDMweiIgZmlsbD0iIzU1MjUzNSIvPjxjaXJjbGUgY3g9IjQwIiBjeT0iMzAiIHI9IjUiIGZpbGw9IiM2NTM1NDUiLz48Y2lyY2xlIGN4PSI0MCIgY3k9IjUwIiByPSI1IiBmaWxsPSIjNjUzNTQ1Ii8+PC9zdmc+" class="dj-img" alt="Red Shift"> <p class="dj-name">Red Shift</p> <p class="dj-genre">House</p> </div> </div> </section> <section id="schedule" class="section hidden-section"> <h2>SCHEDULE</h2> <div class="schedule"> <div class="day"> <h3 class="day-title">DAY 1 - JULY 15</h3> <div class="set"> <div class="set-time">18:00</div> <div class="set-dj">Waveform</div> <div class="set-stage">Flux Arena</div> </div> <div class="set"> <div class="set-time">19:30</div> <div class="set-dj">Red Shift</div> <div class="set-stage">Flux Arena</div> </div> <div class="set"> <div class="set-time">21:00</div> <div class="set-dj">Pixel Witch</div> <div class="set-stage">Quantum Stage</div> </div> <div class="set"> <div class="set-time">22:30</div> <div class="set-dj">Neural Noize</div> <div class="set-stage">Quantum Stage</div> </div> <div class="set"> <div class="set-time">00:00</div> <div class="set-dj">BassMatrix</div> <div class="set-stage">Flux Arena</div> </div> </div> <div class="day"> <h3 class="day-title">DAY 2 - JULY 16</h3> <div class="set"> <div class="set-time">18:00</div> <div class="set-dj">Cyber Shaman</div> <div class="set-stage">Quantum Stage</div> </div> <div class="set"> <div class="set-time">19:30</div> <div class="set-dj">GLITCH:MODE</div> <div class="set-stage">Flux Arena</div> </div> <div class="set"> <div class="set-time">21:00</div> <div class="set-dj">Neural Noize</div> <div class="set-stage">Quantum Stage</div> </div> <div class="set"> <div class="set-time">22:30</div> <div class="set-dj">VortX</div> <div class="set-stage">Flux Arena</div> </div> <div class="set"> <div class="set-time">00:00</div> <div class="set-dj">Pixel Witch</div> <div class="set-stage">Quantum Stage</div> </div> </div> <div class="day"> <h3 class="day-title">DAY 3 - JULY 17</h3> <div class="set"> <div class="set-time">18:00</div> <div class="set-dj">VortX</div> <div class="set-stage">Quantum Stage</div> </div> <div class="set"> <div class="set-time">19:30</div> <div class="set-dj">Waveform</div> <div class="set-stage">Flux Arena</div> </div> <div class="set"> <div class="set-time">21:00</div> <div class="set-dj">Cyber Shaman</div> <div class="set-stage">Quantum Stage</div> </div> <div class="set"> <div class="set-time">22:30</div> <div class="set-dj">Red Shift</div> <div class="set-stage">Flux Arena</div> </div> <div class="set"> <div class="set-time">00:00</div> <div class="set-dj">All Artists Showcase</div> <div class="set-stage">Both Stages</div> </div> </div> </div> </section> <section id="tickets" class="section hidden-section"> <h2>TICKETS</h2> <div class="tickets"> <p>Secure your pass to the most cutting-edge electronic music festival of the year.</p> <div class="ticket-types"> <div class="ticket"> <div class="ticket-name">DAY PASS</div> <div class="ticket-price">$79</div> <div class="ticket-info">Access to all stages for a single day</div> <button class="buy-btn">GET TICKET</button> </div> <div class="ticket"> <div class="ticket-name">FULL ACCESS</div> <div class="ticket-price">$199</div> <div class="ticket-info">3-day pass with priority entrance</div> <button class="buy-btn">GET TICKET</button> </div> <div class="ticket"> <div class="ticket-name">VIP</div> <div class="ticket-price">$349</div> <div class="ticket-info">Backstage access + exclusive merch</div> <button class="buy-btn">GET TICKET</button> </div> </div> </div> </section> <section id="location" class="section hidden-section"> <h2>LOCATION</h2> <div class="location-info"> <div class="map"> <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjIwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzEwMTAyMCIvPjxwYXRoIGQ9Ik0wIDUwaDQwMCIgc3Ryb2tlPSIjMzAzMDUwIiBzdHJva2Utd2lkdGg9IjIiLz48cGF0aCBkPSJNMCAxMDBoNDAwIiBzdHJva2U9IiMzMDMwNTAiIHN0cm9rZS13aWR0aD0iMiIvPjxwYXRoIGQ9Ik0wIDE1MGg0MDAiIHN0cm9rZT0iIzMwMzA1MCIgc3Ryb2tlLXdpZHRoPSIyIi8+PHBhdGggZD0iTTEwMCAwdjIwMCIgc3Ryb2tlPSIjMzAzMDUwIiBzdHJva2Utd2l
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>AR/VR Interface Overlay</title> <style> :root { --primary: #32ffd1; --secondary: #ff3e78; --dark: #0f1420; --light: #f7f9fc; --highlight: #6e49ff; --depth: rgba(15, 20, 32, 0.85); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', 'SF Pro Display', sans-serif; } body { background-color: var(--dark); color: var(--light); height: 700px; width: 700px; overflow: hidden; position: relative; display: flex; justify-content: center; align-items: center; } .container { position: relative; width: 100%; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 2rem; z-index: 1; } .ar-view { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: -1; background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><rect width="100" height="100" fill="%230f1420"/><circle cx="10" cy="10" r="2" fill="%232a3352"/><circle cx="30" cy="10" r="2" fill="%232a3352"/><circle cx="50" cy="10" r="2" fill="%232a3352"/><circle cx="70" cy="10" r="2" fill="%232a3352"/><circle cx="90" cy="10" r="2" fill="%232a3352"/><circle cx="10" cy="30" r="2" fill="%232a3352"/><circle cx="30" cy="30" r="2" fill="%232a3352"/><circle cx="50" cy="30" r="2" fill="%232a3352"/><circle cx="70" cy="30" r="2" fill="%232a3352"/><circle cx="90" cy="30" r="2" fill="%232a3352"/><circle cx="10" cy="50" r="2" fill="%232a3352"/><circle cx="30" cy="50" r="2" fill="%232a3352"/><circle cx="50" cy="50" r="2" fill="%232a3352"/><circle cx="70" cy="50" r="2" fill="%232a3352"/><circle cx="90" cy="50" r="2" fill="%232a3352"/><circle cx="10" cy="70" r="2" fill="%232a3352"/><circle cx="30" cy="70" r="2" fill="%232a3352"/><circle cx="50" cy="70" r="2" fill="%232a3352"/><circle cx="70" cy="70" r="2" fill="%232a3352"/><circle cx="90" cy="70" r="2" fill="%232a3352"/><circle cx="10" cy="90" r="2" fill="%232a3352"/><circle cx="30" cy="90" r="2" fill="%232a3352"/><circle cx="50" cy="90" r="2" fill="%232a3352"/><circle cx="70" cy="90" r="2" fill="%232a3352"/><circle cx="90" cy="90" r="2" fill="%232a3352"/></svg>'); } .glitch-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: transparent; z-index: 0; pointer-events: none; opacity: 0.2; mix-blend-mode: screen; background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500" viewBox="0 0 500 500"><filter id="noise"><feTurbulence type="fractalNoise" baseFrequency="0.65" numOctaves="3" stitchTiles="stitch"/><feColorMatrix type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.5 0"/></filter><rect width="500" height="500" filter="url(%23noise)" opacity="1"/></svg>'); } .ui-panel { background: var(--depth); border-radius: 16px; padding: 2rem; backdrop-filter: blur(10px); box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); border: 1px solid rgba(255, 255, 255, 0.1); width: 90%; max-width: 580px; position: relative; overflow: hidden; transform-style: preserve-3d; perspective: 1000px; } .ui-panel::before { content: ''; position: absolute; top: -5px; left: -5px; right: -5px; bottom: -5px; background: linear-gradient(45deg, var(--primary), var(--secondary), var(--highlight)); z-index: -1; filter: blur(20px); opacity: 0.3; border-radius: 20px; transform: translateZ(-10px); } h1 { font-size: 2.2rem; font-weight: 800; margin-bottom: 1.5rem; background: linear-gradient(to right, var(--primary), var(--highlight)); -webkit-background-clip: text; background-clip: text; color: transparent; position: relative; text-align: center; } p { margin-bottom: 1rem; line-height: 1.5; font-size: 1rem; color: rgba(255, 255, 255, 0.9); } .button-group { display: flex; gap: 1rem; margin-top: 2rem; justify-content: center; flex-wrap: wrap; } .ar-button { padding: 0.75rem 1.5rem; background: rgba(255, 255, 255, 0.05); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 30px; color: var(--light); font-weight: 600; cursor: pointer; transition: all 0.3s ease; position: relative; overflow: hidden; display: flex; align-items: center; justify-content: center; gap: 0.5rem; min-width: 160px; } .ar-button:hover { background: rgba(255, 255, 255, 0.1); transform: translateY(-3px); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2); } .ar-button:hover::before { opacity: 1; } .ar-button::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(45deg, var(--primary), var(--highlight)); opacity: 0; transition: opacity 0.3s ease; z-index: -1; border-radius: 30px; } .primary-button { background: linear-gradient(45deg, var(--primary), var(--highlight)); border: none; box-shadow: 0 5px 15px rgba(110, 73, 255, 0.4); } .primary-button:hover { background: linear-gradient(45deg, var(--highlight), var(--primary)); transform: translateY(-3px) scale(1.05); } .interface-elements { position: absolute; pointer-events: none; } .top-element { top: 20px; right: 20px; } .bottom-element { bottom: 20px; left: 20px; } .compass { width: 80px; height: 80px; border-radius: 50%; background: var(--depth); border: 1px solid rgba(255, 255, 255, 0.1); display: flex; align-items: center; justify-content: center; position: relative; backdrop-filter: blur(10px); } .compass::after { content: ''; width: 2px; height: 30px; background: var(--primary); position: absolute; top: 15px; transform-origin: bottom center; animation: compassSpin 10s infinite linear; box-shadow: 0 0 10px var(--primary); } .compass::before { content: 'N'; position: absolute; top: 5px; color: var(--primary); font-weight: bold; font-size: 12px; } .status-indicator { display: flex; align-items: center; background: var(--depth); border-radius: 30px; padding: 0.5rem 1rem; gap: 0.5rem; border: 1px solid rgba(255, 255, 255, 0.1); backdrop-filter: blur(10px); } .indicator-dot { width: 10px; height: 10px; border-radius: 50%; background: var(--primary); animation: pulse 2s infinite; } .status-text { font-size: 0.8rem; font-weight: 600; } @keyframes pulse { 0% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.2); opacity: 0.7; } 100% { transform: scale(1); opacity: 1; } } @keyframes compassSpin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } .scan-line { position: absolute; top: 0; left: 0; width: 100%; height: 4px; background: linear-gradient(to right, transparent, var(--primary), transparent); opacity: 0.5; animation: scanMove 3s linear infinite; z-index: 100; pointer-events: none; } @keyframes scanMove { 0% { top: 0; } 100% { top: 100%; } } .progress-container { width: 100%; margin-top: 2rem; } .progress-bar { width: 100%; height: 6px; background: rgba(255, 255, 255, 0.1); border-radius: 3px; overflow: hidden; position: relative; } .progress-fill { height: 100%; width: 0%; background: linear-gradient(to right, var(--primary), var(--highlight)); border-radius: 3px; transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .grid-lines { position: absolute; width: 100%; height: 100%; background-size: 50px 50px; background-image: linear-gradient(to right, rgba(255, 255, 255, 0.05) 1px, transparent 1px), linear-gradient(to bottom, rgba(255, 255, 255, 0.05) 1px, transparent 1px); z-index: -1; opacity: 0.3; } .interface-icon { width: 20px; height: 20px; stroke: var(--light); fill: none; stroke-width: 2.5; stroke-linecap: round; stroke-linejoin: round; } .tracking-points { position: absolute; width: 100%; height: 100%; top: 0; left: 0; z-index: -1; } .tracking-point { position: absolute; width: 8px; height: 8px; background: var(--primary); border-radius: 50%; opacity: 0; animation: trackingPoint 4s infinite; } @keyframes trackingPoint { 0%, 100% { opacity: 0; transform: scale(0.5); } 50% { opacity: 0.7; transform: scale(1); } } .cursor-tracker { position: absolute; pointer-events: none; width: 150px; height: 150px; background: radial-gradient(circle, rgba(50, 255, 209, 0.2) 0%, rgba(50, 255, 209, 0) 70%); border-radius: 50%; transform: translate(-50%, -50%); z-index: 10; opacity: 0; transition: opacity 0.3s ease; } /* Glitch effect */ .glitch-container { position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden; pointer-events: none; opacity: 0; z-index: 100; mix-blend-mode: screen; } .glitch-slice { position: absolute; width: 120%; height: 5px; background-color: var(--primary); opacity: 0.1; left: -10%; animation: glitchSlide 3s linear infinite; } @keyframes glitchSlide { 0% { transform: translateY(-500px) skewX(20deg); } 100% { transform: translateY(1000px) skewX(-30deg); } } .noise-animation { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500" viewBox="0 0 500 500"><filter id="noise"><feTurbulence type="fractalNoise" baseFrequency="0.65" numOctaves="3" stitchTiles="stitch"/><feColorMatrix type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.5 0"/></filter><rect width="500" height="500" filter="url(%23noise)" opacity="1"/></svg>'); opacity: 0; mix-blend-mode: overlay; z-index: 101; pointer-events: none; } /* Feature cards */ .feature-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; margin-top: 2rem; width: 100%; } .feature-card { background: rgba(255, 255, 255, 0.05); border-radius: 10px; padding: 1rem; display: flex; flex-direction: column; align-items: center; text-align: center; border: 1px solid rgba(255, 255, 255, 0.05); transition: all 0.3s ease; cursor: pointer; } .feature-card:hover { background: rgba(255, 255, 255, 0.1); transform: translateY(-5px); border-color: var(--primary); } .feature-icon { margin-bottom: 0.5rem; width: 40px; height: 40px; display: flex; align-items: center; justify-content: center; background: var(--depth); border-radius: 10px; } .feature-title { font-size: 0.9rem; font-weight: 600; margin-bottom: 0.25rem; } .feature-description { font-size: 0.75rem; color: rgba(255, 255, 255, 0.7); } @media (max-width: 600px) { h1 { font-size: 1.8rem; } .ui-panel { padding: 1.5rem; } .feature-cards { grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); } .compass { width: 60px; height: 60px; } } </style> </head> <body> <div class="ar-view"></div> <div class="grid-lines"></div> <div class="glitch-overlay"></div> <div class="tracking-points"> <div class="tracking-point" style="top: 20%; left: 30%;"></div> <div class="tracking-point" style="top: 40%; left: 60%;"></div> <div class="tracking-point" style="top: 70%; left: 20%;"></div> <div class="tracking-point" style="top: 25%; left: 80%;"></div> <div class="tracking-point" style="top: 80%; left: 70%;"></div> </div> <div class="scan-line"></div> <div class="interface-elements top-element"> <div class="compass"></div> </div> <div class="interface-elements bottom-element"> <div class="status-indicator"> <div class="indicator-dot"></div> <div class="status-text">Environment Scanning</div> </div> </div> <div class="container"> <div class="ui-panel"> <h1>Dimensional Interface Overlay</h1> <p>Bridging digital and physical reality through layered distortion signals. Our adaptive AR overlay uses glitch effects to seamlessly indicate transitional states between dimensions.</p> <div class="feature-cards"> <div class="feature-card" data-index="1"> <div class="feature-icon"> <svg class="interface-icon" viewBox="0 0 24 24"> <path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"></path> </svg> </div> <div class="feature-title">Spatial Audio</div> <div class="feature-description">3D sound positioning with ambient distortion cues</div> </div> <div class="feature-card" data-index="2"> <div class="feature-icon"> <svg class="interface-icon" viewBox="0 0 24 24"> <path d="M12 19l9 2-9-18-9 18 9-2zm0 0v-8"></path> </svg> </div> <div class="feature-title">Dynamic Mapping</div> <div class="feature-description">Real-time surface detection with glitch feedback</div> </div> <div class="feature-card" data-index="3"> <div class="feature-icon"> <svg class="interface-icon" viewBox="0 0 24 24"> <circle cx="12" cy="12" r="10"></circle> <line x1="12" y1="8" x2="12" y2="12"></line> <line x1="12" y1="16" x2="12.01" y2="16"></line> </svg> </div> <div class="feature-title">Quantum Anchors</div> <div class="feature-description">Digital objects with analog distortion properties</div> </div> </div> <div class="progress-container"> <div class="progress-bar"> <div class="progress-fill" id="progressFill"></div> </div> </div> <div class="button-group"> <button class="ar-button" id="calibrationButton"> <svg class="interface-icon" viewBox="0 0 24 24"> <circle cx="12" cy="12" r="3"></circle> <path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path> </svg> Calibrate </button> <button class="ar-button primary-button" id="launchButton"> <svg class="interface-icon" viewBox="0 0 24 24"> <polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"></polygon> </svg> Initialize Interface </button> </div> </div> </div> <div class="cursor-tracker" id="cursorTracker"></div> <div class="glitch-container" id="glitchContainer"> <div class="glitch-slice" style="top: 10%;"></div> <div class="glitch-slice" style="top: 15%;"></div> <div class="glitch-slice" style="top: 30%;"></div> <div class="glitch-slice" style="top: 45%;"></div> <div class="glitch-slice" style="top: 65%;"></div> <div class="glitch-slice" style="top: 85%;"></div> <div class="noise-animation" id="noiseAnimation"></div> </div> <script> // Create tracking points dynamically function createTrackingPoints() { const trackingContainer = document.querySelector('.tracking-points'); for (let i = 0; i < 15; i++) { const point = document.createElement('div'); point.className = 'tracking-point'; point.style.top = `${Math.random() * 100}%`; point.style.left = `${Math.random() * 100}%`; point.style.animationDelay = `${Math.random() * 4}s`; trackingContainer.appendChild(point); } } // Cursor tracker function initCursorTracker() { const tracker = document.getElementById('cursorTracker'); document.addEventListener('mousemove', (e) => { const rect = document.body.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; tracker.style.transform = `translate(${x}px, ${y}px)`; tracker.style.opacity = '1'; }); document.addEventListener('mouseleave', () => { tracker.style.opacity = '0'; }); } // Glitch effect for transitions function triggerGlitchEffect() { const glitchContainer = document.getElementById('glitchContainer'); const noiseAnimation = document.getElementById('noiseAnimation'); glitchContainer.style.opacity = '1'; noiseAnimation.style.opacity = '0.5'; setTimeout(() => { glitchContainer.style.opacity = '0'; noiseAnimation.style.opacity = '0'; }, 800); } // Initialize progress bar function initProgressBar() { const progressFill = document.getElementById('progressFill'); let width = 0; const interval = setInterval(() => { if (width >= 100) { clearInterval(interval); } else { width += 1; progressFill.style.width = width + '%'; } }, 50); } // Button interactions function initButtons() { const calibrationButton = document.getElementById('calibrationButton'); const launchButton = document.getElementById('launchButton'); calibrationButton.addEventListener('click', function() { triggerGlitchEffect(); // Change status text document.querySelector('.status-text').textContent = 'Calibrating...'; // After a delay, revert back setTimeout(() => { document.querySelector('.status-text').textContent = 'Calibration Complete'; }, 2000); }); launchButton.addEventListener('click', function() { triggerGlitchEffect(); // Change button text this.innerHTML = ` <svg class="interface-icon" viewBox="0 0 24 24"> <circle cx="12" cy="12" r="10"></circle> <path d="M12 16v-4M12 8h.01"></path> </svg> Processing... `; // After a delay, revert back setTimeout(() => { this.innerHTML = ` <svg class="interface-icon" viewBox="0 0 24 24"> <path d="M5 12h14M12 5l7 7-7 7"></path> </svg> Continue `; document.querySelector('.status-text').textContent = 'Interface Ready'; }, 2000); }); // Feature card interactions const featureCards = document.querySelectorAll('.feature-card'); featureCards.forEach(card => { card.addEventListener('click', function() { triggerGlitchEffect(); // Add active class to the clicked card featureCards.forEach(c => c.style.borderColor = 'rgba(255, 255, 255, 0.05)'); this.style.borderColor = 'var(--primary)'; }); }); } // Initialize all features document.addEventListener('DOMContentLoaded', function() { createTrackingPoints(); initCursorTracker(); initProgressBar(); initButtons(); // Create glitch slices const glitchContainer = document.getElementById('glitchContainer'); for (let i = 0; i < 10; i++) { const slice = document.createElement('div'); slice.className = 'glitch-slice'; slice.style.top = `${Math.random() * 100}%`; slice.style.height = `${1 + Math.random() * 5}px`; slice.style.animationDuration = `${1 + Math.random() * 3}s`; slice.style.animationDelay = `${Math.random() * 2}s`; glitchContainer.appendChild(slice); } // Trigger initial glitch effect setTimeout(triggerGlitchEffect, 500); // Add mouse move parallax effect document.addEventListener('mousemove', function(e) { const moveX = (e.clientX / window.innerWidth - 0.5) * 10; const moveY = (e.clientY / window.innerHeight - 0.5) * 10; document.querySelector('.ui-panel').style.transform = `perspective(1000px) rotateX(${moveY * 0.2}deg) rotateY(${moveX * 0.2}deg)`; }); // 3D hover effect for buttons const buttons = document.querySelectorAll('.ar-button'); buttons.forEach(button => { button.addEventListener('mousemove', function(e) { const rect = this.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; const centerX = rect.width / 2; const centerY = rect.height / 2; const angleX = (centerY - y) / 10; const angleY = (x - centerX) / 10; this.style.transform = `perspective(1000px) rotateX(${angleX}deg) rotateY(${angleY}deg) translateZ(10px)`; }); button.addEventListener('mouseleave', function() { this.style.transform = 'perspective(1000px) rotateX(0) rotateY(0) translateZ(0)'; }); }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>GLITCH - Product Showcase</title> <style> :root { --primary: #0a0a0f; --secondary: #e835f0; --tertiary: #3ef0d4; --light: #f0f0f2; --dark: #1a1a20; --transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Poppins', -apple-system, BlinkMacSystemFont, sans-serif; } body { background-color: var(--primary); color: var(--light); overflow-x: hidden; width: 100%; max-width: 700px; margin: 0 auto; height: 100vh; display: flex; flex-direction: column; } header { padding: 20px; text-align: center; position: relative; } .logo { font-size: 24px; font-weight: 800; letter-spacing: 2px; background: linear-gradient(90deg, var(--secondary), var(--tertiary)); -webkit-background-clip: text; background-clip: text; color: transparent; margin-bottom: 5px; } .subtitle { font-size: 14px; opacity: 0.7; font-weight: 300; } .products-container { display: grid; grid-template-columns: repeat(2, 1fr); gap: 20px; padding: 20px; flex-grow: 1; } .product { background: var(--dark); border-radius: 12px; overflow: hidden; position: relative; transition: var(--transition); cursor: pointer; height: 260px; display: flex; flex-direction: column; } .product-image-container { height: 65%; position: relative; overflow: hidden; } .product-image { width: 100%; height: 100%; object-fit: cover; transition: transform 0.5s ease; will-change: transform; } .product-hidden-details { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(10, 10, 15, 0.7); display: flex; flex-direction: column; justify-content: center; align-items: center; opacity: 0; transition: opacity 0.3s ease; padding: 15px; text-align: center; backdrop-filter: blur(3px); } .hidden-title { font-size: 16px; font-weight: 600; margin-bottom: 5px; color: var(--tertiary); } .hidden-desc { font-size: 12px; line-height: 1.4; margin-bottom: 10px; } .hidden-price { font-size: 18px; font-weight: 700; color: var(--secondary); } .product-info { padding: 15px; flex-grow: 1; display: flex; flex-direction: column; justify-content: space-between; } .product-title { font-size: 16px; font-weight: 600; margin-bottom: 5px; } .product-price { display: flex; justify-content: space-between; align-items: center; } .price { font-weight: 700; } .cta-button { background: linear-gradient(45deg, var(--secondary), var(--tertiary)); border: none; color: var(--primary); padding: 8px 12px; border-radius: 6px; font-weight: 600; font-size: 12px; cursor: pointer; transition: var(--transition); position: relative; overflow: hidden; } footer { text-align: center; padding: 20px; font-size: 12px; opacity: 0.7; } /* Glitch Effects */ .glitch-container { position: relative; overflow: hidden; width: 100%; height: 100%; } .product:hover .product-image { transform: scale(1.1); } .product:hover .product-hidden-details { opacity: 1; } .product:hover .glitch-1:after, .product:hover .glitch-2:after { content: ''; position: absolute; top: 0; left: -10px; right: -10px; bottom: 0; background: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiPgogIDxmaWx0ZXIgaWQ9Im5vaXNlIj4KICAgIDxmZVR1cmJ1bGVuY2UgdHlwZT0iZnJhY3RhbE5vaXNlIiBiYXNlRnJlcXVlbmN5PSIwLjA1IiBudW1PY3RhdmVzPSIyIiBzdGl0Y2hUaWxlcz0ic3RpdGNoIiAvPgogIDwvZmlsdGVyPgogIDxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbHRlcj0idXJsKCNub2lzZSkiIG9wYWNpdHk9IjAuMyIgLz4KPC9zdmc+); mix-blend-mode: difference; opacity: 0; z-index: 1; animation: glitchAnimation 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards; } .product:hover .glitch-2:after { animation-delay: 0.1s; animation-duration: 0.6s; } @keyframes glitchAnimation { 0% { opacity: 0; transform: translate3d(0, 0, 0); } 20% { opacity: 0.8; transform: translate3d(5px, 5px, 0); } 40% { opacity: 0.4; transform: translate3d(-2px, -2px, 0); } 60% { opacity: 0.6; transform: translate3d(3px, -1px, 0); } 80% { opacity: 0.3; transform: translate3d(-1px, 2px, 0); } 100% { opacity: 0; transform: translate3d(0, 0, 0); } } .cta-button:hover { transform: translateY(-2px); box-shadow: 0 5px 15px rgba(232, 53, 240, 0.3); } .cta-button:hover::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); transform: translateX(-100%); animation: buttonGlitch 1s infinite; } .cta-button:active { transform: translateY(0); } @keyframes buttonGlitch { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } } .logo-glitch { position: relative; display: inline-block; } .logo-glitch::before, .logo-glitch::after { content: 'GLITCH'; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(90deg, var(--secondary), var(--tertiary)); -webkit-background-clip: text; background-clip: text; color: transparent; } .logo-glitch::before { left: 2px; text-shadow: -1px 0 var(--tertiary); clip-path: inset(0 0 0 0); animation: noise-1 2s infinite linear alternate-reverse; } .logo-glitch::after { left: -2px; text-shadow: 1px 0 var(--secondary); clip-path: inset(0 0 0 0); animation: noise-2 3s infinite linear alternate-reverse; } @keyframes noise-1 { 0%, 20%, 40%, 60%, 70%, 90% { clip-path: inset(90% 0 0 0); } 10%, 30%, 50%, 80%, 100% { clip-path: inset(0 0 85% 0); } 15%, 35%, 55%, 75%, 95% { clip-path: inset(30% 0 40% 0); } } @keyframes noise-2 { 0%, 20%, 40%, 60%, 70%, 90% { clip-path: inset(20% 0 60% 0); } 10%, 30%, 50%, 80%, 100% { clip-path: inset(50% 0 30% 0); } 15%, 35%, 55%, 75%, 95% { clip-path: inset(70% 0 10% 0); } } /* Media Queries */ @media (max-width: 500px) { .products-container { grid-template-columns: 1fr; } .product { height: 280px; } } /* Custom interactive cursor */ .cursor { position: fixed; width: 20px; height: 20px; border-radius: 50%; background-color: var(--secondary); pointer-events: none; mix-blend-mode: difference; z-index: 9999; opacity: 0.7; transform: translate(-50%, -50%); transition: width 0.2s, height 0.2s, background-color 0.2s; } .cursor-follower { position: fixed; width: 40px; height: 40px; border: 2px solid var(--tertiary); border-radius: 50%; pointer-events: none; z-index: 9998; opacity: 0.5; transform: translate(-50%, -50%); transition: width 0.3s, height 0.3s, background-color 0.3s, border 0.3s; } </style> </head> <body> <div class="cursor"></div> <div class="cursor-follower"></div> <header> <div class="logo"> <span class="logo-glitch">GLITCH</span> </div> <div class="subtitle">Reveal the unfiltered reality beneath the surface</div> </header> <div class="products-container"> <div class="product"> <div class="product-image-container"> <div class="glitch-container glitch-1"> <img class="product-image" src="https://images.unsplash.com/photo-1605464315542-bda3e2f4e605?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=500&q=80" alt="Quantum Headphones"> </div> <div class="product-hidden-details"> <div class="hidden-title">Digital Noise Cancellation</div> <div class="hidden-desc">Features adaptive sound with 40mm drivers and spatial audio technology</div> <div class="hidden-price">$249.99</div> </div> </div> <div class="product-info"> <h3 class="product-title">Quantum Headphones X1</h3> <div class="product-price"> <div class="price">$249.99</div> <button class="cta-button">Discover</button> </div> </div> </div> <div class="product"> <div class="product-image-container"> <div class="glitch-container glitch-2"> <img class="product-image" src="https://images.unsplash.com/photo-1523275335684-37898b6baf30?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=500&q=80" alt="Analog Watch"> </div> <div class="product-hidden-details"> <div class="hidden-title">Dual Time Zones</div> <div class="hidden-desc">Swiss-made automatic movement with 72-hour power reserve</div> <div class="hidden-price">$399.99</div> </div> </div> <div class="product-info"> <h3 class="product-title">Chrono Nexus Watch</h3> <div class="product-price"> <div class="price">$399.99</div> <button class="cta-button">Discover</button> </div> </div> </div> <div class="product"> <div class="product-image-container"> <div class="glitch-container glitch-1"> <img class="product-image" src="https://images.unsplash.com/photo-1514866747592-c2d279258a78?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=500&q=80" alt="Sneakers"> </div> <div class="product-hidden-details"> <div class="hidden-title">Reactive Cushioning</div> <div class="hidden-desc">Embedded smart sensors adapt to your running style</div> <div class="hidden-price">$179.99</div> </div> </div> <div class="product-info"> <h3 class="product-title">Vapor Running Shoes</h3> <div class="product-price"> <div class="price">$179.99</div> <button class="cta-button">Discover</button> </div> </div> </div> <div class="product"> <div class="product-image-container"> <div class="glitch-container glitch-2"> <img class="product-image" src="https://images.unsplash.com/photo-1511499767150-a48a237f0083?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=500&q=80" alt="Sunglasses"> </div> <div class="product-hidden-details"> <div class="hidden-title">Photochromic Lenses</div> <div class="hidden-desc">Anti-reflective coating with UV400 full spectrum protection</div> <div class="hidden-price">$129.99</div> </div> </div> <div class="product-info"> <h3 class="product-title">Prism Sunglasses Pro</h3> <div class="product-price"> <div class="price">$129.99</div> <button class="cta-button">Discover</button> </div> </div> </div> </div> <footer> © 2023 GLITCH — Distorting reality since 2019 </footer> <script> document.addEventListener('DOMContentLoaded', function() { // Custom cursor const cursor = document.querySelector('.cursor'); const cursorFollower = document.querySelector('.cursor-follower'); document.addEventListener('mousemove', function(e) { cursor.style.left = e.clientX + 'px'; cursor.style.top = e.clientY + 'px'; // Add delay for follower cursor setTimeout(() => { cursorFollower.style.left = e.clientX + 'px'; cursorFollower.style.top = e.clientY + 'px'; }, 100); }); // Expand cursor when hovering over interactive elements const interactiveElements = document.querySelectorAll('.product, .cta-button, .logo'); interactiveElements.forEach(el => { el.addEventListener('mouseenter', () => { cursor.style.width = '10px'; cursor.style.height = '10px'; cursor.style.backgroundColor = 'var(--tertiary)'; cursorFollower.style.width = '50px'; cursorFollower.style.height = '50px'; cursorFollower.style.border = '1px solid var(--secondary)'; cursorFollower.style.backgroundColor = 'rgba(62, 240, 212, 0.1)'; }); el.addEventListener('mouseleave', () => { cursor.style.width = '20px'; cursor.style.height = '20px'; cursor.style.backgroundColor = 'var(--secondary)'; cursorFollower.style.width = '40px'; cursorFollower.style.height = '40px'; cursorFollower.style.border = '2px solid var(--tertiary)'; cursorFollower.style.backgroundColor = 'transparent'; }); }); // Add glitch effect on button click const ctaButtons = document.querySelectorAll('.cta-button'); ctaButtons.forEach(button => { button.addEventListener('click', function(e) { e.preventDefault(); // Find parent product const product = this.closest('.product'); const image = product.querySelector('.product-image'); // Create glitch effect image.style.filter = 'hue-rotate(90deg) contrast(1.5)'; product.style.transform = 'translateX(5px)'; // Return to normal after glitch setTimeout(() => { image.style.filter = 'none'; product.style.transform = 'translateX(-5px)'; setTimeout(() => { product.style.transform = 'translateX(0)'; }, 100); }, 200); // Change button text temporarily const originalText = this.textContent; this.textContent = "Added"; setTimeout(() => { this.textContent = originalText; }, 1500); }); }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Glitch Notifications</title> <style> :root { --primary: #6c5ce7; --secondary: #00cec9; --success: #00b894; --danger: #d63031; --warning: #fdcb6e; --info: #0984e3; --dark: #2d3436; --light: #dfe6e9; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; } body { background-color: #f9f9f9; display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; padding: 20px; overflow-x: hidden; } .container { width: 100%; max-width: 600px; display: flex; flex-direction: column; gap: 20px; } .header { text-align: center; margin-bottom: 20px; } .header h1 { font-size: 2.4rem; margin-bottom: 10px; color: var(--dark); position: relative; } .header h1::after { content: ""; position: absolute; bottom: -10px; left: 50%; transform: translateX(-50%); width: 80px; height: 4px; background: var(--primary); border-radius: 4px; } .header p { font-size: 1.1rem; color: #636e72; max-width: 80%; margin: 20px auto 0; } .notification-panel { background: white; border-radius: 12px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.05); padding: 25px; display: flex; flex-direction: column; gap: 15px; } .notification-panel h2 { font-size: 1.4rem; color: var(--dark); margin-bottom: 10px; } .notification-list { display: flex; flex-direction: column; gap: 10px; } .notification-item { display: flex; align-items: center; gap: 15px; padding: 15px; border-radius: 8px; background: #f7f7f7; transition: transform 0.2s ease; cursor: pointer; } .notification-item:hover { transform: translateX(5px); } .notification-icon { width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 1.2rem; color: white; } .notification-content { flex: 1; } .notification-title { font-weight: 600; color: var(--dark); margin-bottom: 3px; } .notification-description { font-size: 0.9rem; color: #636e72; } .notification-time { font-size: 0.8rem; color: #b2bec3; } .button-container { display: flex; gap: 15px; margin-top: 20px; justify-content: center; } .btn { padding: 12px 24px; border-radius: 8px; border: none; font-weight: 600; cursor: pointer; transition: all 0.2s ease; font-size: 1rem; display: flex; align-items: center; justify-content: center; gap: 8px; } .btn-primary { background: var(--primary); color: white; } .btn-primary:hover { background: #5849e6; transform: translateY(-2px); box-shadow: 0 5px 15px rgba(108, 92, 231, 0.2); } .btn-secondary { background: white; color: var(--dark); border: 1px solid #ddd; } .btn-secondary:hover { background: #f7f7f7; transform: translateY(-2px); } /* Modal Styles */ .modal-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); backdrop-filter: blur(3px); display: flex; align-items: center; justify-content: center; z-index: 100; opacity: 0; visibility: hidden; transition: opacity 0.3s ease, visibility 0.3s ease; } .modal-overlay.active { opacity: 1; visibility: visible; } .modal { width: 90%; max-width: 500px; background: white; border-radius: 16px; overflow: hidden; box-shadow: 0 15px 40px rgba(0, 0, 0, 0.15); opacity: 0; transform: translateY(30px); transition: opacity 0.4s ease, transform 0.4s ease; position: relative; z-index: 101; } .modal-overlay.active .modal { opacity: 1; transform: translateY(0); } .modal-header { padding: 20px 25px; background: var(--primary); color: white; position: relative; overflow: hidden; } .modal-header h3 { font-size: 1.5rem; margin-bottom: 5px; position: relative; z-index: 2; } .modal-header p { font-size: 0.95rem; opacity: 0.9; position: relative; z-index: 2; } .modal-body { padding: 25px; } .notification-settings { display: flex; flex-direction: column; gap: 15px; } .setting-row { display: flex; justify-content: space-between; align-items: center; padding: 12px 0; border-bottom: 1px solid #eee; } .setting-row:last-child { border-bottom: none; } .setting-label { font-weight: 500; color: var(--dark); } .setting-description { font-size: 0.85rem; color: #636e72; margin-top: 3px; max-width: 300px; } .toggle { position: relative; display: inline-block; width: 46px; height: 24px; } .toggle input { opacity: 0; width: 0; height: 0; } .toggle-slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; transition: .4s; border-radius: 24px; } .toggle-slider:before { position: absolute; content: ""; height: 18px; width: 18px; left: 3px; bottom: 3px; background-color: white; transition: .4s; border-radius: 50%; } input:checked + .toggle-slider { background-color: var(--primary); } input:checked + .toggle-slider:before { transform: translateX(22px); } .modal-footer { padding: 15px 25px; border-top: 1px solid #eee; display: flex; justify-content: flex-end; gap: 10px; } .close-modal { position: absolute; top: 18px; right: 20px; color: white; background: none; border: none; font-size: 1.5rem; cursor: pointer; z-index: 3; width: 30px; height: 30px; display: flex; align-items: center; justify-content: center; border-radius: 50%; transition: background 0.2s ease; } .close-modal:hover { background: rgba(255, 255, 255, 0.2); } /* Alert styles */ .alert-container { position: fixed; bottom: 30px; right: 30px; z-index: 999; display: flex; flex-direction: column; gap: 10px; width: 90%; max-width: 320px; pointer-events: none; } .alert { background: white; border-radius: 12px; padding: 16px; box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1); display: flex; align-items: center; gap: 15px; animation: slideIn 0.5s forwards, slideOut 0.5s forwards 4.5s; pointer-events: auto; position: relative; overflow: hidden; } .alert-icon { width: 35px; height: 35px; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; flex-shrink: 0; } .alert-content { flex: 1; } .alert-title { font-weight: 600; margin-bottom: 2px; color: var(--dark); } .alert-message { font-size: 0.9rem; color: #636e72; } .close-alert { background: none; border: none; font-size: 1.2rem; color: #b2bec3; cursor: pointer; padding: 3px; display: flex; align-items: center; justify-content: center; transition: color 0.2s ease; } .close-alert:hover { color: var(--dark); } /* Animation keyframes */ @keyframes slideIn { from { opacity: 0; transform: translateX(100%); } to { opacity: 1; transform: translateX(0); } } @keyframes slideOut { from { opacity: 1; transform: translateX(0); } to { opacity: 0; transform: translateX(100%); } } /* Glitch Effect */ .glitch-effect { position: relative; } .glitch-effect::before, .glitch-effect::after { content: attr(data-text); position: absolute; top: 0; left: 0; width: 100%; height: 100%; clip: rect(0, 0, 0, 0); } .glitch-effect::before { left: -2px; text-shadow: 1px 0 red; animation: glitch-anim-1 2s infinite linear alternate-reverse; } .glitch-effect::after { left: 2px; text-shadow: -1px 0 blue; animation: glitch-anim-2 3s infinite linear alternate-reverse; } .glitch-alert { position: relative; } .glitch-alert::before { content: ""; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.8) 50%, rgba(255, 255, 255, 0) 100%); transform: translateX(-100%); animation: scanline 2.5s ease-in-out infinite; z-index: 1; pointer-events: none; } @keyframes scanline { 0%, 100% { transform: translateX(-100%); } 50%, 70% { transform: translateX(100%); } } @keyframes glitch-anim-1 { 0%, 100% { clip: rect(0, 0, 0, 0); } 20% { clip: rect(0, 100%, 5px, 0); } 40% { clip: rect(0, 100%, 10px, 0); } 60% { clip: rect(0, 100%, 15px, 0); } } @keyframes glitch-anim-2 { 0%, 100% { clip: rect(0, 0, 0, 0); } 25% { clip: rect(0, 100%, 8px, 0); } 50% { clip: rect(0, 100%, 16px, 0); } 75% { clip: rect(0, 100%, 24px, 0); } } .rgb-border { position: relative; } .rgb-border::after { content: ''; position: absolute; top: -3px; left: -3px; right: -3px; bottom: -3px; z-index: -1; border-radius: 8px; background: linear-gradient(45deg, #f00, #0f0, #00f, #f00); background-size: 400%; animation: rgb-animate 3s linear infinite; opacity: 0; transition: opacity 0.3s ease; } .notification-item:hover .rgb-border::after { opacity: 1; } @keyframes rgb-animate { 0% { background-position: 0 0; } 50% { background-position: 300% 0; } 100% { background-position: 0 0; } } .modal-glitch { animation: modal-glitch 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94); } @keyframes modal-glitch { 0% { transform: translateX(0); } 20% { transform: translateX(-10px) skewX(5deg); } 40% { transform: translateX(10px) skewX(-5deg); } 60% { transform: translateX(-5px) skewX(2deg); } 80% { transform: translateX(5px) skewX(-2deg); } 100% { transform: translateX(0); } } .glitch-noise { position: absolute; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 1; opacity: 0; background-image: url('data:image/png;base64,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'); background-repeat: no-repeat; background-size: cover; } .active-glitch { animation: glitch-flash 0.3s steps(1, end) forwards; } @keyframes glitch-flash { 0%, 100% { opacity: 0; } 10%, 15%, 45%, 50%, 85%, 90% { opacity: 0.2; } 20%, 40%, 60%, 80% { opacity: 0.4; } 30%, 70% { opacity: 0.6; } } .new-indicator { display: inline-block; background: var(--danger); color: white; font-size: 0.75rem; padding: 2px 6px; border-radius: 10px; margin-left: 8px; font-weight: 700; } @media (max-width: 600px) { .header h1 { font-size: 1.8rem; } .header p { font-size: 0.95rem; } .button-container { flex-direction: column; } .button-container .btn { width: 100%; } .setting-description { max-width: 200px; } } </style> </head> <body> <div class="container"> <div class="header"> <h1 class="glitch-effect" data-text="Social Noise">Social Noise</h1> <p>Customize your social media experience with attention-grabbing notification styles and focused alerts.</p> </div> <div class="notification-panel"> <h2>Recent Notifications</h2> <div class="notification-list"> <div class="notification-item rgb-border" onclick="showAlert('Like Alert', 'Emma Davis liked your photo from last weekend.', 'var(--primary)')"> <div class="notification-icon" style="background-color: var(--primary)"> <i>♥</i> </div> <div class="notification-content"> <div class="notification-title">Emma Davis liked your photo <span class="new-indicator">NEW</span></div> <div class="notification-description">Your vacation photo received a new like</div> </div> <div class="notification-time">2m ago</div> </div> <div class="notification-item rgb-border" onclick="showAlert('Comment Alert', 'David Wilson commented on your latest post: \'This is fantastic work!\'', 'var(
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>GLITCHFOLIO | Digital Art Exploration</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Courier New', monospace; } body { background-color: #0f0f0f; color: #f0f0f0; overflow: hidden; width: 100%; height: 100%; position: relative; } .container { width: 100%; height: 700px; position: relative; overflow: hidden; } .slide { position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0; transition: opacity 0.3s ease-in-out; display: flex; flex-direction: column; justify-content: center; z-index: 1; } .slide.active { opacity: 1; z-index: 2; } .artwork { width: 100%; height: 75%; object-fit: contain; position: relative; z-index: 2; } .info { padding: 15px 20px; background-color: rgba(15, 15, 15, 0.7); backdrop-filter: blur(5px); position: absolute; bottom: 0; left: 0; width: 100%; z-index: 3; transform: translateY(100%); transition: transform 0.5s cubic-bezier(0.23, 1, 0.32, 1); } .slide.active .info { transform: translateY(0); } .title { font-size: 1.5rem; margin-bottom: 5px; font-weight: bold; color: #ff3e84; letter-spacing: 1px; } .description { font-size: 0.9rem; line-height: 1.4; color: rgba(240, 240, 240, 0.9); } .nav { position: absolute; top: 20px; right: 20px; z-index: 10; display: flex; gap: 10px; } .nav-btn { background: none; border: none; color: #f0f0f0; font-size: 24px; cursor: pointer; width: 40px; height: 40px; display: flex; align-items: center; justify-content: center; background-color: rgba(0, 0, 0, 0.4); border-radius: 50%; transition: all 0.3s ease; } .nav-btn:hover { background-color: #ff3e84; transform: scale(1.1); } .glitch-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 5; pointer-events: none; opacity: 0; mix-blend-mode: overlay; } canvas { width: 100%; height: 100%; } .logo { position: absolute; top: 20px; left: 20px; font-weight: bold; font-size: 18px; z-index: 10; text-transform: uppercase; letter-spacing: 2px; } .logo span { color: #ff3e84; } .dots { position: absolute; bottom: 120px; left: 50%; transform: translateX(-50%); display: flex; gap: 10px; z-index: 10; } .dot { width: 10px; height: 10px; border-radius: 50%; background-color: rgba(240, 240, 240, 0.3); cursor: pointer; transition: all 0.3s ease; } .dot.active { background-color: #ff3e84; transform: scale(1.2); } .metadata { position: absolute; left: 20px; bottom: 120px; font-size: 12px; z-index: 10; color: rgba(240, 240, 240, 0.6); display: flex; flex-direction: column; gap: 5px; } .metadata span { display: inline-block; margin-right: 5px; color: #ff3e84; } @media (max-width: 700px) { .title { font-size: 1.2rem; } .description { font-size: 0.8rem; } .metadata { bottom: 90px; font-size: 10px; } .dots { bottom: 90px; } } .cursor-follower { position: fixed; width: 20px; height: 20px; background-color: rgba(255, 62, 132, 0.5); border-radius: 50%; pointer-events: none; mix-blend-mode: difference; z-index: 9999; transition: transform 0.1s ease; } </style> </head> <body> <div class="cursor-follower"></div> <div class="container"> <div class="logo">Glitch<span>Folio</span></div> <div class="slide active"> <img src="https://source.unsplash.com/random/800x600/?digital-art-1" alt="Digital Fragmentation Series #1" class="artwork"> <div class="info"> <h2 class="title">Digital Fragmentation Series #1</h2> <p class="description">A study in broken pixels and data distortion. This piece explores the beauty in digital corruption, where imperfection becomes art. The structured chaos reveals patterns that wouldn't exist without technological intervention.</p> </div> <div class="metadata"> <p><span>Medium:</span> Digital / Mixed Media</p> <p><span>Year:</span> 2023</p> <p><span>Dimensions:</span> Variable</p> </div> </div> <div class="slide"> <img src="https://source.unsplash.com/random/800x600/?digital-art-2" alt="Analog Whispers" class="artwork"> <div class="info"> <h2 class="title">Analog Whispers</h2> <p class="description">This composition merges vintage signal disruption with contemporary design principles. The deliberate VHS-inspired artifacts create a nostalgic texture while forming a bridge between analog degradation and digital precision.</p> </div> <div class="metadata"> <p><span>Medium:</span> Digital / VHS Transfer</p> <p><span>Year:</span> 2023</p> <p><span>Dimensions:</span> Variable</p> </div> </div> <div class="slide"> <img src="https://source.unsplash.com/random/800x600/?digital-art-3" alt="Quantum Noise Study" class="artwork"> <div class="info"> <h2 class="title">Quantum Noise Study</h2> <p class="description">Exploring the intersection of quantum disturbance patterns and traditional composition. These deliberate artifacts represent a visual manifestation of uncertainty principles, where observation itself alters the outcome.</p> </div> <div class="metadata"> <p><span>Medium:</span> Digital / Algorithm-Driven</p> <p><span>Year:</span> 2023</p> <p><span>Dimensions:</span> Variable</p> </div> </div> <div class="slide"> <img src="https://source.unsplash.com/random/800x600/?digital-art-4" alt="Signal Interference" class="artwork"> <div class="info"> <h2 class="title">Signal Interference</h2> <p class="description">This piece visualizes data corruption as aesthetic expression. The systematic pixel shifts are choreographed to reveal emergent patterns while preserving the integrity of the underlying image composition.</p> </div> <div class="metadata"> <p><span>Medium:</span> Digital / Data Manipulation</p> <p><span>Year:</span> 2022</p> <p><span>Dimensions:</span> Variable</p> </div> </div> <div class="slide"> <img src="https://source.unsplash.com/random/800x600/?digital-art-5" alt="Memory Corruption" class="artwork"> <div class="info"> <h2 class="title">Memory Corruption</h2> <p class="description">An exploration of how digital memory degrades over time. The intentional buffer overflows and data leakage create visual metaphors for the impermanence of digital information storage systems.</p> </div> <div class="metadata"> <p><span>Medium:</span> Digital / Binary Manipulation</p> <p><span>Year:</span> 2022</p> <p><span>Dimensions:</span> Variable</p> </div> </div> <div class="nav"> <button class="nav-btn prev">←</button> <button class="nav-btn next">→</button> </div> <div class="dots"> <div class="dot active" data-index="0"></div> <div class="dot" data-index="1"></div> <div class="dot" data-index="2"></div> <div class="dot" data-index="3"></div> <div class="dot" data-index="4"></div> </div> <div class="glitch-overlay"> <canvas id="glitchCanvas"></canvas> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const slides = document.querySelectorAll('.slide'); const prevBtn = document.querySelector('.prev'); const nextBtn = document.querySelector('.next'); const dots = document.querySelectorAll('.dot'); const glitchOverlay = document.querySelector('.glitch-overlay'); const canvas = document.getElementById('glitchCanvas'); const ctx = canvas.getContext('2d'); const cursorFollower = document.querySelector('.cursor-follower'); let currentSlide = 0; let isTransitioning = false; // Set canvas size function resizeCanvas() { canvas.width = glitchOverlay.offsetWidth; canvas.height = glitchOverlay.offsetHeight; } resizeCanvas(); window.addEventListener('resize', resizeCanvas); // Cursor follower document.addEventListener('mousemove', (e) => { cursorFollower.style.transform = `translate(${e.clientX - 10}px, ${e.clientY - 10}px)`; }); // Glitch effect function function createGlitchEffect() { return new Promise((resolve) => { glitchOverlay.style.opacity = '1'; let frameCount = 0; const totalFrames = 15; function animate() { ctx.clearRect(0, 0, canvas.width, canvas.height); // Generate random glitch elements const sliceCount = Math.floor(Math.random() * 10) + 5; for (let i = 0; i < sliceCount; i++) { const y = Math.random() * canvas.height; const height = Math.random() * 20 + 5; const x = Math.random() * canvas.width; const width = Math.random() * canvas.width; ctx.fillStyle = `rgba(${Math.random() * 255}, ${Math.random() * 255}, ${Math.random() * 255}, ${Math.random() * 0.2 + 0.1})`; ctx.fillRect(x, y, width, height); } // RGB split for (let i = 0; i < 3; i++) { const y = Math.random() * canvas.height; const height = Math.random() * 40 + 10; ctx.fillStyle = i === 0 ? 'rgba(255,0,0,0.2)' : i === 1 ? 'rgba(0,255,0,0.2)' : 'rgba(0,0,255,0.2)'; ctx.fillRect(0, y, canvas.width, height); } // Noise for (let i = 0; i < 100; i++) { const x = Math.random() * canvas.width; const y = Math.random() * canvas.height; const size = Math.random() * 3 + 1; ctx.fillStyle = `rgba(255, 255, 255, ${Math.random() * 0.8 + 0.2})`; ctx.fillRect(x, y, size, size); } frameCount++; if (frameCount < totalFrames) { requestAnimationFrame(animate); } else { glitchOverlay.style.opacity = '0'; resolve(); } } animate(); }); } // Go to slide async function goToSlide(index) { if (isTransitioning || index === currentSlide) return; isTransitioning = true; // Reset current active classes slides[currentSlide].classList.remove('active'); dots[currentSlide].classList.remove('active'); // Apply glitch transition await createGlitchEffect(); // Update current slide currentSlide = index; // Set new active classes slides[currentSlide].classList.add('active'); dots[currentSlide].classList.add('active'); isTransitioning = false; } // Event listeners prevBtn.addEventListener('click', () => { const prevIndex = (currentSlide - 1 + slides.length) % slides.length; goToSlide(prevIndex); }); nextBtn.addEventListener('click', () => { const nextIndex = (currentSlide + 1) % slides.length; goToSlide(nextIndex); }); dots.forEach((dot) => { dot.addEventListener('click', () => { const index = parseInt(dot.getAttribute('data-index')); goToSlide(index); }); }); // Keyboard navigation document.addEventListener('keydown', (e) => { if (e.key === 'ArrowLeft') { const prevIndex = (currentSlide - 1 + slides.length) % slides.length; goToSlide(prevIndex); } else if (e.key === 'ArrowRight') { const nextIndex = (currentSlide + 1) % slides.length; goToSlide(nextIndex); } }); // Touch swipe let touchStartX = 0; let touchEndX = 0; document.addEventListener('touchstart', (e) => { touchStartX = e.changedTouches[0].screenX; }); document.addEventListener('touchend', (e) => { touchEndX = e.changedTouches[0].screenX; handleSwipe(); }); function handleSwipe() { if (touchEndX < touchStartX - 50) { // Swipe left const nextIndex = (currentSlide + 1) % slides.length; goToSlide(nextIndex); } else if (touchEndX > touchStartX + 50) { // Swipe right const prevIndex = (currentSlide - 1 + slides.length) % slides.length; goToSlide(prevIndex); } } // Hover effects on artwork slides.forEach((slide) => { const artwork = slide.querySelector('.artwork'); artwork.addEventListener('mousemove', (e) => { if (!isTransitioning) { const rect = artwork.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; // Small glitch on hover if (Math.random() > 0.95) { const distortion = Math.random() * 10 - 5; artwork.style.transform = `translateX(${distortion}px)`; setTimeout(() => { artwork.style.transform = 'translateX(0)'; }, 100); } } }); }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>CyberSentry Dashboard</title> <style> :root { --bg-dark: #131820; --panel-bg: #1c2430; --text-primary: #d8dde6; --text-secondary: #8b939e; --accent: #e6213c; --accent-glow: rgba(230, 33, 60, 0.3); --safe: #1dab65; --warning: #e6a821; --danger: #e6213c; --font-mono: 'JetBrains Mono', 'Consolas', monospace; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: var(--font-mono); } body { background-color: var(--bg-dark); color: var(--text-primary); display: flex; flex-direction: column; height: 100vh; width: 100%; overflow: hidden; padding: 15px; } .dashboard { display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: auto 1fr 1fr; gap: 12px; height: 100%; max-width: 700px; margin: 0 auto; width: 100%; } .header { grid-column: 1 / 3; display: flex; justify-content: space-between; align-items: center; padding: 10px 12px; background-color: var(--panel-bg); border-radius: 8px; border: 1px solid rgba(255, 255, 255, 0.05); box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); position: relative; overflow: hidden; } .logo { display: flex; align-items: center; gap: 10px; } .logo-icon { width: 32px; height: 32px; background-color: var(--accent); border-radius: 8px; display: flex; align-items: center; justify-content: center; font-weight: bold; font-size: 18px; position: relative; } .logo-icon::after { content: ''; position: absolute; width: 100%; height: 3px; background-color: rgba(255, 255, 255, 0.3); top: 50%; left: 0; transform: translateY(-50%); animation: scan 2s infinite; } @keyframes scan { 0% { top: 0; opacity: 0.7; } 50% { top: 100%; opacity: 0.3; } 100% { top: 0; opacity: 0.7; } } .logo-text { font-size: 18px; font-weight: bold; } .status { display: flex; align-items: center; gap: 8px; } .status-indicator { width: 12px; height: 12px; border-radius: 50%; background-color: var(--safe); } .status-text { font-size: 14px; } .panel { background-color: var(--panel-bg); border-radius: 8px; padding: 16px; display: flex; flex-direction: column; position: relative; overflow: hidden; border: 1px solid rgba(255, 255, 255, 0.05); box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); } .panel-title { font-size: 14px; color: var(--text-secondary); margin-bottom: 15px; display: flex; justify-content: space-between; align-items: center; } .alerts { overflow-y: auto; flex-grow: 1; } .alert { padding: 10px; margin-bottom: 8px; border-radius: 6px; background-color: rgba(255, 255, 255, 0.03); border-left: 3px solid; position: relative; overflow: hidden; cursor: pointer; transition: transform 0.2s ease, box-shadow 0.2s ease; } .alert:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); } .alert-high { border-left-color: var(--danger); } .alert-medium { border-left-color: var(--warning); } .alert-low { border-left-color: var(--text-secondary); } .alert-title { font-size: 13px; margin-bottom: 4px; font-weight: bold; display: flex; justify-content: space-between; } .alert-message { font-size: 12px; color: var(--text-secondary); } .alert-time { font-size: 11px; color: var(--text-secondary); } .network-graph, .system-stats { display: flex; flex-direction: column; height: 100%; } .graph-container, .stats-container { flex-grow: 1; position: relative; display: flex; flex-direction: column; justify-content: flex-end; } .graph { width: 100%; height: 80%; display: flex; align-items: flex-end; } .bar { flex: 1; margin: 0 2px; background-color: rgba(29, 171, 101, 0.3); border-top: 2px solid var(--safe); height: 20%; position: relative; transition: height 0.5s ease; } .glitch-effect { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.05), transparent); z-index: 1; transform: translateX(-100%); animation: none; } @keyframes glitch-slide { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } } @keyframes alert-glitch { 0% { clip-path: inset(40% 0 61% 0); transform: translate(-5px, 5px); } 20% { clip-path: inset(35% 0 66% 0); transform: translate(5px, -5px); } 40% { clip-path: inset(20% 0 81% 0); transform: translate(5px, 5px); } 60% { clip-path: inset(70% 0 31% 0); transform: translate(-5px, -5px); } 80% { clip-path: inset(50% 0 51% 0); transform: translate(0px, 5px); } 100% { clip-path: inset(40% 0 61% 0); transform: translate(-5px, 5px); } } .graph-labels { display: flex; justify-content: space-between; font-size: 11px; color: var(--text-secondary); margin-top: 8px; } .stat-card { background-color: rgba(255, 255, 255, 0.03); border-radius: 6px; padding: 12px; margin-bottom: 8px; display: flex; justify-content: space-between; align-items: center; } .stat-name { font-size: 13px; color: var(--text-secondary); } .stat-value { font-size: 14px; font-weight: bold; } .activity-log { overflow-y: auto; flex-grow: 1; } .activity { font-size: 12px; padding: 8px 0; border-bottom: 1px solid rgba(255, 255, 255, 0.05); display: flex; align-items: center; gap: 10px; } .activity-icon { width: 18px; height: 18px; display: flex; align-items: center; justify-content: center; border-radius: 50%; background-color: rgba(255, 255, 255, 0.1); font-size: 10px; } .activity-text { flex-grow: 1; } .activity-time { color: var(--text-secondary); font-size: 11px; } .under-attack { animation: redPulse 1.5s infinite; } @keyframes redPulse { 0% { background-color: var(--panel-bg); } 50% { background-color: rgba(230, 33, 60, 0.1); } 100% { background-color: var(--panel-bg); } } .alert-badge { padding: 2px 6px; border-radius: 10px; font-size: 10px; font-weight: bold; } .alert-badge-high { background-color: var(--danger); color: white; } .alert-badge-medium { background-color: var(--warning); color: #222; } .alert-badge-low { background-color: var(--text-secondary); color: #222; } .alert.glitching::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: inherit; z-index: -1; animation: alert-glitch 0.3s linear; } .scan-line { position: absolute; width: 100%; height: 1px; background-color: rgba(255, 255, 255, 0.15); z-index: 5; top: 0; animation: scanline 3s linear infinite; } @keyframes scanline { 0% { top: 0%; opacity: 0.1; } 50% { opacity: 0.3; } 100% { top: 100%; opacity: 0.1; } } .actions { display: flex; gap: 6px; margin-top: 10px; } .action-btn { background-color: rgba(255, 255, 255, 0.05); border: none; padding: 8px 10px; border-radius: 6px; color: var(--text-primary); font-size: 13px; cursor: pointer; transition: background-color 0.2s ease, transform 0.2s ease; flex: 1; } .action-btn:hover { background-color: rgba(255, 255, 255, 0.1); transform: translateY(-2px); } .action-btn-primary { background-color: var(--accent); color: white; } .action-btn-primary:hover { background-color: #d41e36; } .digital-time { font-size: 12px; color: var(--text-secondary); letter-spacing: 1px; } .critical-zone { position: absolute; top: 30%; left: 0; right: 0; height: 1px; border-top: 1px dashed var(--accent); opacity: 0.5; z-index: 1; } @media (max-width: 600px) { .dashboard { grid-template-columns: 1fr; grid-template-rows: auto auto 1fr 1fr; } .header { grid-column: 1; } } /* Glitch Text Effect */ .glitch-text { position: relative; } .glitch-text::before, .glitch-text::after { content: attr(data-text); position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: var(--panel-bg); } .glitch-text::before { left: 2px; text-shadow: -1px 0 red; animation: glitch-text-1 2s infinite linear alternate-reverse; } .glitch-text::after { left: -2px; text-shadow: 1px 0 blue; animation: glitch-text-2 3s infinite linear alternate-reverse; } @keyframes glitch-text-1 { 0% {clip: rect(44px, 450px, 56px, 0);} 5% {clip: rect(46px, 450px, 18px, 0);} 10% {clip: rect(70px, 450px, 95px, 0);} 15% {clip: rect(52px, 450px, 72px, 0);} 20% {clip: rect(12px, 450px, 61px, 0);} 25% {clip: rect(59px, 450px, 35px, 0);} 30% {clip: rect(1px, 450px, 71px, 0);} 35% {clip: rect(28px, 450px, 25px, 0);} 40% {clip: rect(15px, 450px, 50px, 0);} 45% {clip: rect(34px, 450px, 68px, 0);} 50% {clip: rect(82px, 450px, 31px, 0);} 55% {clip: rect(5px, 450px, 52px, 0);} 60% {clip: rect(15px, 450px, 28px, 0);} 65% {clip: rect(58px, 450px, 3px, 0);} 70% {clip: rect(24px, 450px, 70px, 0);} 75% {clip: rect(37px, 450px, 80px, 0);} 80% {clip: rect(71px, 450px, 22px, 0);} 85% {clip: rect(38px, 450px, 92px, 0);} 90% {clip: rect(40px, 450px, 74px, 0);} 95% {clip: rect(10px, 450px, 63px, 0);} 100% {clip: rect(87px, 450px, 12px, 0);} } @keyframes glitch-text-2 { 0% {clip: rect(65px, 450px, 91px, 0);} 5% {clip: rect(54px, 450px, 30px, 0);} 10% {clip: rect(8px, 450px, 65px, 0);} 15% {clip: rect(23px, 450px, 11px, 0);} 20% {clip: rect(18px, 450px, 81px, 0);} 25% {clip: rect(5px, 450px, 80px, 0);} 30% {clip: rect(16px, 450px, 21px, 0);} 35% {clip: rect(84px, 450px, 84px, 0);} 40% {clip: rect(46px, 450px, 15px, 0);} 45% {clip: rect(54px, 450px, 35px, 0);} 50% {clip: rect(92px, 450px, 64px, 0);} 55% {clip: rect(24px, 450px, 23px, 0);} 60% {clip: rect(23px, 450px, 69px, 0);} 65% {clip: rect(19px, 450px, 17px, 0);} 70% {clip: rect(87px, 450px, 89px, 0);} 75% {clip: rect(28px, 450px, 30px, 0);} 80% {clip: rect(53px, 450px, 35px, 0);} 85% {clip: rect(19px, 450px, 98px, 0);} 90% {clip: rect(68px, 450px, 54px, 0);} 95% {clip: rect(65px, 450px, 45px, 0);} 100% {clip: rect(94px, 450px, 88px, 0);} } </style> </head> <body> <div class="dashboard"> <div class="header"> <div class="logo"> <div class="logo-icon">CS</div> <div class="logo-text">CyberSentry</div> </div> <div class="status"> <div class="status-indicator" id="status-indicator"></div> <div class="status-text" id="status-text">System Secure</div> </div> <span class="digital-time" id="digital-time">00:00:00</span> <div class="scan-line"></div> </div> <div class="panel" id="alerts-panel"> <div class="panel-title"> <span>Active Threats</span> <span id="threat-count">0 alerts</span> </div> <div class="alerts" id="alerts-container"> <!-- Alerts will be dynamically generated --> </div> <div class="actions"> <button class="action-btn">Investigate All</button> <button class="action-btn action-btn-primary" id="isolate-btn">Isolate Threat</button> </div> </div> <div class="panel"> <div class="panel-title"> <span>Network Traffic</span> <span>Last 60 min</span> </div> <div class="network-graph"> <div class="graph-container"> <div class="critical-zone"></div> <div class="graph" id="network-graph"> <!-- Bars will be dynamically generated --> </div> <div class="glitch-effect"></div> </div> <div class="graph-labels"> <span>-60m</span> <span>-45m</span> <span>-30m</span> <span>-15m</span> <span>Now</span> </div> </div> </div> <div class="panel"> <div class="panel-title"> <span>System Metrics</span> <span>Real-time</span> </div> <div class="system-stats"> <div class="stats-container" id="system-stats"> <div class="stat-card"> <span class="stat-name">CPU Usage</span> <span class="stat-value" id="cpu-usage">24%</span> </div> <div class="stat-card"> <span class="stat-name">Memory</span> <span class="stat-value" id="memory-usage">3.2 GB / 16 GB</span> </div> <div class="stat-card"> <span class="stat-name">Disk I/O</span> <span class="stat-value" id="disk-io">12 MB/s</span> </div> <div class="stat-card"> <span class="stat-name">Network</span> <span class="stat-value" id="network-usage">4.5 Mbps</span> </div> </div> </div> </div> <div class="panel"> <div class="panel-title"> <span>Activity Log</span> <span>Today</span> </div> <div class="activity-log" id="activity-log"> <!-- Activities will be dynamically generated --> </div> </div> </div> <script> // Initialize variables let isUnderAttack = false; let glitchInterval; let networkBars = []; let alertCount = 0; // DOM Elements const statusIndicator = document.getElementById('status-indicator'); const statusText = document.getElementById('status-text'); const alertsContainer = document.getElementById('alerts-container'); const networkGraph = document.getElementById('network-graph'); const glitchEffect = document.querySelector('.glitch-effect'); const alertsPanel = document.getElementById('alerts-panel'); const threatCount = document.getElementById('threat-count'); const activityLog = document.getElementById('activity-log'); const isolateBtn = document.getElementById('isolate-btn'); const cpuUsage = document.getElementById('cpu-usage'); const memoryUsage = document.getElementById('memory-usage'); const diskIo = document.getElementById('disk-io'); const networkUsage = document.getElementById('network-usage'); const digitalTime = document.getElementById('digital-time'); // Initialize the dashboard function initDashboard() { createNetworkGraph(); updateTime(); setInterval(updateTime, 1000); // Generate initial activities addActivity('User authentication', 'success'); addActivity('Firewall rules updated', 'info'); addActivity('System scan completed', 'info'); // Update system metrics periodically updateSystemMetrics(); setInterval(updateSystemMetrics, 5000); // Every 15 seconds, decide if an attack should happen based on a random probability setInterval(() => { if (!isUnderAttack && Math.random() < 0.3) { simulateAttack(); } }, 15000); // Initialize with normal network traffic updateNetworkGraph(false); setInterval(() => updateNetworkGraph(isUnderAttack), 2000); // Add event listeners isolateBtn.addEventListener('click', isolateThreat); } // Create the network graph bars function createNetworkGraph() { for (let i = 0; i < 20; i++) { const bar = document.createElement('div'); bar.className = 'bar'; const height = Math.floor(10 + Math.random() * 40) + '%'; bar.style.height = height; networkGraph.appendChild(bar); networkBars.push(bar); } } // Update the network graph function updateNetworkGraph(isAttack) { for (let i = 0; i < networkBars.length - 1; i++) { networkBars[i].style.height = networkBars[i + 1].style.height; networkBars[i].style.backgroundColor = networkBars[i + 1].style.backgroundColor; networkBars[i].style.borderTopColor = networkBars[i + 1].style.borderTopColor; } // Update the last bar const lastIndex = networkBars.length - 1; let height; if (isAttack) { height = Math.floor(50 + Math.random() * 50) + '%'; if (Math.random() < 0.2) { height = '90%'; networkBars[lastIndex].style.backgroundColor = 'rgba(230, 33, 60, 0.3)'; networkBars[lastIndex].style.borderTopColor = 'var(--danger)'; triggerGlitchEffect(); } else { networkBars[lastIndex].style.backgroundColor = 'rgba(230, 165, 33, 0.3)'; networkBars[lastIndex].style.borderTopColor = 'var(--warning)'; } } else { height = Math.floor(10 + Math.random() * 40) + '%'; networkBars[lastIndex].style.backgroundColor = 'rgba(29, 171, 101, 0.3)'; networkBars[lastIndex].style.borderTopColor = 'var(--safe)'; } networkBars[lastIndex].style.height = height; } // Simulate an attack function simulateAttack() { isUnderAttack = true; // Update status statusIndicator.style.backgroundColor = 'var(--danger)'; statusText.textContent = 'UNDER ATTACK'; statusText.classList.add('glitch-text'); statusText.setAttribute('data-text', 'UNDER ATTACK'); alertsPanel.classList.add('under-attack'); // Add attack alerts const attacks = [ { title: 'Brute Force Attempt', message: 'Multiple failed login attempts detected from IP 198.51.100.234', severity: 'high' }, { title: 'Unusual Port Scanning', message: 'Sequential port scan detected from external source', severity: 'high' }, { title: 'Data Exfiltration', message: 'Abnormal outbound data transfer from server DB-03', severity: 'high' } ]; // Add a delay to make alerts appear one after another setTimeout(() => addAlert(attacks[0]), 500); setTimeout(() => addAlert(attacks[1]), 3500); setTimeout(() => addAlert(attacks[2]), 6500); // Add attack activities setTimeout(() => addActivity('Intrusion Detection System alert', 'danger'), 1000); setTimeout(() => addActivity('Suspicious IP blocked', 'warning'), 4000); setTimeout(() => addActivity('Firewall rules tightened', 'warning'), 7000); // Start glitch effects startGlitchEffects(); } // Add an alert to the alerts container function addAlert(alert) { const alertElement = document.createElement('div'); alertElement.className = `alert alert-${alert.severity}`; alertElement.innerHTML = ` <div class="alert-title"> ${alert.title} <span class="alert-badge alert-badge-${alert.severity}">${alert.severity.toUpperCase()}</span> </div> <div class="alert-message">${alert.message}</div> <div class="alert-time">Just now</div> `; alertElement.addEventListener('click', () => { alertElement.classList.add('glitching'); setTimeout(() => alertElement.classList.remove('glitching'), 300); }); alertsContainer.prepend(alertElement); alertCount++; threatCount.textContent = `${alertCount} alert${alertCount !== 1 ? 's' : ''}`; // Trigger glitch effect on the alert setTimeout(() => { alertElement.classList.add('glitching'); setTimeout(() => alertElement.classList.remove('glitching'), 300); }, 100); } // Add an activity to the activity log function addActivity(text, type) { const activityElement = document.createElement('div'); activityElement.className = 'activity'; let icon = '✓'; if (type === 'danger') icon = '!'; else if (type === 'warning') icon = '⚠'; else if (type === 'info') icon = 'i'; const now = new Date(); const time = `${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}`; activityElement.innerHTML = ` <div class="activity-icon">${icon}</div> <div class="activity-text">${text}</div> <div class="activity-time">${time}</div> `; activityLog.prepend(activityElement); // Keep only the latest 15 activities while (activityLog.children.length > 15) { activityLog.removeChild(activityLog.lastChild); } } // Start glitch effects function startGlitchEffects() { glitchInterval = setInterval(triggerGlitchEffect, 5000); } // Trigger a single glitch effect function triggerGlitchEffect() { glitchEffect.style.animation = 'glitch-slide 0.5s forwards'; setTimeout(() => { glitchEffect.style.animation = 'none'; glitchEffect.offsetHeight; // Force reflow // Randomly update system metrics with abnormal values if (Math.random() < 0.5) { cpuUsage.textContent = Math.floor(70 + Math.random() * 30) + '%'; cpuUsage.style.color = 'var(--danger)'; setTimeout(() => cpuUsage.style.color = '', 800); } if (Math.random() < 0.3) { const randomMem = (12 + Math.random() * 3.5).toFixed(1); memoryUsage.textContent = `${randomMem} GB / 16 GB`; memoryUsage.style.color = 'var(--warning)'; setTimeout(() => memoryUsage.style.color = '', 800); } if (Math.random() < 0.4) { diskIo.textContent = Math.floor(50 + Math.random() * 150) + ' MB/s'; diskIo.style.color = 'var(--danger)'; setTimeout(() => diskIo.style.color = '', 800); } if (Math.random() < 0.6) { networkUsage.textContent = Math.floor(30 + Math.random() * 80) + ' Mbps'; networkUsage.style.color = 'var(--danger)'; setTimeout(() => networkUsage.style.color = '', 800); } }, 500); } // Isolate the threat function isolateThreat() { isUnderAttack = false; // Update status statusIndicator.style.backgroundColor = 'var(--warning)'; statusText.textContent = 'Threat Contained'; statusText.classList.remove('glitch-text'); alertsPanel.classList.remove('under-attack'); // Clear glitch interval clearInterval(glitchInterval); // Add resolution activities addActivity('Network segment isolated', 'warning'); addActivity('Threat containment initiated', 'warning'); // After a delay, return to normal setTimeout(() => { statusIndicator.style.backgroundColor = 'var(--safe)'; statusText.textContent = 'System Secure'; addActivity('Security audit completed', 'success'); addActivity('System restored to secure state', 'success'); // Clear alerts alertsContainer.innerHTML = ''; alertCount = 0; threatCount.textContent = '0 alerts'; // Normalize system metrics updateSystemMetrics(); }, 5000); } // Update system metrics with normal values function updateSystemMetrics() { if (!isUnderAttack) { cpuUsage.textContent = Math.floor(15 + Math.random() * 15) + '%'; const randomMem = (2 + Math.random() * 2).toFixed(1); memoryUsage.textContent = `${randomMem} GB / 16 GB`; diskIo.textContent = Math.floor(5 + Math.random() * 15) + ' MB/s'; networkUsage.textContent = (1 + Math.random() * 5).toFixed(1) + ' Mbps'; } } // Update the digital time function updateTime() { const now = new Date(); const hours = now.getHours().toString().padStart(2, '0'); const minutes = now.getMinutes().toString().padStart(2, '0'); const seconds = now.getSeconds().toString().padStart(2, '0'); digitalTime.textContent = `${hours}:${minutes}:${seconds}`; } // Initialize the dashboard when the DOM is loaded document.addEventListener('DOMContentLoaded', initDashboard); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>NexusWave Conference</title> <style> :root { --primary: #6c5ce7; --secondary: #00cec9; --tertiary: #fd79a8; --dark: #2d3436; --light: #f9f9f9; --transition: all 0.3s ease; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { background-color: var(--dark); color: var(--light); overflow-x: hidden; width: 100%; height: 100vh; display: flex; flex-direction: column; align-items: center; justify-content: flex-start; } .container { width: 100%; max-width: 700px; height: 700px; padding: 20px; display: flex; flex-direction: column; position: relative; } .header { display: flex; justify-content: space-between; align-items: center; padding: 10px 0; border-bottom: 1px solid rgba(255, 255, 255, 0.1); margin-bottom: 20px; } .logo { font-size: 24px; font-weight: bold; color: var(--secondary); display: flex; align-items: center; } .logo span { margin-left: 10px; } .controls { display: flex; gap: 15px; } .control-btn { background: none; border: none; color: var(--light); font-size: 18px; cursor: pointer; transition: var(--transition); width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; } .control-btn:hover { background: rgba(255, 255, 255, 0.1); transform: scale(1.05); } .active { color: var(--secondary); } .video-grid { display: grid; grid-template-columns: repeat(2, 1fr); grid-gap: 15px; flex-grow: 1; margin-bottom: 20px; } .video-container { position: relative; border-radius: 12px; overflow: hidden; background-color: rgba(0, 0, 0, 0.3); aspect-ratio: 16/9; } .video-feed { width: 100%; height: 100%; object-fit: cover; transition: var(--transition); } .participant-info { position: absolute; bottom: 10px; left: 10px; background: rgba(0, 0, 0, 0.5); padding: 5px 10px; border-radius: 20px; font-size: 12px; display: flex; align-items: center; gap: 5px; } .status-indicator { width: 8px; height: 8px; border-radius: 50%; background-color: #2ecc71; } .poor-connection .status-indicator { background-color: #e74c3c; } .glitch-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0); mix-blend-mode: overlay; pointer-events: none; opacity: 0; z-index: 10; } .chat-box { height: 180px; background-color: rgba(255, 255, 255, 0.05); border-radius: 12px; padding: 15px; overflow-y: auto; margin-bottom: 10px; } .message { margin-bottom: 10px; display: flex; flex-direction: column; } .message-header { display: flex; align-items: center; gap: 8px; margin-bottom: 5px; } .message-sender { font-weight: bold; font-size: 14px; } .message-time { font-size: 11px; color: rgba(255, 255, 255, 0.5); } .message-content { font-size: 14px; line-height: 1.4; background-color: rgba(255, 255, 255, 0.1); padding: 8px 12px; border-radius: 8px; border-top-left-radius: 0; max-width: 85%; align-self: flex-start; } .message.self .message-content { background-color: var(--primary); align-self: flex-end; border-radius: 8px; border-top-right-radius: 0; } .message-input { display: flex; gap: 10px; } .message-input input { flex-grow: 1; background-color: rgba(255, 255, 255, 0.1); border: none; border-radius: 30px; padding: 12px 20px; color: var(--light); font-size: 14px; outline: none; transition: var(--transition); } .message-input input:focus { background-color: rgba(255, 255, 255, 0.15); } .send-btn { background-color: var(--secondary); border: none; border-radius: 50%; width: 42px; height: 42px; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: var(--transition); } .send-btn:hover { transform: scale(1.05); background-color: var(--primary); } .reconnecting-badge { position: absolute; top: 10px; left: 10px; background-color: rgba(0, 0, 0, 0.7); color: var(--tertiary); padding: 5px 10px; border-radius: 5px; font-size: 12px; display: flex; align-items: center; gap: 6px; opacity: 0; transition: opacity 0.3s ease; z-index: 20; } .reconnecting-badge .loading { width: 12px; height: 12px; border: 2px solid transparent; border-top-color: var(--tertiary); border-radius: 50%; animation: spin 1s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } .glitch-effect { animation: glitch 0.5s cubic-bezier(.25, .46, .45, .94) both; } @keyframes glitch { 0% { transform: translate(0); filter: brightness(1) contrast(1); } 10% { transform: translate(-2px, 2px); filter: brightness(1.5) contrast(1.8) hue-rotate(20deg); } 20% { transform: translate(2px, -2px); filter: brightness(0.8) contrast(1.5) saturate(1.5); } 30% { transform: translate(-1px, -1px); filter: brightness(1.2) contrast(0.8) hue-rotate(-30deg); } 40% { transform: translate(1px, 1px); filter: brightness(0.9) contrast(1.3) saturate(0.8); } 50% { transform: translate(-2px, -2px); filter: brightness(1.4) contrast(1.7) hue-rotate(10deg); } 60% { transform: translate(2px, 2px); filter: brightness(0.7) contrast(1.4) saturate(1.3); } 70% { transform: translate(0); filter: brightness(1) contrast(1); } 100% { transform: translate(0); filter: brightness(1) contrast(1); } } .scanlines { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: repeating-linear-gradient( 0deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0) 1px, rgba(0, 0, 0, 0.1) 1px, rgba(0, 0, 0, 0.1) 2px ); pointer-events: none; z-index: 15; opacity: 0; } .noise { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEXUlEQVR4nO2ZW4hVVRjHf+pMlzG18iK9lGUXuliYpRRez4RdqCioh8yXICUitHwoMoiEijB6yQdFkoiCIsWgl+yGhRWUZYr1kI5lNl5GMx0dZ9T5xX/wmxz22XvtM+ecPUf2Hw7DOt/6vv3fa6+91vftDcOb9aTBfuAcMKGJOQwbdgNlYGuTcwwLTitBHvRlVi1qOwr0A3cCk4AlwM/e+FsO/SuB34E2jd8K9AFbHDaJsxP4TVnfdjuTRVnXcjLQE+jbAswDFgIj5DNO45/rfj8RmK7vvcBlYGQG3cSZa2Y3XBmVBwjLFOiiMvf7u8S5Ux+XZNSPMR4o1WDfnxG5n8ooGZYTjJpqE5FDMVNtXZVyP1aaLFc4tGPl71TaPyg5DQcBTit5PQ6bmeaJnwNzTaLHzDL7C3gCuBlYDnSb5TRZfi3Ap8Aic+9NwAvAfx7btcDXwA3ALcCnxv5shfhjLmNdZgFOKpGTzJj9f1n3zyuwJcA4z1iXcpdCc7JAaU8cVSzA20DnIEcsdWbkO+AV4FH5fuKIpZTDdoHGXOzzqYTIQeB+L/lJZbgbKGSI05LR9ohj7KyeL9SJU8R1wK/ApR72KPH+NhZdwEfABNm0y/RJlxPFX8jO9VztlM+7wI0ZdYiVxAuW3AkwTcaHHHaXgVeBd/R7sux2Z4hRUuwikwuXU1RiKnAQuCrDKUrKGnpRgb0ErHDYjQGeBr7QHDwPnAPeA2YEclDPmZpJyHa9kRkxx/4qMCvlBH0GzE7YvYf/6Ao8pqzFSu4YM6tjFcNp4AXZTQeeBf50NpJJGHRkiFNS1oKOxzbbZsQmOKrFsQ0CrwMPa5QrMRF4HfiBesSc73aBR14DngJOBHza4z72Yc1KnzKwNyHAPl6dHZpE2y/02W2mQZTxbNf1rvZBLVq8Xvd7GbgeeFB+dwPLEr7fa/w/m3FWP5HNGGVgvWxWyj7LyFx1JLZfmq+kZOCRwD4vlWlfWoyz05mRLmWgZEhOylPAozUk8Sdl95gSuyvjrJyjRJQYbMa+VXN/WFuGVbrdF8ovlMRkfY1zAKwdWEgj5jGg3yjKXA0jXxqbjgAjX2/fEVjH2TokQPJErkDnlKQQKanLnwKMVNQ4lqmZ2jzkV+1T27W6eIqeClVCO8E+XTND5NeZcdrn9TlqfcvRXm1XIpNqJPFlcyLXkpmV8rHlf95x7+XT77FZV8vILB1pv1KSCnXqzrsTmVKDnr1qQmJKVY5CqnwMFLT9zlRDuqSZyR2JDKsi+0QikxpkJMYW8/xcrSPLq1zrLCQS0sqsq2XbluHl/4yZkbyTiJLJgUSW12GkQx3LYx5dfWIVxbOJrAh5//FEUrbJkY6sBWl14umMK4kP8vTn8aogpNt+2pxH8nAiK0JO+D4N6fZHgYJXeRaF3NiUyJiQE77eSZQYbKgzTckk4L9G52iY4AoIJbLW7lRa4QAAAABJRU5ErkJggg=='); background-size: 50px 50px; pointer-events: none; z-index: 15; opacity: 0; } .fullscreen-btn { position: absolute; top: 10px; right: 10px; background: rgba(0, 0, 0, 0.5); border: none; border-radius: 5px; width: 30px; height: 30px; display: flex; align-items: center; justify-content: center; cursor: pointer; z-index: 5; transition: var(--transition); } .fullscreen-btn:hover { background: rgba(0, 0, 0, 0.7); } .connection-indicator { position: absolute; top: 10px; right: 10px; background: rgba(0, 0, 0, 0.5); border: none; border-radius: 5px; padding: 5px 10px; font-size: 12px; display: flex; align-items: center; gap: 5px; z-index: 5; color: #2ecc71; } .connection-indicator.poor { color: #e74c3c; } .connection-indicator.medium { color: #f39c12; } .connection-bars { display: flex; gap: 2px; } .connection-bar { width: 3px; height: 10px; background-color: currentColor; border-radius: 1px; } .connection-bar:nth-child(2) { height: 7px; } .connection-bar:nth-child(1) { height: 4px; } .quality-btn { position: absolute; bottom: 10px; right: 10px; background: rgba(0, 0, 0, 0.5); border: none; border-radius: 5px; padding: 5px 8px; font-size: 12px; cursor: pointer; z-index: 5; transition: var(--transition); color: var(--light); } .quality-btn:hover { background: rgba(0, 0, 0, 0.7); } .chat-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; } .chat-title { font-size: 16px; font-weight: bold; } .main-video { grid-column: span 2; } .info-badge { position: fixed; top: 20px; left: 50%; transform: translateX(-50%); background-color: rgba(0, 0, 0, 0.7); color: var(--light); padding: 10px 20px; border-radius: 50px; font-size: 14px; display: flex; align-items: center; gap: 8px; z-index: 1000; opacity: 0; transition: opacity 0.3s ease; } @media (max-width: 600px) { .video-grid { grid-template-columns: 1fr; } .main-video { grid-column: span 1; } } </style> </head> <body> <div class="container"> <div class="header"> <div class="logo"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2ZM12 20C7.59 20 4 16.41 4 12C4 7.59 7.59 4 12 4C16.41 4 20 7.59 20 12C20 16.41 16.41 20 12 20ZM16.59 8.59L10 15.17L7.41 12.59L6 14L10 18L18 10L16.59 8.59Z" fill="#00cec9"/> </svg> <span>NexusWave</span> </div> <div class="controls"> <button class="control-btn active" title="Microphone"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12 14C13.66 14 14.99 12.66 14.99 11L15 5C15 3.34 13.66 2 12 2C10.34 2 9 3.34 9 5V11C9 12.66 10.34 14 12 14ZM17.3 11C17.3 14 14.76 16.1 12 16.1C9.24 16.1 6.7 14 6.7 11H5C5 14.41 7.72 17.23 11 17.72V21H13V17.72C16.28 17.24 19 14.42 19 11H17.3Z" fill="currentColor"/> </svg> </button> <button class="control-btn active" title="Camera"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M17 10.5V7C17 6.45 16.55 6 16 6H4C3.45 6 3 6.45 3 7V17C3 17.55 3.45 18 4 18H16C16.55 18 17 17.55 17 17V13.5L21 17.5V6.5L17 10.5Z" fill="currentColor"/> </svg> </button> <button class="control-btn" title="Share Screen"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M20 18C21.1 18 21.99 17.1 21.99 16L22 6C22 4.9 21.1 4 20 4H4C2.9 4 2 4.9 2 6V16C2 17.1 2.9 18 4 18H0V20H24V18H20ZM4 6H20V16H4V6Z" fill="currentColor"/> </svg> </button> <button class="control-btn" title="More Options"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12 8C13.1 8 14 7.1 14 6C14 4.9 13.1 4 12 4C10.9 4 10 4.9 10 6C10 7.1 10.9 8 12 8ZM12 10C10.9 10 10 10.9 10 12C10 13.1 10.9 14 12 14C13.1 14 14 13.1 14 12C14 10.9 13.1 10 12 10ZM12 16C10.9 16 10 16.9 10 18C10 19.1 10.9 20 12 20C13.1 20 14 19.1 14 18C14 16.9 13.1 16 12 16Z" fill="currentColor"/> </svg> </button> </div> </div> <div class="video-grid"> <div class="video-container main-video"> <img src="https://images.unsplash.com/photo-1629212947402-9d384455bcaa?q=80&w=2070&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="Video feed" class="video-feed"> <div class="participant-info"> <div class="status-indicator"></div> <span>You (Host)</span> </div> <div class="reconnecting-badge"> <div class="loading"></div> <span>Reconnecting...</span> </div> <div class="glitch-overlay"></div> <div class="scanlines"></div> <div class="noise"></div> <button class="fullscreen-btn"> <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M7 14H5V19H10V17H7V14ZM5 10H7V7H10V5H5V10ZM17 17H14V19H19V14H17V17ZM14 5V7H17V10H19V5H14Z" fill="white"/> </svg> </button> <div class="connection-indicator"> <div class="connection-bars"> <div class="connection-bar"></div> <div class="connection-bar"></div> <div class="connection-bar"></div> </div> <span>Excellent</span> </div> <button class="quality-btn">1080p</button> </div> <div class="video-container"> <img src="https://images.unsplash.com/photo-1607746882042-944635dfe10e?q=80&w=2070&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="Video feed" class="video-feed"> <div class="participant-info"> <div class="status-indicator"></div> <span>Alex Chen</span> </div> <div class="reconnecting-badge"> <div class="loading"></div> <span>Reconnecting...</span> </div> <div class="glitch-overlay"></div> <div class="scanlines"></div> <div class="noise"></div> <div class="connection-indicator medium"> <div class="connection-bars"> <div class="connection-bar"></div> <div class="connection-bar"></div> <div class="connection-bar"></div> </div> <span>Fair</span> </div> </div> <div class="video-container"> <img src="https://images.unsplash.com/photo-1557862921-37829c790f19?q=80&w=2071&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="Video feed" class="video-feed"> <div class="participant-info"> <div class="status-indicator"></div> <span>Sarah Johnson</span> </div> <div class="reconnecting-badge"> <div class="loading"></div> <span>Reconnecting...</span> </div> <div class="glitch-overlay"></div> <div class="scanlines"></div> <div class="noise"></div> <div class="connection-indicator poor"> <div class="connection-bars"> <div class="connection-bar"></div> <div class="connection-bar"></div> <div class="connection-bar"></div> </div> <span>Poor</span> </div> </div> </div> <div class="chat-section"> <div class="chat-header"> <div class="chat-title">Conference Chat</div> <span style="font-size: 12px; color: #aaa;">3 participants</span> </div> <div class="chat-box"> <div class="message"> <div class="message-header"> <span class="message-sender">System</span> <span class="message-time">11:30 AM</span> </div> <div class="message-content"> Welcome to NexusWave Conference. The glitch effects you may see indicate network fluctuations. </div> </div> <div class="message"> <div class="message-header"> <span class="message-sender">Alex Chen</span> <span class="message-time">11:32 AM</span> </div> <div class="message-content"> I'm experiencing some bandwidth issues from my end. The visual transition effects make it less distracting! </div> </div> <div class="message self"> <div class="message-header"> <span class="message-sender">You</span> <span class="message-time">11:33 AM</span> </div> <div class="message-content"> Yes, instead of freezing, the glitch effect makes transitions smoother between reconnections. </div> </div> <div class="message"> <div class="message-header"> <span class="message-sender">Sarah Johnson</span> <span class="message-time">11:35 AM</span> </div> <div class="message-content"> My connection keeps fluctuating. The visual indicators help me know when I'm about to drop. </div> </div> </div> <div class="message-input"> <input type="text" placeholder="Type a message..."> <button class="send-btn"> <svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M2.01 21L23 12L2.01 3L2 10L17 12L2 14L2.01 21Z" fill="#2d3436"/> </svg> </button> </div> </div> </div> <div class="info-badge"> <svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2ZM12 20C7.59 20 4 16.41 4 12C4 7.59 7.59 4 12 4C16.41 4 20 7.59 20 12C20 16.41 16.41 20 12 20ZM11 17H13V15H11V17ZM11 7H13V13H11V7Z" fill="white"/> </svg> <span id="info-text">Network fluctuation detected</span> </div> <script> document.addEventListener('DOMContentLoaded', function() { const videoContainers = document.querySelectorAll('.video-container'); const qualityButtons = document.querySelectorAll('.quality-btn'); const connectionIndicators = document.querySelectorAll('.connection-indicator'); const infoBadge = document.querySelector('.info-badge'); const infoText = document.getElementById('info-text'); const messageInput = document.querySelector('.message-input input'); const sendButton = document.querySelector('.send-btn'); const chatBox = document.querySelector('.chat-box'); // Function to show info badge with custom message function showInfoBadge(message, duration = 3000) { infoText.textContent = message; infoBadge.style.opacity = 1; setTimeout(() => { infoBadge.style.opacity = 0; }, duration); } // Function to simulate connection issues on a random video feed function simulateConnectionIssue() { if (Math.random() < 0.7) { // 70% chance of triggering const randomIndex = Math.floor(Math.random() * videoContainers.length); const targetContainer = videoContainers[randomIndex]; const videoFeed = targetContainer.querySelector('.video-feed'); const glitchOverlay = targetContainer.querySelector('.glitch-overlay'); const scanlines = targetContainer.querySelector('.scanlines'); const noise = targetContainer.querySelector('.noise'); const reconnectingBadge = targetContainer.querySelector('.reconnecting-badge'); const connectionIndicator = targetContainer.querySelector('.connection-indicator'); // Apply glitch effects videoFeed.classList.add('glitch-effect'); glitchOverlay.style.opacity = 0.4; scanlines.style.opacity = 0.3; noise.style.opacity = 0.3; reconnectingBadge.style.opacity = 1; if (connectionIndicator) { connectionIndicator.classList.add('poor'); connectionIndicator.innerHTML = ` <div class="connection-bars"> <div class="connection-bar"></div> <div class="connection-bar"></div> <div class="connection-bar"></div> </div> <span>Poor</span> `; } // Show info badge const participantName = targetContainer.querySelector('.participant-info span').textContent; showInfoBadge(`Network fluctuation detected for ${participantName}`); // Remove effects after a random duration (1-3 seconds) const duration = 1000 + Math.random() * 2000; setTimeout(() => { videoFeed.classList.remove('glitch-effect'); // Gradually fade out effects const fadeInterval = setInterval(() => { glitchOverlay.style.opacity = parseFloat(glitchOverlay.style.opacity) - 0.1; scanlines.style.opacity = parseFloat(scanlines.style.opacity) - 0.1; noise.style.opacity = parseFloat(noise.style.opacity) - 0.1; if (parseFloat(glitchOverlay.style.opacity) <= 0) { clearInterval(fadeInterval); reconnectingBadge.style.opacity = 0; // Restore connection indicator if (connectionIndicator) { const quality = Math.random(); if (quality > 0.7) { connectionIndicator.classList.remove('poor', 'medium'); connectionIndicator.innerHTML = ` <div class="connection-bars"> <div class="connection-bar"></div> <div class="connection-bar"></div> <div class="connection-bar"></div> </div> <span>Excellent</span> `; } else if (quality > 0.4) { connectionIndicator.classList.remove('poor'); connectionIndicator.classList.add('medium'); connectionIndicator.innerHTML = ` <div class="connection-bars"> <div class="connection-bar"></div> <div class="connection-bar"></div> <div class="connection-bar"></div> </div> <span>Fair</span> `; } } showInfoBadge(`${participantName} reconnected successfully`); } }, 100); }, duration); } } // Simulate connection issues periodically setInterval(simulateConnectionIssue, 5000); // Handle quality button clicks qualityButtons.forEach(button => { button.addEventListener('click', function() { const qualities = ['480p', '720p', '1080p']; const currentIndex = qualities.indexOf(this.textContent); const nextIndex = (currentIndex + 1) % qualities.length; this.textContent = qualities[nextIndex]; showInfoBadge(`Video quality changed to ${qualities[nextIndex]}`); }); }); // Handle send button click and enter key for chat function sendMessage() { const message = messageInput.value.trim(); if (message) { const now = new Date(); const timeStr = now.getHours() + ':' + (now.getMinutes() < 10 ? '0' : '') + now.getMinutes(); const messageHTML = ` <div class="message self"> <div class="message-header"> <span class="message-sender">You</span> <span class="message-time">${timeStr}</span> </div> <div class="message-content"> ${message} </div> </div> `; chatBox.innerHTML += messageHTML; messageInput.value = ''; chatBox.scrollTop = chatBox.scrollHeight; } } sendButton.addEventListener('click', sendMessage); messageInput.addEventListener('keypress', function(e) { if (e.key === 'Enter') { sendMessage(); } }); // Handle control buttons const controlButtons = document.querySelectorAll('.
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Glitch Magazine</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Helvetica Neue', Arial, sans-serif; overflow: hidden; width: 100%; height: 100vh; background-color: #f8f8f8; color: #222; } .magazine-container { width: 100%; height: 100%; position: relative; overflow: hidden; } .page { position: absolute; width: 100%; height: 100%; transition: transform 0.5s ease; display: flex; flex-direction: column; padding: 2rem; background-color: #fff; overflow-y: auto; transform: translateX(100%); opacity: 0; } .page.active { transform: translateX(0); opacity: 1; z-index: 2; } .page.prev { transform: translateX(-100%); opacity: 0; } .page-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.5rem; padding-bottom: 0.5rem; border-bottom: 1px solid #e2e2e2; } .page-header h1 { font-size: 1.8rem; font-weight: 800; letter-spacing: -0.5px; } .page-number { font-size: 0.8rem; color: #888; font-weight: 600; letter-spacing: 1px; } .article-title { font-size: 2.5rem; line-height: 1.1; margin-bottom: 1rem; font-weight: 800; letter-spacing: -1px; } .article-subtitle { font-size: 1.2rem; color: #555; margin-bottom: 2rem; font-weight: 400; line-height: 1.4; } .article-image { width: 100%; height: 250px; object-fit: cover; margin-bottom: 2rem; border-radius: 3px; } .article-content { font-size: 1rem; line-height: 1.6; margin-bottom: 1.5rem; } .article-content p { margin-bottom: 1.2rem; } .pull-quote { font-size: 1.4rem; font-weight: 600; color: #333; border-left: 3px solid #5c67ff; padding-left: 1rem; margin: 2rem 0; line-height: 1.4; } .nav-buttons { position: fixed; bottom: 2rem; right: 2rem; display: flex; gap: 0.5rem; z-index: 100; } .nav-button { padding: 0.5rem 1rem; background: rgba(0, 0, 0, 0.7); color: white; border: none; border-radius: 3px; cursor: pointer; font-weight: 600; transition: all 0.3s ease; } .nav-button:hover { background: rgba(0, 0, 0, 0.9); } .toc { list-style: none; margin-top: 2rem; } .toc-item { padding: 1rem; border-bottom: 1px solid #eee; cursor: pointer; transition: all 0.3s ease; display: flex; justify-content: space-between; align-items: center; } .toc-item:hover { background-color: #f5f5f5; transform: translateX(5px); } .toc-title { font-weight: 600; font-size: 1.1rem; } .toc-description { font-size: 0.9rem; color: #666; margin-top: 0.3rem; } .toc-page { color: #999; font-size: 0.8rem; font-weight: 600; } /* Glitch Effect */ .glitch-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 1000; pointer-events: none; opacity: 0; background: transparent; } .glitch-line { position: absolute; height: 1px; width: 100%; background-color: rgba(255, 255, 255, 0.8); left: 0; transform: scaleX(0); transform-origin: left center; } .glitch-pixel { position: absolute; width: 5px; height: 5px; background-color: #5c67ff; opacity: 0; border-radius: 1px; } .magazine-logo { font-weight: 800; letter-spacing: -1px; font-size: 1.2rem; color: #333; display: flex; align-items: center; } .magazine-logo:before { content: "//"; color: #5c67ff; margin-right: 5px; font-weight: 600; } .byline { font-size: 0.9rem; color: #777; margin-bottom: 2rem; font-style: italic; } @media (max-width: 700px) { .article-title { font-size: 2rem; } .pull-quote { font-size: 1.2rem; } .page { padding: 1.5rem; } } .header-issue { color: #5c67ff; font-size: 0.8rem; letter-spacing: 1px; text-transform: uppercase; font-weight: 700; } .column-layout { column-count: 2; column-gap: 2rem; } @media (max-width: 600px) { .column-layout { column-count: 1; } } /* Additional design elements */ .highlight { color: #5c67ff; font-weight: 600; } .color-block { background-color: #f2f3ff; padding: 1.5rem; border-radius: 3px; margin: 1.5rem 0; } .footer { margin-top: 2rem; padding-top: 1rem; border-top: 1px solid #eee; font-size: 0.8rem; color: #999; } .tab-indicator { position: fixed; top: 50%; right: 10px; transform: translateY(-50%); display: flex; flex-direction: column; gap: 10px; z-index: 100; } .tab { width: 10px; height: 10px; border-radius: 50%; background-color: #ddd; cursor: pointer; transition: all 0.3s ease; } .tab.active { background-color: #5c67ff; transform: scale(1.2); } </style> </head> <body> <div class="magazine-container"> <!-- Cover Page --> <div class="page active" id="page0"> <div class="page-header"> <div class="header-issue">Issue 06 / Spring 2024</div> <div class="magazine-logo">GLITCH</div> </div> <h1 class="article-title" style="font-size: 3.5rem; margin-top: 4rem;">The Digital Divide</h1> <p class="article-subtitle" style="font-size: 1.5rem;">Exploring the intersection of technology, design, and human experience in the meta-digital age</p> <div style="margin-top: 3rem; display: flex; justify-content: space-between; align-items: flex-end;"> <div> <p style="font-size: 0.9rem; color: #666; margin-bottom: 0.5rem;">FEATURING</p> <p style="font-weight: 600; margin-bottom: 0.3rem;">The Aesthetics of Digital Disruption</p> <p style="font-weight: 600; margin-bottom: 0.3rem;">Pixel Reality: The New Frontier</p> <p style="font-weight: 600;">Interface Evolution Through Noise</p> </div> <div class="page-number">001</div> </div> <div class="nav-buttons"> <button class="nav-button next-btn">Next Page</button> </div> </div> <!-- Table of Contents --> <div class="page" id="page1"> <div class="page-header"> <div class="magazine-logo">GLITCH</div> <div class="page-number">002</div> </div> <h2 class="article-title" style="font-size: 2rem;">Contents</h2> <ul class="toc"> <li class="toc-item" data-page="2"> <div> <div class="toc-title">The Aesthetics of Digital Disruption</div> <div class="toc-description">How glitch art is reshaping digital interfaces</div> </div> <div class="toc-page">003</div> </li> <li class="toc-item" data-page="3"> <div> <div class="toc-title">Pixel Reality: The New Frontier</div> <div class="toc-description">Embracing imperfection in digital design</div> </div> <div class="toc-page">005</div> </li> <li class="toc-item" data-page="4"> <div> <div class="toc-title">Interface Evolution Through Noise</div> <div class="toc-description">When errors become features in UX design</div> </div> <div class="toc-page">007</div> </li> </ul> <div class="footer"> © 2024 GLITCH Magazine. All articles represent the intersection of digital design, technology, and contemporary culture. </div> <div class="nav-buttons"> <button class="nav-button prev-btn">Previous</button> <button class="nav-button next-btn">Next</button> </div> </div> <!-- Article 1 --> <div class="page" id="page2"> <div class="page-header"> <div class="magazine-logo">GLITCH</div> <div class="page-number">003</div> </div> <h2 class="article-title">The Aesthetics of Digital Disruption</h2> <p class="article-subtitle">How deliberate errors and distortion are reshaping our visual language</p> <p class="byline">By Aiko Nakamura, Digital Art Theorist</p> <img class="article-image" src="https://images.unsplash.com/photo-1550745165-9bc0b252726f?ixlib=rb-1.2.1&auto=format&fit=crop&w=1350&q=80" alt="Digital glitch art representation"> <div class="column-layout"> <p class="article-content"> In an era obsessed with perfection, the rise of <span class="highlight">digital glitch aesthetics</span> represents a compelling countermovement. Editorial designers are increasingly incorporating pixel scatter, RGB shifts, and horizontal distortions not as errors to be fixed, but as deliberate stylistic choices that add depth and intrigue to digital experiences. </p> <p class="article-content"> The horizontally distorted line—a classic glitch artifact—has evolved from being a mark of technical failure to a sophisticated transitional element. When a reader flips from one article to the next, these horizontal distortions create a momentary disruption that signals change, mimicking the physical act of turning a page while embracing the unique capabilities of digital media. </p> <div class="pull-quote"> "The glitch is not a mistake, but a new form of digital expression that acknowledges the medium's inherent qualities rather than trying to hide them." </div> <p class="article-content"> This aesthetic choice reflects a more profound cultural shift: the acceptance that digital experiences have their own materiality, limitations, and expressive potential. The deliberate integration of digital artifacts acknowledges the screen as a medium with unique properties, rather than just a transparent vessel for content. </p> <p class="article-content"> For magazine designers specifically, the challenge lies in balancing disruption with legibility. The most successful implementations use glitch effects as transitional moments—creating visual interest during page turns without compromising the reading experience when users are engaged with content. </p> </div> <div class="nav-buttons"> <button class="nav-button prev-btn">Previous</button> <button class="nav-button next-btn">Next</button> </div> </div> <!-- Article 2 --> <div class="page" id="page3"> <div class="page-header"> <div class="magazine-logo">GLITCH</div> <div class="page-number">005</div> </div> <h2 class="article-title">Pixel Reality: The New Frontier</h2> <p class="article-subtitle">How pixel scattering creates dynamic dimensions in digital magazines</p> <p class="byline">By Marcus Chen, UX Researcher</p> <img class="article-image" src="https://images.unsplash.com/photo-1518770660439-4636190af475?ixlib=rb-1.2.1&auto=format&fit=crop&w=1350&q=80" alt="Scattered pixel visualization"> <div class="color-block"> <h3 style="margin-bottom: 1rem; font-size: 1.1rem;">Key Elements of Pixel Scattering in Digital Layouts</h3> <p>• Controlled randomness that creates visual interest without chaos</p> <p>• Targeted application during transitions for context-appropriate effects</p> <p>• Retention of content integrity while transforming the container</p> <p>• Subtle animation curves that feel responsive to user interaction</p> </div> <p class="article-content"> Pixel scattering—the deliberate fragmentation and reassembly of digital elements—serves a dual purpose in modern magazine layouts. First, it creates a momentary sense of <span class="highlight">transformation and dynamism</span> that static layouts can't achieve. Second, it subtly reminds readers of the constructed nature of digital media, fostering a more engaged and critical relationship with content. </p> <p class="article-content"> When implemented during page transitions, these effects create a brief moment where the magazine acknowledges its digital nature before resolving back into a clean, readable format. This momentary break in the illusion serves as a mental palate cleanser between articles. </p> <div class="pull-quote"> "The scattered pixel doesn't destroy information—it transforms how we perceive the container of that information, making us more aware of the medium itself." </div> <p class="article-content"> Unlike early glitch aesthetics that often prioritized visual disruption over usability, today's implementations are more nuanced, appearing precisely when readers are between engagements with content. This contextual awareness marks the maturation of glitch from experimental technique to sophisticated design language. </p> <div class="nav-buttons"> <button class="nav-button prev-btn">Previous</button> <button class="nav-button next-btn">Next</button> </div> </div> <!-- Article 3 --> <div class="page" id="page4"> <div class="page-header"> <div class="magazine-logo">GLITCH</div> <div class="page-number">007</div> </div> <h2 class="article-title">Interface Evolution Through Noise</h2> <p class="article-subtitle">When distortion becomes a feature, not a bug</p> <p class="byline">By Eliza Wright, Digital Publishing Strategist</p> <img class="article-image" src="https://images.unsplash.com/photo-1515879218367-8466d910aaa4?ixlib=rb-1.2.1&auto=format&fit=crop&w=1350&q=80" alt="Abstract digital interface with glitch elements"> <p class="article-content"> The integration of horizontal distortion lines during page transitions isn't merely aesthetic—it serves crucial functional purposes in digital reading experiences. These momentary visual disruptions provide tactile feedback in an otherwise intangible medium, creating what UX researchers call <span class="highlight">"digital tactility"</span>—sensory cues that replace the physical feedback of traditional media. </p> <p class="article-content"> Magazines pioneering this approach report increased reader engagement and longer session times. The brief moments of visual interest during transitions create micro-breaks that prevent the cognitive fatigue associated with seamless scrolling interfaces, effectively mimicking the natural pauses that occur when reading physical media. </p> <div class="pull-quote"> "The glitch transition serves as a digital page turn—a moment of pause and reset that helps readers mentally organize content into discrete sections." </div> <p class="article-content"> From an implementation perspective, these effects require careful calibration. The distortion must be pronounced enough to register as intentional but brief enough not to interrupt the flow of reading. The most successful examples use horizontal lines that move at varying speeds and opacities, creating a cascade effect that feels responsive to the reader's action. </p> <p class="article-content"> As digital publishing continues to mature, we're seeing these techniques adopted beyond experimental publications into mainstream media. What began as avant-garde design is becoming a standard tool for creating distinctive, memorable reading experiences that acknowledge the digital context without being defined by its limitations. </p> <div class="nav-buttons"> <button class="nav-button prev-btn">Previous</button> </div> </div> <!-- Glitch Effect Overlay --> <div class="glitch-overlay" id="glitchOverlay"></div> <!-- Page Indicator --> <div class="tab-indicator" id="tabIndicator"></div> </div> <script> document.addEventListener('DOMContentLoaded', () => { const pages = document.querySelectorAll('.page'); const nextButtons = document.querySelectorAll('.next-btn'); const prevButtons = document.querySelectorAll('.prev-btn'); const tocItems = document.querySelectorAll('.toc-item'); const glitchOverlay = document.getElementById('glitchOverlay'); const tabIndicator = document.getElementById('tabIndicator'); let currentPage = 0; // Create tab indicators pages.forEach((_, index) => { const tab = document.createElement('div'); tab.classList.add('tab'); if (index === currentPage) tab.classList.add('active'); tab.dataset.page = index; tab.addEventListener('click', () => { if (index !== currentPage) { navigateToPage(index); } }); tabIndicator.appendChild(tab); }); // Event Listeners nextButtons.forEach(btn => { btn.addEventListener('click', () => { if (currentPage < pages.length - 1) { navigateToPage(currentPage + 1); } }); }); prevButtons.forEach(btn => { btn.addEventListener('click', () => { if (currentPage > 0) { navigateToPage(currentPage - 1); } }); }); tocItems.forEach(item => { item.addEventListener('click', () => { const targetPage = parseInt(item.dataset.page); navigateToPage(targetPage); }); }); // Navigation with glitch effect function navigateToPage(targetPage) { if (targetPage === currentPage) return; // Direction of transition const direction = targetPage > currentPage ? 1 : -1; // Apply glitch effect createGlitchEffect(direction); // Update page classes after a short delay setTimeout(() => { pages[currentPage].classList.remove('active'); pages[currentPage].classList.add(direction > 0 ? 'prev' : ''); pages[targetPage].classList.add('active'); pages[targetPage].classList.remove('prev'); // Update tab indicators document.querySelectorAll('.tab').forEach((tab, index) => { if (index === targetPage) { tab.classList.add('active'); } else { tab.classList.remove('active'); } }); currentPage = targetPage; }, 200); } // Create glitch effect function createGlitchEffect(direction) { // Clear previous glitch elements glitchOverlay.innerHTML = ''; glitchOverlay.style.opacity = 1; // Create horizontal lines const lineCount = 15; for (let i = 0; i < lineCount; i++) { const line = document.createElement('div'); line.classList.add('glitch-line'); const yPos = Math.random() * 100; const thickness = Math.random() * 3 + 1; const delay = Math.random() * 100; const duration = Math.random() * 200 + 200; line.style.top = `${yPos}%`; line.style.height = `${thickness}px`; line.style.transition = `transform ${duration}ms cubic-bezier(0.2, 0.8, 0.2, 1) ${delay}ms`; line.style.backgroundColor = Math.random() > 0.7 ? '#5c67ff' : 'rgba(255, 255, 255, 0.8)'; glitchOverlay.appendChild(line); // Trigger animation setTimeout(() => { line.style.transform = `scaleX(1) translateX(${direction > 0 ? '' : '-'}100%)`; }, 10); } // Create scattered pixels const pixelCount = 30; for (let i = 0; i < pixelCount; i++) { const pixel = document.createElement('div'); pixel.classList.add('glitch-pixel'); const size = Math.random() * 10 + 2; const xPos = Math.random() * 100; const yPos = Math.random() * 100; const delay = Math.random() * 200; const duration = Math.random() * 400 + 200; pixel.style.width = `${size}px`; pixel.style.height = `${size}px`; pixel.style.left = `${xPos}%`; pixel.style.top = `${yPos}%`; pixel.style.backgroundColor = Math.random() > 0.5 ? '#5c67ff' : '#ff5c5c'; pixel.style.transition = `opacity ${duration}ms ease ${delay}ms, transform ${duration}ms cubic-bezier(0.1, 0.9, 0.2, 1) ${delay}ms`; glitchOverlay.appendChild(pixel); // Trigger animation setTimeout(() => { pixel.style.opacity = 0.7; pixel.style.transform = `translate(${(Math.random() - 0.5) * 100}px, ${(Math.random() - 0.5) * 100}px)`; }, 10); // Fade out setTimeout(() => { pixel.style.opacity = 0; }, delay + duration - 100); } // Hide overlay after effect completes setTimeout(() => { glitchOverlay.style.opacity = 0; }, 500); } }); </script> </body> </html>