ProjectGenesis commited on
Commit
138ddd3
·
verified ·
1 Parent(s): 01c0a69

Create a 16:9 widescreen UI render of a clean, modern “Multiplier Spin Slider” for an online sweepstakes casino platform called Nioplay.

Browse files

This scene should ONLY show the multiplier slider — do not include loot boxes, characters, or any other game modules. The focus must be entirely on the horizontal multiplier meter and its animation state.

Overall Visual Style:
- Deep black and charcoal background with subtle ambient glow.
- Nioplay color palette: neon orange (#FF8C00) accents, warm gold (#FFCC66 / #FFD700) highlights, soft amber lighting.
- Clean, premium, fintech-like aesthetic with glassmorphism surfaces and glowing accents.
- No cartoon style. Modern, futuristic, minimal, sleek.

Multiplier Slider Structure:
- A long, horizontal, thin track centered in the frame.
- Inside the track, display repeating multiplier values as glowing “pills” or rounded rectangles:
×1, ×1.25, ×1.5, ×2, ×3, ×5
- Repeat the sequence twice so the slider appears long and scrollable.
- Each multiplier pill should have:
- Translucent glassmorphism background (blur, reflection).
- Soft white or gold text with a faint glow.
- Rounded pill shape with subtle rim light.
- Light shadow to create floating depth.

Selection Window:
- A small glowing rectangular frame centered over the track.
- Neon-orange outline, soft glow, transparent interior.
- This window indicates the chosen multiplier after the spin.

Animation Impression:
- Show the slider mid-spin or slowing down:
- Slight motion blur on non-selected multiplier pills.
- Multiplier values stretching or streaking slightly to show speed.
- The selected multiplier (centered) should be:
- Slightly larger (scaled up)
- Strong neon-orange glow behind it
- Crisp and perfectly readable
- The rest of the multipliers should have mild blur to imply horizontal motion.

Background & Atmosphere:
- Deep black-to-warm radial gradient.
- Subtle particles, dust, or amber sparks floating around the slider.
- Soft rim lighting behind the slider to highlight depth.

Text Labels (optional, small and minimal):
- A tiny upper label above the slider:
“Multiplier Roll”
- A tiny lower label:
“Spin to boost your reward”

Final Requirements:
- Render in true 16:9 widescreen.
- Only show the multiplier slider component — no loot boxes or pop-ups.
- The final design should look like a polished, production-ready Nioplay UI module focused solely on the multiplier meter spin.

Files changed (3) hide show
  1. multiplier-slider.html +41 -0
  2. script.js +93 -13
  3. style.css +73 -2
multiplier-slider.html ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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>Nioplay Multiplier Slider</title>
7
+ <link rel="stylesheet" href="style.css">
8
+ <script src="https://cdn.tailwindcss.com"></script>
9
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.4/gsap.min.js"></script>
10
+ </head>
11
+ <body class="bg-black w-full h-screen flex items-center justify-center overflow-hidden">
12
+ <div id="multiplier-slider-container" class="relative w-full max-w-4xl">
13
+ <!-- Background Effects -->
14
+ <div class="absolute inset-0 bg-gradient-to-b from-black to-gray-900 opacity-90 -z-10"></div>
15
+ <div class="ambient-particles absolute inset-0 -z-10"></div>
16
+
17
+ <!-- Slider Track -->
18
+ <div class="slider-track absolute w-full h-2 bg-gray-800/50 rounded-full blur-sm"></div>
19
+ <div class="slider-track-highlight absolute w-full h-1 bg-amber-500/10 rounded-full blur-xs"></div>
20
+
21
+ <!-- Multiplier Values -->
22
+ <div id="multiplier-values" class="relative h-20 flex items-center overflow-hidden">
23
+ <div id="multiplier-strip" class="flex space-x-8 transition-transform duration-1000">
24
+ <!-- Multiplier pills will be generated via JS -->
25
+ </div>
26
+ </div>
27
+
28
+ <!-- Selection Window -->
29
+ <div class="selection-window absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 w-24 h-16 border-2 border-amber-500/80 rounded-lg shadow-lg shadow-amber-500/30 pointer-events-none">
30
+ <div class="absolute inset-0 bg-amber-500/10 rounded-md blur-xs"></div>
31
+ <div class="absolute -inset-1 border border-amber-500/20 rounded-lg pointer-events-none"></div>
32
+ </div>
33
+
34
+ <!-- Labels -->
35
+ <div class="absolute -top-8 left-0 right-0 text-center text-sm text-amber-500/80 tracking-widest">MULTIPLIER ROLL</div>
36
+ <div class="absolute -bottom-8 left-0 right-0 text-center text-xs text-amber-500/60 tracking-wider">SPIN TO BOOST YOUR REWARD</div>
37
+ </div>
38
+
39
+ <script src="script.js"></script>
40
+ </body>
41
+ </html>
script.js CHANGED
@@ -250,18 +250,98 @@ document.addEventListener('DOMContentLoaded', () => {
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
  });
 
250
  });
251
  }
252
  }
253
+ // Ambient animations
254
+ setInterval(() => {
255
+ const randomBox = boxes[Math.floor(Math.random() * boxes.length)];
256
+ if (!randomBox.classList.contains('selected') && !lootBoxesContainer.classList.contains('rolling')) {
257
+ gsap.to(randomBox, {
258
+ y: -10,
259
+ duration: 1,
260
+ yoyo: true,
261
+ repeat: 1,
262
+ ease: 'sine.inOut'
263
+ });
264
+ }
265
+ }, 3000);
266
+
267
+ // Multiplier Slider Initialization
268
+ if (document.getElementById('multiplier-strip')) {
269
+ const multiplierValues = ['×1', '×1.25', '×1.5', '×2', '×3', '×5'];
270
+ const strip = document.getElementById('multiplier-strip');
271
 
272
+ // Create two sets of multipliers for smooth looping
273
+ for (let i = 0; i < 12; i++) {
274
+ const value = multiplierValues[i % multiplierValues.length];
275
+ const pill = document.createElement('div');
276
+ pill.className = 'multiplier-pill';
277
+ pill.textContent = value;
278
+ strip.appendChild(pill);
279
+ }
280
+
281
+ // Start infinite scroll animation
282
+ let currentPosition = 0;
283
+ let isSpinning = false;
284
+
285
+ function startSpin() {
286
+ if (isSpinning) return;
287
+ isSpinning = true;
288
+
289
+ const spinDistance = Math.random() * 1500 + 1000;
290
+ const spinDuration = 3;
291
+
292
+ // Add motion blur to all pills except selected one
293
+ document.querySelectorAll('.multiplier-pill').forEach(pill => {
294
+ pill.classList.add('motion-blur');
295
+ });
296
+
297
+ gsap.to(strip, {
298
+ x: `-=${spinDistance}`,
299
+ duration: spinDuration,
300
+ ease: "power2.inOut",
301
+ onUpdate: () => {
302
+ // Check if we need to loop the strip
303
+ const stripRect = strip.getBoundingClientRect();
304
+ if (stripRect.right < window.innerWidth / 2) {
305
+ const firstChild = strip.firstElementChild;
306
+ strip.appendChild(firstChild.cloneNode(true));
307
+ firstChild.remove();
308
+ gsap.set(strip, { x: `+=${firstChild.offsetWidth + 32}` });
309
+ }
310
+ },
311
+ onComplete: () => {
312
+ // Select a random multiplier (biased toward middle values)
313
+ const centerIndex = Math.floor(Math.random() * 3) + 5;
314
+ const pills = document.querySelectorAll('.multiplier-pill');
315
+ const selectedPill = pills[centerIndex];
316
+
317
+ // Align selected pill to center
318
+ const containerWidth = document.getElementById('multiplier-slider-container').offsetWidth;
319
+ const pillWidth = selectedPill.offsetWidth;
320
+ const pillOffset = selectedPill.offsetLeft;
321
+ const targetX = containerWidth / 2 - pillWidth / 2 - pillOffset;
322
+
323
+ gsap.to(strip, {
324
+ x: targetX,
325
+ duration: 0.8,
326
+ ease: "elastic.out(1, 0.5)",
327
+ onStart: () => {
328
+ // Remove blur from selected pill
329
+ selectedPill.classList.remove('motion-blur');
330
+ selectedPill.classList.add('selected');
331
+ },
332
+ onComplete: () => {
333
+ isSpinning = false;
334
+ // Remove blur from all pills after animation
335
+ document.querySelectorAll('.multiplier-pill').forEach(pill => {
336
+ pill.classList.remove('motion-blur');
337
+ });
338
+ }
339
+ });
340
+ }
341
+ });
342
+ }
343
+
344
+ // Auto-spin on page load
345
+ setTimeout(startSpin, 1000);
346
+ }
347
  });
style.css CHANGED
@@ -135,11 +135,82 @@
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
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135
  background: linear-gradient(90deg, transparent, rgba(255, 140, 0, 0.1), transparent);
136
  opacity: 0;
137
  }
 
138
  .energy-burst {
139
  position: absolute;
140
  border-radius: 50%;
141
  background: radial-gradient(circle, rgba(255, 140, 0, 0.8), transparent 70%);
142
  transform: scale(0);
143
  opacity: 0;
144
+ }
145
+
146
+ /* Multiplier Slider Styles */
147
+ .multiplier-pill {
148
+ position: relative;
149
+ width: 80px;
150
+ height: 40px;
151
+ background: rgba(30, 30, 30, 0.7);
152
+ backdrop-filter: blur(8px);
153
+ border-radius: 20px;
154
+ display: flex;
155
+ align-items: center;
156
+ justify-content: center;
157
+ color: white;
158
+ font-weight: bold;
159
+ font-size: 1.1rem;
160
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3),
161
+ inset 0 1px 1px rgba(255, 255, 255, 0.1);
162
+ transition: all 0.3s ease;
163
+ border: 1px solid rgba(255, 140, 0, 0.2);
164
+ }
165
+
166
+ .multiplier-pill::before {
167
+ content: '';
168
+ position: absolute;
169
+ inset: 0;
170
+ border-radius: 20px;
171
+ padding: 1px;
172
+ background: linear-gradient(135deg, rgba(255, 140, 0, 0.5), rgba(255, 215, 0, 0.3));
173
+ -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
174
+ -webkit-mask-composite: xor;
175
+ mask-composite: exclude;
176
+ pointer-events: none;
177
+ }
178
+
179
+ .multiplier-pill.selected {
180
+ transform: scale(1.2);
181
+ background: rgba(255, 140, 0, 0.3);
182
+ box-shadow: 0 0 20px rgba(255, 140, 0, 0.5);
183
+ z-index: 10;
184
+ }
185
+
186
+ .multiplier-pill.motion-blur {
187
+ filter: blur(2px);
188
+ opacity: 0.7;
189
+ }
190
+
191
+ .slider-track {
192
+ top: 50%;
193
+ transform: translateY(-50%);
194
+ }
195
+
196
+ .slider-track-highlight {
197
+ top: 50%;
198
+ transform: translateY(-50%);
199
+ background: linear-gradient(90deg, transparent, rgba(255, 140, 0, 0.3), transparent);
200
+ }
201
+
202
+ .ambient-particles {
203
+ background-image: radial-gradient(ellipse at center, rgba(255, 140, 0, 0.05) 0%, transparent 70%);
204
+ background-size: 600px 600px;
205
+ background-position: 0 0;
206
+ animation: particle-move 20s infinite linear;
207
+ }
208
+
209
+ .selection-window {
210
+ animation: pulse-glow 2s infinite alternate;
211
+ }
212
+
213
+ @keyframes pulse-glow {
214
+ 0% { box-shadow: 0 0 10px rgba(255, 140, 0, 0.3); }
215
+ 100% { box-shadow: 0 0 20px rgba(255, 140, 0, 0.5); }
216
+ }