Create a cinematic animation concept for Nioplay’s horizontal loot-box RNG slider — inspired by Stake.com’s mystery box mechanic.
Browse filesDo NOT generate a full webpage or desktop mockup. Only produce the animation module.
Overall Direction:
Design a motion graphic sequence that shows how the loot box system behaves from start to finish.
Use a premium black + neon orange/gold casino theme with glowing accents, soft glassmorphism layers, backlit amber lighting, and particle effects.
Animation Sequence to Depict (Frame-by-Frame Concept):
Idle State
A long horizontal carousel with 10–14 loot boxes evenly spaced.
Boxes glow subtly:
Common = green
Rare = blue
Epic = purple
Legendary = bright gold/orange
All boxes float slightly above a glossy black track with soft reflections.
Player Action
A large glowing “ROLL” button pulses beneath the carousel.
When pressed, show a charged energy burst under the button.
High-Speed Sliding Phase
The entire horizontal row of boxes moves at high velocity left-to-right.
Use motion blur, neon streaks, light trails, and radial highlights.
Background stays dark — the only lighting comes from the passing boxes.
Deceleration Phase
The carousel slows down with rhythmic pulses of light.
Camera slightly zooms in for tension.
Add subtle sparks, floating particles, and lens reflections.
Final Settle & Selection
The motion stops precisely on one loot box.
The selected box should:
Enlarge 10–15%
Glow intensely with neon orange/gold rim-light
Emit heatwave distortion
Cast light onto the track
Loot Box Opening Reveal
The lid pops open with a cinematic light explosion
Streams of particles, fog glow, and golden dust burst outward
SC coins with ·SC· engraved spin upward
Show the prize hovering above the open box with a radiant outline
End State
Dim surrounding boxes
Keep the selected box glowing
Prize hover slowly with gentle rotation
Visual Requirements:
Style: Futuristic casino luxury — metallic, glassy, realistic
Colors: Black, deep charcoal, neon orange (#FF8C00), gold, amber
Lighting: Backlit glow, rim lighting, volumetric fog beams
No characters, no people, no mascots
No browser UI, device frame, or page layout
Final render should clearly read as an animation storyboard or motion concept, not a static page.
Aspect ratio: 16:9 widescreen.
Background: Black-to-warm gradient with subtle spark particles.
|
@@ -1,10 +1,13 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
|
|
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: LootBox Cinematics Royale 🎰
|
| 3 |
+
colorFrom: pink
|
| 4 |
+
colorTo: green
|
| 5 |
+
emoji: 🐳
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
+
tags:
|
| 9 |
+
- deepsite-v3
|
| 10 |
---
|
| 11 |
|
| 12 |
+
# Welcome to your new DeepSite project!
|
| 13 |
+
This project was created with [DeepSite](https://huggingface.co/deepsite).
|
|
@@ -1,19 +1,48 @@
|
|
| 1 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>LootBox Animation Concept</title>
|
| 7 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 8 |
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.4/gsap.min.js"></script>
|
| 9 |
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.4/ScrollTrigger.min.js"></script>
|
| 10 |
+
<style>
|
| 11 |
+
@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700&display=swap');
|
| 12 |
+
</style>
|
| 13 |
+
<link rel="stylesheet" href="style.css">
|
| 14 |
+
</head>
|
| 15 |
+
<body class="bg-black overflow-hidden font-['Orbitron']">
|
| 16 |
+
<div class="relative w-full h-screen flex items-center justify-center">
|
| 17 |
+
<!-- Background Elements -->
|
| 18 |
+
<div class="absolute inset-0 bg-gradient-to-b from-black to-gray-900 opacity-90 z-0"></div>
|
| 19 |
+
<div class="particles absolute inset-0 z-10"></div>
|
| 20 |
+
|
| 21 |
+
<!-- Main Animation Container -->
|
| 22 |
+
<div id="animation-container" class="relative w-full max-w-4xl h-80 z-20">
|
| 23 |
+
<!-- Track -->
|
| 24 |
+
<div class="absolute bottom-0 left-0 right-0 h-2 bg-gradient-to-r from-transparent via-amber-500/50 to-transparent rounded-full blur-sm"></div>
|
| 25 |
+
<div class="absolute bottom-0 left-0 right-0 h-1.5 bg-gradient-to-r from-transparent via-amber-500/20 to-transparent rounded-full"></div>
|
| 26 |
+
|
| 27 |
+
<!-- Loot Boxes -->
|
| 28 |
+
<div id="loot-boxes" class="absolute bottom-10 left-0 flex space-x-8 transition-transform duration-1000">
|
| 29 |
+
<!-- Boxes will be generated via JS -->
|
| 30 |
+
</div>
|
| 31 |
+
|
| 32 |
+
<!-- ROLL Button -->
|
| 33 |
+
<div id="roll-button" class="absolute -bottom-16 left-1/2 transform -translate-x-1/2 px-10 py-3 bg-gradient-to-br from-amber-500 to-orange-600 rounded-full cursor-pointer shadow-lg shadow-amber-500/30 hover:shadow-amber-500/50 transition-all duration-300 group">
|
| 34 |
+
<span class="text-lg font-bold text-white tracking-widest">ROLL</span>
|
| 35 |
+
<div class="absolute inset-0 rounded-full border-2 border-amber-300/50 opacity-0 group-hover:opacity-100 transition-opacity duration-300"></div>
|
| 36 |
+
<div class="absolute -inset-1 rounded-full bg-amber-500 blur opacity-0 group-hover:opacity-50 transition-opacity duration-300"></div>
|
| 37 |
+
</div>
|
| 38 |
+
|
| 39 |
+
<!-- Light Effects -->
|
| 40 |
+
<div class="light-beam absolute w-40 h-40 bg-amber-500/10 rounded-full blur-3xl -z-10"></div>
|
| 41 |
+
<div class="light-beam-2 absolute w-60 h-60 bg-orange-500/5 rounded-full blur-3xl -z-10"></div>
|
| 42 |
+
</div>
|
| 43 |
+
</div>
|
| 44 |
+
|
| 45 |
+
<script src="script.js"></script>
|
| 46 |
+
<script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
|
| 47 |
+
</body>
|
| 48 |
+
</html>
|
|
@@ -0,0 +1,267 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
document.addEventListener('DOMContentLoaded', () => {
|
| 2 |
+
// Initialize scene
|
| 3 |
+
const container = document.getElementById('animation-container');
|
| 4 |
+
const lootBoxesContainer = document.getElementById('loot-boxes');
|
| 5 |
+
const rollButton = document.getElementById('roll-button');
|
| 6 |
+
|
| 7 |
+
// Box types and colors
|
| 8 |
+
const boxTypes = [
|
| 9 |
+
{ name: 'Common', class: 'common', chance: 60 },
|
| 10 |
+
{ name: 'Rare', class: 'rare', chance: 25 },
|
| 11 |
+
{ name: 'Epic', class: 'epic', chance: 10 },
|
| 12 |
+
{ name: 'Legendary', class: 'legendary', chance: 5 }
|
| 13 |
+
];
|
| 14 |
+
|
| 15 |
+
// Generate loot boxes
|
| 16 |
+
const totalBoxes = 12;
|
| 17 |
+
const boxes = [];
|
| 18 |
+
|
| 19 |
+
for (let i = 0; i < totalBoxes; i++) {
|
| 20 |
+
const box = document.createElement('div');
|
| 21 |
+
box.className = 'loot-box';
|
| 22 |
+
|
| 23 |
+
// Determine box type based on chance
|
| 24 |
+
const random = Math.random() * 100;
|
| 25 |
+
let cumulativeChance = 0;
|
| 26 |
+
let boxType;
|
| 27 |
+
|
| 28 |
+
for (const type of boxTypes) {
|
| 29 |
+
cumulativeChance += type.chance;
|
| 30 |
+
if (random <= cumulativeChance) {
|
| 31 |
+
boxType = type;
|
| 32 |
+
break;
|
| 33 |
+
}
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
+
box.innerHTML = `
|
| 37 |
+
<div class="loot-box-inner">
|
| 38 |
+
<div class="loot-box-front ${boxType.class}">
|
| 39 |
+
<div class="loot-box-lid ${boxType.class}"></div>
|
| 40 |
+
<span class="text-xs opacity-70">${boxType.name}</span>
|
| 41 |
+
</div>
|
| 42 |
+
<div class="loot-box-back"></div>
|
| 43 |
+
</div>
|
| 44 |
+
`;
|
| 45 |
+
|
| 46 |
+
boxes.push(box);
|
| 47 |
+
lootBoxesContainer.appendChild(box);
|
| 48 |
+
}
|
| 49 |
+
|
| 50 |
+
// Add event listener to roll button
|
| 51 |
+
rollButton.addEventListener('click', () => {
|
| 52 |
+
if (lootBoxesContainer.classList.contains('rolling')) return;
|
| 53 |
+
|
| 54 |
+
startRollAnimation();
|
| 55 |
+
});
|
| 56 |
+
|
| 57 |
+
function startRollAnimation() {
|
| 58 |
+
// Disable button during animation
|
| 59 |
+
lootBoxesContainer.classList.add('rolling');
|
| 60 |
+
rollButton.classList.add('opacity-50', 'pointer-events-none');
|
| 61 |
+
|
| 62 |
+
// Clear previous selection
|
| 63 |
+
document.querySelectorAll('.loot-box.selected').forEach(box => {
|
| 64 |
+
box.classList.remove('selected');
|
| 65 |
+
});
|
| 66 |
+
|
| 67 |
+
// Add motion blur
|
| 68 |
+
lootBoxesContainer.classList.add('motion-blur');
|
| 69 |
+
|
| 70 |
+
// Create speed lines
|
| 71 |
+
const speedLines = document.createElement('div');
|
| 72 |
+
speedLines.className = 'speed-lines';
|
| 73 |
+
container.appendChild(speedLines);
|
| 74 |
+
|
| 75 |
+
// Energy burst effect
|
| 76 |
+
const energyBurst = document.createElement('div');
|
| 77 |
+
energyBurst.className = 'energy-burst';
|
| 78 |
+
energyBurst.style.width = '200px';
|
| 79 |
+
energyBurst.style.height = '200px';
|
| 80 |
+
energyBurst.style.left = rollButton.offsetLeft + rollButton.offsetWidth / 2 - 100 + 'px';
|
| 81 |
+
energyBurst.style.top = rollButton.offsetTop + rollButton.offsetHeight / 2 - 100 + 'px';
|
| 82 |
+
container.appendChild(energyBurst);
|
| 83 |
+
|
| 84 |
+
// Animate energy burst
|
| 85 |
+
gsap.to(energyBurst, {
|
| 86 |
+
scale: 1.5,
|
| 87 |
+
opacity: 0.8,
|
| 88 |
+
duration: 0.3,
|
| 89 |
+
ease: 'power2.out',
|
| 90 |
+
onComplete: () => {
|
| 91 |
+
gsap.to(energyBurst, {
|
| 92 |
+
scale: 3,
|
| 93 |
+
opacity: 0,
|
| 94 |
+
duration: 0.5,
|
| 95 |
+
onComplete: () => {
|
| 96 |
+
energyBurst.remove();
|
| 97 |
+
}
|
| 98 |
+
});
|
| 99 |
+
}
|
| 100 |
+
});
|
| 101 |
+
|
| 102 |
+
// High-speed sliding phase
|
| 103 |
+
const slideDistance = Math.random() * 5000 + 3000;
|
| 104 |
+
|
| 105 |
+
gsap.to(lootBoxesContainer, {
|
| 106 |
+
x: `-=${slideDistance}`,
|
| 107 |
+
duration: 3,
|
| 108 |
+
ease: 'power2.inOut',
|
| 109 |
+
onUpdate: () => {
|
| 110 |
+
// Add speed lines effect
|
| 111 |
+
gsap.to(speedLines, {
|
| 112 |
+
opacity: 0.5,
|
| 113 |
+
duration: 0.1
|
| 114 |
+
});
|
| 115 |
+
},
|
| 116 |
+
onComplete: () => {
|
| 117 |
+
// Remove speed lines
|
| 118 |
+
gsap.to(speedLines, {
|
| 119 |
+
opacity: 0,
|
| 120 |
+
duration: 0.5,
|
| 121 |
+
onComplete: () => {
|
| 122 |
+
speedLines.remove();
|
| 123 |
+
}
|
| 124 |
+
});
|
| 125 |
+
|
| 126 |
+
// Remove motion blur
|
| 127 |
+
lootBoxesContainer.classList.remove('motion-blur');
|
| 128 |
+
|
| 129 |
+
// Select a random box (bias towards center boxes)
|
| 130 |
+
const centerBoxIndex = Math.floor(Math.random() * 4) + 4;
|
| 131 |
+
const selectedBox = boxes[centerBoxIndex];
|
| 132 |
+
selectedBox.classList.add('selected');
|
| 133 |
+
|
| 134 |
+
// Align the selected box to center
|
| 135 |
+
const containerWidth = container.offsetWidth;
|
| 136 |
+
const boxWidth = selectedBox.offsetWidth;
|
| 137 |
+
const boxOffset = selectedBox.offsetLeft;
|
| 138 |
+
const targetX = containerWidth / 2 - boxWidth / 2 - boxOffset;
|
| 139 |
+
|
| 140 |
+
gsap.to(lootBoxesContainer, {
|
| 141 |
+
x: targetX,
|
| 142 |
+
duration: 0.8,
|
| 143 |
+
ease: 'elastic.out(1, 0.5)',
|
| 144 |
+
onComplete: () => {
|
| 145 |
+
// Open the box after a delay
|
| 146 |
+
setTimeout(() => {
|
| 147 |
+
openBox(selectedBox);
|
| 148 |
+
}, 500);
|
| 149 |
+
}
|
| 150 |
+
});
|
| 151 |
+
}
|
| 152 |
+
});
|
| 153 |
+
}
|
| 154 |
+
|
| 155 |
+
function openBox(box) {
|
| 156 |
+
const lid = box.querySelector('.loot-box-lid');
|
| 157 |
+
const isLegendary = box.classList.contains('legendary');
|
| 158 |
+
|
| 159 |
+
// Animate lid opening
|
| 160 |
+
gsap.to(lid, {
|
| 161 |
+
rotationX: -120,
|
| 162 |
+
transformOrigin: 'bottom',
|
| 163 |
+
duration: 0.5,
|
| 164 |
+
ease: 'back.out(1)'
|
| 165 |
+
});
|
| 166 |
+
|
| 167 |
+
// Create light explosion
|
| 168 |
+
const explosion = document.createElement('div');
|
| 169 |
+
explosion.className = 'absolute inset-0 rounded-full bg-amber-500/20 blur-xl';
|
| 170 |
+
explosion.style.width = '200px';
|
| 171 |
+
explosion.style.height = '200px';
|
| 172 |
+
explosion.style.left = '50%';
|
| 173 |
+
explosion.style.top = '50%';
|
| 174 |
+
explosion.style.transform = 'translate(-50%, -50%) scale(0)';
|
| 175 |
+
box.appendChild(explosion);
|
| 176 |
+
|
| 177 |
+
// Animate explosion
|
| 178 |
+
gsap.to(explosion, {
|
| 179 |
+
scale: 2,
|
| 180 |
+
opacity: 0.8,
|
| 181 |
+
duration: 0.3,
|
| 182 |
+
ease: 'power2.out',
|
| 183 |
+
onComplete: () => {
|
| 184 |
+
gsap.to(explosion, {
|
| 185 |
+
scale: 3,
|
| 186 |
+
opacity: 0,
|
| 187 |
+
duration: 0.5,
|
| 188 |
+
onComplete: () => {
|
| 189 |
+
explosion.remove();
|
| 190 |
+
}
|
| 191 |
+
});
|
| 192 |
+
}
|
| 193 |
+
});
|
| 194 |
+
|
| 195 |
+
// Create particles
|
| 196 |
+
createParticles(box, isLegendary);
|
| 197 |
+
|
| 198 |
+
// Create prize reveal
|
| 199 |
+
const prizeValue = isLegendary ? '5000 SC' : ['100 SC', '250 SC', '500 SC', '1000 SC'][Math.floor(Math.random() * 4)];
|
| 200 |
+
const prize = document.createElement('div');
|
| 201 |
+
prize.className = 'prize-reveal';
|
| 202 |
+
prize.textContent = prizeValue;
|
| 203 |
+
box.appendChild(prize);
|
| 204 |
+
|
| 205 |
+
// Enable button again
|
| 206 |
+
setTimeout(() => {
|
| 207 |
+
lootBoxesContainer.classList.remove('rolling');
|
| 208 |
+
rollButton.classList.remove('opacity-50', 'pointer-events-none');
|
| 209 |
+
}, 2000);
|
| 210 |
+
}
|
| 211 |
+
|
| 212 |
+
function createParticles(box, isLegendary) {
|
| 213 |
+
const particleCount = isLegendary ? 30 : 15;
|
| 214 |
+
const colors = isLegendary
|
| 215 |
+
? ['#FF8C00', '#FFD700', '#FFA500', '#FFFFFF']
|
| 216 |
+
: ['#FFFFFF', '#CCCCCC', '#AAAAAA'];
|
| 217 |
+
|
| 218 |
+
for (let i = 0; i < particleCount; i++) {
|
| 219 |
+
const particle = document.createElement('div');
|
| 220 |
+
particle.className = 'absolute rounded-full';
|
| 221 |
+
particle.style.width = Math.random() * 8 + 2 + 'px';
|
| 222 |
+
particle.style.height = particle.style.width;
|
| 223 |
+
particle.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)];
|
| 224 |
+
particle.style.left = '50%';
|
| 225 |
+
particle.style.top = '50%';
|
| 226 |
+
particle.style.opacity = '0';
|
| 227 |
+
box.appendChild(particle);
|
| 228 |
+
|
| 229 |
+
const angle = Math.random() * Math.PI * 2;
|
| 230 |
+
const distance = Math.random() * 50 + 30;
|
| 231 |
+
const duration = Math.random() * 1 + 0.5;
|
| 232 |
+
|
| 233 |
+
gsap.to(particle, {
|
| 234 |
+
x: Math.cos(angle) * distance,
|
| 235 |
+
y: Math.sin(angle) * distance - 50,
|
| 236 |
+
opacity: 1,
|
| 237 |
+
duration: duration * 0.3,
|
| 238 |
+
ease: 'power2.out'
|
| 239 |
+
});
|
| 240 |
+
|
| 241 |
+
gsap.to(particle, {
|
| 242 |
+
y: `-=${Math.random() * 30 + 20}`,
|
| 243 |
+
opacity: 0,
|
| 244 |
+
duration: duration * 0.7,
|
| 245 |
+
delay: duration * 0.3,
|
| 246 |
+
ease: 'power2.in',
|
| 247 |
+
onComplete: () => {
|
| 248 |
+
particle.remove();
|
| 249 |
+
}
|
| 250 |
+
});
|
| 251 |
+
}
|
| 252 |
+
}
|
| 253 |
+
|
| 254 |
+
// Ambient animations
|
| 255 |
+
setInterval(() => {
|
| 256 |
+
const randomBox = boxes[Math.floor(Math.random() * boxes.length)];
|
| 257 |
+
if (!randomBox.classList.contains('selected') && !lootBoxesContainer.classList.contains('rolling')) {
|
| 258 |
+
gsap.to(randomBox, {
|
| 259 |
+
y: -10,
|
| 260 |
+
duration: 1,
|
| 261 |
+
yoyo: true,
|
| 262 |
+
repeat: 1,
|
| 263 |
+
ease: 'sine.inOut'
|
| 264 |
+
});
|
| 265 |
+
}
|
| 266 |
+
}, 3000);
|
| 267 |
+
});
|
|
@@ -1,28 +1,145 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 3 |
-
|
| 4 |
}
|
| 5 |
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
}
|
| 10 |
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
|
|
|
|
|
|
| 16 |
}
|
| 17 |
|
| 18 |
-
.
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
}
|
| 25 |
|
| 26 |
-
.
|
| 27 |
-
|
| 28 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@keyframes pulse-glow {
|
| 2 |
+
0%, 100% { opacity: 0.7; }
|
| 3 |
+
50% { opacity: 1; }
|
| 4 |
}
|
| 5 |
|
| 6 |
+
@keyframes float {
|
| 7 |
+
0%, 100% { transform: translateY(0); }
|
| 8 |
+
50% { transform: translateY(-5px); }
|
| 9 |
}
|
| 10 |
|
| 11 |
+
.loot-box {
|
| 12 |
+
position: relative;
|
| 13 |
+
width: 120px;
|
| 14 |
+
height: 120px;
|
| 15 |
+
perspective: 1000px;
|
| 16 |
+
cursor: pointer;
|
| 17 |
+
animation: float 3s ease-in-out infinite;
|
| 18 |
}
|
| 19 |
|
| 20 |
+
.loot-box-inner {
|
| 21 |
+
position: relative;
|
| 22 |
+
width: 100%;
|
| 23 |
+
height: 100%;
|
| 24 |
+
transform-style: preserve-3d;
|
| 25 |
+
transition: transform 0.8s;
|
| 26 |
}
|
| 27 |
|
| 28 |
+
.loot-box:hover .loot-box-inner {
|
| 29 |
+
transform: rotateY(10deg) rotateX(5deg);
|
| 30 |
}
|
| 31 |
+
|
| 32 |
+
.loot-box-front, .loot-box-back {
|
| 33 |
+
position: absolute;
|
| 34 |
+
width: 100%;
|
| 35 |
+
height: 100%;
|
| 36 |
+
backface-visibility: hidden;
|
| 37 |
+
border-radius: 8px;
|
| 38 |
+
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
|
| 39 |
+
background: linear-gradient(145deg, #1a1a1a, #2a2a2a);
|
| 40 |
+
border: 2px solid;
|
| 41 |
+
}
|
| 42 |
+
|
| 43 |
+
.loot-box-front {
|
| 44 |
+
display: flex;
|
| 45 |
+
align-items: center;
|
| 46 |
+
justify-content: center;
|
| 47 |
+
font-weight: bold;
|
| 48 |
+
color: white;
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
+
.loot-box-back {
|
| 52 |
+
transform: rotateY(180deg);
|
| 53 |
+
background: linear-gradient(145deg, #1a1a1a, #2a2a2a);
|
| 54 |
+
}
|
| 55 |
+
|
| 56 |
+
.common { border-color: rgba(0, 255, 0, 0.3); box-shadow: 0 0 20px rgba(0, 255, 0, 0.1); }
|
| 57 |
+
.rare { border-color: rgba(0, 100, 255, 0.3); box-shadow: 0 0 20px rgba(0, 100, 255, 0.1); }
|
| 58 |
+
.epic { border-color: rgba(150, 0, 255, 0.3); box-shadow: 0 0 20px rgba(150, 0, 255, 0.1); }
|
| 59 |
+
.legendary { border-color: rgba(255, 140, 0, 0.5); box-shadow: 0 0 30px rgba(255, 140, 0, 0.2); }
|
| 60 |
+
|
| 61 |
+
.loot-box.selected {
|
| 62 |
+
animation: pulse-glow 1.5s infinite;
|
| 63 |
+
transform: scale(1.15);
|
| 64 |
+
z-index: 10;
|
| 65 |
+
}
|
| 66 |
+
|
| 67 |
+
.loot-box.selected.legendary {
|
| 68 |
+
box-shadow: 0 0 50px rgba(255, 140, 0, 0.5);
|
| 69 |
+
}
|
| 70 |
+
|
| 71 |
+
.loot-box-lid {
|
| 72 |
+
position: absolute;
|
| 73 |
+
top: 0;
|
| 74 |
+
left: 0;
|
| 75 |
+
width: 100%;
|
| 76 |
+
height: 20%;
|
| 77 |
+
background: inherit;
|
| 78 |
+
border-radius: 8px 8px 0 0;
|
| 79 |
+
transform-origin: bottom;
|
| 80 |
+
transition: transform 0.5s;
|
| 81 |
+
}
|
| 82 |
+
|
| 83 |
+
.particles {
|
| 84 |
+
background-image: radial-gradient(ellipse at center, rgba(255, 140, 0, 0.1) 0%, transparent 70%);
|
| 85 |
+
background-size: 600px 600px;
|
| 86 |
+
background-position: 0 0;
|
| 87 |
+
animation: particle-move 20s infinite linear;
|
| 88 |
+
}
|
| 89 |
+
|
| 90 |
+
@keyframes particle-move {
|
| 91 |
+
100% { background-position: 600px 600px; }
|
| 92 |
+
}
|
| 93 |
+
|
| 94 |
+
.light-beam {
|
| 95 |
+
animation: beam-pulse 8s infinite alternate;
|
| 96 |
+
}
|
| 97 |
+
|
| 98 |
+
.light-beam-2 {
|
| 99 |
+
animation: beam-pulse 12s infinite alternate-reverse;
|
| 100 |
+
}
|
| 101 |
+
|
| 102 |
+
@keyframes beam-pulse {
|
| 103 |
+
0%, 100% { transform: translate(-50%, -50%) scale(0.8); opacity: 0.1; }
|
| 104 |
+
50% { transform: translate(-50%, -50%) scale(1.2); opacity: 0.3; }
|
| 105 |
+
}
|
| 106 |
+
|
| 107 |
+
.prize-reveal {
|
| 108 |
+
position: absolute;
|
| 109 |
+
top: -100px;
|
| 110 |
+
left: 50%;
|
| 111 |
+
transform: translateX(-50%);
|
| 112 |
+
font-size: 1.5rem;
|
| 113 |
+
font-weight: bold;
|
| 114 |
+
color: white;
|
| 115 |
+
text-shadow: 0 0 10px rgba(255, 140, 0, 0.8);
|
| 116 |
+
animation: prize-float 3s ease-in-out infinite;
|
| 117 |
+
}
|
| 118 |
+
|
| 119 |
+
@keyframes prize-float {
|
| 120 |
+
0%, 100% { transform: translate(-50%, 0); }
|
| 121 |
+
50% { transform: translate(-50%, -10px); }
|
| 122 |
+
}
|
| 123 |
+
|
| 124 |
+
.motion-blur {
|
| 125 |
+
filter: blur(3px);
|
| 126 |
+
opacity: 0.7;
|
| 127 |
+
}
|
| 128 |
+
|
| 129 |
+
.speed-lines {
|
| 130 |
+
position: absolute;
|
| 131 |
+
top: 0;
|
| 132 |
+
left: 0;
|
| 133 |
+
width: 100%;
|
| 134 |
+
height: 100%;
|
| 135 |
+
background: linear-gradient(90deg, transparent, rgba(255, 140, 0, 0.1), transparent);
|
| 136 |
+
opacity: 0;
|
| 137 |
+
}
|
| 138 |
+
|
| 139 |
+
.energy-burst {
|
| 140 |
+
position: absolute;
|
| 141 |
+
border-radius: 50%;
|
| 142 |
+
background: radial-gradient(circle, rgba(255, 140, 0, 0.8), transparent 70%);
|
| 143 |
+
transform: scale(0);
|
| 144 |
+
opacity: 0;
|
| 145 |
+
}
|