devinyonas commited on
Commit
8f0ee54
·
verified ·
1 Parent(s): c5c6d73

Add 2 files

Browse files
Files changed (2) hide show
  1. README.md +7 -5
  2. index.html +552 -19
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Personal Space
3
- emoji: 📊
4
- colorFrom: red
5
- colorTo: red
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: personal-space
3
+ emoji: 🐳
4
+ colorFrom: blue
5
+ colorTo: blue
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
index.html CHANGED
@@ -1,19 +1,552 @@
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>Minimalist 3D Dice Roller</title>
7
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
8
+ <style>
9
+ :root {
10
+ --primary-color: #2c3e50;
11
+ --secondary-color: #e74c3c;
12
+ --background-color: #f5f6fa;
13
+ --dice-color: #ffffff;
14
+ --shadow-color: rgba(0, 0, 0, 0.2);
15
+ }
16
+
17
+ * {
18
+ margin: 0;
19
+ padding: 0;
20
+ box-sizing: border-box;
21
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
22
+ }
23
+
24
+ body {
25
+ background-color: var(--background-color);
26
+ display: flex;
27
+ justify-content: center;
28
+ align-items: center;
29
+ min-height: 100vh;
30
+ color: var(--primary-color);
31
+ overflow-x: hidden;
32
+ }
33
+
34
+ .container {
35
+ text-align: center;
36
+ max-width: 800px;
37
+ padding: 2rem;
38
+ }
39
+
40
+ h1 {
41
+ font-weight: 300;
42
+ margin-bottom: 2rem;
43
+ font-size: 2.5rem;
44
+ letter-spacing: 1px;
45
+ }
46
+
47
+ .controls {
48
+ display: flex;
49
+ justify-content: center;
50
+ align-items: center;
51
+ margin-bottom: 2rem;
52
+ gap: 1rem;
53
+ flex-wrap: wrap;
54
+ }
55
+
56
+ .dice-count {
57
+ display: flex;
58
+ align-items: center;
59
+ gap: 0.5rem;
60
+ }
61
+
62
+ label {
63
+ font-size: 1.1rem;
64
+ }
65
+
66
+ input[type="number"] {
67
+ width: 60px;
68
+ padding: 0.5rem;
69
+ border: 1px solid #ddd;
70
+ border-radius: 4px;
71
+ text-align: center;
72
+ font-size: 1rem;
73
+ outline: none;
74
+ transition: border 0.3s;
75
+ }
76
+
77
+ input[type="number"]:focus {
78
+ border-color: var(--secondary-color);
79
+ }
80
+
81
+ input[type="number"]::-webkit-inner-spin-button,
82
+ input[type="number"]::-webkit-outer-spin-button {
83
+ -webkit-appearance: none;
84
+ margin: 0;
85
+ }
86
+
87
+ .btn {
88
+ background-color: var(--secondary-color);
89
+ color: white;
90
+ border: none;
91
+ padding: 0.75rem 1.5rem;
92
+ border-radius: 4px;
93
+ cursor: pointer;
94
+ font-size: 1rem;
95
+ transition: all 0.3s;
96
+ display: flex;
97
+ align-items: center;
98
+ gap: 0.5rem;
99
+ }
100
+
101
+ .btn:hover {
102
+ background-color: #c0392b;
103
+ transform: translateY(-2px);
104
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
105
+ }
106
+
107
+ .btn:active {
108
+ transform: translateY(0);
109
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
110
+ }
111
+
112
+ .dice-container {
113
+ display: flex;
114
+ justify-content: center;
115
+ flex-wrap: wrap;
116
+ gap: 2rem;
117
+ margin: 2rem 0;
118
+ min-height: 200px;
119
+ perspective: 1000px;
120
+ }
121
+
122
+ .dice {
123
+ width: 80px;
124
+ height: 80px;
125
+ position: relative;
126
+ transform-style: preserve-3d;
127
+ transition: transform 1s ease-in-out;
128
+ cursor: pointer;
129
+ }
130
+
131
+ @media (max-width: 768px) {
132
+ .dice {
133
+ width: 60px;
134
+ height: 60px;
135
+ }
136
+ }
137
+
138
+ .dice-face {
139
+ position: absolute;
140
+ width: 100%;
141
+ height: 100%;
142
+ background-color: var(--dice-color);
143
+ border-radius: 8px;
144
+ display: flex;
145
+ justify-content: center;
146
+ align-items: center;
147
+ box-shadow: inset 0 0 10px var(--shadow-color);
148
+ border: 1px solid #eee;
149
+ }
150
+
151
+ .dot {
152
+ width: 12px;
153
+ height: 12px;
154
+ background-color: var(--primary-color);
155
+ border-radius: 50%;
156
+ position: absolute;
157
+ }
158
+
159
+ @media (max-width: 768px) {
160
+ .dot {
161
+ width: 10px;
162
+ height: 10px;
163
+ }
164
+ }
165
+
166
+ /* Dice face positions */
167
+ .front { transform: translateZ(40px); }
168
+ .back { transform: rotateY(180deg) translateZ(40px); }
169
+ .right { transform: rotateY(90deg) translateZ(40px); }
170
+ .left { transform: rotateY(-90deg) translateZ(40px); }
171
+ .top { transform: rotateX(90deg) translateZ(40px); }
172
+ .bottom { transform: rotateX(-90deg) translateZ(40px); }
173
+
174
+ /* Media query for smaller dice on mobile */
175
+ @media (max-width: 768px) {
176
+ .front { transform: translateZ(30px); }
177
+ .back { transform: rotateY(180deg) translateZ(30px); }
178
+ .right { transform: rotateY(90deg) translateZ(30px); }
179
+ .left { transform: rotateY(-90deg) translateZ(30px); }
180
+ .top { transform: rotateX(90deg) translateZ(30px); }
181
+ .bottom { transform: rotateX(-90deg) translateZ(30px); }
182
+ }
183
+
184
+ /* Dot positions for each face */
185
+ /* All faces use these positions and visibility is controlled by JavaScript */
186
+ .dot-center { transform: translate(0, 0); }
187
+
188
+ .dot-top-left {
189
+ top: 20%;
190
+ left: 20%;
191
+ }
192
+ .dot-top-right {
193
+ top: 20%;
194
+ right: 20%;
195
+ }
196
+ .dot-middle-left {
197
+ left: 20%;
198
+ }
199
+ .dot-middle-right {
200
+ right: 20%;
201
+ }
202
+ .dot-bottom-left {
203
+ bottom: 20%;
204
+ left: 20%;
205
+ }
206
+ .dot-bottom-right {
207
+ bottom: 20%;
208
+ right: 20%;
209
+ }
210
+
211
+ /* Dice roll animations */
212
+ @keyframes roll-twist {
213
+ 0% { transform: rotateX(0) rotateY(0) rotateZ(0); }
214
+ 20% { transform: rotateX(180deg) rotateY(360deg) rotateZ(45deg); }
215
+ 40% { transform: rotateX(360deg) rotateY(180deg) rotateZ(90deg); }
216
+ 60% { transform: rotateX(540deg) rotateY(360deg) rotateZ(135deg); }
217
+ 80% { transform: rotateX(720deg) rotateY(540deg) rotateZ(180deg); }
218
+ 100% { transform: rotateX(900deg) rotateY(720deg) rotateZ(225deg); }
219
+ }
220
+
221
+ @keyframes roll-flip {
222
+ 0% { transform: rotateX(0) rotateY(0); }
223
+ 30% { transform: rotateX(360deg) rotateY(180deg); }
224
+ 70% { transform: rotateX(720deg) rotateY(540deg); }
225
+ 100% { transform: rotateX(1080deg) rotateY(720deg); }
226
+ }
227
+
228
+ @keyframes roll-spiral {
229
+ 0% { transform: rotateX(0) rotateY(0) rotateZ(0) translateY(0); }
230
+ 20% { transform: rotateX(180deg) rotateY(90deg) rotateZ(90deg) translateY(-50px); }
231
+ 40% { transform: rotateX(360deg) rotateY(180deg) rotateZ(180deg) translateY(0); }
232
+ 60% { transform: rotateX(540deg) rotateY(270deg) rotateZ(270deg) translateY(30px); }
233
+ 80% { transform: rotateX(720deg) rotateY(360deg) rotateZ(360deg) translateY(-20px); }
234
+ 100% { transform: rotateX(900deg) rotateY(450deg) rotateZ(450deg) translateY(0); }
235
+ }
236
+
237
+ @keyframes roll-bounce {
238
+ 0% { transform: rotateX(0) rotateY(0) translateY(0); }
239
+ 10% { transform: rotateX(180deg) rotateY(90deg) translateY(-40px); }
240
+ 25% { transform: rotateX(360deg) rotateY(180deg) translateY(0); }
241
+ 35% { transform: rotateX(540deg) rotateY(270deg) translateY(-30px); }
242
+ 45% { transform: rotateX(720deg) rotateY(360deg) translateY(0); }
243
+ 55% { transform: rotateX(900deg) rotateY(450deg) translateY(-15px); }
244
+ 65% { transform: rotateX(1080deg) rotateY(540deg) translateY(0); }
245
+ 75% { transform: rotateX(1260deg) rotateY(630deg) translateY(-5px); }
246
+ 85% { transform: rotateX(1440deg) rotateY(720deg) translateY(0); }
247
+ 100% { transform: rotateX(1620deg) rotateY(810deg) translateY(0); }
248
+ }
249
+
250
+ .rolling-twist {
251
+ animation: roll-twist 1.5s cubic-bezier(0.17, 0.67, 0.83, 0.67) forwards;
252
+ }
253
+
254
+ .rolling-flip {
255
+ animation: roll-flip 1.5s cubic-bezier(0.17, 0.67, 0.83, 0.67) forwards;
256
+ }
257
+
258
+ .rolling-spiral {
259
+ animation: roll-spiral 1.5s cubic-bezier(0.17, 0.67, 0.83, 0.67) forwards;
260
+ }
261
+
262
+ .rolling-bounce {
263
+ animation: roll-bounce 2s cubic-bezier(0.17, 0.67, 0.83, 0.67) forwards;
264
+ }
265
+
266
+ .total-display {
267
+ margin-top: 2rem;
268
+ font-size: 1.5rem;
269
+ opacity: 0;
270
+ transition: opacity 0.5s;
271
+ }
272
+
273
+ .show-total {
274
+ opacity: 1;
275
+ }
276
+
277
+ footer {
278
+ margin-top: 3rem;
279
+ font-size: 0.9rem;
280
+ color: #7f8c8d;
281
+ }
282
+
283
+ /* Responsive adjustments */
284
+ @media (max-width: 600px) {
285
+ h1 {
286
+ font-size: 2rem;
287
+ }
288
+ .controls {
289
+ flex-direction: column;
290
+ }
291
+ .dice-count {
292
+ margin-bottom: 1rem;
293
+ }
294
+ }
295
+ </style>
296
+ </head>
297
+ <body>
298
+ <div class="container">
299
+ <h1>Minimalist Dice Roller</h1>
300
+
301
+ <div class="controls">
302
+ <div class="dice-count">
303
+ <label for="dice-number">Number of dice:</label>
304
+ <input type="number" id="dice-number" min="1" max="10" value="3">
305
+ </div>
306
+ <button id="roll-btn" class="btn">
307
+ <i class="fas fa-dice"></i> Roll Dice
308
+ </button>
309
+ </div>
310
+
311
+ <div id="dice-container" class="dice-container"></div>
312
+
313
+ <div id="total-display" class="total-display"></div>
314
+
315
+ <footer>
316
+ Click any die to roll it individually
317
+ </footer>
318
+ </div>
319
+
320
+ <script>
321
+ document.addEventListener('DOMContentLoaded', function() {
322
+ const diceContainer = document.getElementById('dice-container');
323
+ const rollBtn = document.getElementById('roll-btn');
324
+ const diceNumberInput = document.getElementById('dice-number');
325
+ const totalDisplay = document.getElementById('total-display');
326
+
327
+ let diceCount = 3;
328
+ let diceElements = [];
329
+
330
+ // Possible roll animations
331
+ const rollAnimations = [
332
+ 'rolling-twist',
333
+ 'rolling-flip',
334
+ 'rolling-spiral',
335
+ 'rolling-bounce'
336
+ ];
337
+
338
+ // Create initial dice
339
+ initializeDice();
340
+
341
+ // Update dice count when input changes
342
+ diceNumberInput.addEventListener('change', function() {
343
+ const value = parseInt(this.value);
344
+ if (isNaN(value) || value < 1) {
345
+ this.value = 1;
346
+ diceCount = 1;
347
+ } else if (value > 10) {
348
+ this.value = 10;
349
+ diceCount = 10;
350
+ } else {
351
+ diceCount = value;
352
+ }
353
+ initializeDice();
354
+ });
355
+
356
+ // Roll all dice
357
+ rollBtn.addEventListener('click', function() {
358
+ rollAllDice();
359
+ });
360
+
361
+ function initializeDice() {
362
+ // Clear existing dice
363
+ diceContainer.innerHTML = '';
364
+ diceElements = [];
365
+
366
+ // Create new dice
367
+ for (let i = 0; i < diceCount; i++) {
368
+ const dice = createDiceElement();
369
+ diceContainer.appendChild(dice);
370
+ diceElements.push(dice);
371
+ }
372
+ }
373
+
374
+ function createDiceElement() {
375
+ const dice = document.createElement('div');
376
+ dice.className = 'dice';
377
+
378
+ // Create all 6 faces of the dice with ALL possible dots
379
+ const faces = [
380
+ { class: 'front', value: 1 },
381
+ { class: 'back', value: 2 },
382
+ { class: 'right', value: 3 },
383
+ { class: 'left', value: 4 },
384
+ { class: 'top', value: 5 },
385
+ { class: 'bottom', value: 6 }
386
+ ];
387
+
388
+ faces.forEach((face) => {
389
+ const faceElement = document.createElement('div');
390
+ faceElement.className = `dice-face ${face.class}`;
391
+
392
+ // Create all possible dots (they will be shown/hidden based on value)
393
+ const dotPositions = [
394
+ 'dot-center',
395
+ 'dot-top-left',
396
+ 'dot-top-right',
397
+ 'dot-middle-left',
398
+ 'dot-middle-right',
399
+ 'dot-bottom-left',
400
+ 'dot-bottom-right'
401
+ ];
402
+
403
+ // Create all dots (visibility will be controlled by JS)
404
+ dotPositions.forEach(pos => {
405
+ const dot = document.createElement('div');
406
+ dot.className = `dot ${pos}`;
407
+ faceElement.appendChild(dot);
408
+ });
409
+
410
+ dice.appendChild(faceElement);
411
+ });
412
+
413
+ // Show random face initially
414
+ rollSingleDice(dice, false);
415
+
416
+ // Add click event to roll single die
417
+ dice.addEventListener('click', function() {
418
+ rollSingleDice(this, true);
419
+ updateTotal();
420
+ });
421
+
422
+ return dice;
423
+ }
424
+
425
+ function rollSingleDice(diceElement, withAnimation = true) {
426
+ // Remove any existing animation classes
427
+ rollAnimations.forEach(anim => {
428
+ diceElement.classList.remove(anim);
429
+ });
430
+
431
+ if (withAnimation) {
432
+ // Randomly select an animation
433
+ const randomAnim = rollAnimations[Math.floor(Math.random() * rollAnimations.length)];
434
+ diceElement.classList.add(randomAnim);
435
+
436
+ // Remove animation class after animation completes
437
+ setTimeout(() => {
438
+ diceElement.className = 'dice'; // Reset all classes
439
+ showRandomFace(diceElement);
440
+ }, 2000);
441
+ } else {
442
+ showRandomFace(diceElement);
443
+ }
444
+ }
445
+
446
+ function showRandomFace(diceElement) {
447
+ // Generate random number between 1 and 6
448
+ const randomValue = Math.floor(Math.random() * 6) + 1;
449
+
450
+ // Calculate rotation to show the correct face
451
+ const rotations = [
452
+ { x: 0, y: 0 }, // 1 (front)
453
+ { x: 0, y: 180 }, // 2 (back)
454
+ { x: 0, y: 90 }, // 3 (right)
455
+ { x: 0, y: 270 }, // 4 (left)
456
+ { x: 270, y: 0 }, // 5 (top)
457
+ { x: 90, y: 0 } // 6 (bottom)
458
+ ];
459
+
460
+ const rotation = rotations[randomValue - 1];
461
+ diceElement.style.transform = `rotateX(${rotation.x}deg) rotateY(${rotation.y}deg)`;
462
+ diceElement.setAttribute('data-value', randomValue);
463
+
464
+ // Update dots visibility for all faces based on their values
465
+ const faces = diceElement.querySelectorAll('.dice-face');
466
+ faces.forEach((face, idx) => {
467
+ const value = idx + 1; // faces are in order 1-6
468
+ const dots = face.querySelectorAll('.dot');
469
+
470
+ // Hide all dots first
471
+ dots.forEach(dot => dot.style.display = 'none');
472
+
473
+ // Show dots based on face value
474
+ switch(value) {
475
+ case 1: // Center
476
+ dots[0].style.display = 'block';
477
+ break;
478
+ case 2: // Top-left, Bottom-right
479
+ dots[1].style.display = 'block';
480
+ dots[6].style.display = 'block';
481
+ break;
482
+ case 3: // Center + case 2
483
+ dots[0].style.display = 'block';
484
+ dots[1].style.display = 'block';
485
+ dots[6].style.display = 'block';
486
+ break;
487
+ case 4: // All corners
488
+ dots[1].style.display = 'block';
489
+ dots[2].style.display = 'block';
490
+ dots[5].style.display = 'block';
491
+ dots[6].style.display = 'block';
492
+ break;
493
+ case 5: // Center + case 4
494
+ dots[0].style.display = 'block';
495
+ dots[1].style.display = 'block';
496
+ dots[2].style.display = 'block';
497
+ dots[5].style.display = 'block';
498
+ dots[6].style.display = 'block';
499
+ break;
500
+ case 6: // All corners + middle
501
+ dots[1].style.display = 'block';
502
+ dots[2].style.display = 'block';
503
+ dots[3].style.display = 'block';
504
+ dots[4].style.display = 'block';
505
+ dots[5].style.display = 'block';
506
+ dots[6].style.display = 'block';
507
+ break;
508
+ }
509
+ });
510
+ }
511
+
512
+ function rollAllDice() {
513
+ // Hide total display during roll
514
+ totalDisplay.classList.remove('show-total');
515
+
516
+ // Roll each die with a slight delay between them
517
+ diceElements.forEach((dice, index) => {
518
+ setTimeout(() => {
519
+ rollSingleDice(dice, true);
520
+ }, index * 150);
521
+ });
522
+
523
+ // Show total after all dice finish rolling
524
+ setTimeout(() => {
525
+ updateTotal();
526
+ totalDisplay.classList.add('show-total');
527
+ }, 2500);
528
+ }
529
+
530
+ function updateTotal() {
531
+ let total = 0;
532
+ let allRolled = true;
533
+
534
+ diceElements.forEach(dice => {
535
+ const value = dice.getAttribute('data-value');
536
+ if (value) {
537
+ total += parseInt(value);
538
+ } else {
539
+ allRolled = false;
540
+ }
541
+ });
542
+
543
+ if (allRolled) {
544
+ totalDisplay.textContent = `Total: ${total}`;
545
+ } else {
546
+ totalDisplay.textContent = '';
547
+ }
548
+ }
549
+ });
550
+ </script>
551
+ <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <a href="https://enzostvs-deepsite.hf.space" style="color: #fff;" target="_blank" >DeepSite</a> <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;"></p></body>
552
+ </html>