Exploring the world of cubes can be both fascinating and educational. From simple geometric shapes to complex structures, cubes offer a variety of applications and insights.
In this article, we will delve into 10 intriguing examples of cubes. Each example highlights unique characteristics and uses, showcasing the versatility of this fundamental shape.
CODE1
Here's the code:
CODETEXT1
CODE2
Here's the code:
CODETEXT2
CODE3
Here's the code:
CODETEXT3
CODE4
Here's the code:
CODETEXT4
CODE5
Here's the code:
CODETEXT5
Designers and developers love Subframe for its drag-and-drop interface and intuitive, responsive canvas. Create pixel-perfect UI effortlessly, ensuring every detail is just right.
Join the community of satisfied users and bring your cube designs to life. 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 cubes, in minutes. Our drag-and-drop editor ensures efficiency and precision.
Don't wait to bring your ideas to life. Start for free and begin designing immediately!
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>NeoRealm Gaming Dashboard</title> <style> @import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@400;500;700;900&family=Rajdhani:wght@300;400;500;600;700&display=swap'); :root { --neon-purple: #b829f7; --neon-blue: #2962ff; --neon-green: #39ff14; --neon-pink: #ff2975; --neon-yellow: #fffc00; --dark-bg: #0a0b15; --dark-panel: #141528; --cube-size: 140px; --glow-strength: 5px; } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Rajdhani', sans-serif; background-color: var(--dark-bg); color: white; min-height: 100vh; overflow: hidden; display: flex; justify-content: center; align-items: center; perspective: 1200px; } .dashboard-container { width: 100%; max-width: 700px; height: 700px; padding: 20px; display: flex; flex-direction: column; overflow: hidden; position: relative; } .grid-pattern { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-image: linear-gradient(rgba(41, 98, 255, 0.1) 1px, transparent 1px), linear-gradient(90deg, rgba(41, 98, 255, 0.1) 1px, transparent 1px); background-size: 20px 20px; z-index: -1; } .dashboard-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; } .dashboard-title { font-family: 'Orbitron', sans-serif; font-weight: 900; font-size: 2rem; color: white; text-shadow: 0 0 15px var(--neon-blue); letter-spacing: 2px; animation: pulseText 3s infinite alternate; } .player-profile { display: flex; align-items: center; gap: 10px; } .player-avatar { width: 40px; height: 40px; border-radius: 50%; background: linear-gradient(135deg, var(--neon-purple), var(--neon-blue)); position: relative; overflow: hidden; display: flex; justify-content: center; align-items: center; box-shadow: 0 0 var(--glow-strength) var(--neon-blue); } .player-avatar::after { content: "NG"; font-weight: bold; font-size: 16px; } .player-info { font-size: 0.9rem; } .player-name { font-weight: bold; color: var(--neon-yellow); } .player-level { color: var(--neon-green); } .cube-grid { display: flex; justify-content: space-around; align-items: center; flex-wrap: wrap; gap: 30px; margin-top: 30px; flex: 1; } .cube-wrapper { position: relative; width: var(--cube-size); height: var(--cube-size); perspective: 800px; } .cube { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transform: rotateX(0) rotateY(0); transition: transform 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275); } .cube-face { position: absolute; width: 100%; height: 100%; display: flex; flex-direction: column; justify-content: center; align-items: center; text-align: center; padding: 15px; backface-visibility: hidden; border-radius: 10px; background: var(--dark-panel); box-shadow: inset 0 0 15px rgba(255, 255, 255, 0.1); overflow: hidden; transition: all 0.3s ease; } .cube-face::before { content: ''; position: absolute; top: -2px; left: -2px; right: -2px; bottom: -2px; z-index: -1; border-radius: 12px; } /* Position the faces */ .cube-face-front { transform: translateZ(calc(var(--cube-size) / 2)); } .cube-face-back { transform: rotateY(180deg) translateZ(calc(var(--cube-size) / 2)); } .cube-face-right { transform: rotateY(90deg) translateZ(calc(var(--cube-size) / 2)); } .cube-face-left { transform: rotateY(-90deg) translateZ(calc(var(--cube-size) / 2)); } .cube-face-top { transform: rotateX(90deg) translateZ(calc(var(--cube-size) / 2)); } .cube-face-bottom { transform: rotateX(-90deg) translateZ(calc(var(--cube-size) / 2)); } /* Cube specific styles */ .cube-stats::before { background: linear-gradient(45deg, var(--neon-blue), transparent); box-shadow: 0 0 var(--glow-strength) var(--neon-blue); } .cube-achievements::before { background: linear-gradient(45deg, var(--neon-green), transparent); box-shadow: 0 0 var(--glow-strength) var(--neon-green); } .cube-rewards::before { background: linear-gradient(45deg, var(--neon-purple), transparent); box-shadow: 0 0 var(--glow-strength) var(--neon-purple); } .cube-challenges::before { background: linear-gradient(45deg, var(--neon-pink), transparent); box-shadow: 0 0 var(--glow-strength) var(--neon-pink); } .cube-icon { font-size: 1.5rem; margin-bottom: 8px; color: white; text-shadow: 0 0 10px currentColor; } .cube-title { font-family: 'Orbitron', sans-serif; font-weight: 700; font-size: 1rem; color: white; margin-bottom: 5px; text-transform: uppercase; letter-spacing: 1px; } .cube-stats .cube-icon, .cube-stats .value { color: var(--neon-blue); } .cube-achievements .cube-icon, .cube-achievements .value { color: var(--neon-green); } .cube-rewards .cube-icon, .cube-rewards .value { color: var(--neon-purple); } .cube-challenges .cube-icon, .cube-challenges .value { color: var(--neon-pink); } .cube-description { font-size: 0.85rem; opacity: 0.8; margin-bottom: 10px; } .value { font-size: 1.5rem; font-weight: bold; margin: 5px 0; } .progress-bar { width: 90%; height: 8px; background-color: rgba(255, 255, 255, 0.1); border-radius: 10px; margin: 5px 0; overflow: hidden; } .progress-fill { height: 100%; border-radius: 10px; transition: width 1s cubic-bezier(0.22, 1, 0.36, 1); } .cube-stats .progress-fill { background-color: var(--neon-blue); box-shadow: 0 0 8px var(--neon-blue); } .cube-achievements .progress-fill { background-color: var(--neon-green); box-shadow: 0 0 8px var(--neon-green); } .cube-rewards .progress-fill { background-color: var(--neon-purple); box-shadow: 0 0 8px var(--neon-purple); } .cube-challenges .progress-fill { background-color: var(--neon-pink); box-shadow: 0 0 8px var(--neon-pink); } .bottom-panel { display: flex; justify-content: space-between; align-items: center; margin-top: 30px; background: rgba(20, 21, 40, 0.5); padding: 15px; border-radius: 10px; position: relative; overflow: hidden; } .bottom-panel::before { content: ''; position: absolute; top: -2px; left: -2px; right: -2px; bottom: -2px; background: linear-gradient(90deg, var(--neon-blue), var(--neon-purple), var(--neon-pink)); z-index: -1; border-radius: 12px; animation: borderGlow 3s infinite linear; } .current-game { display: flex; align-items: center; gap: 10px; } .game-icon { width: 40px; height: 40px; background: rgba(255, 255, 255, 0.1); border-radius: 8px; display: flex; justify-content: center; align-items: center; font-size: 20px; } .game-info h3 { font-size: 1rem; font-weight: 600; color: white; } .game-info p { font-size: 0.8rem; opacity: 0.7; } .quick-actions { display: flex; gap: 10px; } .action-btn { background: none; border: none; color: white; font-family: 'Rajdhani', sans-serif; font-size: 0.9rem; cursor: pointer; padding: 8px 15px; border-radius: 5px; transition: all 0.3s ease; position: relative; overflow: hidden; z-index: 1; } .action-btn::before { content: ''; position: absolute; top: 0; left: -10px; width: 0; height: 100%; background: rgba(255, 255, 255, 0.1); transform: skewX(-15deg); transition: all 0.3s ease; z-index: -1; } .action-btn:hover::before { width: 120%; } .play-btn { background: var(--neon-green); color: black; font-weight: bold; box-shadow: 0 0 10px var(--neon-green); } .play-btn:hover { background: color-mix(in srgb, var(--neon-green) 80%, white); transform: translateY(-2px); box-shadow: 0 0 15px var(--neon-green); } /* Hover effect for cubes */ .cube-wrapper:hover .cube { animation: cubeHover 1s infinite alternate ease-in-out; } @keyframes cubeHover { 0% { transform: translateY(0) rotateX(5deg) rotateY(5deg); } 100% { transform: translateY(-10px) rotateX(-5deg) rotateY(-5deg); } } @keyframes pulseText { 0% { text-shadow: 0 0 10px var(--neon-blue); } 100% { text-shadow: 0 0 20px var(--neon-blue), 0 0 30px var(--neon-blue); } } @keyframes borderGlow { 0% { background-position: 0% 50%; } 100% { background-position: 300% 50%; } } /* Responsive styles */ @media (max-width: 700px) { :root { --cube-size: 120px; } .dashboard-title { font-size: 1.5rem; } .cube-grid { gap: 15px; } .bottom-panel { flex-direction: column; gap: 15px; align-items: flex-start; } .quick-actions { width: 100%; justify-content: space-between; } } @media (max-width: 500px) { :root { --cube-size: 100px; } .cube-grid { gap: 10px; } .dashboard-title { font-size: 1.2rem; } .cube-description { display: none; } } </style> </head> <body> <div class="dashboard-container"> <div class="grid-pattern"></div> <div class="dashboard-header"> <h1 class="dashboard-title">NEOREALM</h1> <div class="player-profile"> <div class="player-avatar"></div> <div class="player-info"> <div class="player-name">CyberSlayer92</div> <div class="player-level">Level 42</div> </div> </div> </div> <div class="cube-grid"> <!-- Stats Cube --> <div class="cube-wrapper"> <div class="cube cube-stats" data-cube="stats"> <div class="cube-face cube-face-front"> <div class="cube-icon">📊</div> <div class="cube-title">Player Stats</div> <div class="cube-description">Performance metrics</div> <div class="value">87.3</div> <div class="progress-bar"> <div class="progress-fill" style="width: 87.3%"></div> </div> </div> <div class="cube-face cube-face-back"> <div class="cube-title">K/D Ratio</div> <div class="value">2.8</div> <div class="cube-description">Top 12% of players</div> </div> <div class="cube-face cube-face-right"> <div class="cube-title">Win Rate</div> <div class="value">61%</div> <div class="cube-description">Last 50 matches</div> </div> <div class="cube-face cube-face-left"> <div class="cube-title">Accuracy</div> <div class="value">72%</div> <div class="cube-description">Headshot: 28%</div> </div> <div class="cube-face cube-face-top"> <div class="cube-title">Play Time</div> <div class="value">183h</div> <div class="cube-description">This season</div> </div> <div class="cube-face cube-face-bottom"> <div class="cube-title">XP Rate</div> <div class="value">+15%</div> <div class="cube-description">Premium boost active</div> </div> </div> </div> <!-- Achievements Cube --> <div class="cube-wrapper"> <div class="cube cube-achievements" data-cube="achievements"> <div class="cube-face cube-face-front"> <div class="cube-icon">🏆</div> <div class="cube-title">Achievements</div> <div class="cube-description">Milestones collected</div> <div class="value">42/75</div> <div class="progress-bar"> <div class="progress-fill" style="width: 56%"></div> </div> </div> <div class="cube-face cube-face-back"> <div class="cube-title">Latest</div> <div class="value">Sniper Elite</div> <div class="cube-description">10 long-range eliminations</div> </div> <div class="cube-face cube-face-right"> <div class="cube-title">Rare</div> <div class="value">8/14</div> <div class="cube-description">Rare achievements unlocked</div> </div> <div class="cube-face cube-face-left"> <div class="cube-title">Secret</div> <div class="value">3/9</div> <div class="cube-description">Hidden achievements found</div> </div> <div class="cube-face cube-face-top"> <div class="cube-title">Next</div> <div class="value">Squad Leader</div> <div class="cube-description">Win 5 matches as team captain</div> </div> <div class="cube-face cube-face-bottom"> <div class="cube-title">Ranking</div> <div class="value">Top 7%</div> <div class="cube-description">Achievement hunter status</div> </div> </div> </div> <!-- Rewards Cube --> <div class="cube-wrapper"> <div class="cube cube-rewards" data-cube="rewards"> <div class="cube-face cube-face-front"> <div class="cube-icon">💎</div> <div class="cube-title">Rewards</div> <div class="cube-description">Claim your bonuses</div> <div class="value">3 Unclaimed</div> <div class="progress-bar"> <div class="progress-fill" style="width: 100%"></div> </div> </div> <div class="cube-face cube-face-back"> <div class="cube-title">Battle Pass</div> <div class="value">Tier 64</div> <div class="cube-description">16 tiers until legendary skin</div> </div> <div class="cube-face cube-face-right"> <div class="cube-title">Currency</div> <div class="value">4,850</div> <div class="cube-description">NeoCredits available</div> </div> <div class="cube-face cube-face-left"> <div class="cube-title">Daily</div> <div class="value">2/3</div> <div class="cube-description">Daily missions completed</div> </div> <div class="cube-face cube-face-top"> <div class="cube-title">Loot Boxes</div> <div class="value">5</div> <div class="cube-description">Ready to open</div> </div> <div class="cube-face cube-face-bottom"> <div class="cube-title">Next Reward</div> <div class="value">23m 41s</div> <div class="cube-description">Time until next drop</div> </div> </div> </div> <!-- Challenges Cube --> <div class="cube-wrapper"> <div class="cube cube-challenges" data-cube="challenges"> <div class="cube-face cube-face-front"> <div class="cube-icon">🔥</div> <div class="cube-title">Challenges</div> <div class="cube-description">Active missions</div> <div class="value">7 Active</div> <div class="progress-bar"> <div class="progress-fill" style="width: 70%"></div> </div> </div> <div class="cube-face cube-face-back"> <div class="cube-title">Weekly</div> <div class="value">4/8</div> <div class="cube-description">Weekly challenges complete</div> </div> <div class="cube-face cube-face-right"> <div class="cube-title">Featured</div> <div class="value">Apex Hunter</div> <div class="cube-description">Win in 3 different zones</div> </div> <div class="cube-face cube-face-left"> <div class="cube-title">Ranked</div> <div class="value">Diamond II</div> <div class="cube-description">75 RP until Diamond I</div> </div> <div class="cube-face cube-face-top"> <div class="cube-title">Community</div> <div class="value">38%</div> <div class="cube-description">Global event progress</div> </div> <div class="cube-face cube-face-bottom"> <div class="cube-title">Seasonal</div> <div class="value">13/25</div> <div class="cube-description">Season challenges completed</div> </div> </div> </div> </div> <div class="bottom-panel"> <div class="current-game"> <div class="game-icon">🎮</div> <div class="game-info"> <h3>Quantum Breach</h3> <p>Last played 1h ago • 23 friends online</p> </div> </div> <div class="quick-actions"> <button class="action-btn">Inventory</button> <button class="action-btn">Friends</button> <button class="action-btn play-btn">PLAY NOW</button> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const cubes = document.querySelectorAll('.cube'); // Initial staggered animation of cubes cubes.forEach((cube, index) => { setTimeout(() => { cube.style.transform = 'rotateX(10deg) rotateY(10deg)'; }, index * 200); }); // Add interactivity to each cube cubes.forEach(cube => { const faces = ['front', 'back', 'right', 'left', 'top', 'bottom']; let currentFace = 0; cube.addEventListener('click', function() { currentFace = (currentFace + 1) % faces.length; updateCubeRotation(cube, faces[currentFace]); }); // Periodically rotate the cube let rotationInterval; cube.addEventListener('mouseenter', function() { clearInterval(rotationInterval); // Reset to default hover animation cube.style.animation = 'cubeHover 1s infinite alternate ease-in-out'; }); cube.addEventListener('mouseleave', function() { // Start auto-rotation after mouse leaves rotationInterval = setInterval(() => { currentFace = (currentFace + 1) % faces.length; updateCubeRotation(cube, faces[currentFace]); }, 4000); // Trigger first rotation setTimeout(() => { currentFace = (currentFace + 1) % faces.length; updateCubeRotation(cube, faces[currentFace]); }, 1000); }); // Trigger mouseleave to start the auto-rotation setTimeout(() => { const event = new Event('mouseleave'); cube.dispatchEvent(event); }, 2000); }); // Function to update cube rotation based on face function updateCubeRotation(cube, face) { cube.style.animation = 'none'; switch(face) { case 'front': cube.style.transform = 'rotateX(0deg) rotateY(0deg)'; break; case 'back': cube.style.transform = 'rotateX(0deg) rotateY(180deg)'; break; case 'right': cube.style.transform = 'rotateX(0deg) rotateY(90deg)'; break; case 'left': cube.style.transform = 'rotateX(0deg) rotateY(-90deg)'; break; case 'top': cube.style.transform = 'rotateX(90deg) rotateY(0deg)'; break; case 'bottom': cube.style.transform = 'rotateX(-90deg) rotateY(0deg)'; break; } } // Animate progress bars const progressBars = document.querySelectorAll('.progress-fill'); progressBars.forEach(bar => { const targetWidth = bar.style.width; bar.style.width = '0'; setTimeout(() => { bar.style.width = targetWidth; }, 500); }); // Play button effect const playButton = document.querySelector('.play-btn'); playButton.addEventListener('click', function(e) { e.preventDefault(); this.style.transform = 'scale(0.95)'; // Create ripple effect const ripple = document.createElement('span'); ripple.style.position = 'absolute'; ripple.style.borderRadius = '50%'; ripple.style.backgroundColor = 'rgba(255, 255, 255, 0.7)'; ripple.style.transform = 'scale(0)'; ripple.style.animation = 'ripple 0.8s linear'; ripple.style.pointerEvents = 'none'; // Set position const rect = this.getBoundingClientRect(); const offsetX = e.clientX - rect.left; const offsetY = e.clientY - rect.top; ripple.style.width = `${Math.max(rect.width, rect.height) * 2}px`; ripple.style.height = `${Math.max(rect.width, rect.height) * 2}px`; ripple.style.left = `${offsetX - (Math.max(rect.width, rect.height))}px`; ripple.style.top = `${offsetY - (Math.max(rect.width, rect.height))}px`; this.appendChild(ripple); setTimeout(() => { this.style.transform = 'translateY(-2px)'; ripple.remove(); }, 800); }); // Add keyframes for ripple animation const style = document.createElement('style'); style.textContent = ` @keyframes ripple { 0% { transform: scale(0); opacity: 1; } 100% { transform: scale(1); opacity: 0; } } `; document.head.appendChild(style); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>3D Business Analytics Cubes</title> <style> :root { --primary: #2A3D45; --secondary: #5C7B93; --accent1: #D0E0EB; --accent2: #E7F2F8; --accent3: #94B0C3; --text: #333333; --bg: #F5F7FA; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; } body { background-color: var(--bg); color: var(--text); display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 700px; width: 100%; padding: 20px; overflow-x: hidden; } .container { max-width: 660px; width: 100%; margin: 0 auto; } header { text-align: center; margin-bottom: 30px; } h1 { font-size: 28px; font-weight: 700; margin-bottom: 10px; color: var(--primary); letter-spacing: -0.02em; } p.subtitle { font-size: 16px; color: var(--secondary); line-height: 1.5; max-width: 600px; margin: 0 auto; } .dashboard { display: flex; flex-wrap: wrap; justify-content: center; gap: 25px; perspective: 1000px; margin-bottom: 30px; } .cube-container { width: 180px; height: 180px; position: relative; perspective: 800px; margin-bottom: 20px; } .cube { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 1s ease; cursor: pointer; } .cube-face { position: absolute; width: 100%; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 15px; backface-visibility: visible; border-radius: 8px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); text-align: center; transition: all 0.3s ease; } .front { transform: translateZ(90px); background-color: var(--accent2); } .back { transform: rotateY(180deg) translateZ(90px); background-color: var(--accent3); } .right { transform: rotateY(90deg) translateZ(90px); background-color: var(--accent2); } .left { transform: rotateY(-90deg) translateZ(90px); background-color: var(--accent3); } .top { transform: rotateX(90deg) translateZ(90px); background-color: var(--accent2); } .bottom { transform: rotateX(-90deg) translateZ(90px); background-color: var(--accent3); } .metric-title { font-size: 14px; font-weight: 600; margin-bottom: 10px; color: var(--primary); } .metric-value { font-size: 28px; font-weight: 700; margin-bottom: 5px; color: var(--primary); } .metric-trend { font-size: 12px; display: flex; align-items: center; gap: 3px; } .trend-up { color: #28a745; } .trend-down { color: #dc3545; } .metric-icon { font-size: 20px; margin-bottom: 12px; color: var(--secondary); } .controls { display: flex; flex-wrap: wrap; justify-content: center; gap: 12px; margin-bottom: 15px; } button { padding: 8px 16px; background-color: var(--accent1); border: none; border-radius: 6px; color: var(--primary); font-weight: 500; cursor: pointer; transition: all 0.2s ease; font-size: 14px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } button:hover { background-color: var(--accent3); transform: translateY(-2px); } button.active { background-color: var(--secondary); color: white; } .time-range { display: flex; justify-content: center; margin-bottom: 25px; } .time-range span { padding: 6px 12px; font-size: 13px; cursor: pointer; color: var(--secondary); border-radius: 4px; transition: all 0.2s ease; } .time-range span.active { background-color: var(--accent1); color: var(--primary); font-weight: 500; } .time-range span:hover { background-color: var(--accent2); } .info-text { font-size: 13px; color: var(--secondary); text-align: center; margin-top: 20px; max-width: 500px; line-height: 1.5; } .cube:hover { transform: scale(1.05); } @media (max-width: 650px) { .dashboard { gap: 15px; } .cube-container { width: 140px; height: 140px; } .front, .back, .right, .left, .top, .bottom { transform-origin: center; transform: translateZ(70px); } .back { transform: rotateY(180deg) translateZ(70px); } .right { transform: rotateY(90deg) translateZ(70px); } .left { transform: rotateY(-90deg) translateZ(70px); } .top { transform: rotateX(90deg) translateZ(70px); } .bottom { transform: rotateX(-90deg) translateZ(70px); } .metric-title { font-size: 12px; } .metric-value { font-size: 22px; } } @keyframes pulse { 0% { opacity: 1; } 50% { opacity: 0.7; } 100% { opacity: 1; } } .pulse { animation: pulse 2s infinite; } .cube-face .chart { width: 80px; height: 40px; margin-top: 5px; display: flex; align-items: flex-end; } .cube-face .chart .bar { flex: 1; margin: 0 1px; background-color: var(--secondary); border-radius: 2px 2px 0 0; } </style> </head> <body> <div class="container"> <header> <h1>KPI Analytics Dashboard</h1> <p class="subtitle">Interactive 3D data visualization showcasing your key business metrics and revenue streams with real-time updates.</p> </header> <div class="time-range"> <span class="active">Q2 2023</span> <span>Q1 2023</span> <span>2022</span> <span>YTD</span> </div> <div class="controls"> <button class="active" data-view="revenue">Revenue Metrics</button> <button data-view="performance">Performance KPIs</button> <button data-view="operations">Operations</button> <button data-view="custom">Custom View</button> </div> <div class="dashboard"> <!-- Cube 1: Revenue --> <div class="cube-container"> <div class="cube" id="cube1"> <div class="cube-face front"> <div class="metric-icon">📈</div> <div class="metric-title">Quarterly Revenue</div> <div class="metric-value">$4.7M</div> <div class="metric-trend trend-up">+12.4% YoY</div> </div> <div class="cube-face back"> <div class="metric-icon">💰</div> <div class="metric-title">Net Profit Margin</div> <div class="metric-value">23.6%</div> <div class="metric-trend trend-up">+3.2% QoQ</div> </div> <div class="cube-face right"> <div class="metric-icon">🔄</div> <div class="metric-title">Recurring Revenue</div> <div class="metric-value">$2.9M</div> <div class="metric-trend trend-up">+18.7% YoY</div> </div> <div class="cube-face left"> <div class="metric-icon">📱</div> <div class="metric-title">Digital Sales</div> <div class="metric-value">$1.8M</div> <div class="metric-trend trend-up">+27.3% YoY</div> </div> <div class="cube-face top"> <div class="metric-icon">🌱</div> <div class="metric-title">New Initiatives</div> <div class="metric-value">$0.6M</div> <div class="metric-trend">New Stream</div> </div> <div class="cube-face bottom"> <div class="metric-icon">🏢</div> <div class="metric-title">Enterprise Sales</div> <div class="metric-value">$2.3M</div> <div class="metric-trend trend-up">+8.5% YoY</div> </div> </div> </div> <!-- Cube 2: Customer Metrics --> <div class="cube-container"> <div class="cube" id="cube2"> <div class="cube-face front"> <div class="metric-icon">👥</div> <div class="metric-title">Customer Base</div> <div class="metric-value">14,872</div> <div class="metric-trend trend-up">+9.3% QoQ</div> </div> <div class="cube-face back"> <div class="metric-icon">💎</div> <div class="metric-title">Customer LTV</div> <div class="metric-value">$4,283</div> <div class="metric-trend trend-up">+7.1% YoY</div> </div> <div class="cube-face right"> <div class="metric-icon">🔁</div> <div class="metric-title">Retention Rate</div> <div class="metric-value">87.2%</div> <div class="metric-trend trend-up">+2.8% QoQ</div> </div> <div class="cube-face left"> <div class="metric-icon">💫</div> <div class="metric-title">NPS Score</div> <div class="metric-value">72</div> <div class="metric-trend trend-up">+5 points</div> </div> <div class="cube-face top"> <div class="metric-icon">⚡</div> <div class="metric-title">Conversion Rate</div> <div class="metric-value">4.8%</div> <div class="metric-trend trend-up">+0.6% QoQ</div> </div> <div class="cube-face bottom"> <div class="metric-icon">💸</div> <div class="metric-title">CAC</div> <div class="metric-value">$285</div> <div class="metric-trend trend-down">-12.3% YoY</div> </div> </div> </div> <!-- Cube 3: Performance --> <div class="cube-container"> <div class="cube" id="cube3"> <div class="cube-face front"> <div class="metric-icon">⏱️</div> <div class="metric-title">Avg. Resolution Time</div> <div class="metric-value">3.2h</div> <div class="metric-trend trend-down">-14.8% YoY</div> <div class="chart"> <div class="bar" style="height: 60%;"></div> <div class="bar" style="height: 40%;"></div> <div class="bar" style="height: 75%;"></div> <div class="bar" style="height: 30%;"></div> <div class="bar" style="height: 50%;"></div> </div> </div> <div class="cube-face back"> <div class="metric-icon">🎯</div> <div class="metric-title">Task Completion</div> <div class="metric-value">94.3%</div> <div class="metric-trend trend-up">+3.7% QoQ</div> <div class="chart"> <div class="bar" style="height: 80%;"></div> <div class="bar" style="height: 95%;"></div> <div class="bar" style="height: 85%;"></div> <div class="bar" style="height: 90%;"></div> <div class="bar" style="height: 94%;"></div> </div> </div> <div class="cube-face right"> <div class="metric-icon">🚀</div> <div class="metric-title">Team Productivity</div> <div class="metric-value">108%</div> <div class="metric-trend trend-up">+6.2% YoY</div> </div> <div class="cube-face left"> <div class="metric-icon">⏳</div> <div class="metric-title">Time to Market</div> <div class="metric-value">48d</div> <div class="metric-trend trend-down">-8.7 days</div> </div> <div class="cube-face top"> <div class="metric-icon">📝</div> <div class="metric-title">QA Pass Rate</div> <div class="metric-value">96.4%</div> <div class="metric-trend trend-up">+1.8% QoQ</div> </div> <div class="cube-face bottom"> <div class="metric-icon">☁️</div> <div class="metric-title">System Uptime</div> <div class="metric-value">99.98%</div> <div class="metric-trend trend-up">+0.05% YoY</div> </div> </div> </div> </div> <p class="info-text">Click or tap on any cube to rotate and explore different metrics. Each face represents a connected KPI that gives you a comprehensive view of your business performance.</p> </div> <script> document.addEventListener('DOMContentLoaded', () => { // Initialize cube rotations const cubes = document.querySelectorAll('.cube'); cubes.forEach(cube => { let xRotation = 0; let yRotation = 0; let zRotation = 0; let isRotating = false; let lastFace = 'front'; cube.addEventListener('click', () => { if (isRotating) return; isRotating = true; // Determine next face to show (rotational sequence) const faces = ['front', 'right', 'back', 'left', 'top', 'bottom']; const currentIndex = faces.indexOf(lastFace); const nextIndex = (currentIndex + 1) % faces.length; lastFace = faces[nextIndex]; // Set rotation based on the next face switch(lastFace) { case 'front': xRotation = 0; yRotation = 0; break; case 'right': xRotation = 0; yRotation = 90; break; case 'back': xRotation = 0; yRotation = 180; break; case 'left': xRotation = 0; yRotation = -90; break; case 'top': xRotation = 90; yRotation = 0; break; case 'bottom': xRotation = -90; yRotation = 0; break; } // Apply the rotation cube.style.transform = `rotateX(${xRotation}deg) rotateY(${yRotation}deg) rotateZ(${zRotation}deg)`; // Reset rotation flag after animation completes setTimeout(() => { isRotating = false; }, 1000); }); // Initial random rotation for visual interest const initialFaces = ['front', 'right', 'back', 'left', 'top', 'bottom']; const randomFace = initialFaces[Math.floor(Math.random() * initialFaces.length)]; lastFace = randomFace; switch(randomFace) { case 'front': xRotation = 0; yRotation = 0; break; case 'right': xRotation = 0; yRotation = 90; break; case 'back': xRotation = 0; yRotation = 180; break; case 'left': xRotation = 0; yRotation = -90; break; case 'top': xRotation = 90; yRotation = 0; break; case 'bottom': xRotation = -90; yRotation = 0; break; } cube.style.transform = `rotateX(${xRotation}deg) rotateY(${yRotation}deg) rotateZ(${zRotation}deg)`; }); // View switching functionality const viewButtons = document.querySelectorAll('.controls button'); viewButtons.forEach(button => { button.addEventListener('click', () => { // Remove active class from all buttons viewButtons.forEach(b => b.classList.remove('active')); // Add active class to clicked button button.classList.add('active'); // Add a subtle animation effect when switching views cubes.forEach(cube => { cube.classList.add('pulse'); setTimeout(() => { cube.classList.remove('pulse'); }, 2000); }); }); }); // Time range selection const timeRanges = document.querySelectorAll('.time-range span'); timeRanges.forEach(span => { span.addEventListener('click', () => { timeRanges.forEach(s => s.classList.remove('active')); span.classList.add('active'); // Simulate data update with subtle animation cubes.forEach(cube => { cube.classList.add('pulse'); setTimeout(() => { cube.classList.remove('pulse'); }, 2000); }); }); }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>VR Tour Experience</title> <style> :root { --primary: #3a7cfa; --secondary: #6c4ee4; --accent: #00eeff; --dark: #1a1a2e; --light: #f5f5fa; --panel-bg: rgba(18, 18, 32, 0.85); --cube-size: 80px; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { background: linear-gradient(135deg, #1a1a2e, #0f3460); height: 100vh; overflow: hidden; color: var(--light); perspective: 1000px; display: flex; justify-content: center; align-items: center; } .container { width: 100%; max-width: 700px; height: 700px; position: relative; perspective: 1500px; overflow: hidden; } .environment { position: absolute; width: 100%; height: 100%; transform-style: preserve-3d; transition: transform 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275); } .vr-scene { position: absolute; width: 100%; height: 100%; background: url('https://images.unsplash.com/photo-1535350356005-fd52b3b524fb?ixlib=rb-1.2.1&auto=format&fit=crop&w=1000&q=80') no-repeat center center; background-size: cover; border-radius: 12px; overflow: hidden; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5); } .vr-scene::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: radial-gradient(circle at center, transparent 60%, rgba(0, 0, 0, 0.6)); pointer-events: none; } .grid { position: absolute; width: 100%; height: 100%; display: flex; justify-content: space-around; align-items: center; flex-wrap: wrap; transform-style: preserve-3d; } .cube-container { position: relative; width: var(--cube-size); height: var(--cube-size); transform-style: preserve-3d; transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); cursor: pointer; } .cube-container:hover { transform: scale(1.1) translateZ(20px); } .cube { position: absolute; width: 100%; height: 100%; transform-style: preserve-3d; transition: transform 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275); animation: cube-float 3s ease-in-out infinite; } .cube-container:nth-child(2) .cube { animation-delay: 0.2s; } .cube-container:nth-child(3) .cube { animation-delay: 0.4s; } .cube-container:nth-child(4) .cube { animation-delay: 0.6s; } @keyframes cube-float { 0%, 100% { transform: translateY(0) rotateY(0); } 50% { transform: translateY(-10px) rotateY(10deg); } } .cube-face { position: absolute; width: 100%; height: 100%; background: var(--panel-bg); border: 2px solid var(--accent); box-shadow: 0 0 15px rgba(0, 238, 255, 0.4); display: flex; justify-content: center; align-items: center; font-weight: bold; font-size: 16px; text-transform: uppercase; letter-spacing: 1px; backface-visibility: hidden; transform-style: preserve-3d; transition: all 0.3s ease; overflow: hidden; } .cube-face::before { content: ''; position: absolute; width: 150%; height: 150%; background: linear-gradient(135deg, transparent, rgba(0, 238, 255, 0.1), transparent); transform: rotate(45deg) translate(-100%, -100%); animation: shine 3s infinite; } @keyframes shine { 0% { transform: rotate(45deg) translate(-100%, -100%); } 100% { transform: rotate(45deg) translate(100%, 100%); } } .cube-face.front { transform: translateZ(calc(var(--cube-size) / 2)); background: var(--primary); background: linear-gradient(135deg, var(--primary), var(--secondary)); } .cube-face.back { transform: rotateY(180deg) translateZ(calc(var(--cube-size) / 2)); } .cube-face.left { transform: rotateY(-90deg) translateZ(calc(var(--cube-size) / 2)); } .cube-face.right { transform: rotateY(90deg) translateZ(calc(var(--cube-size) / 2)); } .cube-face.top { transform: rotateX(90deg) translateZ(calc(var(--cube-size) / 2)); } .cube-face.bottom { transform: rotateX(-90deg) translateZ(calc(var(--cube-size) / 2)); } .cube-icon { font-size: 28px; color: var(--light); text-shadow: 0 0 10px rgba(0, 238, 255, 0.7); z-index: 2; } .service-panel { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) scale(0); width: 90%; max-width: 500px; background: var(--panel-bg); border-radius: 12px; padding: 30px; z-index: 100; opacity: 0; visibility: hidden; transition: all 0.5s cubic-bezier(0.34, 1.56, 0.64, 1); backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.1); box-shadow: 0 15px 35px rgba(0, 0, 0, 0.2), 0 0 25px rgba(0, 238, 255, 0.3); overflow: hidden; } .service-panel.active { transform: translate(-50%, -50%) scale(1); opacity: 1; visibility: visible; } .service-panel::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 5px; background: linear-gradient(90deg, var(--primary), var(--accent)); } .panel-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; padding-bottom: 15px; border-bottom: 1px solid rgba(255, 255, 255, 0.1); } .panel-title { font-size: 24px; font-weight: 600; background: linear-gradient(90deg, var(--light), var(--accent)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; text-shadow: 0 0 10px rgba(0, 238, 255, 0.3); } .close-panel { background: none; border: none; color: var(--light); font-size: 20px; cursor: pointer; width: 36px; height: 36px; border-radius: 50%; display: flex; justify-content: center; align-items: center; background: rgba(255, 255, 255, 0.1); transition: all 0.3s ease; } .close-panel:hover { background: rgba(255, 255, 255, 0.2); transform: rotate(90deg); } .panel-content { margin-bottom: 25px; } .panel-content p { line-height: 1.6; margin-bottom: 15px; color: rgba(255, 255, 255, 0.8); } .feature-list { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; margin: 20px 0; } .feature-item { display: flex; align-items: center; gap: 10px; } .feature-icon { width: 30px; height: 30px; background: rgba(58, 124, 250, 0.2); border-radius: 50%; display: flex; justify-content: center; align-items: center; color: var(--accent); font-size: 14px; } .action-buttons { display: flex; gap: 12px; } .btn { padding: 12px 20px; border: none; border-radius: 8px; font-weight: 600; cursor: pointer; transition: all 0.3s ease; display: flex; align-items: center; gap: 8px; } .btn-primary { background: linear-gradient(135deg, var(--primary), var(--secondary)); color: white; flex: 1; justify-content: center; box-shadow: 0 5px 15px rgba(58, 124, 250, 0.3); } .btn-primary:hover { transform: translateY(-3px); box-shadow: 0 8px 20px rgba(58, 124, 250, 0.4); } .btn-outline { background: transparent; color: var(--light); border: 1px solid rgba(255, 255, 255, 0.2); } .btn-outline:hover { background: rgba(255, 255, 255, 0.1); } .overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); backdrop-filter: blur(5px); z-index: 90; opacity: 0; visibility: hidden; transition: all 0.3s ease; } .overlay.active { opacity: 1; visibility: visible; } .navigation { position: absolute; bottom: 20px; left: 50%; transform: translateX(-50%); z-index: 50; display: flex; gap: 10px; } .nav-dot { width: 12px; height: 12px; border-radius: 50%; background: rgba(255, 255, 255, 0.3); cursor: pointer; transition: all 0.3s ease; } .nav-dot.active { background: var(--accent); box-shadow: 0 0 10px var(--accent); } .title-bar { position: absolute; top: 20px; left: 50%; transform: translateX(-50%); background: var(--panel-bg); padding: 10px 25px; border-radius: 30px; z-index: 50; display: flex; align-items: center; gap: 10px; box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2); border: 1px solid rgba(255, 255, 255, 0.1); } .title-vr-icon { font-size: 18px; color: var(--accent); } .title-text { font-weight: 600; letter-spacing: 1px; } @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(0, 238, 255, 0.4); } 70% { box-shadow: 0 0 0 15px rgba(0, 238, 255, 0); } 100% { box-shadow: 0 0 0 0 rgba(0, 238, 255, 0); } } /* Responsive Adjustments */ @media (max-width: 600px) { .feature-list { grid-template-columns: 1fr; } .cube-container { --cube-size: 60px; } .panel-title { font-size: 20px; } .service-panel { padding: 20px; width: 95%; } } /* Futuristic HUD elements */ .hud-corner { position: absolute; width: 100px; height: 100px; opacity: 0.7; pointer-events: none; } .hud-corner-tl { top: 0; left: 0; border-top: 2px solid var(--accent); border-left: 2px solid var(--accent); border-top-left-radius: 10px; } .hud-corner-tr { top: 0; right: 0; border-top: 2px solid var(--accent); border-right: 2px solid var(--accent); border-top-right-radius: 10px; } .hud-corner-bl { bottom: 0; left: 0; border-bottom: 2px solid var(--accent); border-left: 2px solid var(--accent); border-bottom-left-radius: 10px; } .hud-corner-br { bottom: 0; right: 0; border-bottom: 2px solid var(--accent); border-right: 2px solid var(--accent); border-bottom-right-radius: 10px; } </style> </head> <body> <div class="container"> <div class="environment"> <div class="vr-scene"> <div class="hud-corner hud-corner-tl"></div> <div class="hud-corner hud-corner-tr"></div> <div class="hud-corner hud-corner-bl"></div> <div class="hud-corner hud-corner-br"></div> <div class="title-bar"> <div class="title-vr-icon"> <i class="fas fa-vr-cardboard"></i> </div> <div class="title-text">QUANTUM VR TOUR</div> </div> <div class="grid"> <!-- Immersive Environments Cube --> <div class="cube-container" data-panel="immersive"> <div class="cube"> <div class="cube-face front"> <div class="cube-icon"> <i class="fas fa-globe"></i> </div> </div> <div class="cube-face back"></div> <div class="cube-face left"></div> <div class="cube-face right"></div> <div class="cube-face top"></div> <div class="cube-face bottom"></div> </div> </div> <!-- Interactive Training Cube --> <div class="cube-container" data-panel="training"> <div class="cube"> <div class="cube-face front"> <div class="cube-icon"> <i class="fas fa-graduation-cap"></i> </div> </div> <div class="cube-face back"></div> <div class="cube-face left"></div> <div class="cube-face right"></div> <div class="cube-face top"></div> <div class="cube-face bottom"></div> </div> </div> <!-- Architectural Visualization Cube --> <div class="cube-container" data-panel="architectural"> <div class="cube"> <div class="cube-face front"> <div class="cube-icon"> <i class="fas fa-building"></i> </div> </div> <div class="cube-face back"></div> <div class="cube-face left"></div> <div class="cube-face right"></div> <div class="cube-face top"></div> <div class="cube-face bottom"></div> </div> </div> <!-- Medical Simulation Cube --> <div class="cube-container" data-panel="medical"> <div class="cube"> <div class="cube-face front"> <div class="cube-icon"> <i class="fas fa-heartbeat"></i> </div> </div> <div class="cube-face back"></div> <div class="cube-face left"></div> <div class="cube-face right"></div> <div class="cube-face top"></div> <div class="cube-face bottom"></div> </div> </div> </div> <div class="navigation"> <div class="nav-dot active"></div> <div class="nav-dot"></div> <div class="nav-dot"></div> </div> </div> </div> <div class="overlay"></div> <!-- Immersive Environments Panel --> <div id="immersive-panel" class="service-panel"> <div class="panel-header"> <h2 class="panel-title">Immersive Environments</h2> <button class="close-panel">×</button> </div> <div class="panel-content"> <p>Transport your audience to photorealistic digital worlds with our cutting-edge immersive environment solutions. Our proprietary Quantum Engine creates spaces with unprecedented visual fidelity and physical accuracy.</p> <div class="feature-list"> <div class="feature-item"> <div class="feature-icon"><i class="fas fa-check"></i></div> <span>12K Panoramic Rendering</span> </div> <div class="feature-item"> <div class="feature-icon"><i class="fas fa-check"></i></div> <span>Spatial Audio Integration</span> </div> <div class="feature-item"> <div class="feature-icon"><i class="fas fa-check"></i></div> <span>Real-time Lighting</span> </div> <div class="feature-item"> <div class="feature-icon"><i class="fas fa-check"></i></div> <span>Physics-based Materials</span> </div> </div> <p>Perfect for tradeshows, conferences, or permanent installations where you need to make an unforgettable impression.</p> </div> <div class="action-buttons"> <button class="btn btn-primary">Experience Demo <i class="fas fa-arrow-right"></i></button> <button class="btn btn-outline"><i class="fas fa-info-circle"></i></button> </div> </div> <!-- Interactive Training Panel --> <div id="training-panel" class="service-panel"> <div class="panel-header"> <h2 class="panel-title">Interactive Training</h2> <button class="close-panel">×</button> </div> <div class="panel-content"> <p>Revolutionary VR training environments that reduce learning time by up to 60% while improving retention rates. Our proprietary haptic feedback system creates muscle memory that translates directly to real-world performance.</p> <div class="feature-list"> <div class="feature-item"> <div class="feature-icon"><i class="fas fa-check"></i></div> <span>Multi-user Collaboration</span> </div> <div class="feature-item"> <div class="feature-icon"><i class="fas fa-check"></i></div> <span>Performance Analytics</span> </div> <div class="feature-item"> <div class="feature-icon"><i class="fas fa-check"></i></div> <span>Scenario Branching</span> </div> <div class="feature-item"> <div class="feature-icon"><i class="fas fa-check"></i></div> <span>Adaptive Difficulty</span> </div> </div> <p>Used by Fortune 500 companies and military organizations to train complex procedures without risk or equipment downtime.</p> </div> <div class="action-buttons"> <button class="btn btn-primary">View Case Studies <i class="fas fa-arrow-right"></i></button> <button class="btn btn-outline"><i class="fas fa-info-circle"></i></button> </div> </div> <!-- Architectural Visualization Panel --> <div id="architectural-panel" class="service-panel"> <div class="panel-header"> <h2 class="panel-title">Architectural Visualization</h2> <button class="close-panel">×</button> </div> <div class="panel-content"> <p>Experience buildings before they're built with our architectural visualization platform. Walk through fully interactive, true-to-scale environments with physically accurate materials, lighting, and spatial acoustics.</p> <div class="feature-list"> <div class="feature-item"> <div class="feature-icon"><i class="fas fa-check"></i></div> <span>BIM Integration</span> </div> <div class="feature-item"> <div class="feature-icon"><i class="fas fa-check"></i></div> <span>Material Swap System</span> </div> <div class="feature-item"> <div class="feature-icon"><i class="fas fa-check"></i></div> <span>Time-of-Day Simulation</span> </div> <div class="feature-item"> <div class="feature-icon"><i class="fas fa-check"></i></div> <span>Remote Collaboration</span> </div> </div> <p>Reduce design iterations and client approval time by 40% while dramatically improving client satisfaction and project outcomes.</p> </div> <div class="action-buttons"> <button class="btn btn-primary">View Gallery <i class="fas fa-arrow-right"></i></button> <button class="btn btn-outline"><i class="fas fa-info-circle"></i></button> </div> </div> <!-- Medical Simulation Panel --> <div id="medical-panel" class="service-panel"> <div class="panel-header"> <h2 class="panel-title">Medical Simulation</h2> <button class="close-panel">×</button> </div> <div class="panel-content"> <p>FDA-approved medical simulations that accurately replicate surgical procedures with unprecedented anatomical fidelity. Our proprietary tissue simulation engine provides realistic haptic feedback for each tissue type.</p> <div class="feature-list"> <div class="feature-item"> <div class="feature-icon"><i class="fas fa-check"></i></div> <span>Patient-specific Models</span> </div> <div class="feature-item"> <div class="feature-icon"><i class="fas fa-check"></i></div> <span>Hemodynamic Simulation</span> </div> <div class="feature-item"> <div class="feature-icon"><i class="fas fa-check"></i></div> <span>Procedural Guidance</span> </div> <div class="feature-item"> <div class="feature-icon"><i class="fas fa-check"></i></div> <span>Complication Scenarios</span> </div> </div> <p>Used by leading medical institutions to train surgeons and medical professionals on complex procedures with zero risk to patients.</p> </div> <div class="action-buttons"> <button class="btn btn-primary">Medical Partners <i class="fas fa-arrow-right"></i></button> <button class="btn btn-outline"><i class="fas fa-info-circle"></i></button> </div> </div> </div> <script> // Add FontAwesome for icons document.head.innerHTML += '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">'; document.addEventListener('DOMContentLoaded', function() { const cubes = document.querySelectorAll('.cube-container'); const overlay = document.querySelector('.overlay'); const panels = document.querySelectorAll('.service-panel'); const closeButtons = document.querySelectorAll('.close-panel'); const navDots = document.querySelectorAll('.nav-dot'); const environment = document.querySelector('.environment'); // Function to handle cube click function handleCubeClick() { const panelId = this.dataset.panel + '-panel'; const panel = document.getElementById(panelId); // Animate cube on click this.querySelector('.cube').style.transform = 'scale(0.8) rotateY(180deg)'; setTimeout(() => { this.querySelector('.cube').style.transform = ''; }, 500); // Show panel with bounce effect overlay.classList.add('active'); panel.classList.add('active'); // Apply bounce animation panel.animate([ { transform: 'translate(-50%, -50%) scale(0.7)' }, { transform: 'translate(-50%, -50%) scale(1.05)' }, { transform: 'translate(-50%, -50%) scale(0.95)' }, { transform: 'translate(-50%, -50%) scale(1)' } ], { duration: 600, easing: 'cubic-bezier(0.175, 0.885, 0.32, 1.275)' }); } // Add click event to all cubes cubes.forEach(cube => { cube.addEventListener('click', handleCubeClick); // Add hover effect with 3D rotation cube.addEventListener('mousemove', function(e) { const cubeRect = this.getBoundingClientRect(); const cubeX = cubeRect.left + cubeRect.width / 2; const cubeY = cubeRect.top + cubeRect.height / 2; const mouseX = e.clientX; const mouseY = e.clientY; const angleX = (mouseY - cubeY) / 10; const angleY = (mouseX - cubeX) / -10; this.querySelector('.cube').style.transform = `rotateX(${angleX}deg) rotateY(${angleY}deg)`; }); cube.addEventListener('mouseleave', function() { this.querySelector('.cube').style.transform = ''; }); }); // Close panel function function closePanel() { overlay.classList.remove('active'); panels.forEach(panel => { if (panel.classList.contains('active')) { // Apply closing animation panel.animate([ { transform: 'translate(-50%, -50%) scale(1)', opacity: 1 }, { transform: 'translate(-50%, -50%) scale(0.8)', opacity: 0 } ], { duration: 300, easing: 'ease-out' }); setTimeout(() => { panel.classList.remove('active'); }, 280); } }); } // Close panel when clicking close button closeButtons.forEach(button => { button.addEventListener('click', closePanel); }); // Close panel when clicking overlay overlay.addEventListener('click', closePanel); // Navigation dots functionality navDots.forEach((dot, index) => { dot.addEventListener('click', function() { navDots.forEach(d => d.classList.remove('active')); this.classList.add('active'); // Rotate the environment to simulate different scenes environment.style.transform = `rotateY(${index * -120}deg)`; }); }); // Mouse move parallax effect on scene document.querySelector('.vr-scene').addEventListener('mousemove', function(e) { const xAxis = (window.innerWidth / 2 - e.pageX) / 25; const yAxis = (window.innerHeight / 2 - e.pageY) / 25; this.style.transform = `rotateY(${xAxis}deg) rotateX(${yAxis}deg)`; }); document.querySelector('.vr-scene').addEventListener('mouseleave', function() { this.style.transform = 'rotateY(0deg) rotateX(0deg)'; }); // Add pulse animation to cubes periodically setInterval(() => { const randomCube = cubes[Math.floor(Math.random() * cubes.length)]; randomCube.style.animation = 'pulse 1.5s'; setTimeout(() => { randomCube.style.animation = ''; }, 1500); }, 3000); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>CubicLearn - Educational Modules</title> <style> :root { --primary: #4361ee; --secondary: #3a0ca3; --accent: #f72585; --light: #f1faee; --dark: #1d3557; --success: #06d6a0; --warning: #ffd166; --cube-size: 180px; --cube-margin: 20px; --transition-time: 0.6s; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { background-color: #f8f9fa; background-image: radial-gradient(#3a0ca3 0.5px, transparent 0.5px), radial-gradient(#3a0ca3 0.5px, #f8f9fa 0.5px); background-size: 20px 20px; background-position: 0 0, 10px 10px; color: var(--dark); height: 100vh; display: flex; flex-direction: column; overflow-x: hidden; } header { background-color: white; box-shadow: 0 2px 15px rgba(0, 0, 0, 0.1); padding: 15px 20px; display: flex; justify-content: space-between; align-items: center; position: relative; z-index: 10; } .logo { display: flex; align-items: center; gap: 10px; font-weight: 700; font-size: 1.3rem; color: var(--secondary); } .logo .cube-icon { width: 25px; height: 25px; background: var(--primary); transform: rotate(45deg); margin-right: 5px; position: relative; animation: rotateCube 8s infinite linear; } @keyframes rotateCube { 0% { transform: rotate(45deg); } 25% { transform: rotate(135deg); } 50% { transform: rotate(225deg); } 75% { transform: rotate(315deg); } 100% { transform: rotate(405deg); } } .user-profile { width: 35px; height: 35px; background: linear-gradient(45deg, var(--primary), var(--secondary)); border-radius: 50%; display: flex; justify-content: center; align-items: center; color: white; font-weight: bold; cursor: pointer; } main { flex: 1; padding: 30px 20px; position: relative; overflow-y: auto; } h1 { text-align: center; margin-bottom: 30px; font-size: 1.8rem; font-weight: 700; color: var(--secondary); text-shadow: 1px 1px 0px rgba(0, 0, 0, 0.1); } .progress-indicator { max-width: 600px; margin: 0 auto 30px; background-color: #e9ecef; height: 10px; border-radius: 5px; overflow: hidden; } .progress-bar { height: 100%; width: 35%; background: linear-gradient(90deg, var(--primary), var(--accent)); border-radius: 5px; transition: width 1s ease; } .course-info { display: flex; justify-content: space-between; max-width: 600px; margin: 0 auto 20px; font-size: 0.9rem; color: var(--dark); } .course-progress { display: flex; align-items: center; gap: 5px; } .completed { color: var(--success); font-weight: 600; } .module-grid { display: flex; flex-wrap: wrap; justify-content: center; gap: 30px; perspective: 1000px; perspective-origin: center; } .cube-wrapper { width: var(--cube-size); height: var(--cube-size); position: relative; margin: var(--cube-margin); perspective: 1000px; } .cube { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform var(--transition-time) ease; cursor: pointer; } .cube-face { position: absolute; width: 100%; height: 100%; display: flex; flex-direction: column; justify-content: center; align-items: center; padding: 15px; backface-visibility: hidden; border-radius: 10px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); text-align: center; transition: all 0.3s ease; background-color: white; overflow: hidden; } .cube-face::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 8px; z-index: 1; } .face-front::before { background: var(--primary); } .face-back::before { background: var(--secondary); } .face-right::before { background: var(--accent); } .face-left::before { background: var(--success); } .face-top::before { background: var(--warning); } .face-bottom::before { background: #7209b7; } .face-front { transform: translateZ(calc(var(--cube-size) / 2)); } .face-back { transform: rotateY(180deg) translateZ(calc(var(--cube-size) / 2)); } .face-right { transform: rotateY(90deg) translateZ(calc(var(--cube-size) / 2)); } .face-left { transform: rotateY(-90deg) translateZ(calc(var(--cube-size) / 2)); } .face-top { transform: rotateX(90deg) translateZ(calc(var(--cube-size) / 2)); } .face-bottom { transform: rotateX(-90deg) translateZ(calc(var(--cube-size) / 2)); } .cube-icon { font-size: 2.5rem; margin-bottom: 15px; color: var(--dark); } .cube-title { font-weight: 700; margin-bottom: 8px; font-size: 1.1rem; color: var(--dark); } .cube-desc { font-size: 0.85rem; color: #495057; margin-bottom: 15px; line-height: 1.4; } .progress-circle { position: relative; width: 40px; height: 40px; margin-top: 5px; } .progress-circle svg { width: 100%; height: 100%; } .progress-circle circle { fill: none; stroke-width: 5; stroke-linecap: round; transform: rotate(-90deg); transform-origin: center; transition: stroke-dashoffset 1s ease; } .progress-circle .background { stroke: #e9ecef; } .progress-circle .progress { stroke: var(--success); } .percent { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 0.7rem; font-weight: 700; } .status-tag { position: absolute; bottom: 12px; right: 12px; padding: 3px 8px; border-radius: 12px; font-size: 0.7rem; font-weight: 600; background-color: var(--light); color: var(--dark); } .completed-tag { background-color: var(--success); color: white; } .in-progress-tag { background-color: var(--warning); color: var(--dark); } .locked-tag { background-color: #e9ecef; color: #6c757d; } .cube-nav { position: absolute; bottom: 0; left: 0; width: 100%; display: flex; justify-content: center; gap: 5px; padding: 10px; opacity: 0; transition: opacity 0.3s ease; z-index: 1; } .cube-wrapper:hover .cube-nav { opacity: 1; } .nav-dot { width: 8px; height: 8px; border-radius: 50%; background-color: #dee2e6; cursor: pointer; transition: all 0.3s ease; } .nav-dot.active { background-color: var(--primary); transform: scale(1.3); } .start-button { padding: 8px 16px; background-color: var(--primary); color: white; border: none; border-radius: 5px; font-weight: 600; cursor: pointer; transition: all 0.3s ease; box-shadow: 0 3px 5px rgba(0, 0, 0, 0.1); } .start-button:hover { background-color: var(--secondary); transform: translateY(-2px); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.15); } .unlock-message { font-size: 0.85rem; color: #6c757d; margin-top: 15px; font-style: italic; } @media (max-width: 640px) { :root { --cube-size: 140px; --cube-margin: 10px; } h1 { font-size: 1.5rem; margin-bottom: 20px; } .course-info { flex-direction: column; gap: 10px; align-items: center; } .module-grid { gap: 15px; } .cube-title { font-size: 0.9rem; } .cube-desc { font-size: 0.75rem; } } @media (max-width: 480px) { :root { --cube-size: 120px; } .cube-icon { font-size: 2rem; margin-bottom: 8px; } .progress-circle { width: 30px; height: 30px; } } </style> </head> <body> <header> <div class="logo"> <div class="cube-icon"></div> CubicLearn </div> <div class="user-profile">JS</div> </header> <main> <h1>Web Development Fundamentals</h1> <div class="progress-indicator"> <div class="progress-bar"></div> </div> <div class="course-info"> <div class="course-progress"> <span class="completed">2</span> / 6 modules completed </div> <div class="time-estimate">Est. time remaining: 6h 45min</div> </div> <div class="module-grid"> <!-- Cube 1 --> <div class="cube-wrapper"> <div class="cube" id="cube1"> <div class="cube-face face-front"> <div class="cube-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 16 16"> <path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm.25-14.75v1.5a.25.25 0 0 1-.5 0v-1.5a.25.25 0 0 1 .5 0zm0 12v1.5a.25.25 0 1 1-.5 0v-1.5a.25.25 0 1 1 .5 0zM4.5 1.938a.25.25 0 0 1 .342.091l.75 1.3a.25.25 0 0 1-.434.25l-.75-1.3a.25.25 0 0 1 .092-.341zm6.5 0a.25.25 0 0 1 .092.34l-.75 1.3a.25.25 0 1 1-.434-.25l.75-1.3a.25.25 0 0 1 .342-.09zM1.938 4.5a.25.25 0 0 1 .34.091l1.3.75a.25.25 0 1 1-.25.434l-1.3-.75a.25.25 0 0 1-.09-.341zm0 6.5a.25.25 0 0 1-.09-.342l1.3-.75a.25.25 0 1 1 .25.434l-1.3.75a.25.25 0 0 1-.34-.092zm12.03-6.5a.25.25 0 0 1-.09.342l-1.3.75a.25.25 0 1 1-.25-.434l1.3-.75a.25.25 0 0 1 .34.091zm0 6.5a.25.25 0 0 1-.34.091l-1.3-.75a.25.25 0 0 1 .25-.434l1.3.75a.25.25 0 0 1 .09.342z"/> </svg> </div> <div class="cube-title">HTML Essentials</div> <div class="cube-desc">Structure, semantics & building blocks of the web</div> <div class="progress-circle"> <svg viewBox="0 0 36 36"> <circle class="background" cx="18" cy="18" r="16" stroke-dasharray="100" stroke-dashoffset="0"></circle> <circle class="progress" cx="18" cy="18" r="16" stroke-dasharray="100" stroke-dashoffset="0"></circle> </svg> <span class="percent">100%</span> </div> <span class="status-tag completed-tag">Completed</span> </div> <div class="cube-face face-back"> <div class="cube-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 16 16"> <path d="M5.854 4.854a.5.5 0 1 0-.708-.708l-3.5 3.5a.5.5 0 0 0 0 .708l3.5 3.5a.5.5 0 0 0 .708-.708L2.707 8l3.147-3.146zm4.292 0a.5.5 0 0 1 .708-.708l3.5 3.5a.5.5 0 0 1 0 .708l-3.5 3.5a.5.5 0 0 1-.708-.708L13.293 8l-3.147-3.146z"/> </svg> </div> <div class="cube-title">HTML Tags & Elements</div> <div class="cube-desc">Mastering fundamental tags, attributes, and document structure</div> <button class="start-button">Review Module</button> </div> <div class="cube-face face-right"> <div class="cube-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 16 16"> <path d="M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z"/> <path d="M10.97 4.97a.75.75 0 0 1 1.07 1.05l-3.99 4.99a.75.75 0 0 1-1.08.02L4.324 8.384a.75.75 0 1 1 1.06-1.06l2.094 2.093 3.473-4.425a.267.267 0 0 1 .02-.022z"/> </svg> </div> <div class="cube-title">Forms & Multimedia</div> <div class="cube-desc">Learn to create interactive forms and embed various media types</div> <button class="start-button">Review Module</button> </div> <div class="cube-face face-left"> <div class="cube-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 16 16"> <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z"/> <path d="M11 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0z"/> </svg> </div> <div class="cube-title">Semantic HTML</div> <div class="cube-desc">Creating accessible, SEO-friendly pages with proper structure</div> <button class="start-button">Review Module</button> </div> <div class="cube-face face-top"> <div class="cube-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 16 16"> <path d="M2 6a6 6 0 1 1 10.174 4.31c-.203.196-.359.4-.453.619l-.762 1.769A.5.5 0 0 1 10.5 13h-5a.5.5 0 0 1-.46-.302l-.761-1.77a1.964 1.964 0 0 0-.453-.618A5.984 5.984 0 0 1 2 6zm3 8.5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1l-.224.447a1 1 0 0 1-.894.553H6.618a1 1 0 0 1-.894-.553L5.5 15a.5.5 0 0 1-.5-.5z"/> </svg> </div> <div class="cube-title">HTML5 Features</div> <div class="cube-desc">Exploring modern APIs and browser capabilities</div> <button class="start-button">Review Module</button> </div> <div class="cube-face face-bottom"> <div class="cube-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 16 16"> <path d="M6 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-5 6s-1 0-1-1 1-4 6-4 6 3 6 4-1 1-1 1H1zM11 3.5a.5.5 0 0 1 .5-.5h4a.5.5 0 0 1 0 1h-4a.5.5 0 0 1-.5-.5zm.5 2.5a.5.5 0 0 0 0 1h4a.5.5 0 0 0 0-1h-4zm2 3a.5.5 0 0 0 0 1h2a.5.5 0 0 0 0-1h-2zm0 3a.5.5 0 0 0 0 1h2a.5.5 0 0 0 0-1h-2z"/> </svg> </div> <div class="cube-title">HTML Best Practices</div> <div class="cube-desc">Code organization, validation, and industry standards</div> <button class="start-button">Review Module</button> </div> </div> <div class="cube-nav"> <div class="nav-dot active" data-face="front"></div> <div class="nav-dot" data-face="back"></div> <div class="nav-dot" data-face="right"></div> <div class="nav-dot" data-face="left"></div> <div class="nav-dot" data-face="top"></div> <div class="nav-dot" data-face="bottom"></div> </div> </div> <!-- Cube 2 --> <div class="cube-wrapper"> <div class="cube" id="cube2"> <div class="cube-face face-front"> <div class="cube-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 16 16"> <path d="M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z"/> <path d="m6.79 5.093.51.54L4.93 9h.97l1.86-3.028 1.29 1.947V9h.93V4.91h-.832L7.82 6.857l-1.03-1.764h-.961l.9 1.54-.901 1.476-.985-1.476.77-1.54h-.936L2.75 9h.964l.53-.907.886-1.5z"/> </svg> </div> <div class="cube-title">CSS Foundations</div> <div class="cube-desc">Styling, selectors & visual presentation for web pages</div> <div class="progress-circle"> <svg viewBox="0 0 36 36"> <circle class="background" cx="18" cy="18" r="16" stroke-dasharray="100" stroke-dashoffset="0"></circle> <circle class="progress" cx="18" cy="18" r="16" stroke-dasharray="100" stroke-dashoffset="30"></circle> </svg> <span class="percent">70%</span> </div> <span class="status-tag in-progress-tag">In Progress</span> </div> <div class="cube-face face-back"> <div class="cube-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 16 16"> <path d="M2.5 3.5a.5.5 0 0 1 0-1h11a.5.5 0 0 1 0 1h-11zm2-2a.5.5 0 0 1 0-1h7a.5.5 0 0 1 0 1h-7zM0 13a1.5 1.5 0 0 0 1.5 1.5h13A1.5 1.5 0 0 0 16 13V6a1.5 1.5 0 0 0-1.5-1.5h-13A1.5 1.5 0 0 0 0 6v7zm1.5.5A.5.5 0 0 1 1 13V6a.5.5 0 0 1 .5-.5h13a.5.5 0 0 1 .5.5v7a.5.5 0 0 1-.5.5h-13z"/> </svg> </div> <div class="cube-title">Selectors & Specificity</div> <div class="cube-desc">Mastering CSS selectors and understanding the cascade</div> <button class="start-button">Continue Learning</button> </div> <div class="cube-face face-right"> <div class="cube-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 16 16"> <path d="M14 10.5a.5.5 0 0 0-.5-.5h-3a.5.5 0 0 0 0 1h3a.5.5 0 0 0 .5-.5zm0-3a.5.5 0 0 0-.5-.5h-7a.5.5 0 0 0 0 1h7a.5.5 0 0 0 .5-.5zm0-3a.5.5 0 0 0-.5-.5h-11a.5.5 0 0 0 0 1h11a.5.5 0 0 0 .5-.5z"/> </svg> </div> <div class="cube-title">Box Model & Layout</div> <div class="cube-desc">Understanding spacing, sizing, and positioning elements</div> <button class="start-button">Continue Learning</button> </div> <div class="cube-face face-left"> <div class="cube-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 16 16"> <path d="M5.338 1.59a61.44 61.44 0 0 0-2.837.856.481.481 0 0 0-.328.39c-.554 4.157.726 7.19 2.253 9.188a10.725 10.725 0 0 0 2.287 2.233c.346.244.652.42.893.533.12.057.218.095.293.118a.55.55 0 0 0 .101.025.615.615 0 0 0 .1-.025c.076-.023.174-.061.294-.118.24-.113.547-.29.893-.533a10.726 10.726 0 0 0 2.287-2.233c1.527-1.997 2.807-5.031 2.253-9.188a.48.48 0 0 0-.328-.39c-.651-.213-1.75-.56-2.837-.855C9.552 1.29 8.531 1.067 8 1.067c-.53 0-1.552.223-2.662.524zM5.072.56C6.157.265 7.31 0 8 0s1.843.265 2.928.56c1.11.3 2.229.655 2.887.87a1.54 1.54 0 0 1 1.044 1.262c.596 4.477-.787 7.795-2.465 9.99a11.775 11.775 0 0 1-2.517 2.453 7.159 7.159 0 0 1-1.048.625c-.28.132-.581.24-.829.24s-.548-.108-.829-.24a7.158 7.158 0 0 1-1.048-.625 11.777 11.777 0 0 1-2.517-2.453C1.928 10.487.545 7.169 1.141 2.692A1.54 1.54 0 0 1 2.185 1.43 62.456 62.456 0 0 1 5.072.56z"/> </svg> </div> <div class="cube-title">Typography & Colors</div> <div class="cube-desc">Creating aesthetically pleasing designs with text and color theory</div> <button class="start-button">Continue Learning</button> </div> <div class="cube-face face-top"> <div class="cube-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 16 16"> <path d="M14 3a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h12zM2 2a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2H2z"/> <path d="M6.854 8.146a.5.5 0 1 1 .708.708L5.707 10.7l1.823 1.823a.5.5 0 0 1-.708.708l-2-2a.5.5 0 0 1 0-.708l2-2zm2.292 0a.5.5 0 0 0-.708.708L10.293 10.7l-1.823 1.823a.5.5 0 1 0 .708.708l2-2a.5.5 0 0 0 0-.708l-2-2z"/> </svg> </div> <div class="cube-title">Responsive Design</div> <div class="cube-desc">Building sites that adapt to different screen sizes and devices</div> <button class="start-button">Continue Learning</button> </div> <div class="cube-face face-bottom"> <div class="cube-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 16 16"> <path d="M11.251.068a.5.5 0 0 1 .227.58L9.677 6.5H13a.5.5 0 0 1 .364.843l-8 8.5a.5.5 0 0 1-.842-.49L6.323 9.5H3a.5.5 0 0 1-.364-.843l8-8.5a.5.5 0 0 1 .615-.09z"/> </svg> </div> <div class="cube-title">CSS Animations</div> <div class="cube-desc">Creating transitions, keyframes and interactive effects</div> <button class="start-button">Continue Learning</button> </div> </div> <div class="cube-nav"> <div class="nav-dot active" data-face="front"></div> <div class="nav-dot" data-face="back"></div> <div class="nav-dot" data-face="right"></div> <div class="nav-dot" data-face="left"></div> <div class="nav-dot" data-face="top"></div> <div class="nav-dot" data-face="bottom"></div> </div> </div> <!-- Cube 3 --> <div class="cube-wrapper"> <div class="cube" id="cube3"> <div class="cube-face face-front"> <div class="cube-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 16 16"> <path d="M6.5 1A1.5 1.5 0 0 0 5 2.5V3H1.5A1.5 1.5 0 0 0 0 4.5v8A1.5 1.5 0 0 0 1.5 14h13a1.5 1.5 0 0 0 1.5-1.5v-8A1.5 1.5 0 0 0 14.5 3H11v-.5A1.5 1.5 0 0 0 9.5 1h-3zm0 1h3a.5.5 0 0 1 .5.5V3H6v-.5a.5.5 0 0 1 .5-.5zm1.886 6.914L15 7.151V12.5a.5.5 0 0 1-.5.5h-13a.5.5 0 0 1-.5-.5V7.15l6.614 1.764a1.5 1.5 0 0 0 .772 0zM1.5 4h13a.5.5 0 0 1 .5.5v1.616L8.129 7.948a.5.5 0 0 1-.258 0L1 6.116V4.5a.5.5 0 0 1 .5-.5z"/> </svg> </div> <div class="cube-title">JavaScript Core</div> <div class="cube-desc">Programming logic, DOM manipulation & interactivity</div> <div class="progress-circle"> <svg viewBox="0 0 36 36"> <circle class="background" cx="18" cy="18" r="16" stroke-dasharray="100" stroke-dashoffset="0"></circle> <circle class="progress" cx="18" cy="18" r="16" stroke-dasharray="100" stroke-dashoffset="100"></circle> </svg> <span class="percent">0%</span> </div> <span class="status-tag locked-tag">Locked</span> </div> <div class="cube-face face-back"> <div class="cube-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 16 16"> <path d="M5 8a1 1 0 1 1-2 0 1 1 0 0 1 2 0zm4 0a1 1 0 1 1-2 0 1 1 0 0 1 2 0zm3 1a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/> <path d="m2.165 15.803.02-.004c1.83-.363 2.948-.842 3.468-1.105A9.06 9.06 0 0 0 8 15c4.418 0 8-3.134 8-7s
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>E-commerce Explorer</title> <style> :root { --primary: #2A3D66; --secondary: #38B6FF; --accent: #FA7268; --light: #F8F9FB; --dark: #1A1E2A; --transition: 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', sans-serif; } body { background-color: var(--light); color: var(--dark); overflow-x: hidden; height: 100vh; width: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; } .container { width: 100%; max-width: 700px; height: 100%; max-height: 700px; padding: 20px; display: flex; flex-direction: column; overflow: hidden; } header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; } h1 { font-size: 1.8rem; font-weight: 700; color: var(--primary); letter-spacing: -0.5px; position: relative; } h1::after { content: ''; position: absolute; left: 0; bottom: -5px; width: 40px; height: 3px; background-color: var(--accent); border-radius: 2px; } .search-container { position: relative; width: 180px; } .search-input { width: 100%; padding: 10px 15px; border: none; border-radius: 25px; background-color: rgba(42, 61, 102, 0.05); transition: all 0.3s ease; outline: none; } .search-input:focus { background-color: white; box-shadow: 0 3px 10px rgba(42, 61, 102, 0.1); } .search-icon { position: absolute; right: 15px; top: 50%; transform: translateY(-50%); color: var(--primary); opacity: 0.7; } .categories { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); grid-gap: 20px; margin-bottom: 30px; } .cube-wrapper { perspective: 1000px; height: 150px; cursor: pointer; } .cube { position: relative; width: 100%; height: 100%; transform-style: preserve-3d; transition: transform var(--transition); } .cube-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; overflow: hidden; border-radius: 12px; display: flex; flex-direction: column; justify-content: flex-end; padding: 15px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); } .cube-front { background-size: cover; background-position: center; transform: rotateY(0deg); } .cube-back { background-color: white; transform: rotateY(180deg); padding: 15px; overflow-y: auto; } .cube.flipped { transform: rotateY(180deg); } .category-name { background: linear-gradient(to top, rgba(0, 0, 0, 0.7), transparent); border-radius: 0 0 12px 12px; margin: -15px; padding: 15px; color: white; font-weight: 600; font-size: 1rem; text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5); } .product-mini { display: flex; margin-bottom: 10px; align-items: center; } .product-mini img { width: 40px; height: 40px; object-fit: cover; border-radius: 5px; margin-right: 8px; } .product-info { flex: 1; } .product-name { font-size: 0.8rem; font-weight: 600; color: var(--dark); margin-bottom: 3px; } .product-price { font-size: 0.7rem; color: var(--accent); font-weight: 500; } .view-all { text-align: center; margin-top: 10px; font-size: 0.75rem; color: var(--secondary); text-decoration: none; font-weight: 600; display: block; } .info-bar { display: flex; align-items: center; background-color: white; padding: 15px; border-radius: 12px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05); opacity: 0; transform: translateY(20px); transition: all 0.5s ease; } .info-bar.visible { opacity: 1; transform: translateY(0); } .info-icon { width: 40px; height: 40px; background-color: rgba(56, 182, 255, 0.1); color: var(--secondary); display: flex; align-items: center; justify-content: center; border-radius: 50%; margin-right: 15px; flex-shrink: 0; } .info-text { flex: 1; } .info-title { font-weight: 600; margin-bottom: 3px; font-size: 0.9rem; } .info-desc { font-size: 0.8rem; color: #666; line-height: 1.4; } @media (max-width: 600px) { .categories { grid-template-columns: repeat(2, 1fr); } h1 { font-size: 1.5rem; } .search-container { width: 140px; } } /* Pulse animation for category hover */ @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(250, 114, 104, 0.7); } 70% { box-shadow: 0 0 0 10px rgba(250, 114, 104, 0); } 100% { box-shadow: 0 0 0 0 rgba(250, 114, 104, 0); } } .cube-wrapper:hover .cube-front { animation: pulse 1.5s infinite; } /* Custom scrollbar */ .cube-back::-webkit-scrollbar { width: 4px; } .cube-back::-webkit-scrollbar-track { background: #f1f1f1; } .cube-back::-webkit-scrollbar-thumb { background: var(--secondary); border-radius: 4px; } /* Sheen effect */ .cube-front::before { content: ''; position: absolute; top: -50%; left: -50%; width: 200%; height: 200%; background: linear-gradient( to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.3) 50%, rgba(255, 255, 255, 0) 100% ); transform: rotate(30deg); transition: transform 0.7s; } .cube-wrapper:hover .cube-front::before { transform: translate(-30%, -30%) rotate(30deg); } </style> </head> <body> <div class="container"> <header> <h1>Explore Products</h1> <div class="search-container"> <input type="text" class="search-input" placeholder="Search..."> <svg class="search-icon" width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M7 13A6 6 0 107 1a6 6 0 000 12z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> <path d="M15 15l-3-3" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> </svg> </div> </header> <div class="categories"> <div class="cube-wrapper"> <div class="cube"> <div class="cube-face cube-front" style="background-image: url('https://images.unsplash.com/photo-1505740420928-5e560c06d30e?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=300&q=80')"> <div class="category-name">Audio</div> </div> <div class="cube-face cube-back"> <div class="product-mini"> <img src="https://images.unsplash.com/photo-1572536147248-ac59a8abfa4b?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=100&q=80" alt="SoundWave X300"> <div class="product-info"> <div class="product-name">SoundWave X300</div> <div class="product-price">$199.99</div> </div> </div> <div class="product-mini"> <img src="https://images.unsplash.com/photo-1577174881658-0f30ed549adc?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=100&q=80" alt="AudioPlus Pro"> <div class="product-info"> <div class="product-name">AudioPlus Pro</div> <div class="product-price">$149.99</div> </div> </div> <div class="product-mini"> <img src="https://images.unsplash.com/photo-1585298723682-7115561c51b7?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=100&q=80" alt="BassKing TWS"> <div class="product-info"> <div class="product-name">BassKing TWS</div> <div class="product-price">$89.99</div> </div> </div> <a href="#" class="view-all">View all 18 items</a> </div> </div> </div> <div class="cube-wrapper"> <div class="cube"> <div class="cube-face cube-front" style="background-image: url('https://images.unsplash.com/photo-1517336714731-489689fd1ca8?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=300&q=80')"> <div class="category-name">Gadgets</div> </div> <div class="cube-face cube-back"> <div class="product-mini"> <img src="https://images.unsplash.com/photo-1523206489230-c012c64b2b48?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=100&q=80" alt="SmartLife Watch"> <div class="product-info"> <div class="product-name">SmartLife Watch</div> <div class="product-price">$249.99</div> </div> </div> <div class="product-mini"> <img src="https://images.unsplash.com/photo-1511300636408-a63a89df3482?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=100&q=80" alt="MiniDrone X1"> <div class="product-info"> <div class="product-name">MiniDrone X1</div> <div class="product-price">$129.99</div> </div> </div> <div class="product-mini"> <img src="https://images.unsplash.com/photo-1557438159-51eae76ae315?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=100&q=80" alt="HomeHub Controller"> <div class="product-info"> <div class="product-name">HomeHub Controller</div> <div class="product-price">$79.99</div> </div> </div> <a href="#" class="view-all">View all 24 items</a> </div> </div> </div> <div class="cube-wrapper"> <div class="cube"> <div class="cube-face cube-front" style="background-image: url('https://images.unsplash.com/photo-1560769629-975ec94e6a86?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=300&q=80')"> <div class="category-name">Fashion</div> </div> <div class="cube-face cube-back"> <div class="product-mini"> <img src="https://images.unsplash.com/photo-1588117305388-c2631a279f82?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=100&q=80" alt="Urban Sneakers"> <div class="product-info"> <div class="product-name">Urban Sneakers</div> <div class="product-price">$89.99</div> </div> </div> <div class="product-mini"> <img src="https://images.unsplash.com/photo-1591047139829-d91aecb6caea?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=100&q=80" alt="Pocket Watch"> <div class="product-info"> <div class="product-name">Vintage Jacket</div> <div class="product-price">$119.99</div> </div> </div> <div class="product-mini"> <img src="https://images.unsplash.com/photo-1523779105320-d1cd346ff52b?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=100&q=80" alt="Designer Glasses"> <div class="product-info"> <div class="product-name">Designer Glasses</div> <div class="product-price">$159.99</div> </div> </div> <a href="#" class="view-all">View all 42 items</a> </div> </div> </div> <div class="cube-wrapper"> <div class="cube"> <div class="cube-face cube-front" style="background-image: url('https://images.unsplash.com/photo-1554189097-ffe88e998a2b?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=300&q=80')"> <div class="category-name">Home</div> </div> <div class="cube-face cube-back"> <div class="product-mini"> <img src="https://images.unsplash.com/photo-1583847268964-b28dc8f51f92?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=100&q=80" alt="Nordic Lamp"> <div class="product-info"> <div class="product-name">Nordic Lamp</div> <div class="product-price">$59.99</div> </div> </div> <div class="product-mini"> <img src="https://images.unsplash.com/photo-1600585152220-90363fe7e115?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=100&q=80" alt="Minimalist Sofa"> <div class="product-info"> <div class="product-name">Minimalist Sofa</div> <div class="product-price">$799.99</div> </div> </div> <div class="product-mini"> <img src="https://images.unsplash.com/photo-1567016376408-0226e4d0c1ea?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=100&q=80" alt="Ceramic Vase"> <div class="product-info"> <div class="product-name">Ceramic Vase</div> <div class="product-price">$39.99</div> </div> </div> <a href="#" class="view-all">View all 36 items</a> </div> </div> </div> <div class="cube-wrapper"> <div class="cube"> <div class="cube-face cube-front" style="background-image: url('https://images.unsplash.com/photo-1531297484001-80022131f5a1?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=300&q=80')"> <div class="category-name">Tech</div> </div> <div class="cube-face cube-back"> <div class="product-mini"> <img src="https://images.unsplash.com/photo-1537498425277-c283d32ef9db?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=100&q=80" alt="UltraBook Pro"> <div class="product-info"> <div class="product-name">UltraBook Pro</div> <div class="product-price">$1299.99</div> </div> </div> <div class="product-mini"> <img src="https://images.unsplash.com/photo-1593642632823-8f785ba67e45?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=100&q=80" alt="4K Monitor"> <div class="product-info"> <div class="product-name">4K Monitor</div> <div class="product-price">$349.99</div> </div> </div> <div class="product-mini"> <img src="https://images.unsplash.com/photo-1617465781852-0b594e882dedixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=100&q=80" alt="Wireless Keyboard"> <div class="product-info"> <div class="product-name">Wireless Keyboard</div> <div class="product-price">$79.99</div> </div> </div> <a href="#" class="view-all">View all 29 items</a> </div> </div> </div> <div class="cube-wrapper"> <div class="cube"> <div class="cube-face cube-front" style="background-image: url('https://images.unsplash.com/photo-1603808033192-082d6919d3e1?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=300&q=80')"> <div class="category-name">Gaming</div> </div> <div class="cube-face cube-back"> <div class="product-mini"> <img src="https://images.unsplash.com/photo-1605979257913-1704eb7b6246?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=100&q=80" alt="Gaming Console"> <div class="product-info"> <div class="product-name">Gaming Console</div> <div class="product-price">$499.99</div> </div> </div> <div class="product-mini"> <img src="https://images.unsplash.com/photo-1600080972464-8e5f35f63d08?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=100&q=80" alt="Pro Controller"> <div class="product-info"> <div class="product-name">Pro Controller</div> <div class="product-price">$69.99</div> </div> </div> <div class="product-mini"> <img src="https://images.unsplash.com/photo-1591370874773-6702e8f12fd8?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=100&q=80" alt="Gaming Headset"> <div class="product-info"> <div class="product-name">Gaming Headset</div> <div class="product-price">$129.99</div> </div> </div> <a href="#" class="view-all">View all 21 items</a> </div> </div> </div> </div> <div class="info-bar"> <div class="info-icon"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M12 16V12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M12 8H12.01" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> </div> <div class="info-text"> <div class="info-title">Interactive Category Browser</div> <div class="info-desc">Click on any category cube to flip it and discover featured products. Each product shows real-time availability and pricing.</div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Initialize cubes const cubes = document.querySelectorAll('.cube-wrapper'); cubes.forEach(wrapper => { const cube = wrapper.querySelector('.cube'); wrapper.addEventListener('click', () => { cube.classList.toggle('flipped'); // Show info bar when first cube is flipped if (!document.querySelector('.info-bar').classList.contains('visible') && cube.classList.contains('flipped')) { setTimeout(() => { document.querySelector('.info-bar').classList.add('visible'); }, 500); } }); }); // Make search functional const searchInput = document.querySelector('.search-input'); searchInput.addEventListener('input', function() { const searchTerm = this.value.toLowerCase(); document.querySelectorAll('.cube-wrapper').forEach(wrapper => { const categoryName = wrapper.querySelector('.category-name').textContent.toLowerCase(); const products = Array.from(wrapper.querySelectorAll('.product-name')).map(el => el.textContent.toLowerCase()); const matchCategory = categoryName.includes(searchTerm); const matchProduct = products.some(product => product.includes(searchTerm)); if (searchTerm === '' || matchCategory || matchProduct) { wrapper.style.display = 'block'; } else { wrapper.style.display = 'none'; } }); }); // Prevent default on view all links document.querySelectorAll('.view-all').forEach(link => { link.addEventListener('click', (e) => { e.preventDefault(); // Here you would normally navigate to category page // Instead, just toggle the info bar for demo document.querySelector('.info-bar').classList.toggle('visible'); }); }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Healthcare Metrics Dashboard</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', sans-serif; } :root { --primary: #3a86ff; --success: #4CAF50; --warning: #FF9800; --danger: #f94144; --background: #f8f9fe; --cube-bg: rgba(255, 255, 255, 0.9); --card-bg: #ffffff; --text-primary: #2d3748; --text-secondary: #718096; --shadow-sm: 0 2px 5px rgba(0, 0, 0, 0.05); --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08); --shadow-lg: 0 10px 30px rgba(0, 0, 0, 0.12); --transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } html, body { width: 100%; height: 100%; background-color: var(--background); color: var(--text-primary); overflow-x: hidden; } .dashboard { max-width: 700px; height: 700px; margin: 0 auto; padding: 20px; display: flex; flex-direction: column; gap: 20px; overflow-y: auto; position: relative; } .dashboard-header { display: flex; justify-content: space-between; align-items: center; padding-bottom: 15px; border-bottom: 1px solid rgba(113, 128, 150, 0.2); } .dashboard-title { font-size: 1.5rem; font-weight: 700; color: var(--text-primary); } .time-filter { display: flex; gap: 10px; } .time-filter button { background: none; border: none; padding: 6px 12px; border-radius: 20px; font-size: 0.85rem; cursor: pointer; color: var(--text-secondary); transition: var(--transition); } .time-filter button.active { background-color: var(--primary); color: white; } .cubes-container { display: grid; grid-template-columns: repeat(2, 1fr); gap: 20px; } .cube { perspective: 1000px; height: 200px; position: relative; cursor: pointer; border-radius: 12px; overflow: hidden; transition: var(--transition); background: var(--card-bg); box-shadow: var(--shadow-sm); } .cube:hover { box-shadow: var(--shadow-md); transform: translateY(-5px); } .cube-inner { position: relative; width: 100%; height: 100%; text-align: center; transition: transform 0.8s; transform-style: preserve-3d; display: flex; flex-direction: column; justify-content: center; align-items: center; padding: 20px; } .cube-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; justify-content: center; align-items: center; padding: 20px; } .cube-front { background-color: var(--cube-bg); z-index: 2; } .cube-back { background-color: var(--cube-bg); transform: rotateY(180deg); overflow-y: auto; padding: 15px; } .cube.flipped .cube-inner { transform: rotateY(180deg); } .metric-value { font-size: 2.5rem; font-weight: 700; color: var(--text-primary); margin: 10px 0; transition: var(--transition); } .metric-title { font-size: 1rem; color: var(--text-secondary); margin-bottom: 10px; } .metric-change { font-size: 0.85rem; display: flex; align-items: center; gap: 5px; } .change-positive { color: var(--success); } .change-negative { color: var(--danger); } .metric-icon { width: 40px; height: 40px; display: flex; align-items: center; justify-content: center; border-radius: 10px; margin-bottom: 15px; } .detailed-list { width: 100%; text-align: left; font-size: 0.85rem; } .detailed-list-item { display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid rgba(113, 128, 150, 0.1); } .detailed-list-item:last-child { border-bottom: none; } .detailed-title { font-weight: 600; margin-bottom: 15px; text-align: center; font-size: 0.95rem; } .detailed-item-name { color: var(--text-primary); } .detailed-item-value { font-weight: 600; } .charts-container { display: grid; grid-template-columns: 1fr; gap: 20px; } .chart-card { background-color: var(--card-bg); border-radius: 12px; padding: 20px; box-shadow: var(--shadow-sm); height: 250px; transition: var(--transition); position: relative; } .chart-card:hover { box-shadow: var(--shadow-md); } .chart-header { display: flex; justify-content: space-between; margin-bottom: 15px; } .chart-title { font-size: 1rem; font-weight: 600; } .chart-legend { display: flex; gap: 15px; font-size: 0.8rem; } .legend-item { display: flex; align-items: center; gap: 5px; } .legend-color { width: 10px; height: 10px; border-radius: 50%; } .chart-canvas { width: 100%; height: calc(100% - 40px); } canvas { width: 100% !important; height: 100% !important; } .patient-trends { width: 100%; height: 100%; } @media (max-width: 600px) { .cubes-container { grid-template-columns: 1fr; } .dashboard { padding: 15px; } .cube { height: 180px; } .metric-value { font-size: 2rem; } } /* Animated 3D Pulse Effect for Cubes */ @keyframes pulse3D { 0% { transform: translateZ(0); } 50% { transform: translateZ(10px); } 100% { transform: translateZ(0); } } .cube-front .metric-icon { animation: pulse3D 3s infinite ease-in-out; } /* Gradient backgrounds for icons */ .patients-icon { background: linear-gradient(135deg, #3a86ff20, #3a86ff40); color: var(--primary); } .admission-icon { background: linear-gradient(135deg, #f9414420, #f9414440); color: var(--danger); } .satisfaction-icon { background: linear-gradient(135deg, #4CAF5020, #4CAF5040); color: var(--success); } .waittime-icon { background: linear-gradient(135deg, #FF980020, #FF980040); color: var(--warning); } /* Loading animation */ .loading-container { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(248, 249, 254, 0.8); display: flex; justify-content: center; align-items: center; z-index: 1000; opacity: 1; transition: opacity 0.5s ease; } .loading-spinner { width: 50px; height: 50px; border: 5px solid rgba(58, 134, 255, 0.2); border-radius: 50%; border-top: 5px solid var(--primary); animation: spin 1s linear infinite; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .fade-out { opacity: 0; pointer-events: none; } /* Tooltip */ .tooltip { position: absolute; background-color: rgba(45, 55, 72, 0.95); color: white; padding: 8px 12px; border-radius: 6px; font-size: 0.8rem; pointer-events: none; opacity: 0; transition: opacity 0.2s; z-index: 1000; max-width: 200px; box-shadow: var(--shadow-md); } .tooltip.visible { opacity: 1; } </style> </head> <body> <div id="tooltip" class="tooltip"></div> <div class="loading-container" id="loadingContainer"> <div class="loading-spinner"></div> </div> <div class="dashboard"> <div class="dashboard-header"> <h1 class="dashboard-title">Clinical Metrics Dashboard</h1> <div class="time-filter"> <button data-period="day" class="time-btn">Day</button> <button data-period="week" class="time-btn active">Week</button> <button data-period="month" class="time-btn">Month</button> </div> </div> <div class="cubes-container"> <div class="cube" data-metric="patients"> <div class="cube-inner"> <div class="cube-face cube-front"> <div class="metric-icon patients-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path><circle cx="9" cy="7" r="4"></circle><path d="M23 21v-2a4 4 0 0 0-3-3.87"></path><path d="M16 3.13a4 4 0 0 1 0 7.75"></path></svg> </div> <h3 class="metric-title">Active Patients</h3> <div class="metric-value">247</div> <div class="metric-change change-positive"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="18 15 12 9 6 15"></polyline></svg> 12% from last week </div> </div> <div class="cube-face cube-back"> <h4 class="detailed-title">Active Patients by Department</h4> <div class="detailed-list"> <div class="detailed-list-item"> <span class="detailed-item-name">Cardiology</span> <span class="detailed-item-value">68</span> </div> <div class="detailed-list-item"> <span class="detailed-item-name">Neurology</span> <span class="detailed-item-value">52</span> </div> <div class="detailed-list-item"> <span class="detailed-item-name">Orthopedics</span> <span class="detailed-item-value">44</span> </div> <div class="detailed-list-item"> <span class="detailed-item-name">Oncology</span> <span class="detailed-item-value">41</span> </div> <div class="detailed-list-item"> <span class="detailed-item-name">Other</span> <span class="detailed-item-value">42</span> </div> </div> </div> </div> </div> <div class="cube" data-metric="admissions"> <div class="cube-inner"> <div class="cube-face cube-front"> <div class="metric-icon admission-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="2" width="20" height="8" rx="2" ry="2"></rect><rect x="2" y="14" width="20" height="8" rx="2" ry="2"></rect><line x1="6" y1="6" x2="6.01" y2="6"></line><line x1="6" y1="18" x2="6.01" y2="18"></line></svg> </div> <h3 class="metric-title">Weekly Admissions</h3> <div class="metric-value">83</div> <div class="metric-change change-positive"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="18 15 12 9 6 15"></polyline></svg> 8% from previous week </div> </div> <div class="cube-face cube-back"> <h4 class="detailed-title">Admission Types</h4> <div class="detailed-list"> <div class="detailed-list-item"> <span class="detailed-item-name">Emergency</span> <span class="detailed-item-value">31</span> </div> <div class="detailed-list-item"> <span class="detailed-item-name">Planned Surgery</span> <span class="detailed-item-value">25</span> </div> <div class="detailed-list-item"> <span class="detailed-item-name">Transfer</span> <span class="detailed-item-value">12</span> </div> <div class="detailed-list-item"> <span class="detailed-item-name">Outpatient</span> <span class="detailed-item-value">15</span> </div> </div> </div> </div> </div> <div class="cube" data-metric="satisfaction"> <div class="cube-inner"> <div class="cube-face cube-front"> <div class="metric-icon satisfaction-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg> </div> <h3 class="metric-title">Patient Satisfaction</h3> <div class="metric-value">92%</div> <div class="metric-change change-positive"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="18 15 12 9 6 15"></polyline></svg> 3% from last quarter </div> </div> <div class="cube-face cube-back"> <h4 class="detailed-title">Satisfaction by Category</h4> <div class="detailed-list"> <div class="detailed-list-item"> <span class="detailed-item-name">Staff Communication</span> <span class="detailed-item-value">94%</span> </div> <div class="detailed-list-item"> <span class="detailed-item-name">Facility Cleanliness</span> <span class="detailed-item-value">96%</span> </div> <div class="detailed-list-item"> <span class="detailed-item-name">Treatment Outcomes</span> <span class="detailed-item-value">89%</span> </div> <div class="detailed-list-item"> <span class="detailed-item-name">Billing Process</span> <span class="detailed-item-value">85%</span> </div> </div> </div> </div> </div> <div class="cube" data-metric="waittime"> <div class="cube-inner"> <div class="cube-face cube-front"> <div class="metric-icon waittime-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg> </div> <h3 class="metric-title">Avg. Wait Time</h3> <div class="metric-value">24m</div> <div class="metric-change change-negative"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"></polyline></svg> 10% from last week </div> </div> <div class="cube-face cube-back"> <h4 class="detailed-title">Wait Times by Department</h4> <div class="detailed-list"> <div class="detailed-list-item"> <span class="detailed-item-name">Emergency</span> <span class="detailed-item-value">36m</span> </div> <div class="detailed-list-item"> <span class="detailed-item-name">Radiology</span> <span class="detailed-item-value">19m</span> </div> <div class="detailed-list-item"> <span class="detailed-item-name">Laboratory</span> <span class="detailed-item-value">14m</span> </div> <div class="detailed-list-item"> <span class="detailed-item-name">Outpatient</span> <span class="detailed-item-value">27m</span> </div> </div> </div> </div> </div> </div> <div class="charts-container"> <div class="chart-card"> <div class="chart-header"> <div class="chart-title">Patient Trends (Last 7 Days)</div> <div class="chart-legend"> <div class="legend-item"> <div class="legend-color" style="background-color: rgba(58, 134, 255, 0.8);"></div> <span>Admissions</span> </div> <div class="legend-item"> <div class="legend-color" style="background-color: rgba(249, 65, 68, 0.8);"></div> <span>Discharges</span> </div> </div> </div> <div class="chart-canvas"> <canvas id="patientTrends"></canvas> </div> </div> </div> </div> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <script> document.addEventListener('DOMContentLoaded', () => { // Hide loading screen after content is loaded setTimeout(() => { document.getElementById('loadingContainer').classList.add('fade-out'); }, 1500); // Initialize time filter const timeButtons = document.querySelectorAll('.time-btn'); timeButtons.forEach(button => { button.addEventListener('click', () => { // Remove active class from all buttons timeButtons.forEach(btn => btn.classList.remove('active')); // Add active class to clicked button button.classList.add('active'); // Update metrics based on selected time period updateMetrics(button.dataset.period); }); }); // Cube flip functionality const cubes = document.querySelectorAll('.cube'); cubes.forEach(cube => { cube.addEventListener('click', () => { cube.classList.toggle('flipped'); }); // Show tooltip on hover cube.addEventListener('mouseenter', (e) => { const metric = cube.dataset.metric; let tooltipText = ''; switch(metric) { case 'patients': tooltipText = 'Total number of patients currently receiving care in our facility'; break; case 'admissions': tooltipText = 'New patients admitted during the selected time period'; break; case 'satisfaction': tooltipText = 'Overall patient satisfaction score based on post-care surveys'; break; case 'waittime': tooltipText = 'Average time patients wait before receiving care'; break; } showTooltip(e, tooltipText); }); cube.addEventListener('mousemove', (e) => { const tooltip = document.getElementById('tooltip'); if (tooltip.classList.contains('visible')) { positionTooltip(e); } }); cube.addEventListener('mouseleave', () => { hideTooltip(); }); }); // Initialize chart const ctx = document.getElementById('patientTrends').getContext('2d'); const chart = new Chart(ctx, { type: 'line', data: { labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], datasets: [ { label: 'Admissions', data: [12, 19, 14, 15, 12, 8, 13], borderColor: 'rgba(58, 134, 255, 0.8)', backgroundColor: 'rgba(58, 134, 255, 0.2)', borderWidth: 2, tension: 0.3, pointBackgroundColor: 'rgba(58, 134, 255, 1)', pointRadius: 4, pointHoverRadius: 6, }, { label: 'Discharges', data: [8, 15, 12, 14, 10, 7, 11], borderColor: 'rgba(249, 65, 68, 0.8)', backgroundColor: 'rgba(249, 65, 68, 0.2)', borderWidth: 2, tension: 0.3, pointBackgroundColor: 'rgba(249, 65, 68, 1)', pointRadius: 4, pointHoverRadius: 6, } ] }, options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false }, tooltip: { mode: 'index', intersect: false, backgroundColor: 'rgba(45, 55, 72, 0.9)', padding: 10, cornerRadius: 6, caretSize: 6, titleFont: { size: 14, weight: 'bold' }, bodyFont: { size: 13 } } }, scales: { y: { beginAtZero: true, grid: { color: 'rgba(113, 128, 150, 0.1)', }, ticks: { font: { size: 11 } } }, x: { grid: { display: false }, ticks: { font: { size: 11 } } } } } }); // Tooltip functionality function showTooltip(e, text) { const tooltip = document.getElementById('tooltip'); tooltip.textContent = text; tooltip.classList.add('visible'); positionTooltip(e); } function positionTooltip(e) { const tooltip = document.getElementById('tooltip'); const tooltipWidth = tooltip.offsetWidth; const windowWidth = window.innerWidth; let left = e.pageX + 15; // Check if tooltip would go off screen if (left + tooltipWidth > windowWidth - 20) { left = e.pageX - tooltipWidth - 15; } tooltip.style.left = `${left}px`; tooltip.style.top = `${e.pageY + 15}px`; } function hideTooltip() { const tooltip = document.getElementById('tooltip'); tooltip.classList.remove('visible'); } // Function to update metrics based on selected time period function updateMetrics(period) { // This would normally fetch data from an API based on the period // For demo purposes, we'll just simulate changes let patientsData, admissionsData, satisfactionData, waitTimeData; switch(period) { case 'day': patientsData = { value: '238', change: '5%', changeType: 'positive' }; admissionsData = { value: '22', change: '12%', changeType: 'positive' }; satisfactionData = { value: '90%', change: '1%', changeType: 'positive' }; waitTimeData = { value: '18m', change: '15%', changeType: 'positive' }; updateChart([5, 8, 6, 10, 7, 4, 6], [4, 6, 5, 7, 6, 3, 5]); break; case 'week': patientsData = { value: '247', change: '12%', changeType: 'positive' }; admissionsData = { value: '83', change: '8%', changeType: 'positive' }; satisfactionData = { value: '92%', change: '3%', changeType: 'positive' }; waitTimeData = { value: '24m', change: '10%', changeType: 'negative' }; updateChart([12, 19, 14, 15, 12, 8, 13], [8, 15, 12, 14, 10, 7, 11]); break; case 'month': patientsData = { value: '312', change: '18%', changeType: 'positive' }; admissionsData = { value: '356', change: '5%', changeType: 'negative' }; satisfactionData = { value: '94%', change: '5%', changeType: 'positive' }; waitTimeData = { value: '32m', change: '25%', changeType: 'negative' }; updateChart([42, 48, 53, 45, 58, 62, 60], [38, 43, 49, 42, 52, 56, 55]); break; } updateMetricDisplay('patients', patientsData); updateMetricDisplay('admissions', admissionsData); updateMetricDisplay('satisfaction', satisfactionData); updateMetricDisplay('waittime', waitTimeData); } function updateMetricDisplay(metricId, data) { const cube = document.querySelector(`.cube[data-metric="${metricId}"]`); const valueEl = cube.querySelector('.metric-value'); const changeEl = cube.querySelector('.metric-change'); // Animate value change animateValue(valueEl, valueEl.textContent, data.value, 800); // Update change indicator changeEl.textContent = data.change + (metricId === 'waittime' ? ' from last week' : ' from last week'); changeEl.className = `metric-change change-${data.changeType}`; // Update icon const iconSvg = changeEl.querySelector('svg'); if (iconSvg) { iconSvg.outerHTML = data.changeType === 'positive' ? '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="18 15 12 9 6 15"></polyline></svg>' : '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"></polyline></svg>'; } } function updateChart(admissionsData, dischargesData) { const chart = Chart.getChart('patientTrends'); if (chart) { chart.data.datasets[0].data = admissionsData; chart.data.datasets[1].data = dischargesData; chart.update(); } } function animateValue(element, start, end, duration) { // Handle numeric values with possible text suffixes const numericRegex = /^(\d+)(.*)$/; const startMatch = String(start).match(numericRegex); const endMatch = String(end).match(numericRegex); if (!startMatch || !endMatch) { element.textContent = end; return; } const startNum = parseInt(startMatch[1]); const endNum = parseInt(endMatch[1]); const suffix = endMatch[2]; // Suffix like 'm', '%', etc. let startTime = null; function animation(currentTime) { if (startTime === null) startTime = currentTime; const timeElapsed = currentTime - startTime; const progress = Math.min(timeElapsed / duration, 1); const value = Math.floor(startNum + progress * (endNum - startNum)); element.textContent = value + suffix; if (timeElapsed < duration) { requestAnimationFrame(animation); } } requestAnimationFrame(animation); } }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Smart Home Control Hub</title> <style> :root { --primary: #0a1c3d; --secondary: #1e3a70; --accent: #00ddff; --accent-dim: #00ddff30; --text: #e9f0ff; --success: #00cc66; --warning: #ffaa00; --danger: #ff4455; --inactive: #475879; --cube-size: 120px; --cube-gap: 20px; --transition-time: 0.3s; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { background: linear-gradient(135deg, var(--primary), #000516); color: var(--text); display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; padding: 1rem; overflow-x: hidden; } .container { width: 100%; max-width: 700px; height: 700px; display: flex; flex-direction: column; position: relative; overflow: hidden; } header { padding: 1rem 0; text-align: center; position: relative; z-index: 10; } h1 { font-size: 1.8rem; font-weight: 300; letter-spacing: 1px; margin-bottom: 0.5rem; background: linear-gradient(90deg, var(--accent), #4d9fff); -webkit-background-clip: text; -webkit-text-fill-color: transparent; } .status-bar { background: rgba(6, 24, 56, 0.7); border-radius: 30px; padding: 0.5rem 1rem; margin: 0 auto 1rem; display: flex; align-items: center; justify-content: center; gap: 1rem; width: fit-content; backdrop-filter: blur(5px); border: 1px solid rgba(255, 255, 255, 0.1); box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); } .status-indicator { width: 10px; height: 10px; border-radius: 50%; background-color: var(--success); box-shadow: 0 0 10px var(--success); animation: pulse 2s infinite; } .status-text { font-size: 0.9rem; font-weight: 300; } .time { font-size: 1.1rem; font-weight: 600; margin-left: 1rem; opacity: 0.8; } .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(var(--cube-size), 1fr)); gap: var(--cube-gap); justify-content: center; align-content: center; padding: 1rem; flex-grow: 1; max-width: 600px; margin: 0 auto; } .cube { width: 100%; aspect-ratio: 1/1; position: relative; transform-style: preserve-3d; transition: transform var(--transition-time) ease; cursor: pointer; transform: translateZ(0); } .cube:hover { transform: scale(1.05) translateZ(0); } .cube.active { animation: activateCube 0.5s forwards; } .face { position: absolute; width: 100%; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; border-radius: 16px; background: linear-gradient(145deg, var(--secondary), var(--primary)); box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); backface-visibility: hidden; border: 1px solid rgba(255, 255, 255, 0.1); padding: 1rem; text-align: center; overflow: hidden; } .face::before { content: ''; position: absolute; top: -50%; left: -50%; width: 200%; height: 200%; background: radial-gradient(circle at center, var(--accent-dim) 0%, transparent 50%); opacity: 0; transition: opacity 0.5s ease; z-index: 0; pointer-events: none; } .cube:hover .face::before { opacity: 0.5; } .cube.active .face::before { opacity: 0.8; animation: pulse-ring 1.5s infinite; } .icon { font-size: 2.5rem; margin-bottom: 0.5rem; position: relative; z-index: 1; transition: all 0.3s ease; } .cube.active .icon { color: var(--accent); text-shadow: 0 0 10px var(--accent); } .device-name { font-size: 1rem; font-weight: 500; margin-bottom: 0.5rem; position: relative; z-index: 1; } .device-status { font-size: 0.8rem; color: var(--inactive); transition: all 0.3s ease; position: relative; z-index: 1; } .cube.active .device-status { color: var(--text); } .status-dot { width: 8px; height: 8px; border-radius: 50%; background-color: var(--inactive); display: inline-block; margin-right: 5px; transition: all 0.3s ease; } .cube.active .status-dot { background-color: var(--success); box-shadow: 0 0 10px var(--success); } .floating-menu { position: absolute; bottom: 1rem; left: 50%; transform: translateX(-50%); background: rgba(6, 24, 56, 0.8); backdrop-filter: blur(10px); padding: 0.8rem 1.5rem; border-radius: 50px; display: flex; gap: 1.5rem; align-items: center; justify-content: center; border: 1px solid rgba(255, 255, 255, 0.1); box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3); z-index: 100; } .menu-button { background: none; border: none; color: var(--text); font-size: 1.2rem; cursor: pointer; opacity: 0.7; transition: all 0.3s ease; position: relative; } .menu-button:hover { opacity: 1; transform: translateY(-3px); } .menu-button.active { color: var(--accent); opacity: 1; } .menu-button.active::after { content: ''; position: absolute; bottom: -10px; left: 50%; transform: translateX(-50%); width: 5px; height: 5px; border-radius: 50%; background-color: var(--accent); box-shadow: 0 0 10px var(--accent); } .detail-panel { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(6, 24, 56, 0.95); backdrop-filter: blur(10px); z-index: 200; padding: 2rem; display: flex; flex-direction: column; transform: translateY(100%); transition: transform 0.5s cubic-bezier(0.16, 1, 0.3, 1); border-radius: 20px; } .detail-panel.active { transform: translateY(0); } .close-panel { position: absolute; top: 1rem; right: 1rem; background: none; border: none; color: var(--text); font-size: 1.5rem; cursor: pointer; opacity: 0.7; transition: all 0.3s ease; z-index: 1; } .close-panel:hover { opacity: 1; transform: rotate(90deg); } .device-detail-header { display: flex; align-items: center; gap: 1rem; margin-bottom: 2rem; } .detail-icon { font-size: 2rem; background: linear-gradient(135deg, var(--secondary), var(--primary)); width: 60px; height: 60px; display: flex; align-items: center; justify-content: center; border-radius: 16px; box-shadow: 0 8px 20px rgba(0, 0, 0, 0.2); } .detail-title { font-size: 1.5rem; font-weight: 500; } .detail-subtitle { font-size: 0.9rem; opacity: 0.7; } .detail-controls { display: flex; flex-direction: column; gap: 1.5rem; margin-top: 1rem; } .control-group { background: rgba(255, 255, 255, 0.05); border-radius: 16px; padding: 1rem; border: 1px solid rgba(255, 255, 255, 0.1); } .control-name { font-size: 0.9rem; margin-bottom: 0.8rem; display: flex; justify-content: space-between; align-items: center; } .control-value { font-size: 0.8rem; color: var(--accent); } .slider { width: 100%; -webkit-appearance: none; height: 6px; background: rgba(255, 255, 255, 0.1); border-radius: 5px; outline: none; } .slider::-webkit-slider-thumb { -webkit-appearance: none; width: 18px; height: 18px; border-radius: 50%; background: var(--accent); cursor: pointer; box-shadow: 0 0 10px var(--accent); } .toggle-switch { position: relative; display: inline-block; width: 50px; height: 26px; } .toggle-switch input { opacity: 0; width: 0; height: 0; } .toggle-slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(255, 255, 255, 0.2); transition: .4s; border-radius: 34px; } .toggle-slider:before { position: absolute; content: ""; height: 20px; width: 20px; left: 3px; bottom: 3px; background-color: white; transition: .4s; border-radius: 50%; } input:checked + .toggle-slider { background-color: var(--accent); } input:checked + .toggle-slider:before { transform: translateX(24px); } .mode-buttons { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.5rem; margin-top: 0.5rem; } .mode-button { background: rgba(255, 255, 255, 0.1); border: 1px solid rgba(255, 255, 255, 0.15); border-radius: 8px; padding: 0.5rem; color: var(--text); font-size: 0.8rem; cursor: pointer; transition: all 0.3s ease; } .mode-button:hover { background: rgba(255, 255, 255, 0.2); } .mode-button.active { background: var(--accent-dim); border-color: var(--accent); color: var(--accent); box-shadow: 0 0 10px var(--accent-dim); } .background-effects { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: -1; overflow: hidden; } .bg-circle { position: absolute; border-radius: 50%; background: radial-gradient(circle, var(--accent-dim), transparent 70%); opacity: 0.3; filter: blur(30px); } .circle-1 { width: 300px; height: 300px; top: -100px; right: -100px; } .circle-2 { width: 400px; height: 400px; bottom: -200px; left: -200px; opacity: 0.2; } @keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(0, 204, 102, 0.7); } 70% { box-shadow: 0 0 0 5px rgba(0, 204, 102, 0); } 100% { box-shadow: 0 0 0 0 rgba(0, 204, 102, 0); } } @keyframes activateCube { 0% { transform: scale(1) rotateY(0deg); } 50% { transform: scale(1.1) rotateY(180deg); } 100% { transform: scale(1.05) rotateY(360deg); } } @keyframes pulse-ring { 0% { opacity: 0.6; } 50% { opacity: 0.3; } 100% { opacity: 0.6; } } @media (max-width: 600px) { :root { --cube-size: 100px; --cube-gap: 15px; } .floating-menu { padding: 0.6rem 1rem; gap: 1rem; } .menu-button { font-size: 1rem; } h1 { font-size: 1.5rem; } .grid { padding: 0.5rem; } } @media (max-width: 400px) { :root { --cube-size: 80px; --cube-gap: 10px; } .device-name { font-size: 0.8rem; } .device-status { font-size: 0.7rem; } .icon { font-size: 1.8rem; } } </style> </head> <body> <div class="container"> <div class="background-effects"> <div class="bg-circle circle-1"></div> <div class="bg-circle circle-2"></div> </div> <header> <h1>NEXUS HOME</h1> <div class="status-bar"> <div class="status-indicator"></div> <div class="status-text">System online</div> <div class="time" id="current-time">21:35</div> </div> </header> <div class="grid"> <div class="cube" data-device="lighting"> <div class="face"> <div class="icon">💡</div> <div class="device-name">Lighting</div> <div class="device-status"><span class="status-dot"></span> 4 lights active</div> </div> </div> <div class="cube" data-device="climate"> <div class="face"> <div class="icon">🌡️</div> <div class="device-name">Climate</div> <div class="device-status"><span class="status-dot"></span> 22°C | 45% humidity</div> </div> </div> <div class="cube" data-device="security"> <div class="face"> <div class="icon">🔒</div> <div class="device-name">Security</div> <div class="device-status"><span class="status-dot"></span> All systems secure</div> </div> </div> <div class="cube" data-device="entertainment"> <div class="face"> <div class="icon">🎮</div> <div class="device-name">Entertainment</div> <div class="device-status"><span class="status-dot"></span> 3 devices connected</div> </div> </div> <div class="cube" data-device="energy"> <div class="face"> <div class="icon">⚡</div> <div class="device-name">Energy</div> <div class="device-status"><span class="status-dot"></span> 3.2 kWh today</div> </div> </div> <div class="cube" data-device="scenes"> <div class="face"> <div class="icon">🌙</div> <div class="device-name">Scenes</div> <div class="device-status"><span class="status-dot"></span> Evening mode ready</div> </div> </div> </div> <div class="floating-menu"> <button class="menu-button active" data-view="home"> <i>🏠</i> </button> <button class="menu-button" data-view="favorites"> <i>⭐</i> </button> <button class="menu-button" data-view="automation"> <i>⚙️</i> </button> <button class="menu-button" data-view="settings"> <i>🔧</i> </button> </div> <!-- Lighting Detail Panel --> <div class="detail-panel" id="lighting-panel"> <button class="close-panel">×</button> <div class="device-detail-header"> <div class="detail-icon">💡</div> <div> <div class="detail-title">Lighting Control</div> <div class="detail-subtitle">Manage all connected lights</div> </div> </div> <div class="detail-controls"> <div class="control-group"> <div class="control-name"> Main power <label class="toggle-switch"> <input type="checkbox" id="lighting-power" checked> <span class="toggle-slider"></span> </label> </div> </div> <div class="control-group"> <div class="control-name"> Brightness <span class="control-value" id="brightness-value">75%</span> </div> <input type="range" min="0" max="100" value="75" class="slider" id="brightness-slider"> </div> <div class="control-group"> <div class="control-name"> Color temperature <span class="control-value" id="temperature-value">Neutral</span> </div> <input type="range" min="0" max="100" value="50" class="slider" id="temperature-slider"> </div> <div class="control-group"> <div class="control-name">Lighting mode</div> <div class="mode-buttons"> <button class="mode-button" data-mode="work">Work</button> <button class="mode-button active" data-mode="relax">Relax</button> <button class="mode-button" data-mode="movie">Movie</button> <button class="mode-button" data-mode="party">Party</button> <button class="mode-button" data-mode="night">Night</button> <button class="mode-button" data-mode="custom">Custom</button> </div> </div> </div> </div> <!-- Climate Detail Panel --> <div class="detail-panel" id="climate-panel"> <button class="close-panel">×</button> <div class="device-detail-header"> <div class="detail-icon">🌡️</div> <div> <div class="detail-title">Climate Control</div> <div class="detail-subtitle">Manage temperature and air quality</div> </div> </div> <div class="detail-controls"> <div class="control-group"> <div class="control-name"> HVAC System <label class="toggle-switch"> <input type="checkbox" id="climate-power" checked> <span class="toggle-slider"></span> </label> </div> </div> <div class="control-group"> <div class="control-name"> Temperature target <span class="control-value" id="temp-value">22°C</span> </div> <input type="range" min="16" max="30" value="22" class="slider" id="temp-slider"> </div> <div class="control-group"> <div class="control-name"> Fan speed <span class="control-value" id="fan-value">Auto</span> </div> <input type="range" min="0" max="4" value="0" class="slider" id="fan-slider"> </div> <div class="control-group"> <div class="control-name">Climate mode</div> <div class="mode-buttons"> <button class="mode-button active" data-mode="auto">Auto</button> <button class="mode-button" data-mode="cool">Cool</button> <button class="mode-button" data-mode="heat">Heat</button> <button class="mode-button" data-mode="fan">Fan</button> <button class="mode-button" data-mode="dry">Dry</button> </div> </div> </div> </div> </div> <script> // Update the current time function updateTime() { const now = new Date(); const hours = now.getHours().toString().padStart(2, '0'); const minutes = now.getMinutes().toString().padStart(2, '0'); document.getElementById('current-time').textContent = `${hours}:${minutes}`; } updateTime(); setInterval(updateTime, 60000); // Cube interactions const cubes = document.querySelectorAll('.cube'); cubes.forEach(cube => { cube.addEventListener('click', () => { const deviceType = cube.getAttribute('data-device'); // Toggle active state for visual feedback if (!cube.classList.contains('active')) { cubes.forEach(c => c.classList.remove('active')); cube.classList.add('active'); } // Show appropriate detail panel const panel = document.getElementById(`${deviceType}-panel`); if (panel) { document.querySelectorAll('.detail-panel').forEach(p => { p.classList.remove('active'); }); panel.classList.add('active'); } }); }); // Close panel buttons const closeButtons = document.querySelectorAll('.close-panel'); closeButtons.forEach(button => { button.addEventListener('click', () => { const panel = button.closest('.detail-panel'); panel.classList.remove('active'); // Remove active state from cubes cubes.forEach(cube => { cube.classList.remove('active'); }); }); }); // Menu buttons const menuButtons = document.querySelectorAll('.menu-button'); menuButtons.forEach(button => { button.addEventListener('click', () => { menuButtons.forEach(b => b.classList.remove('active')); button.classList.add('active'); // For demo purposes, we're not actually changing views // This would typically load different content }); }); // Lighting control panel interactions const brightnessSlider = document.getElementById('brightness-slider'); const brightnessValue = document.getElementById('brightness-value'); brightnessSlider.addEventListener('input', () => { const value = brightnessSlider.value; brightnessValue.textContent = `${value}%`; }); const temperatureSlider = document.getElementById('temperature-slider'); const temperatureValue = document.getElementById('temperature-value'); temperatureSlider.addEventListener('input', () => { const value = temperatureSlider.value; let tempDesc; if (value < 20) { tempDesc = "Cool"; } else if (value < 40) { tempDesc = "Daylight"; } else if (value < 60) { tempDesc = "Neutral"; } else if (value < 80) { tempDesc = "Warm"; } else { tempDesc = "Cozy"; } temperatureValue.textContent = tempDesc; }); // Climate control panel interactions const tempSlider = document.getElementById('temp-slider'); const tempValue = document.getElementById('temp-value'); tempSlider.addEventListener('input', () => { const value = tempSlider.value; tempValue.textContent = `${value}°C`; }); const fanSlider = document.getElementById('fan-slider'); const fanValue = document.getElementById('fan-value'); fanSlider.addEventListener('input', () => { const value = parseInt(fanSlider.value); let fanDesc; switch(value) { case 0: fanDesc = "Auto"; break; case 1: fanDesc = "Low"; break; case 2: fanDesc = "Medium"; break; case 3: fanDesc = "High"; break; case 4: fanDesc = "Turbo"; break; default: fanDesc = "Auto"; } fanValue.textContent = fanDesc; }); // Mode buttons const modeButtons = document.querySelectorAll('.mode-button'); modeButtons.forEach(button => { button.addEventListener('click', (e) => { // Find all mode buttons in the same group const group = button.closest('.mode-buttons'); group.querySelectorAll('.mode-button').forEach(b => { b.classList.remove('active'); }); button.classList.add('active'); }); }); // Toggle switches const toggles = document.querySelectorAll('.toggle-switch input'); toggles.forEach(toggle => { toggle.addEventListener('change', () => { // In a real app, this would control the actual device // For demo, we're just toggling the class on parent cube const panelId = toggle.closest('.detail-panel').id; const deviceType = panelId.split('-')[0]; const cube = document.querySelector(`.cube[data-device="${deviceType}"]`); if (toggle.checked) { cube.classList.add('active'); } else { cube.classList.remove('active'); } }); }); // Simulate initial device statuses window.addEventListener('load', () => { // Randomly activate some devices const randomDevices = ['lighting', 'climate', 'security']; randomDevices.forEach(device => { const cube = document.querySelector(`.cube[data-device="${device}"]`); if (Math.random() > 0.5) { cube.classList.add('active'); } }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Portfolio Cube Analytics</title> <style> :root { --primary: #1e3a8a; --secondary: #0ea5e9; --tertiary: #f97316; --quaternary: #10b981; --dark: #0f172a; --light: #f8fafc; --gray: #64748b; --danger: #ef4444; --success: #22c55e; --neutral: #e2e8f0; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; } body { background-color: var(--dark); color: var(--light); min-height: 100vh; display: flex; flex-direction: column; align-items: center; justify-content: flex-start; padding: 1.5rem; max-width: 700px; margin: 0 auto; overflow-x: hidden; } header { width: 100%; margin-bottom: 1.5rem; } h1 { font-size: 1.8rem; margin-bottom: 0.5rem; background: linear-gradient(90deg, var(--secondary), var(--quaternary)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; text-align: center; } .subtitle { font-size: 0.9rem; color: var(--gray); margin-bottom: 1rem; text-align: center; } .metrics-summary { display: flex; justify-content: space-between; margin-bottom: 1.5rem; gap: 1rem; width: 100%; } .metric { background: rgba(30, 58, 138, 0.3); border-radius: 8px; padding: 0.75rem; flex: 1; border: 1px solid rgba(255, 255, 255, 0.1); text-align: center; } .metric-value { font-size: 1.4rem; font-weight: 700; margin-bottom: 0.25rem; } .metric-label { font-size: 0.75rem; color: var(--gray); } .up { color: var(--success); } .down { color: var(--danger); } .portfolio-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 1.25rem; width: 100%; perspective: 1000px; } .cube-container { aspect-ratio: 1/1; cursor: pointer; position: relative; transform-style: preserve-3d; transition: transform 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275); } .cube-face { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border-radius: 12px; padding: 1rem; backface-visibility: hidden; display: flex; flex-direction: column; justify-content: space-between; box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); transition: transform 0.6s, box-shadow 0.3s; } .cube-container:hover { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); } .cube-front { transform: rotateY(0deg); background: linear-gradient(135deg, rgba(14, 165, 233, 0.2), rgba(30, 58, 138, 0.4)); border: 1px solid rgba(14, 165, 233, 0.3); } .cube-back { transform: rotateY(180deg); background: linear-gradient(135deg, rgba(16, 185, 129, 0.2), rgba(30, 58, 138, 0.4)); border: 1px solid rgba(16, 185, 129, 0.3); } .flipped { transform: rotateY(180deg); } .segment-title { font-size: 1rem; font-weight: 600; margin-bottom: 0.5rem; } .segment-allocation { font-size: 1.5rem; font-weight: 700; margin-bottom: 0.5rem; color: var(--secondary); } .segment-info { display: flex; justify-content: space-between; font-size: 0.75rem; color: var(--gray); } .performance-data h3 { font-size: 1rem; margin-bottom: 0.75rem; color: var(--quaternary); } .performance-metric { display: flex; justify-content: space-between; margin-bottom: 0.5rem; font-size: 0.85rem; } .performance-label { color: var(--gray); } .performance-value { font-weight: 600; } .progress-bar { height: 4px; background-color: rgba(255, 255, 255, 0.1); border-radius: 2px; margin-top: 0.25rem; overflow: hidden; } .progress-fill { height: 100%; border-radius: 2px; transition: width 1s ease-out; } .hint { font-size: 0.7rem; text-align: center; margin-top: 0.5rem; color: var(--secondary); } .cube-sparkline { height: 40px; margin-top: 0.5rem; } .click-hint { position: absolute; bottom: 0.5rem; right: 0.5rem; font-size: 0.6rem; color: rgba(255, 255, 255, 0.5); display: flex; align-items: center; gap: 0.25rem; } .click-hint svg { width: 12px; height: 12px; } .filters { display: flex; gap: 0.5rem; margin-bottom: 1.5rem; width: 100%; justify-content: center; flex-wrap: wrap; } .filter-btn { background: transparent; color: var(--gray); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 20px; padding: 0.4rem 0.8rem; font-size: 0.75rem; cursor: pointer; transition: all 0.3s ease; } .filter-btn.active { background-color: var(--secondary); color: var(--light); border-color: var(--secondary); } .filter-btn:hover:not(.active) { background-color: rgba(255, 255, 255, 0.05); border-color: rgba(255, 255, 255, 0.2); } .loading-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(15, 23, 42, 0.9); display: flex; flex-direction: column; justify-content: center; align-items: center; z-index: 100; transition: opacity 0.5s ease, visibility 0.5s ease; } .loading-spinner { width: 40px; height: 40px; border: 3px solid rgba(255, 255, 255, 0.1); border-radius: 50%; border-top-color: var(--secondary); animation: spin 1s ease-in-out infinite; margin-bottom: 1rem; } @keyframes spin { to { transform: rotate(360deg); } } .donut-chart { width: 40px; height: 40px; margin-right: 0.5rem; } .asset-distribution { display: flex; align-items: center; margin-top: 0.5rem; font-size: 0.7rem; } @media (max-width: 600px) { .portfolio-grid { grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 1rem; } .segment-title { font-size: 0.9rem; } .segment-allocation { font-size: 1.2rem; } .metrics-summary { flex-wrap: wrap; } .metric { flex-basis: calc(50% - 0.5rem); } } @media (max-width: 400px) { .portfolio-grid { grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); } h1 { font-size: 1.5rem; } } /* Animations */ @keyframes pulse { 0% { opacity: 1; transform: scale(1); } 50% { opacity: 0.7; transform: scale(1.05); } 100% { opacity: 1; transform: scale(1); } } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .fade-in { animation: fadeIn 0.5s ease forwards; } .pulse { animation: pulse 2s infinite ease-in-out; } </style> </head> <body> <div class="loading-overlay"> <div class="loading-spinner"></div> <p>Loading portfolio data...</p> </div> <header> <h1>Strategic Asset Allocator</h1> <p class="subtitle">Portfolio performance analytics by segment</p> </header> <div class="metrics-summary"> <div class="metric"> <div class="metric-value">$2.47M</div> <div class="metric-label">TOTAL ASSETS</div> </div> <div class="metric"> <div class="metric-value up">+12.4%</div> <div class="metric-label">YTD RETURN</div> </div> <div class="metric"> <div class="metric-value">0.68</div> <div class="metric-label">SHARPE RATIO</div> </div> </div> <div class="filters"> <button class="filter-btn active" data-filter="all">All Segments</button> <button class="filter-btn" data-filter="equity">Equity</button> <button class="filter-btn" data-filter="fixed-income">Fixed Income</button> <button class="filter-btn" data-filter="alternative">Alternatives</button> </div> <div class="portfolio-grid"> <!-- Cubes will be generated here --> </div> <p class="hint">Click on any segment cube to reveal detailed performance metrics</p> <script> const portfolioData = [ { id: 1, title: "US Large Cap", type: "equity", allocation: "24%", riskLevel: "Medium", ytdReturn: "+15.3%", holdingCount: 42, volatility: "16.2%", alpha: "+2.1%", beta: "0.94", sharpeRatio: "0.72", sparkline: [30, 35, 40, 38, 42, 45, 47, 49, 53, 50, 55], assetDistribution: [65, 20, 15] }, { id: 2, title: "US Small Cap", type: "equity", allocation: "11%", riskLevel: "High", ytdReturn: "+8.4%", holdingCount: 76, volatility: "21.7%", alpha: "+1.8%", beta: "1.23", sharpeRatio: "0.58", sparkline: [25, 30, 28, 32, 29, 35, 38, 36, 40, 38, 42], assetDistribution: [70, 20, 10] }, { id: 3, title: "Int'l Developed", type: "equity", allocation: "16%", riskLevel: "Medium-High", ytdReturn: "+10.2%", holdingCount: 64, volatility: "18.9%", alpha: "+0.7%", beta: "1.05", sharpeRatio: "0.64", sparkline: [40, 42, 45, 42, 40, 44, 46, 43, 48, 45, 49], assetDistribution: [80, 10, 10] }, { id: 4, title: "Emerging Markets", type: "equity", allocation: "8%", riskLevel: "Very High", ytdReturn: "+5.1%", holdingCount: 58, volatility: "24.6%", alpha: "-0.5%", beta: "1.42", sharpeRatio: "0.41", sparkline: [20, 25, 22, 28, 24, 22, 26, 30, 28, 32, 30], assetDistribution: [75, 15, 10] }, { id: 5, title: "Govt Bonds", type: "fixed-income", allocation: "14%", riskLevel: "Low", ytdReturn: "+2.1%", holdingCount: 24, volatility: "4.3%", alpha: "+0.2%", beta: "0.15", sharpeRatio: "0.55", sparkline: [50, 51, 52, 51, 53, 54, 53, 55, 56, 55, 57], assetDistribution: [10, 85, 5] }, { id: 6, title: "Corp Bonds", type: "fixed-income", allocation: "12%", riskLevel: "Low-Medium", ytdReturn: "+3.8%", holdingCount: 35, volatility: "6.7%", alpha: "+0.6%", beta: "0.27", sharpeRatio: "0.64", sparkline: [45, 46, 48, 47, 49, 50, 51, 50, 52, 53, 54], assetDistribution: [5, 90, 5] }, { id: 7, title: "Real Estate", type: "alternative", allocation: "8%", riskLevel: "Medium", ytdReturn: "+6.9%", holdingCount: 18, volatility: "14.2%", alpha: "+1.1%", beta: "0.65", sharpeRatio: "0.61", sparkline: [35, 38, 36, 40, 38, 42, 40, 44, 42, 45, 43], assetDistribution: [25, 15, 60] }, { id: 8, title: "Commodities", type: "alternative", allocation: "7%", riskLevel: "High", ytdReturn: "-2.3%", holdingCount: 12, volatility: "19.8%", alpha: "-1.2%", beta: "0.31", sharpeRatio: "0.28", sparkline: [42, 40, 38, 35, 33, 35, 32, 30, 33, 31, 30], assetDistribution: [10, 10, 80] } ]; function getRandomDelay(min, max) { return Math.random() * (max - min) + min; } function createCube(data, index) { const { id, title, allocation, riskLevel, ytdReturn, holdingCount, volatility, alpha, beta, sharpeRatio, sparkline, type, assetDistribution } = data; const isPositive = !ytdReturn.startsWith('-'); // Draw sparkline const sparklineWidth = 100; const sparklineHeight = 40; const sparklinePoints = []; const max = Math.max(...sparkline); const min = Math.min(...sparkline); const range = max - min; for (let i = 0; i < sparkline.length; i++) { const x = (i / (sparkline.length - 1)) * sparklineWidth; const y = sparklineHeight - ((sparkline[i] - min) / range) * sparklineHeight; sparklinePoints.push(`${x},${y}`); } const sparklinePath = `M${sparklinePoints.join(' L')}`; const strokeColor = isPositive ? 'var(--success)' : 'var(--danger)'; // Create cube container const cube = document.createElement('div'); cube.className = 'cube-container'; cube.dataset.type = type; cube.style.animationDelay = `${getRandomDelay(0, 0.5)}s`; // Create front face const front = document.createElement('div'); front.className = 'cube-face cube-front'; front.innerHTML = ` <div> <div class="segment-title">${title}</div> <div class="segment-allocation">${allocation}</div> <div class="segment-info"> <span>${holdingCount} holdings</span> <span>${riskLevel}</span> </div> </div> <div> <svg class="cube-sparkline" viewBox="0 0 100 40" preserveAspectRatio="none"> <path d="${sparklinePath}" fill="none" stroke="${strokeColor}" stroke-width="2" /> </svg> <div class="segment-info"> <span>YTD</span> <span class="${isPositive ? 'up' : 'down'}">${ytdReturn}</span> </div> </div> <div class="click-hint"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 9l3 3m0 0l-3 3m3-3H8m13 0a9 9 0 11-18 0 9 9 0 0118 0z" /> </svg> Flip </div> `; // Create back face const back = document.createElement('div'); back.className = 'cube-face cube-back'; back.innerHTML = ` <div class="performance-data"> <h3>${title} Metrics</h3> <div class="performance-metric"> <span class="performance-label">Volatility</span> <span class="performance-value">${volatility}</span> </div> <div class="performance-metric"> <span class="performance-label">Alpha</span> <span class="performance-value ${alpha.startsWith('+') ? 'up' : 'down'}">${alpha}</span> </div> <div class="performance-metric"> <span class="performance-label">Beta</span> <span class="performance-value">${beta}</span> </div> <div class="performance-metric"> <span class="performance-label">Sharpe Ratio</span> <span class="performance-value">${sharpeRatio}</span> </div> <div class="asset-distribution"> <svg class="donut-chart" viewBox="0 0 40 40"> <circle cx="20" cy="20" r="15.91549430918954" fill="transparent" stroke="#64748b" stroke-width="3"></circle> <circle cx="20" cy="20" r="15.91549430918954" fill="transparent" stroke="var(--secondary)" stroke-width="3" stroke-dasharray="${assetDistribution[0]} ${100-assetDistribution[0]}" stroke-dashoffset="25"></circle> <circle cx="20" cy="20" r="15.91549430918954" fill="transparent" stroke="var(--tertiary)" stroke-width="3" stroke-dasharray="${assetDistribution[1]} ${100-assetDistribution[1]}" stroke-dashoffset="${100-assetDistribution[0]+25}"></circle> <circle cx="20" cy="20" r="15.91549430918954" fill="transparent" stroke="var(--quaternary)" stroke-width="3" stroke-dasharray="${assetDistribution[2]} ${100-assetDistribution[2]}" stroke-dashoffset="${100-assetDistribution[0]-assetDistribution[1]+25}"></circle> </svg> <div> <div>Asset distribution</div> </div> </div> </div> <div class="click-hint"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 15l-3-3m0 0l3-3m-3 3h8M3 12a9 9 0 1118 0 9 9 0 01-18 0z" /> </svg> Back </div> `; cube.appendChild(front); cube.appendChild(back); // Add click event to flip the cube cube.addEventListener('click', () => { cube.classList.toggle('flipped'); }); return cube; } function renderPortfolio(filter = 'all') { const grid = document.querySelector('.portfolio-grid'); grid.innerHTML = ''; const filteredData = filter === 'all' ? portfolioData : portfolioData.filter(item => item.type === filter); filteredData.forEach((data, index) => { const cube = createCube(data, index); cube.style.opacity = '0'; grid.appendChild(cube); // Staggered animation setTimeout(() => { cube.style.opacity = '1'; cube.classList.add('fade-in'); }, 100 * index); }); } document.addEventListener('DOMContentLoaded', () => { // Initialize with loading state setTimeout(() => { document.querySelector('.loading-overlay').style.opacity = '0'; document.querySelector('.loading-overlay').style.visibility = 'hidden'; renderPortfolio(); }, 1200); // Set up filter buttons const filterButtons = document.querySelectorAll('.filter-btn'); filterButtons.forEach(btn => { btn.addEventListener('click', () => { filterButtons.forEach(b => b.classList.remove('active')); btn.classList.add('active'); renderPortfolio(btn.dataset.filter); }); }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Destination Cubes</title> <style> :root { --bali-color: #ff7e5f; --kyoto-color: #7b68ee; --santorini-color: #5cdbf0; --safari-color: #ffa500; --peru-color: #2ecc71; --norway-color: #3498db; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Montserrat', sans-serif; } body { background-color: #f8f9fa; min-height: 100vh; display: flex; flex-direction: column; justify-content: center; align-items: center; overflow-x: hidden; padding: 20px; } .container { max-width: 700px; width: 100%; height: 700px; display: flex; flex-direction: column; justify-content: center; align-items: center; position: relative; overflow: hidden; } h1 { font-size: 2.2rem; color: #333; margin-bottom: 15px; text-align: center; font-weight: 700; background: linear-gradient(45deg, #ff7e5f, #feb47b); background-clip: text; -webkit-background-clip: text; color: transparent; position: relative; z-index: 10; } p.subtitle { color: #666; font-size: 1rem; text-align: center; margin-bottom: 30px; max-width: 600px; line-height: 1.5; position: relative; z-index: 10; } .cube-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; justify-content: center; align-items: center; perspective: 1000px; width: 100%; max-width: 650px; position: relative; z-index: 10; } .cube-wrapper { width: 100%; height: 200px; perspective: 1000px; position: relative; cursor: pointer; } .cube { transform-style: preserve-3d; width: 100%; height: 100%; position: relative; transition: transform 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275); transform: rotateY(0deg); } .cube-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; background-color: white; border-radius: 15px; overflow: hidden; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); transition: all 0.3s ease; display: flex; flex-direction: column; justify-content: flex-end; align-items: center; text-align: center; padding: 15px; } .cube-face.front { transform: rotateY(0deg); background-size: cover; background-position: center; } .cube-face.back { transform: rotateY(180deg); padding: 15px; justify-content: center; } .front::after { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(to top, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0) 60%); z-index: 1; } .destination-name { color: #fff; font-size: 1.5rem; font-weight: 700; margin-bottom: 5px; position: relative; z-index: 2; } .destination-tagline { color: rgba(255, 255, 255, 0.9); font-size: 0.85rem; position: relative; z-index: 2; } .price { font-size: 1.5rem; font-weight: 700; color: #333; margin-bottom: 10px; } .details { font-size: 0.85rem; color: #666; margin-bottom: 15px; line-height: 1.4; } .explore-btn { background-color: #333; color: white; border: none; padding: 8px 15px; border-radius: 20px; font-size: 0.85rem; cursor: pointer; transition: all 0.3s ease; text-transform: uppercase; letter-spacing: 1px; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1); } .explore-btn:hover { transform: translateY(-3px); box-shadow: 0 6px 15px rgba(0, 0, 0, 0.15); } .flip-hint { position: absolute; bottom: 10px; right: 10px; background-color: rgba(255, 255, 255, 0.8); width: 30px; height: 30px; border-radius: 50%; display: flex; justify-content: center; align-items: center; font-size: 1rem; color: #333; animation: pulse 2s infinite; z-index: 2; } @keyframes pulse { 0% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.2); opacity: 0.7; } 100% { transform: scale(1); opacity: 1; } } .bali .cube-face.front { background-image: url('https://images.unsplash.com/photo-1537996194471-e657df975ab4?auto=format&fit=crop&w=400&h=300&q=80'); } .kyoto .cube-face.front { background-image: url('https://images.unsplash.com/photo-1545569341-9eb8b30979d9?auto=format&fit=crop&w=400&h=300&q=80'); } .santorini .cube-face.front { background-image: url('https://images.unsplash.com/photo-1570077188670-e3a8d69ac5ff?auto=format&fit=crop&w=400&h=300&q=80'); } .safari .cube-face.front { background-image: url('https://images.unsplash.com/photo-1523805009345-7448845a9e53?auto=format&fit=crop&w=400&h=300&q=80'); } .peru .cube-face.front { background-image: url('https://images.unsplash.com/photo-1526392060635-9d6019884377?auto=format&fit=crop&w=400&h=300&q=80'); } .norway .cube-face.front { background-image: url('https://images.unsplash.com/photo-1531366936337-7c912a4589a7?auto=format&fit=crop&w=400&h=300&q=80'); } .bali .explore-btn { background-color: var(--bali-color); } .kyoto .explore-btn { background-color: var(--kyoto-color); } .santorini .explore-btn { background-color: var(--santorini-color); } .safari .explore-btn { background-color: var(--safari-color); } .peru .explore-btn { background-color: var(--peru-color); } .norway .explore-btn { background-color: var(--norway-color); } .pattern { position: absolute; width: 100%; height: 100%; top: 0; left: 0; opacity: 0.05; background-image: radial-gradient(circle at 25px 25px, #333 2%, transparent 0%), radial-gradient(circle at 75px 75px, #333 2%, transparent 0%); background-size: 100px 100px; z-index: 1; pointer-events: none; } .floating-icon { position: absolute; font-size: 1.8rem; color: rgba(255, 255, 255, 0.3); animation: float 8s ease-in-out infinite; z-index: 2; } @keyframes float { 0% { transform: translateY(0) rotate(0deg); } 50% { transform: translateY(-15px) rotate(5deg); } 100% { transform: translateY(0) rotate(0deg); } } .tooltip { position: absolute; top: -40px; left: 50%; transform: translateX(-50%); background-color: rgba(0, 0, 0, 0.7); color: white; padding: 5px 10px; border-radius: 5px; font-size: 0.8rem; opacity: 0; transition: opacity 0.3s ease; pointer-events: none; white-space: nowrap; } .cube-wrapper:hover .tooltip { opacity: 1; } @media (max-width: 700px) { .cube-grid { grid-template-columns: repeat(2, 1fr); } h1 { font-size: 1.8rem; } .cube-wrapper { height: 180px; } } @media (max-width: 500px) { .cube-grid { grid-template-columns: 1fr; } .cube-wrapper { height: 200px; } } </style> </head> <body> <div class="container"> <div class="pattern"></div> <h1>Discover Your Perfect Escape</h1> <p class="subtitle">Explore our handcrafted destination packages. Click on a cube to reveal details and start your journey to somewhere extraordinary.</p> <div class="cube-grid"> <div class="cube-wrapper bali" data-destination="Bali"> <div class="tooltip">Click to flip</div> <div class="cube"> <div class="cube-face front"> <span class="destination-name">Bali</span> <span class="destination-tagline">Island of the Gods</span> <div class="flip-hint">↻</div> </div> <div class="cube-face back"> <span class="price">$1,499</span> <p class="details">7 nights in a traditional villa, daily yoga sessions, volcano trek, and authentic cooking class.</p> <button class="explore-btn">Explore Package</button> </div> </div> </div> <div class="cube-wrapper kyoto" data-destination="Kyoto"> <div class="tooltip">Click to flip</div> <div class="cube"> <div class="cube-face front"> <span class="destination-name">Kyoto</span> <span class="destination-tagline">Ancient Japanese Charm</span> <div class="flip-hint">↻</div> </div> <div class="cube-face back"> <span class="price">$1,899</span> <p class="details">6 nights in a ryokan, tea ceremony experience, bamboo forest tour, and private geisha dinner.</p> <button class="explore-btn">Explore Package</button> </div> </div> </div> <div class="cube-wrapper santorini" data-destination="Santorini"> <div class="tooltip">Click to flip</div> <div class="cube"> <div class="cube-face front"> <span class="destination-name">Santorini</span> <span class="destination-tagline">Aegean Paradise</span> <div class="flip-hint">↻</div> </div> <div class="cube-face back"> <span class="price">$2,199</span> <p class="details">5 nights in a cliffside suite, private sunset cruise, wine tour, and Greek cooking workshop.</p> <button class="explore-btn">Explore Package</button> </div> </div> </div> <div class="cube-wrapper safari" data-destination="Safari"> <div class="tooltip">Click to flip</div> <div class="cube"> <div class="cube-face front"> <span class="destination-name">Kenya</span> <span class="destination-tagline">Maasai Mara Safari</span> <div class="flip-hint">↻</div> </div> <div class="cube-face back"> <span class="price">$3,299</span> <p class="details">8 days of guided safaris, luxury tent accommodations, hot air balloon ride, and tribal village visit.</p> <button class="explore-btn">Explore Package</button> </div> </div> </div> <div class="cube-wrapper peru" data-destination="Peru"> <div class="tooltip">Click to flip</div> <div class="cube"> <div class="cube-face front"> <span class="destination-name">Peru</span> <span class="destination-tagline">Inca Trail & Machu Picchu</span> <div class="flip-hint">↻</div> </div> <div class="cube-face back"> <span class="price">$2,499</span> <p class="details">9-day expedition with guided Inca Trail trek, Cusco exploration, and Sacred Valley experiences.</p> <button class="explore-btn">Explore Package</button> </div> </div> </div> <div class="cube-wrapper norway" data-destination="Norway"> <div class="tooltip">Click to flip</div> <div class="cube"> <div class="cube-face front"> <span class="destination-name">Norway</span> <span class="destination-tagline">Northern Lights & Fjords</span> <div class="flip-hint">↻</div> </div> <div class="cube-face back"> <span class="price">$2,799</span> <p class="details">7 nights with aurora viewing, fjord cruise, husky sledding, and glass igloo overnight stay.</p> <button class="explore-btn">Explore Package</button> </div> </div> </div> </div> <div class="floating-icon" style="top: 15%; left: 8%;">✈️</div> <div class="floating-icon" style="top: 70%; left: 85%;">🌴</div> <div class="floating-icon" style="top: 30%; left: 92%;">🗺️</div> <div class="floating-icon" style="top: 80%; left: 15%;">🏔️</div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const cubes = document.querySelectorAll('.cube-wrapper'); cubes.forEach(cubeWrapper => { const cube = cubeWrapper.querySelector('.cube'); let isFlipped = false; cubeWrapper.addEventListener('click', function() { isFlipped = !isFlipped; if (isFlipped) { cube.style.transform = 'rotateY(180deg)'; } else { cube.style.transform = 'rotateY(0deg)'; } }); // Create staggered animation effect on load const index = Array.from(cubeWrapper.parentElement.children).indexOf(cubeWrapper); setTimeout(() => { cubeWrapper.style.opacity = '1'; cubeWrapper.style.transform = 'translateY(0)'; }, 100 * index); // Add button functionality const exploreBtn = cubeWrapper.querySelector('.explore-btn'); exploreBtn.addEventListener('click', function(e) { e.stopPropagation(); const destination = cubeWrapper.getAttribute('data-destination'); console.log(`Exploring package to ${destination}`); // Add a visual feedback for button click this.style.transform = 'scale(0.95)'; setTimeout(() => { this.style.transform = ''; }, 150); }); }); // Add floating icons animation variations const icons = document.querySelectorAll('.floating-icon'); icons.forEach((icon, index) => { icon.style.animationDelay = `${index * 0.5}s`; }); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Cubic Social Feed</title> <style> :root { --primary: #2a2a72; --secondary: #009ffd; --accent: #ff7e5f; --light: #f8f9fa; --dark: #343a40; --cube-size: 140px; --cube-gap: 15px; --transition-speed: 0.4s; } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; background-color: #f5f5f7; color: var(--dark); display: flex; justify-content: center; align-items: center; min-height: 100vh; overflow-x: hidden; line-height: 1.5; } .container { width: 100%; max-width: 700px; height: 700px; padding: 20px; position: relative; overflow: hidden; } .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 25px; position: relative; z-index: 10; } .logo { font-weight: 800; font-size: 24px; color: var(--primary); display: flex; align-items: center; } .logo-cube { width: 20px; height: 20px; background: var(--primary); margin-right: 8px; transform: rotate(45deg); animation: rotateCube 8s infinite linear; } .controls { display: flex; gap: 12px; } .btn { background: white; border: none; padding: 8px 14px; border-radius: 30px; font-weight: 600; font-size: 14px; color: var(--dark); box-shadow: 0 2px 8px rgba(0,0,0,0.05); cursor: pointer; transition: all 0.2s ease; } .btn:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0,0,0,0.1); } .btn.active { background: var(--primary); color: white; } .feed { display: grid; grid-template-columns: repeat(auto-fill, minmax(var(--cube-size), 1fr)); gap: var(--cube-gap); position: relative; perspective: 1000px; margin-top: 10px; } .cube { height: var(--cube-size); background: white; border-radius: 8px; overflow: hidden; position: relative; box-shadow: 0 4px 20px rgba(0,0,0,0.08); cursor: pointer; transition: all var(--transition-speed) cubic-bezier(0.34, 1.56, 0.64, 1); transform-style: preserve-3d; } .cube:hover { transform: translateY(-8px) rotate3d(1, 1, 0, 4deg); box-shadow: 0 15px 30px rgba(0,0,0,0.1); z-index: 5; } .cube.expanded { grid-column: span 2; grid-row: span 2; transform: scale(1.02); z-index: 10; } .cube-content { padding: 15px; height: 100%; display: flex; flex-direction: column; justify-content: space-between; transition: all var(--transition-speed) ease; } .cube-header { display: flex; align-items: center; margin-bottom: 10px; } .avatar { width: 32px; height: 32px; border-radius: 50%; margin-right: 10px; background-size: cover; flex-shrink: 0; } .user-name { font-weight: 600; font-size: 14px; } .time { margin-left: auto; font-size: 12px; color: #9aa0a6; } .content { font-size: 14px; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; margin-bottom: 5px; transition: all var(--transition-speed) ease; } .expanded .content { -webkit-line-clamp: 10; } .media { width: 100%; height: 0; padding-bottom: 60%; background-size: cover; background-position: center; border-radius: 4px; margin: 5px 0; transition: all var(--transition-speed) ease; } .cube.expanded .media { padding-bottom: 50%; } .metrics { display: flex; justify-content: space-between; font-size: 12px; color: #606770; margin-top: 10px; } .metric { display: flex; align-items: center; } .metric svg { width: 14px; height: 14px; margin-right: 4px; fill: currentColor; } .metric.like:hover { color: var(--accent); } .metric.share:hover { color: var(--secondary); } .hashtag { color: var(--primary); font-weight: 500; } .special { position: relative; overflow: hidden; } .special::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 4px; background: linear-gradient(90deg, var(--secondary), var(--accent)); } .animated-bg { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: -1; opacity: 0.2; } .animated-bg .shape { position: absolute; border-radius: 50%; filter: blur(60px); opacity: 0.4; animation: floatAnimation 20s infinite linear alternate; } .shape:nth-child(1) { width: 300px; height: 300px; background: var(--secondary); top: -100px; left: -150px; animation-delay: 0s; } .shape:nth-child(2) { width: 250px; height: 250px; background: var(--accent); bottom: -80px; right: -100px; animation-delay: -5s; } .shape:nth-child(3) { width: 200px; height: 200px; background: var(--primary); bottom: 20%; left: 30%; animation-delay: -10s; } @keyframes floatAnimation { 0% { transform: translate(0, 0) scale(1); } 50% { transform: translate(20px, 20px) scale(1.1); } 100% { transform: translate(-20px, -20px) scale(0.9); } } @keyframes rotateCube { 0% { transform: rotate(45deg); } 100% { transform: rotate(405deg); } } .empty-state { display: none; height: 300px; justify-content: center; align-items: center; flex-direction: column; text-align: center; margin: 40px 0; } .empty-icon { width: 80px; height: 80px; margin-bottom: 20px; position: relative; } .empty-cube { width: 40px; height: 40px; background: #e0e0e0; position: absolute; border-radius: 4px; transition: all 0.3s ease; } .empty-cube:nth-child(1) { top: 0; left: 20px; animation: floatCube 3s infinite ease-in-out; } .empty-cube:nth-child(2) { top: 20px; left: 0; animation: floatCube 3s infinite ease-in-out 0.5s; } .empty-cube:nth-child(3) { top: 20px; left: 40px; animation: floatCube 3s infinite ease-in-out 1s; } .empty-cube:nth-child(4) { top: 40px; left: 20px; animation: floatCube 3s infinite ease-in-out 1.5s; } .empty-text { font-weight: 500; color: #606770; } @keyframes floatCube { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-10px); } } @media (max-width: 600px) { :root { --cube-size: 120px; --cube-gap: 12px; } .controls { gap: 8px; } .btn { padding: 6px 10px; font-size: 12px; } } @media (max-width: 480px) { :root { --cube-size: 100px; --cube-gap: 10px; } .logo { font-size: 20px; } .cube-content { padding: 10px; } .avatar { width: 28px; height: 28px; } .user-name { font-size: 12px; } .content { font-size: 12px; } } </style> </head> <body> <div class="container"> <div class="animated-bg"> <div class="shape"></div> <div class="shape"></div> <div class="shape"></div> </div> <div class="header"> <div class="logo"> <div class="logo-cube"></div> CubeFeed </div> <div class="controls"> <button class="btn active" data-filter="all">All</button> <button class="btn" data-filter="trending">Trending</button> <button class="btn" data-filter="technology">Tech</button> <button class="btn" data-filter="design">Design</button> </div> </div> <div class="feed" id="feed"> <!-- Cubes will be generated by JavaScript --> </div> <div class="empty-state" id="empty-state"> <div class="empty-icon"> <div class="empty-cube"></div> <div class="empty-cube"></div> <div class="empty-cube"></div> <div class="empty-cube"></div> </div> <div class="empty-text">No content matches your filter</div> </div> </div> <script> // Feed data const feedData = [ { id: 1, username: "Alex Morgan", avatar: "https://images.unsplash.com/photo-1494790108377-be9c29b29330?ixlib=rb-1.2.1&auto=format&fit=crop&w=100&q=80", time: "12m ago", content: "Just discovered a fascinating approach to layered UI with cube-based containers. The depth perception really enhances user engagement! #UXDesign #CubeUI", media: "https://images.unsplash.com/photo-1558655146-d09347e92766?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=80", likes: 124, comments: 18, shares: 7, category: "design", isTrending: true, isSpecial: true }, { id: 2, username: "Taylor Zhao", avatar: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?ixlib=rb-1.2.1&auto=format&fit=crop&w=100&q=80", time: "43m ago", content: "Minimalist design doesn't mean minimal functionality. These modular content blocks have completely transformed how I organize my dashboard. Clean, functional, and so satisfying to interact with.", media: "", likes: 89, comments: 14, shares: 3, category: "design", isTrending: false, isSpecial: false }, { id: 3, username: "Jordan Lee", avatar: "https://images.unsplash.com/photo-1570295999919-56ceb5ecca61?ixlib=rb-1.2.1&auto=format&fit=crop&w=100&q=80", time: "1h ago", content: "Testing the new spatial arrangement algorithm for our cube-based feed. The 3D transformation on scroll is butter-smooth. CSS perspective properties are seriously underrated! #WebDev #FrontEnd", media: "https://images.unsplash.com/photo-1545670723-196ed0954986?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=80", likes: 231, comments: 42, shares: 18, category: "technology", isTrending: true, isSpecial: false }, { id: 4, username: "Riley Kim", avatar: "https://images.unsplash.com/photo-1534528741775-53994a69daeb?ixlib=rb-1.2.1&auto=format&fit=crop&w=100&q=80", time: "2h ago", content: "The subtle depth cues in this interface make a world of difference. Notice how the shadow changes during interaction to reinforce the cube metaphor. Details matter! #DesignDetails", media: "", likes: 76, comments: 9, shares: 4, category: "design", isTrending: false, isSpecial: false }, { id: 5, username: "Casey Zhang", avatar: "https://images.unsplash.com/photo-1500648767791-00dcc994a43e?ixlib=rb-1.2.1&auto=format&fit=crop&w=100&q=80", time: "3h ago", content: "Just implemented a dynamic reconfiguration system for our content modules. The cubes now intelligently rearrange based on user interaction patterns and content type. #AIDesign #MachineLearning", media: "https://images.unsplash.com/photo-1551288049-bebda4e38f71?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=80", likes: 312, comments: 47, shares: 29, category: "technology", isTrending: true, isSpecial: true }, { id: 6, username: "Morgan Chen", avatar: "https://images.unsplash.com/photo-1438761681033-6461ffad8d80?ixlib=rb-1.2.1&auto=format&fit=crop&w=100&q=80", time: "4h ago", content: "Experimenting with color theory in minimalist interfaces. Subtle gradients can add emotional depth without cluttering the visual field. This palette creates a calm, focused experience.", media: "https://images.unsplash.com/photo-1618005198919-d3d4b5a92ead?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=80", likes: 165, comments: 23, shares: 11, category: "design", isTrending: false, isSpecial: false }, { id: 7, username: "Sam Thompson", avatar: "https://images.unsplash.com/photo-1552058544-f2b08422138a?ixlib=rb-1.2.1&auto=format&fit=crop&w=100&q=80", time: "6h ago", content: "Performance optimizations for 3D transforms are crucial for smooth interactions. Just reduced our animation frame latency by 40% with proper GPU acceleration techniques. #WebPerformance #CSS3D", media: "", likes: 203, comments: 36, shares: 14, category: "technology", isTrending: true, isSpecial: false }, { id: 8, username: "Jamie Rodriguez", avatar: "https://images.unsplash.com/photo-1544005313-94ddf0286df2?ixlib=rb-1.2.1&auto=format&fit=crop&w=100&q=80", time: "8h ago", content: "The best interfaces anticipate user needs. Our new priority-based cube layout ensures the most relevant content is visually prominent while maintaining a clean aesthetic. #UXDesign #ContentStrategy", media: "https://images.unsplash.com/photo-1545239351-ef35f43d514b?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=80", likes: 178, comments: 29, shares: 13, category: "design", isTrending: true, isSpecial: false } ]; // DOM elements const feedElement = document.getElementById('feed'); const emptyState = document.getElementById('empty-state'); const filterButtons = document.querySelectorAll('.btn[data-filter]'); // Current filter let currentFilter = 'all'; // Generate feed items function generateFeed(filter = 'all') { // Clear current feed feedElement.innerHTML = ''; // Filter data let filteredData = feedData; if (filter === 'trending') { filteredData = feedData.filter(item => item.isTrending); } else if (filter !== 'all') { filteredData = feedData.filter(item => item.category === filter); } // Check if empty if (filteredData.length === 0) { feedElement.style.display = 'none'; emptyState.style.display = 'flex'; return; } else { feedElement.style.display = 'grid'; emptyState.style.display = 'none'; } // Create cubes filteredData.forEach(item => { const cube = document.createElement('div'); cube.classList.add('cube'); if (item.isSpecial) cube.classList.add('special'); cube.dataset.id = item.id; const mediaHTML = item.media ? `<div class="media" style="background-image: url('${item.media}')"></div>` : ''; cube.innerHTML = ` <div class="cube-content"> <div> <div class="cube-header"> <div class="avatar" style="background-image: url('${item.avatar}')"></div> <div class="user-name">${item.username}</div> <div class="time">${item.time}</div> </div> <div class="content">${item.content}</div> ${mediaHTML} </div> <div class="metrics"> <div class="metric like"> <svg viewBox="0 0 24 24"> <path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"></path> </svg> ${item.likes} </div> <div class="metric"> <svg viewBox="0 0 24 24"> <path d="M21 6h-2v9H6v2c0 .55.45 1 1 1h11l4 4V7c0-.55-.45-1-1-1zm-4 6V3c0-.55-.45-1-1-1H3c-.55 0-1 .45-1 1v14l4-4h10c.55 0 1-.45 1-1z"></path> </svg> ${item.comments} </div> <div class="metric share"> <svg viewBox="0 0 24 24"> <path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z"></path> </svg> ${item.shares} </div> </div> </div> `; feedElement.appendChild(cube); }); // Add event listeners document.querySelectorAll('.cube').forEach(cube => { cube.addEventListener('click', function() { this.classList.toggle('expanded'); }); }); } // Filter click handler filterButtons.forEach(button => { button.addEventListener('click', function() { // Update active state filterButtons.forEach(btn => btn.classList.remove('active')); this.classList.add('active'); // Update filter and regenerate feed currentFilter = this.dataset.filter; generateFeed(currentFilter); }); }); // Initial feed generation generateFeed(); // Add like functionality document.addEventListener('click', function(e) { if (e.target.closest('.metric.like')) { e.stopPropagation(); const likeElement = e.target.closest('.metric.like'); // Toggle active state likeElement.classList.toggle('active'); // Update count const currentLikes = parseInt(likeElement.innerText); likeElement.innerHTML = ` <svg viewBox="0 0 24 24"> <path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"></path> </svg> ${likeElement.classList.contains('active') ? currentLikes + 1 : currentLikes - 1} `; if (likeElement.classList.contains('active')) { likeElement.style.color = 'var(--accent)'; } else { likeElement.style.color = ''; } } }); // Randomize cube arrangement periodically function randomizeArrangement() { const cubes = document.querySelectorAll('.cube:not(.expanded)'); cubes.forEach(cube => { const delay = Math.random() * 0.5; cube.style.transition = `all var(--transition-speed) cubic-bezier(0.34, 1.56, 0.64, 1) ${delay}s`; // Small random position adjustment const randomX = (Math.random() - 0.5) * 10; const randomY = (Math.random() - 0.5) * 10; const randomRotate = (Math.random() - 0.5) * 2; cube.style.transform = `translate(${randomX}px, ${randomY}px) rotate3d(0, 0, 1, ${randomRotate}deg)`; setTimeout(() => { cube.style.transform = ''; }, 2000); }); } // Trigger randomization every 20 seconds setInterval(randomizeArrangement, 20000); </script> </body> </html>