create-template-html-css 1.8.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +179 -2
  3. package/bin/cli.js +20 -2
  4. package/package.json +1 -1
  5. package/templates/blackjack/index.html +97 -0
  6. package/templates/blackjack/script.js +381 -0
  7. package/templates/blackjack/style.css +452 -0
  8. package/templates/breakout/index.html +56 -0
  9. package/templates/breakout/script.js +387 -0
  10. package/templates/breakout/style.css +239 -0
  11. package/templates/connect-four/index.html +78 -0
  12. package/templates/connect-four/script.js +413 -0
  13. package/templates/connect-four/style.css +426 -0
  14. package/templates/dice-game/index.html +99 -0
  15. package/templates/dice-game/script.js +291 -0
  16. package/templates/dice-game/style.css +403 -0
  17. package/templates/flappy-bird/index.html +47 -0
  18. package/templates/flappy-bird/script.js +394 -0
  19. package/templates/flappy-bird/style.css +243 -0
  20. package/templates/game-2048/index.html +59 -0
  21. package/templates/game-2048/script.js +269 -0
  22. package/templates/game-2048/style.css +281 -0
  23. package/templates/guess-number/index.html +71 -0
  24. package/templates/guess-number/script.js +216 -0
  25. package/templates/guess-number/style.css +337 -0
  26. package/templates/memory-game/index.html +50 -0
  27. package/templates/memory-game/script.js +216 -0
  28. package/templates/memory-game/style.css +288 -0
  29. package/templates/pong/index.html +90 -0
  30. package/templates/pong/script.js +364 -0
  31. package/templates/pong/style.css +371 -0
  32. package/templates/rock-paper-scissors/index.html +84 -0
  33. package/templates/rock-paper-scissors/script.js +199 -0
  34. package/templates/rock-paper-scissors/style.css +295 -0
  35. package/templates/simon-says/index.html +64 -0
  36. package/templates/simon-says/script.js +206 -0
  37. package/templates/simon-says/style.css +250 -0
  38. package/templates/slot-machine/index.html +112 -0
  39. package/templates/slot-machine/script.js +238 -0
  40. package/templates/slot-machine/style.css +464 -0
  41. package/templates/snake-game/index.html +61 -0
  42. package/templates/snake-game/script.js +360 -0
  43. package/templates/snake-game/style.css +246 -0
  44. package/templates/tetris/index.html +84 -0
  45. package/templates/tetris/script.js +447 -0
  46. package/templates/tetris/style.css +286 -0
  47. package/templates/tic-tac-toe/index.html +57 -0
  48. package/templates/tic-tac-toe/script.js +156 -0
  49. package/templates/tic-tac-toe/style.css +244 -0
  50. package/templates/whack-a-mole/index.html +85 -0
  51. package/templates/whack-a-mole/script.js +172 -0
  52. package/templates/whack-a-mole/style.css +263 -0
  53. package/COMPONENTS-GALLERY.html +0 -773
  54. package/PUBLISH-GUIDE.md +0 -112
  55. package/create-template-html-css-1.8.0.tgz +0 -0
@@ -0,0 +1,291 @@
1
+ // Game state
2
+ let gameState = {
3
+ players: [
4
+ { total: 0, current: 0, name: 'שחקן 1' },
5
+ { total: 0, current: 0, name: 'שחקן 2' }
6
+ ],
7
+ currentPlayer: 0,
8
+ gameActive: true,
9
+ gameMode: 'pvp', // 'pvp' or 'pvc'
10
+ rolling: false
11
+ };
12
+
13
+ // Dice faces configuration
14
+ const diceFaces = {
15
+ 1: [{ x: 50, y: 50 }],
16
+ 2: [{ x: 25, y: 25 }, { x: 75, y: 75 }],
17
+ 3: [{ x: 25, y: 25 }, { x: 50, y: 50 }, { x: 75, y: 75 }],
18
+ 4: [{ x: 25, y: 25 }, { x: 75, y: 25 }, { x: 25, y: 75 }, { x: 75, y: 75 }],
19
+ 5: [{ x: 25, y: 25 }, { x: 75, y: 25 }, { x: 50, y: 50 }, { x: 25, y: 75 }, { x: 75, y: 75 }],
20
+ 6: [{ x: 25, y: 25 }, { x: 75, y: 25 }, { x: 25, y: 50 }, { x: 75, y: 50 }, { x: 25, y: 75 }, { x: 75, y: 75 }]
21
+ };
22
+
23
+ // Update display
24
+ function updateDisplay() {
25
+ document.getElementById('player1Total').textContent = gameState.players[0].total;
26
+ document.getElementById('player1Current').textContent = gameState.players[0].current;
27
+ document.getElementById('player2Total').textContent = gameState.players[1].total;
28
+ document.getElementById('player2Current').textContent = gameState.players[1].current;
29
+
30
+ // Update active player
31
+ const player1Card = document.getElementById('player1Card');
32
+ const player2Card = document.getElementById('player2Card');
33
+
34
+ if (gameState.currentPlayer === 0) {
35
+ player1Card.classList.add('active');
36
+ player2Card.classList.remove('active');
37
+ player1Card.querySelector('.current-turn').textContent = 'תורך!';
38
+ player2Card.querySelector('.current-turn').textContent = 'המתן...';
39
+ } else {
40
+ player1Card.classList.remove('active');
41
+ player2Card.classList.add('active');
42
+ player1Card.querySelector('.current-turn').textContent = 'המתן...';
43
+ player2Card.querySelector('.current-turn').textContent = gameState.gameMode === 'pvc' ? 'תור המחשב...' : 'תורך!';
44
+ }
45
+ }
46
+
47
+ // Draw dice
48
+ function drawDice(number) {
49
+ const dice = document.getElementById('dice');
50
+ const face = dice.querySelector('.dice-face');
51
+
52
+ face.innerHTML = '';
53
+
54
+ const dots = diceFaces[number];
55
+ dots.forEach(dot => {
56
+ const dotEl = document.createElement('span');
57
+ dotEl.className = 'dot';
58
+ dotEl.style.left = `${dot.x}%`;
59
+ dotEl.style.top = `${dot.y}%`;
60
+ face.appendChild(dotEl);
61
+ });
62
+ }
63
+
64
+ // Roll dice with animation
65
+ async function rollDice() {
66
+ if (!gameState.gameActive || gameState.rolling) return;
67
+
68
+ gameState.rolling = true;
69
+ const dice = document.getElementById('dice');
70
+ dice.classList.add('rolling');
71
+
72
+ // Animate random numbers
73
+ for (let i = 0; i < 10; i++) {
74
+ drawDice(Math.floor(Math.random() * 6) + 1);
75
+ await new Promise(resolve => setTimeout(resolve, 100));
76
+ }
77
+
78
+ // Final roll
79
+ const result = Math.floor(Math.random() * 6) + 1;
80
+ drawDice(result);
81
+
82
+ dice.classList.remove('rolling');
83
+ gameState.rolling = false;
84
+
85
+ return result;
86
+ }
87
+
88
+ // Roll button
89
+ document.getElementById('rollBtn').addEventListener('click', async () => {
90
+ if (!gameState.gameActive || gameState.rolling) return;
91
+
92
+ document.getElementById('resultMessage').textContent = '';
93
+
94
+ const roll = await rollDice();
95
+
96
+ if (roll === 1) {
97
+ // Lost turn
98
+ gameState.players[gameState.currentPlayer].current = 0;
99
+ showMessage(`💥 הטלת 1! איבדת את כל ניקוד התור!`, 'error');
100
+
101
+ await new Promise(resolve => setTimeout(resolve, 1500));
102
+ switchPlayer();
103
+ } else {
104
+ // Add to current
105
+ gameState.players[gameState.currentPlayer].current += roll;
106
+ updateDisplay();
107
+ showMessage(`🎲 הטלת ${roll}!`, 'info');
108
+ }
109
+ });
110
+
111
+ // Hold button
112
+ document.getElementById('holdBtn').addEventListener('click', () => {
113
+ if (!gameState.gameActive || gameState.rolling) return;
114
+
115
+ const player = gameState.players[gameState.currentPlayer];
116
+
117
+ if (player.current === 0) {
118
+ showMessage('אין מה לשמור! הטל קובייה תחילה.', 'error');
119
+ return;
120
+ }
121
+
122
+ player.total += player.current;
123
+ player.current = 0;
124
+
125
+ updateDisplay();
126
+
127
+ // Check for win
128
+ if (player.total >= 100) {
129
+ endGame();
130
+ } else {
131
+ showMessage(`✅ נשמר! ${player.total} נקודות סה"כ.`, 'success');
132
+ setTimeout(() => {
133
+ switchPlayer();
134
+ }, 1000);
135
+ }
136
+ });
137
+
138
+ // Switch player
139
+ async function switchPlayer() {
140
+ gameState.currentPlayer = gameState.currentPlayer === 0 ? 1 : 0;
141
+ updateDisplay();
142
+ document.getElementById('resultMessage').textContent = '';
143
+
144
+ // Computer turn
145
+ if (gameState.gameMode === 'pvc' && gameState.currentPlayer === 1) {
146
+ await computerTurn();
147
+ }
148
+ }
149
+
150
+ // Computer turn (AI)
151
+ async function computerTurn() {
152
+ await new Promise(resolve => setTimeout(resolve, 1000));
153
+
154
+ const player = gameState.players[1];
155
+ const opponent = gameState.players[0];
156
+
157
+ while (gameState.currentPlayer === 1 && gameState.gameActive) {
158
+ await new Promise(resolve => setTimeout(resolve, 1200));
159
+
160
+ const roll = await rollDice();
161
+
162
+ if (roll === 1) {
163
+ player.current = 0;
164
+ showMessage(`🤖 המחשב הטיל 1! איבד את התור!`, 'error');
165
+ await new Promise(resolve => setTimeout(resolve, 1500));
166
+ switchPlayer();
167
+ return;
168
+ }
169
+
170
+ player.current += roll;
171
+ updateDisplay();
172
+ showMessage(`🤖 המחשב הטיל ${roll}!`, 'info');
173
+
174
+ // AI decision logic
175
+ const shouldHold =
176
+ player.current >= 20 || // Safe threshold
177
+ (player.total + player.current >= 100) || // Winning move
178
+ (opponent.total >= 80 && player.current >= 15); // Defensive play
179
+
180
+ if (shouldHold) {
181
+ await new Promise(resolve => setTimeout(resolve, 1000));
182
+
183
+ player.total += player.current;
184
+ player.current = 0;
185
+ updateDisplay();
186
+
187
+ if (player.total >= 100) {
188
+ endGame();
189
+ return;
190
+ }
191
+
192
+ showMessage(`🤖 המחשב שומר ${player.total} נקודות!`, 'success');
193
+ await new Promise(resolve => setTimeout(resolve, 1500));
194
+ switchPlayer();
195
+ return;
196
+ }
197
+ }
198
+ }
199
+
200
+ // End game
201
+ function endGame() {
202
+ gameState.gameActive = false;
203
+
204
+ const winner = gameState.players[gameState.currentPlayer];
205
+ const winnerName = gameState.currentPlayer === 0 ?
206
+ 'שחקן 1' :
207
+ (gameState.gameMode === 'pvc' ? 'המחשב' : 'שחקן 2');
208
+
209
+ showMessage(`🎉 ${winnerName} ניצח עם ${winner.total} נקודות!`, 'success');
210
+
211
+ // Celebrate
212
+ celebrate();
213
+ }
214
+
215
+ // New game
216
+ document.getElementById('newGameBtn').addEventListener('click', newGame);
217
+
218
+ function newGame() {
219
+ gameState.players = [
220
+ { total: 0, current: 0, name: 'שחקן 1' },
221
+ { total: 0, current: 0, name: 'שחקן 2' }
222
+ ];
223
+ gameState.currentPlayer = 0;
224
+ gameState.gameActive = true;
225
+ gameState.rolling = false;
226
+
227
+ updateDisplay();
228
+ drawDice(1);
229
+ document.getElementById('resultMessage').textContent = '';
230
+ }
231
+
232
+ // Game mode buttons
233
+ document.querySelectorAll('.mode-btn').forEach(btn => {
234
+ btn.addEventListener('click', () => {
235
+ if (gameState.rolling) return;
236
+
237
+ document.querySelectorAll('.mode-btn').forEach(b => b.classList.remove('active'));
238
+ btn.classList.add('active');
239
+
240
+ gameState.gameMode = btn.dataset.mode;
241
+
242
+ // Update player 2 name
243
+ if (gameState.gameMode === 'pvc') {
244
+ document.querySelector('#player2Card h3').textContent = '🤖 מחשב';
245
+ } else {
246
+ document.querySelector('#player2Card h3').textContent = '👤 שחקן 2';
247
+ }
248
+
249
+ newGame();
250
+ });
251
+ });
252
+
253
+ // Show message
254
+ function showMessage(text, type = 'info') {
255
+ const messageEl = document.getElementById('resultMessage');
256
+ messageEl.textContent = text;
257
+ messageEl.className = `result-message ${type}`;
258
+ messageEl.style.display = 'block';
259
+ }
260
+
261
+ // Celebration
262
+ function celebrate() {
263
+ const card = document.getElementById(`player${gameState.currentPlayer + 1}Card`);
264
+ card.classList.add('winner');
265
+
266
+ // Confetti
267
+ for (let i = 0; i < 50; i++) {
268
+ setTimeout(() => {
269
+ createConfetti();
270
+ }, i * 30);
271
+ }
272
+ }
273
+
274
+ // Create confetti
275
+ function createConfetti() {
276
+ const confetti = document.createElement('div');
277
+ confetti.className = 'confetti';
278
+ confetti.style.left = Math.random() * 100 + '%';
279
+ confetti.style.animationDuration = (Math.random() * 2 + 1) + 's';
280
+ confetti.style.background = ['#FFD700', '#FF6347', '#4169E1', '#32CD32', '#FF69B4'][Math.floor(Math.random() * 5)];
281
+
282
+ document.body.appendChild(confetti);
283
+
284
+ setTimeout(() => {
285
+ confetti.remove();
286
+ }, 3000);
287
+ }
288
+
289
+ // Initialize
290
+ updateDisplay();
291
+ drawDice(1);
@@ -0,0 +1,403 @@
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ box-sizing: border-box;
5
+ }
6
+
7
+ body {
8
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
9
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
10
+ min-height: 100vh;
11
+ display: flex;
12
+ justify-content: center;
13
+ align-items: center;
14
+ padding: 20px;
15
+ overflow-x: hidden;
16
+ }
17
+
18
+ .container {
19
+ background: white;
20
+ border-radius: 20px;
21
+ padding: 30px;
22
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
23
+ max-width: 800px;
24
+ width: 100%;
25
+ }
26
+
27
+ .header {
28
+ text-align: center;
29
+ margin-bottom: 20px;
30
+ }
31
+
32
+ .header h1 {
33
+ color: #2d3748;
34
+ font-size: 2.5rem;
35
+ margin-bottom: 5px;
36
+ }
37
+
38
+ .subtitle {
39
+ color: #718096;
40
+ font-size: 1.1rem;
41
+ }
42
+
43
+ .game-mode {
44
+ display: flex;
45
+ gap: 15px;
46
+ justify-content: center;
47
+ margin-bottom: 25px;
48
+ }
49
+
50
+ .mode-btn {
51
+ padding: 12px 30px;
52
+ font-size: 1rem;
53
+ font-weight: 600;
54
+ border: 3px solid #e2e8f0;
55
+ background: white;
56
+ color: #4a5568;
57
+ border-radius: 10px;
58
+ cursor: pointer;
59
+ transition: all 0.3s ease;
60
+ }
61
+
62
+ .mode-btn:hover {
63
+ border-color: #667eea;
64
+ color: #667eea;
65
+ }
66
+
67
+ .mode-btn.active {
68
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
69
+ color: white;
70
+ border-color: #667eea;
71
+ }
72
+
73
+ .players-section {
74
+ display: grid;
75
+ grid-template-columns: 1fr 1fr;
76
+ gap: 20px;
77
+ margin-bottom: 30px;
78
+ }
79
+
80
+ .player-card {
81
+ background: #f7fafc;
82
+ border-radius: 15px;
83
+ padding: 20px;
84
+ border: 3px solid #e2e8f0;
85
+ transition: all 0.3s ease;
86
+ }
87
+
88
+ .player-card.active {
89
+ border-color: #667eea;
90
+ box-shadow: 0 8px 30px rgba(102, 126, 234, 0.3);
91
+ transform: scale(1.02);
92
+ }
93
+
94
+ .player-card.winner {
95
+ animation: winnerPulse 1s ease-in-out infinite;
96
+ }
97
+
98
+ @keyframes winnerPulse {
99
+ 0%, 100% {
100
+ transform: scale(1);
101
+ box-shadow: 0 0 20px rgba(255, 215, 0, 0.5);
102
+ }
103
+ 50% {
104
+ transform: scale(1.05);
105
+ box-shadow: 0 0 40px rgba(255, 215, 0, 0.8);
106
+ }
107
+ }
108
+
109
+ .player1-card.active {
110
+ background: linear-gradient(135deg, rgba(245, 87, 108, 0.1) 0%, rgba(240, 147, 251, 0.1) 100%);
111
+ }
112
+
113
+ .player2-card.active {
114
+ background: linear-gradient(135deg, rgba(77, 219, 255, 0.1) 0%, rgba(66, 153, 225, 0.1) 100%);
115
+ }
116
+
117
+ .player-header {
118
+ display: flex;
119
+ justify-content: space-between;
120
+ align-items: center;
121
+ margin-bottom: 15px;
122
+ }
123
+
124
+ .player-header h3 {
125
+ color: #2d3748;
126
+ font-size: 1.3rem;
127
+ }
128
+
129
+ .current-turn {
130
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
131
+ color: white;
132
+ padding: 6px 15px;
133
+ border-radius: 20px;
134
+ font-size: 0.85rem;
135
+ font-weight: bold;
136
+ }
137
+
138
+ .player-stats {
139
+ display: flex;
140
+ flex-direction: column;
141
+ gap: 12px;
142
+ }
143
+
144
+ .stat {
145
+ display: flex;
146
+ justify-content: space-between;
147
+ align-items: center;
148
+ }
149
+
150
+ .stat-label {
151
+ color: #718096;
152
+ font-size: 0.95rem;
153
+ font-weight: 600;
154
+ }
155
+
156
+ .stat-value {
157
+ color: #2d3748;
158
+ font-size: 1.8rem;
159
+ font-weight: bold;
160
+ }
161
+
162
+ .dice-container {
163
+ display: flex;
164
+ justify-content: center;
165
+ margin-bottom: 30px;
166
+ }
167
+
168
+ .dice {
169
+ width: 120px;
170
+ height: 120px;
171
+ perspective: 1000px;
172
+ }
173
+
174
+ .dice.rolling {
175
+ animation: diceRoll 0.5s ease-in-out;
176
+ }
177
+
178
+ @keyframes diceRoll {
179
+ 0%, 100% {
180
+ transform: rotateX(0) rotateY(0);
181
+ }
182
+ 25% {
183
+ transform: rotateX(180deg) rotateY(180deg);
184
+ }
185
+ 50% {
186
+ transform: rotateX(360deg) rotateY(360deg);
187
+ }
188
+ 75% {
189
+ transform: rotateX(540deg) rotateY(540deg);
190
+ }
191
+ }
192
+
193
+ .dice-face {
194
+ width: 100%;
195
+ height: 100%;
196
+ background: white;
197
+ border: 4px solid #2d3748;
198
+ border-radius: 15px;
199
+ position: relative;
200
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);
201
+ }
202
+
203
+ .dot {
204
+ width: 20px;
205
+ height: 20px;
206
+ background: #2d3748;
207
+ border-radius: 50%;
208
+ position: absolute;
209
+ transform: translate(-50%, -50%);
210
+ }
211
+
212
+ .controls {
213
+ display: flex;
214
+ gap: 15px;
215
+ justify-content: center;
216
+ margin-bottom: 20px;
217
+ flex-wrap: wrap;
218
+ }
219
+
220
+ .btn {
221
+ padding: 15px 30px;
222
+ font-size: 1.1rem;
223
+ font-weight: 600;
224
+ border: none;
225
+ border-radius: 10px;
226
+ cursor: pointer;
227
+ transition: all 0.3s ease;
228
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
229
+ display: flex;
230
+ align-items: center;
231
+ gap: 8px;
232
+ min-width: 160px;
233
+ justify-content: center;
234
+ }
235
+
236
+ .btn:hover:not(:disabled) {
237
+ transform: translateY(-3px);
238
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3);
239
+ }
240
+
241
+ .btn:active:not(:disabled) {
242
+ transform: translateY(0);
243
+ }
244
+
245
+ .btn:disabled {
246
+ opacity: 0.5;
247
+ cursor: not-allowed;
248
+ }
249
+
250
+ .btn-icon {
251
+ font-size: 1.5rem;
252
+ }
253
+
254
+ .btn-roll {
255
+ background: linear-gradient(135deg, #48bb78 0%, #38a169 100%);
256
+ color: white;
257
+ }
258
+
259
+ .btn-hold {
260
+ background: linear-gradient(135deg, #ed8936 0%, #dd6b20 100%);
261
+ color: white;
262
+ }
263
+
264
+ .btn-new {
265
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
266
+ color: white;
267
+ }
268
+
269
+ .result-message {
270
+ text-align: center;
271
+ padding: 15px;
272
+ border-radius: 10px;
273
+ font-size: 1.2rem;
274
+ font-weight: bold;
275
+ margin-bottom: 20px;
276
+ display: none;
277
+ }
278
+
279
+ .result-message.success {
280
+ background: #c6f6d5;
281
+ color: #22543d;
282
+ border: 2px solid #9ae6b4;
283
+ }
284
+
285
+ .result-message.error {
286
+ background: #fed7d7;
287
+ color: #742a2a;
288
+ border: 2px solid #fc8181;
289
+ }
290
+
291
+ .result-message.info {
292
+ background: #bee3f8;
293
+ color: #2c5282;
294
+ border: 2px solid #90cdf4;
295
+ }
296
+
297
+ .instructions {
298
+ background: #f7fafc;
299
+ padding: 20px;
300
+ border-radius: 10px;
301
+ border: 2px solid #e2e8f0;
302
+ }
303
+
304
+ .instructions h3 {
305
+ color: #2d3748;
306
+ margin-bottom: 12px;
307
+ font-size: 1.1rem;
308
+ }
309
+
310
+ .instructions ul {
311
+ list-style: none;
312
+ padding-right: 0;
313
+ }
314
+
315
+ .instructions li {
316
+ color: #4a5568;
317
+ margin-bottom: 8px;
318
+ padding-right: 20px;
319
+ position: relative;
320
+ line-height: 1.6;
321
+ }
322
+
323
+ .instructions li:before {
324
+ content: "•";
325
+ color: #667eea;
326
+ font-weight: bold;
327
+ position: absolute;
328
+ right: 0;
329
+ font-size: 1.2rem;
330
+ }
331
+
332
+ /* Confetti */
333
+ .confetti {
334
+ position: fixed;
335
+ width: 10px;
336
+ height: 10px;
337
+ top: -10px;
338
+ z-index: 9999;
339
+ animation: confettiFall linear forwards;
340
+ }
341
+
342
+ @keyframes confettiFall {
343
+ to {
344
+ transform: translateY(100vh) rotate(720deg);
345
+ }
346
+ }
347
+
348
+ /* Responsive */
349
+ @media (max-width: 768px) {
350
+ .container {
351
+ padding: 20px;
352
+ }
353
+
354
+ .header h1 {
355
+ font-size: 2rem;
356
+ }
357
+
358
+ .players-section {
359
+ grid-template-columns: 1fr;
360
+ }
361
+
362
+ .game-mode {
363
+ flex-direction: column;
364
+ }
365
+
366
+ .mode-btn {
367
+ width: 100%;
368
+ }
369
+
370
+ .controls {
371
+ flex-direction: column;
372
+ align-items: stretch;
373
+ }
374
+
375
+ .btn {
376
+ min-width: unset;
377
+ }
378
+ }
379
+
380
+ @media (max-width: 480px) {
381
+ .header h1 {
382
+ font-size: 1.5rem;
383
+ }
384
+
385
+ .dice {
386
+ width: 100px;
387
+ height: 100px;
388
+ }
389
+
390
+ .dot {
391
+ width: 16px;
392
+ height: 16px;
393
+ }
394
+
395
+ .btn {
396
+ padding: 12px 20px;
397
+ font-size: 1rem;
398
+ }
399
+
400
+ .btn-icon {
401
+ font-size: 1.2rem;
402
+ }
403
+ }