ProjectGenesis commited on
Commit
cfea9c9
·
verified ·
1 Parent(s): a5befcd

Create a 16:9 widescreen UI scene showing the entire “Double Spin Loot Box” sequence for Nioplay. Only include the loot box spin carousel, the “LOOT BOX SPIN” label, the multiplier slider, the “MULTIPLIER” label, one SPIN button, and the final prize pop-up. No extra text.

Browse files

=====================
LOOT BOX SPIN — ANIMATED STATE
=====================

At the top, show the loot box carousel in a dynamic animation state. Depict the boxes in mid-roll, showing the exact visual cues of a fast horizontal spin decelerating into a final snap-to-center.

Loot Box Carousel Structure:
- A long horizontal row of glowing rarity boxes.
- Each box is a square neon-outline frame with colors representing rarity: green, blue, purple, gold.
- Each box contains a small cube icon in the center.
- Use 10–14 boxes in view.

Animation Detail (Very Important):
- Boxes near the edges of the screen should appear stretched, with horizontal direction blur and subtle luminous streaks trailing behind them.
- Boxes closer to the center should appear progressively sharper.
- One box must be perfectly aligned inside a vertical selection window at the exact center:
- The selected box must appear crisp, with zero motion blur.
- It should be slightly enlarged (as if it just completed its final easing motion).
- The outline glow should intensify, radiating a smooth neon-orange bloom.
- Add a tiny forward-lean “settle snap” effect: the box visually tilts forward by a few degrees, suggesting the physical snap of landing.
- Boxes behind the selected one should be slightly offset or ghosted, indicating the tail end of the spin.
- The selection window:
- A thin neon-orange (#FF8C00) rectangular frame.
- Soft pulsing glow.
- Transparent center.
- Must visually lock the winning box in place.

Above the carousel, place the label “LOOT BOX SPIN”.

=====================
MULTIPLIER SLIDER — SECOND SPIN ANIMATION
=====================

Directly under the loot box track, show the multiplier slider in mid-spin animation. This is a horizontal meter-like strip with glowing multiplier pills.

Multiplier Pills:
- ×1, ×1.25, ×1.5, ×2, ×3, ×5 (repeat sequence twice for length).
- Each pill is a rounded rectangular glassmorphism capsule.
- Text is warm white or soft gold with faint glow.
- Pills float slightly above the track.

Animation Detail (Very Important):
- Pills not in the center should be shown with clear horizontal motion blur, slightly stretched, as if scrolling rapidly past the viewer.
- Pills should have streaking light trails extending horizontally, giving a high-speed rolling effect.
- The pills closer to the center should show less blur, transitioning into the final chosen multiplier.
- The selected multiplier pill must:
- Sit perfectly inside a smaller centered selection frame matching the neon-orange aesthetic.
- Be scaled up slightly (subtle enlargement).
- Glow much brighter than the others, with a halo that pulses outward.
- Appear perfectly sharp and in freeze-frame clarity.
- The slider track:
- Thin translucent LED bar with reflective highlights.
- Slight gold/orange underglow.

Above it, place the label “MULTIPLIER”.

=====================
SPIN BUTTON
=====================

Below both tracks:
- A single pill-shaped SPIN button.
- Gold-to-neon-orange gradient.
- Soft outer glow, subtle inner light.
- Label: “SPIN”.
- No additional UI text.

=====================
PRIZE POP-UP — FINAL RESULT MOMENT
=====================

Display a reward pop-up floating over the interface to show the end of the animation sequence.

Pop-up Details:
- A glassmorphism panel with neon-orange rim light and bloom.
- Inside, show the payout number ONLY (no text)—for example “×5” or a currency amount.
- Surround it with floating SC coins, light streaks, small particles, and a faint explosion of glow as if the pop-up just appeared.
- The pop-up must feel like it just animated in: rising slightly from below, glowing intensely for a moment, with subtle confetti sparks.

=====================
STYLE REQUIREMENTS
=====================

- Match Nioplay’s dark neon aesthetic: neon orange, gold highlights, black/charcoal base.
- Use soft volumetric lighting and subtle particle effects.
- No characters, no extra icons, no paragraphs of text.
- ONLY include:
- The loot box carousel
- “LOOT BOX SPIN”
- The multiplier slider
- “MULTIPLIER”
- SPIN button
- The prize pop-up
- Everything must be perfectly centered and aligned in a clean 16:9 frame.

Files changed (4) hide show
  1. README.md +8 -5
  2. index.html +66 -19
  3. script.js +144 -0
  4. style.css +120 -19
README.md CHANGED
@@ -1,10 +1,13 @@
1
  ---
2
- title: Neon Loot Spinner Extravaganza
3
- emoji: 😻
4
- colorFrom: red
5
- colorTo: pink
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
1
  ---
2
+ title: Neon Loot Spinner Extravaganza 🎰
3
+ colorFrom: gray
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).
index.html CHANGED
@@ -1,19 +1,66 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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>Neon Loot Spinner</title>
7
+ <link rel="stylesheet" href="style.css">
8
+ <script src="https://cdn.tailwindcss.com"></script>
9
+ <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
10
+ <script src="https://unpkg.com/feather-icons"></script>
11
+ <style>
12
+ @import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@400;500;700&display=swap');
13
+ body {
14
+ font-family: 'Orbitron', sans-serif;
15
+ background: radial-gradient(ellipse at center, #0f0f15 0%, #000000 100%);
16
+ overflow: hidden;
17
+ }
18
+ </style>
19
+ </head>
20
+ <body class="h-screen w-full flex flex-col items-center justify-center overflow-hidden">
21
+ <div class="container mx-auto w-full max-w-4xl aspect-video relative">
22
+ <!-- Loot Box SPIN Section -->
23
+ <div class="relative h-1/2 w-full">
24
+ <h2 class="text-orange-300 text-xl text-center mb-4 text-shadow-orange">LOOT BOX SPIN</h2>
25
+ <div id="spinTrack" class="absolute h-32 w-full overflow-hidden">
26
+ <div id="lootBoxes" class="absolute h-full flex transition-transform duration-3000 ease-out">
27
+ <!-- Loot boxes will be generated by JS -->
28
+ </div>
29
+ <div class="selection-window absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2"></div>
30
+ </div>
31
+ </div>
32
+
33
+ <!-- Multiplier Section -->
34
+ <div class="relative h-1/4 w-full pt-8">
35
+ <h2 class="text-orange-300 text-xl text-center mb-4 text-shadow-orange">MULTIPLIER</h2>
36
+ <div id="multiplierTrack" class="relative h-12 w-full overflow-hidden">
37
+ <div id="multipliers" class="absolute h-full flex items-center">
38
+ <!-- Multipliers will be generated by JS -->
39
+ </div>
40
+ <div class="selection-window absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 h-16"></div>
41
+ </div>
42
+ </div>
43
+
44
+ <!-- Spin Button -->
45
+ <div class="relative h-1/4 w-full flex items-center justify-center pt-8">
46
+ <button id="spinButton" class="spin-button relative px-12 py-4 rounded-full text-xl font-bold text-white">
47
+ SPIN
48
+ </button>
49
+ </div>
50
+
51
+ <!-- Prize Popup -->
52
+ <div id="prizePopup" class="prize-popup hidden absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2">
53
+ <div id="prizeValue" class="text-6xl font-bold text-yellow-300 text-shadow-gold"></div>
54
+ </div>
55
+ </div>
56
+
57
+ <script src="script.js"></script>
58
+ <script>
59
+ feather.replace();
60
+ // Initialize the animations
61
+ initLootBoxes();
62
+ initMultipliers();
63
+ </script>
64
+ <script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
65
+ </body>
66
+ </html>
script.js ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Loot Box Generator
2
+ function initLootBoxes() {
3
+ const lootBoxes = document.getElementById('lootBoxes');
4
+ const rarities = ['common', 'rare', 'epic', 'legendary'];
5
+ const colors = {
6
+ 'common': '#2ecc71',
7
+ 'rare': '#3498db',
8
+ 'epic': '#9b59b6',
9
+ 'legendary': '#f1c40f'
10
+ };
11
+
12
+ // Create 24 loot boxes (12 visible, 12 for seamless looping)
13
+ for (let i = 0; i < 24; i++) {
14
+ const rarity = rarities[Math.floor(Math.random() * rarities.length)];
15
+ const box = document.createElement('div');
16
+ box.className = `loot-box ${rarity} flex-shrink-0`;
17
+ box.innerHTML = `<i data-feather="box" stroke="${colors[rarity]}"></i>`;
18
+ lootBoxes.appendChild(box);
19
+ }
20
+
21
+ // Animate the loot boxes
22
+ let position = 0;
23
+ let speed = 20;
24
+ let deceleration = 0.95;
25
+ let selectedBox = Math.floor(Math.random() * 12) + 6; // Random box between 6-18
26
+
27
+ const animate = () => {
28
+ position += speed;
29
+ speed *= deceleration;
30
+
31
+ // Stop when we reach the selected box
32
+ if (speed < 0.5 && Math.abs(position % 120) < 1) {
33
+ // Select the center box
34
+ lootBoxes.style.transform = `translateX(calc(-${selectedBox * 110}px + 50%))`;
35
+
36
+ // Highlight the selected box
37
+ const boxes = document.querySelectorAll('.loot-box');
38
+ boxes.forEach((box, index) => {
39
+ if (index === selectedBox) {
40
+ box.classList.add('selected');
41
+
42
+ // Show prize popup after slight delay
43
+ setTimeout(() => {
44
+ showPrize(selectedBox);
45
+ }, 800);
46
+ } else {
47
+ box.style.filter = index < selectedBox - 3 || index > selectedBox + 3 ?
48
+ 'blur(3px) opacity(0.5)' : 'blur(1px) opacity(0.8)';
49
+ }
50
+ });
51
+ } else {
52
+ lootBoxes.style.transform = `translateX(calc(-${position % 2400}px + 50%))`;
53
+ requestAnimationFrame(animate);
54
+ }
55
+ };
56
+
57
+ animate();
58
+ }
59
+
60
+ // Multiplier Generator
61
+ function initMultipliers() {
62
+ const multipliers = document.getElementById('multipliers');
63
+ multiplierValues = ['×1', '×1.25', '×1.5', '×2', '×3', '×5', '×1', '×1.25', '×1.5', '×2', '×3', '×5'];
64
+
65
+ multiplierValues.forEach(value => {
66
+ const pill = document.createElement('div');
67
+ pill.className = 'multiplier-pill flex-shrink-0';
68
+ pill.textContent = value;
69
+ multipliers.appendChild(pill);
70
+ });
71
+
72
+ // Animate multipliers
73
+ let position = 0;
74
+ let speed = 15;
75
+ let deceleration = 0.93;
76
+ let selectedMultiplier = Math.floor(Math.random() * 6) + 3; // Random between 3-8
77
+
78
+ const animateMultipliers = () => {
79
+ position += speed;
80
+ speed *= deceleration;
81
+
82
+ if (speed < 0.5 && Math.abs(position % 480) < 1) {
83
+ // Select the center multiplier
84
+ multipliers.style.transform = `translateX(calc(-${selectedMultiplier * 100}px + 50%))`;
85
+
86
+ // Highlight the selected multiplier
87
+ const pills = document.querySelectorAll('.multiplier-pill');
88
+ pills.forEach((pill, index) => {
89
+ if (index === selectedMultiplier) {
90
+ pill.classList.add('selected');
91
+ } else {
92
+ pill.style.filter = index < selectedMultiplier - 2 || index > selectedMultiplier + 2 ?
93
+ 'blur(3px) opacity(0.5)' : 'blur(1px) opacity(0.8)';
94
+ }
95
+ });
96
+ } else {
97
+ multipliers.style.transform = `translateX(calc(-${position % 1200}px + 50%))`;
98
+ requestAnimationFrame(animateMultipliers);
99
+ }
100
+ };
101
+
102
+ animateMultipliers();
103
+ }
104
+
105
+ // Show prize popup
106
+ function showPrize(boxIndex) {
107
+ const prizeValues = ['×1', '×1.5', '×2', '×3', '×5'];
108
+ const prizePopup = document.getElementById('prizePopup');
109
+ const prizeValue = document.getElementById('prizeValue');
110
+
111
+ // Determine prize based on box index (just for demo)
112
+ const prize = prizeValues[boxIndex % prizeValues.length];
113
+ prizeValue.textContent = prize;
114
+
115
+ prizePopup.classList.remove('hidden');
116
+
117
+ // Add confetti effect
118
+ setTimeout(() => {
119
+ prizePopup.style.animation = 'none';
120
+ void prizePopup.offsetWidth; // Trigger reflow
121
+ prizePopup.style.animation = 'rise-up 0.5s ease-out, glow-intense 1s ease-in-out';
122
+ }, 50);
123
+ }
124
+
125
+ // Spin button handler
126
+ document.getElementById('spinButton').addEventListener('click', () => {
127
+ // Reset animations
128
+ document.querySelectorAll('.loot-box, .multiplier-pill').forEach(el => {
129
+ el.classList.remove('selected');
130
+ el.style.filter = '';
131
+ });
132
+
133
+ // Hide prize popup
134
+ document.getElementById('prizePopup').classList.add('hidden');
135
+
136
+ // Restart animations
137
+ document.getElementById('lootBoxes').style.transform = 'translateX(0)';
138
+ document.getElementById('multipliers').style.transform = 'translateX(0)';
139
+
140
+ setTimeout(() => {
141
+ initLootBoxes();
142
+ initMultipliers();
143
+ }, 100);
144
+ });
style.css CHANGED
@@ -1,28 +1,129 @@
1
- body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
4
  }
5
 
6
- h1 {
7
- font-size: 16px;
8
- margin-top: 0;
9
  }
10
 
11
- p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
 
 
 
 
 
 
16
  }
17
 
18
- .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
24
  }
25
 
26
- .card p:last-child {
27
- margin-bottom: 0;
 
28
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Base styles */
2
+ .text-shadow-orange {
3
+ text-shadow: 0 0 8px rgba(255, 140, 0, 0.7);
4
  }
5
 
6
+ .text-shadow-gold {
7
+ text-shadow: 0 0 12px rgba(255, 215, 0, 0.8);
 
8
  }
9
 
10
+ /* Loot Box Styles */
11
+ .loot-box {
12
+ width: 80px;
13
+ height: 80px;
14
+ margin: 0 15px;
15
+ border-radius: 8px;
16
+ display: flex;
17
+ align-items: center;
18
+ justify-content: center;
19
+ position: relative;
20
+ transition: transform 0.3s ease, filter 0.3s ease;
21
  }
22
 
23
+ .loot-box.common {
24
+ border: 2px solid #2ecc71;
25
+ box-shadow: 0 0 15px rgba(46, 204, 113, 0.5);
 
 
 
26
  }
27
 
28
+ .loot-box.rare {
29
+ border: 2px solid #3498db;
30
+ box-shadow: 0 0 15px rgba(52, 152, 219, 0.5);
31
  }
32
+
33
+ .loot-box.epic {
34
+ border: 2px solid #9b59b6;
35
+ box-shadow: 0 0 15px rgba(155, 89, 182, 0.5);
36
+ }
37
+
38
+ .loot-box.legendary {
39
+ border: 2px solid #f1c40f;
40
+ box-shadow: 0 0 20px rgba(241, 196, 15, 0.7);
41
+ }
42
+
43
+ .loot-box.selected {
44
+ transform: scale(1.2) perspective(500px) rotateX(5deg);
45
+ z-index: 10;
46
+ }
47
+
48
+ /* Selection Window */
49
+ .selection-window {
50
+ width: 100px;
51
+ height: 100px;
52
+ border: 2px solid #FF8C00;
53
+ border-radius: 12px;
54
+ box-shadow: 0 0 20px rgba(255, 140, 0, 0.7);
55
+ pointer-events: none;
56
+ opacity: 0.8;
57
+ animation: pulse-glow 2s infinite;
58
+ }
59
+
60
+ /* Multiplier Styles */
61
+ .multiplier-pill {
62
+ min-width: 80px;
63
+ padding: 8px 16px;
64
+ margin: 0 10px;
65
+ border-radius: 20px;
66
+ background: rgba(255, 255, 255, 0.1);
67
+ backdrop-filter: blur(5px);
68
+ border: 1px solid rgba(255, 215, 0, 0.3);
69
+ color: white;
70
+ font-weight: bold;
71
+ text-align: center;
72
+ transition: all 0.3s ease;
73
+ }
74
+
75
+ .multiplier-pill.selected {
76
+ background: linear-gradient(135deg, rgba(255, 140, 0, 0.8), rgba(255, 215, 0, 0.8));
77
+ transform: scale(1.3);
78
+ box-shadow: 0 0 25px rgba(255, 215, 0, 0.7);
79
+ }
80
+
81
+ /* Spin Button */
82
+ .spin-button {
83
+ background: linear-gradient(135deg, #f1c40f, #FF8C00);
84
+ box-shadow: 0 0 20px rgba(255, 140, 0, 0.5);
85
+ transition: all 0.3s ease;
86
+ }
87
+
88
+ .spin-button:hover {
89
+ transform: scale(1.05);
90
+ box-shadow: 0 0 30px rgba(255, 140, 0, 0.8);
91
+ }
92
+
93
+ .spin-button:active {
94
+ transform: scale(0.95);
95
+ }
96
+
97
+ /* Prize Popup */
98
+ .prize-popup {
99
+ width: 200px;
100
+ height: 200px;
101
+ background: rgba(0, 0, 0, 0.8);
102
+ backdrop-filter: blur(10px);
103
+ border-radius: 20px;
104
+ border: 2px solid #FF8C00;
105
+ box-shadow: 0 0 40px rgba(255, 140, 0, 0.8);
106
+ display: flex;
107
+ align-items: center;
108
+ justify-content: center;
109
+ z-index: 100;
110
+ animation: rise-up 0.5s ease-out, glow-intense 1s ease-in-out;
111
+ }
112
+
113
+ /* Animations */
114
+ @keyframes pulse-glow {
115
+ 0% { box-shadow: 0 0 20px rgba(255, 140, 0, 0.7); }
116
+ 50% { box-shadow: 0 0 30px rgba(255, 140, 0, 0.9); }
117
+ 100% { box-shadow: 0 0 20px rgba(255, 140, 0, 0.7); }
118
+ }
119
+
120
+ @keyframes rise-up {
121
+ from { transform: translate(-50%, -30%); opacity: 0; }
122
+ to { transform: translate(-50%, -50%); opacity: 1; }
123
+ }
124
+
125
+ @keyframes glow-intense {
126
+ 0% { box-shadow: 0 0 20px rgba(255, 140, 0, 0.7); }
127
+ 50% { box-shadow: 0 0 60px rgba(255, 215, 0, 0.9); }
128
+ 100% { box-shadow: 0 0 40px rgba(255, 140, 0, 0.8); }
129
+ }