smodusermc commited on
Commit
e11a464
·
verified ·
1 Parent(s): f30e28a

Create static/css/style.css

Browse files
Files changed (1) hide show
  1. static/css/style.css +1805 -0
static/css/style.css ADDED
@@ -0,0 +1,1805 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* ========================================
2
+ CSS Variables & Theme Definitions
3
+ ======================================== */
4
+ :root {
5
+ /* Default Dark Theme */
6
+ --bg-primary: #1a1a2e;
7
+ --bg-secondary: #16213e;
8
+ --bg-tertiary: #0f3460;
9
+ --text-primary: #ffffff;
10
+ --text-secondary: #a0a0a0;
11
+ --accent-primary: #e94560;
12
+ --accent-secondary: #0f3460;
13
+ --board-light: #eeeed2;
14
+ --board-dark: #769656;
15
+ --highlight-move: rgba(255, 255, 0, 0.4);
16
+ --highlight-selected: rgba(20, 85, 30, 0.5);
17
+ --highlight-legal: rgba(0, 0, 0, 0.1);
18
+ --highlight-capture: rgba(255, 0, 0, 0.4);
19
+ --check-color: #ff0000;
20
+ --border-color: #333;
21
+ --shadow-color: rgba(0, 0, 0, 0.3);
22
+ --modal-bg: rgba(0, 0, 0, 0.8);
23
+ }
24
+
25
+ /* Light Theme */
26
+ .theme-light {
27
+ --bg-primary: #f5f5f5;
28
+ --bg-secondary: #ffffff;
29
+ --bg-tertiary: #e0e0e0;
30
+ --text-primary: #1a1a1a;
31
+ --text-secondary: #666666;
32
+ --accent-primary: #2196f3;
33
+ --accent-secondary: #1976d2;
34
+ --border-color: #ddd;
35
+ --shadow-color: rgba(0, 0, 0, 0.1);
36
+ }
37
+
38
+ /* Forest Theme */
39
+ .theme-forest {
40
+ --bg-primary: #1b2d1b;
41
+ --bg-secondary: #2d4a2d;
42
+ --bg-tertiary: #3d6b3d;
43
+ --text-primary: #e8f5e9;
44
+ --text-secondary: #a5d6a7;
45
+ --accent-primary: #4caf50;
46
+ --accent-secondary: #2e7d32;
47
+ --board-light: #c8e6c9;
48
+ --board-dark: #388e3c;
49
+ --border-color: #2e7d32;
50
+ }
51
+
52
+ /* Ocean Theme */
53
+ .theme-ocean {
54
+ --bg-primary: #0d1b2a;
55
+ --bg-secondary: #1b263b;
56
+ --bg-tertiary: #415a77;
57
+ --text-primary: #e0e1dd;
58
+ --text-secondary: #778da9;
59
+ --accent-primary: #00b4d8;
60
+ --accent-secondary: #0077b6;
61
+ --board-light: #caf0f8;
62
+ --board-dark: #0077b6;
63
+ --border-color: #0077b6;
64
+ }
65
+
66
+ /* Sunset Theme */
67
+ .theme-sunset {
68
+ --bg-primary: #2d132c;
69
+ --bg-secondary: #801336;
70
+ --bg-tertiary: #c72c41;
71
+ --text-primary: #fff5e4;
72
+ --text-secondary: #ee6f57;
73
+ --accent-primary: #ee6f57;
74
+ --accent-secondary: #c72c41;
75
+ --board-light: #ffeaa7;
76
+ --board-dark: #d63031;
77
+ --border-color: #c72c41;
78
+ }
79
+
80
+ /* Midnight Theme */
81
+ .theme-midnight {
82
+ --bg-primary: #0a0a0a;
83
+ --bg-secondary: #1a1a1a;
84
+ --bg-tertiary: #2a2a2a;
85
+ --text-primary: #ffffff;
86
+ --text-secondary: #888888;
87
+ --accent-primary: #6c5ce7;
88
+ --accent-secondary: #5541d7;
89
+ --board-light: #b8b8b8;
90
+ --board-dark: #4a4a4a;
91
+ --border-color: #333;
92
+ }
93
+
94
+ /* Cream Theme */
95
+ .theme-cream {
96
+ --bg-primary: #f5f0e1;
97
+ --bg-secondary: #fffef9;
98
+ --bg-tertiary: #e8e0cc;
99
+ --text-primary: #2c2c2c;
100
+ --text-secondary: #666666;
101
+ --accent-primary: #c9a959;
102
+ --accent-secondary: #8b7355;
103
+ --board-light: #f0d9b5;
104
+ --board-dark: #b58863;
105
+ --border-color: #c9a959;
106
+ }
107
+
108
+ /* Lavender Theme */
109
+ .theme-lavender {
110
+ --bg-primary: #2d2540;
111
+ --bg-secondary: #3d3356;
112
+ --bg-tertiary: #5a4f7a;
113
+ --text-primary: #e8e0f0;
114
+ --text-secondary: #b8a8d0;
115
+ --accent-primary: #9b59b6;
116
+ --accent-secondary: #8e44ad;
117
+ --board-light: #e8d5f0;
118
+ --board-dark: #9b59b6;
119
+ --border-color: #8e44ad;
120
+ }
121
+
122
+ /* Mint Theme */
123
+ .theme-mint {
124
+ --bg-primary: #1a332e;
125
+ --bg-secondary: #2a4a44;
126
+ --bg-tertiary: #3a6a60;
127
+ --text-primary: #e0f2ef;
128
+ --text-secondary: #98d4c8;
129
+ --accent-primary: #1abc9c;
130
+ --accent-secondary: #16a085;
131
+ --board-light: #a8e6cf;
132
+ --board-dark: #20b2aa;
133
+ --border-color: #16a085;
134
+ }
135
+
136
+ /* Slate Theme */
137
+ .theme-slate {
138
+ --bg-primary: #2c3e50;
139
+ --bg-secondary: #34495e;
140
+ --bg-tertiary: #4a6278;
141
+ --text-primary: #ecf0f1;
142
+ --text-secondary: #95a5a6;
143
+ --accent-primary: #3498db;
144
+ --accent-secondary: #2980b9;
145
+ --board-light: #bdc3c7;
146
+ --board-dark: #7f8c8d;
147
+ --border-color: #2980b9;
148
+ }
149
+
150
+ /* ========================================
151
+ Rainbow Theme (Special) - Only Board Animates
152
+ ======================================== */
153
+ .theme-rainbow {
154
+ /* Same as Dark Theme */
155
+ --bg-primary: #1a1a2e;
156
+ --bg-secondary: #16213e;
157
+ --bg-tertiary: #0f3460;
158
+ --text-primary: #ffffff;
159
+ --text-secondary: #a0a0a0;
160
+ --accent-primary: #e94560;
161
+ --accent-secondary: #0f3460;
162
+ --border-color: #333;
163
+ --shadow-color: rgba(0, 0, 0, 0.3);
164
+ --modal-bg: rgba(0, 0, 0, 0.8);
165
+ --highlight-move: rgba(255, 255, 0, 0.4);
166
+ --highlight-selected: rgba(20, 85, 30, 0.5);
167
+ --highlight-legal: rgba(0, 0, 0, 0.1);
168
+ --highlight-capture: rgba(255, 0, 0, 0.4);
169
+ --check-color: #ff0000;
170
+ }
171
+
172
+ /* Rainbow animated board glow */
173
+ .theme-rainbow .chessboard {
174
+ animation: rainbow-glow 8s ease infinite;
175
+ }
176
+
177
+ @keyframes rainbow-glow {
178
+ 0%, 100% {
179
+ box-shadow: 0 0 30px #ff6b6b, 0 0 60px #ff6b6b, inset 0 0 20px rgba(255, 107, 107, 0.1);
180
+ border-color: #ff6b6b;
181
+ }
182
+ 14% {
183
+ box-shadow: 0 0 30px #feca57, 0 0 60px #feca57, inset 0 0 20px rgba(254, 202, 87, 0.1);
184
+ border-color: #feca57;
185
+ }
186
+ 28% {
187
+ box-shadow: 0 0 30px #48dbfb, 0 0 60px #48dbfb, inset 0 0 20px rgba(72, 219, 251, 0.1);
188
+ border-color: #48dbfb;
189
+ }
190
+ 42% {
191
+ box-shadow: 0 0 30px #1dd1a1, 0 0 60px #1dd1a1, inset 0 0 20px rgba(29, 209, 161, 0.1);
192
+ border-color: #1dd1a1;
193
+ }
194
+ 56% {
195
+ box-shadow: 0 0 30px #5f27cd, 0 0 60px #5f27cd, inset 0 0 20px rgba(95, 39, 205, 0.1);
196
+ border-color: #5f27cd;
197
+ }
198
+ 70% {
199
+ box-shadow: 0 0 30px #ff9ff3, 0 0 60px #ff9ff3, inset 0 0 20px rgba(255, 159, 243, 0.1);
200
+ border-color: #ff9ff3;
201
+ }
202
+ 84% {
203
+ box-shadow: 0 0 30px #00d2d3, 0 0 60px #00d2d3, inset 0 0 20px rgba(0, 210, 211, 0.1);
204
+ border-color: #00d2d3;
205
+ }
206
+ }
207
+
208
+ /* Rainbow light squares */
209
+ .theme-rainbow .board-square.light {
210
+ animation: rainbow-light-square 6s ease infinite;
211
+ }
212
+
213
+ @keyframes rainbow-light-square {
214
+ 0%, 100% { background-color: #ffe6e6; }
215
+ 14% { background-color: #fff8e6; }
216
+ 28% { background-color: #e6f9ff; }
217
+ 42% { background-color: #e6fff5; }
218
+ 56% { background-color: #f3e6ff; }
219
+ 70% { background-color: #ffe6fb; }
220
+ 84% { background-color: #e6ffff; }
221
+ }
222
+
223
+ /* Rainbow dark squares */
224
+ .theme-rainbow .board-square.dark {
225
+ animation: rainbow-dark-square 6s ease infinite;
226
+ }
227
+
228
+ @keyframes rainbow-dark-square {
229
+ 0%, 100% { background-color: #ff6b6b; }
230
+ 14% { background-color: #feca57; }
231
+ 28% { background-color: #48dbfb; }
232
+ 42% { background-color: #1dd1a1; }
233
+ 56% { background-color: #5f27cd; }
234
+ 70% { background-color: #ff9ff3; }
235
+ 84% { background-color: #00d2d3; }
236
+ }
237
+
238
+ /* Coordinate labels for rainbow theme */
239
+ .theme-rainbow .board-square.light .coord-file,
240
+ .theme-rainbow .board-square.light .coord-rank {
241
+ animation: rainbow-coord-dark 6s ease infinite;
242
+ }
243
+
244
+ @keyframes rainbow-coord-dark {
245
+ 0%, 100% { color: #cc5555; }
246
+ 14% { color: #cca044; }
247
+ 28% { color: #3ab0c9; }
248
+ 42% { color: #17a880; }
249
+ 56% { color: #4c1fa3; }
250
+ 70% { color: #cc7fc2; }
251
+ 84% { color: #00a8a9; }
252
+ }
253
+
254
+ .theme-rainbow .board-square.dark .coord-file,
255
+ .theme-rainbow .board-square.dark .coord-rank {
256
+ color: #fff;
257
+ text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
258
+ }
259
+
260
+ /* Rainbow check ring */
261
+ .theme-rainbow .check-ring {
262
+ animation: rainbow-check-ring 6s ease infinite, check-pulse 1.5s ease-in-out infinite;
263
+ }
264
+
265
+ @keyframes rainbow-check-ring {
266
+ 0%, 100% {
267
+ border-color: #ff0000;
268
+ box-shadow: 0 0 20px #ff0000;
269
+ }
270
+ 14% {
271
+ border-color: #ff6600;
272
+ box-shadow: 0 0 20px #ff6600;
273
+ }
274
+ 28% {
275
+ border-color: #ff00ff;
276
+ box-shadow: 0 0 20px #ff00ff;
277
+ }
278
+ 42% {
279
+ border-color: #ff0066;
280
+ box-shadow: 0 0 20px #ff0066;
281
+ }
282
+ 56% {
283
+ border-color: #ff3300;
284
+ box-shadow: 0 0 20px #ff3300;
285
+ }
286
+ 70% {
287
+ border-color: #ff0099;
288
+ box-shadow: 0 0 20px #ff0099;
289
+ }
290
+ 84% {
291
+ border-color: #ff3366;
292
+ box-shadow: 0 0 20px #ff3366;
293
+ }
294
+ }
295
+
296
+ /* Rainbow last move highlight */
297
+ .theme-rainbow .board-square.last-move {
298
+ animation: rainbow-last-move 6s ease infinite !important;
299
+ }
300
+
301
+ @keyframes rainbow-last-move {
302
+ 0%, 100% { background-color: rgba(255, 107, 107, 0.5) !important; }
303
+ 14% { background-color: rgba(254, 202, 87, 0.5) !important; }
304
+ 28% { background-color: rgba(72, 219, 251, 0.5) !important; }
305
+ 42% { background-color: rgba(29, 209, 161, 0.5) !important; }
306
+ 56% { background-color: rgba(95, 39, 205, 0.5) !important; }
307
+ 70% { background-color: rgba(255, 159, 243, 0.5) !important; }
308
+ 84% { background-color: rgba(0, 210, 211, 0.5) !important; }
309
+ }
310
+
311
+ /* Rainbow selected square */
312
+ .theme-rainbow .board-square.selected {
313
+ animation: rainbow-selected 6s ease infinite !important;
314
+ }
315
+
316
+ @keyframes rainbow-selected {
317
+ 0%, 100% { background-color: rgba(255, 107, 107, 0.6) !important; }
318
+ 14% { background-color: rgba(254, 202, 87, 0.6) !important; }
319
+ 28% { background-color: rgba(72, 219, 251, 0.6) !important; }
320
+ 42% { background-color: rgba(29, 209, 161, 0.6) !important; }
321
+ 56% { background-color: rgba(95, 39, 205, 0.6) !important; }
322
+ 70% { background-color: rgba(255, 159, 243, 0.6) !important; }
323
+ 84% { background-color: rgba(0, 210, 211, 0.6) !important; }
324
+ }
325
+
326
+ /* Rainbow legal move dots */
327
+ .theme-rainbow .board-square.legal-move::after {
328
+ animation: rainbow-legal-dot 6s ease infinite;
329
+ }
330
+
331
+ @keyframes rainbow-legal-dot {
332
+ 0%, 100% { background: rgba(255, 107, 107, 0.5); }
333
+ 14% { background: rgba(254, 202, 87, 0.5); }
334
+ 28% { background: rgba(72, 219, 251, 0.5); }
335
+ 42% { background: rgba(29, 209, 161, 0.5); }
336
+ 56% { background: rgba(95, 39, 205, 0.5); }
337
+ 70% { background: rgba(255, 159, 243, 0.5); }
338
+ 84% { background: rgba(0, 210, 211, 0.5); }
339
+ }
340
+
341
+ /* Rainbow legal capture rings */
342
+ .theme-rainbow .board-square.legal-capture::after {
343
+ animation: rainbow-capture-ring 6s ease infinite;
344
+ }
345
+
346
+ @keyframes rainbow-capture-ring {
347
+ 0%, 100% { border-color: rgba(255, 107, 107, 0.8); }
348
+ 14% { border-color: rgba(254, 202, 87, 0.8); }
349
+ 28% { border-color: rgba(72, 219, 251, 0.8); }
350
+ 42% { border-color: rgba(29, 209, 161, 0.8); }
351
+ 56% { border-color: rgba(95, 39, 205, 0.8); }
352
+ 70% { border-color: rgba(255, 159, 243, 0.8); }
353
+ 84% { border-color: rgba(0, 210, 211, 0.8); }
354
+ }
355
+
356
+ /* Rainbow theme preview in dropdown */
357
+ .rainbow-preview {
358
+ background: linear-gradient(90deg, #ff6b6b, #feca57, #1dd1a1, #48dbfb, #5f27cd, #ff9ff3);
359
+ animation: rainbow-spin 2s linear infinite;
360
+ }
361
+
362
+ @keyframes rainbow-spin {
363
+ 0% { filter: hue-rotate(0deg); }
364
+ 100% { filter: hue-rotate(360deg); }
365
+ }
366
+
367
+ /* ========================================
368
+ Reset & Base Styles
369
+ ======================================== */
370
+ * {
371
+ margin: 0;
372
+ padding: 0;
373
+ box-sizing: border-box;
374
+ }
375
+
376
+ html, body {
377
+ height: 100%;
378
+ font-family: 'Roboto', sans-serif;
379
+ background-color: var(--bg-primary);
380
+ color: var(--text-primary);
381
+ overflow-x: hidden;
382
+ }
383
+
384
+ .hidden {
385
+ display: none !important;
386
+ }
387
+
388
+ /* ========================================
389
+ Loading Screen
390
+ ======================================== */
391
+ .loading-screen {
392
+ position: fixed;
393
+ top: 0;
394
+ left: 0;
395
+ width: 100%;
396
+ height: 100%;
397
+ background: var(--bg-primary);
398
+ display: flex;
399
+ justify-content: center;
400
+ align-items: center;
401
+ z-index: 9999;
402
+ }
403
+
404
+ .loader {
405
+ text-align: center;
406
+ }
407
+
408
+ .chess-piece-loader {
409
+ font-size: 80px;
410
+ animation: bounce 1s ease infinite;
411
+ color: var(--accent-primary);
412
+ }
413
+
414
+ @keyframes bounce {
415
+ 0%, 100% { transform: translateY(0); }
416
+ 50% { transform: translateY(-20px); }
417
+ }
418
+
419
+ .loader p {
420
+ margin-top: 20px;
421
+ font-size: 18px;
422
+ color: var(--text-secondary);
423
+ }
424
+
425
+ /* ========================================
426
+ App Container
427
+ ======================================== */
428
+ .app-container {
429
+ min-height: 100vh;
430
+ display: flex;
431
+ flex-direction: column;
432
+ }
433
+
434
+ /* ========================================
435
+ Header
436
+ ======================================== */
437
+ .header {
438
+ background: var(--bg-secondary);
439
+ padding: 15px 30px;
440
+ display: flex;
441
+ justify-content: space-between;
442
+ align-items: center;
443
+ border-bottom: 1px solid var(--border-color);
444
+ box-shadow: 0 2px 10px var(--shadow-color);
445
+ }
446
+
447
+ .logo {
448
+ display: flex;
449
+ align-items: center;
450
+ gap: 10px;
451
+ }
452
+
453
+ .logo-icon {
454
+ font-size: 36px;
455
+ color: var(--accent-primary);
456
+ }
457
+
458
+ .logo-text {
459
+ font-family: 'Playfair Display', serif;
460
+ font-size: 28px;
461
+ font-weight: 700;
462
+ background: linear-gradient(135deg, var(--accent-primary), var(--text-primary));
463
+ -webkit-background-clip: text;
464
+ -webkit-text-fill-color: transparent;
465
+ background-clip: text;
466
+ }
467
+
468
+ .header-controls {
469
+ display: flex;
470
+ align-items: center;
471
+ gap: 15px;
472
+ }
473
+
474
+ .theme-selector {
475
+ position: relative;
476
+ }
477
+
478
+ .theme-btn, .sound-btn {
479
+ background: var(--bg-tertiary);
480
+ border: none;
481
+ color: var(--text-primary);
482
+ padding: 10px 15px;
483
+ border-radius: 8px;
484
+ cursor: pointer;
485
+ display: flex;
486
+ align-items: center;
487
+ gap: 8px;
488
+ transition: all 0.3s ease;
489
+ }
490
+
491
+ .theme-btn:hover, .sound-btn:hover {
492
+ background: var(--accent-primary);
493
+ transform: translateY(-2px);
494
+ }
495
+
496
+ .theme-dropdown {
497
+ position: absolute;
498
+ top: 100%;
499
+ right: 0;
500
+ margin-top: 10px;
501
+ background: var(--bg-secondary);
502
+ border: 1px solid var(--border-color);
503
+ border-radius: 12px;
504
+ padding: 10px;
505
+ min-width: 180px;
506
+ box-shadow: 0 10px 30px var(--shadow-color);
507
+ z-index: 1000;
508
+ max-height: 400px;
509
+ overflow-y: auto;
510
+ }
511
+
512
+ .theme-option {
513
+ display: flex;
514
+ align-items: center;
515
+ gap: 10px;
516
+ padding: 10px;
517
+ border-radius: 8px;
518
+ cursor: pointer;
519
+ transition: all 0.2s ease;
520
+ }
521
+
522
+ .theme-option:hover {
523
+ background: var(--bg-tertiary);
524
+ }
525
+
526
+ .theme-option.special {
527
+ border: 1px solid var(--accent-primary);
528
+ background: linear-gradient(90deg, rgba(255,107,107,0.1), rgba(78,205,196,0.1));
529
+ }
530
+
531
+ .theme-preview {
532
+ width: 24px;
533
+ height: 24px;
534
+ border-radius: 50%;
535
+ border: 2px solid var(--border-color);
536
+ }
537
+
538
+ .dark-preview { background: linear-gradient(135deg, #1a1a2e, #e94560); }
539
+ .light-preview { background: linear-gradient(135deg, #f5f5f5, #2196f3); }
540
+ .forest-preview { background: linear-gradient(135deg, #1b2d1b, #4caf50); }
541
+ .ocean-preview { background: linear-gradient(135deg, #0d1b2a, #00b4d8); }
542
+ .sunset-preview { background: linear-gradient(135deg, #2d132c, #ee6f57); }
543
+ .midnight-preview { background: linear-gradient(135deg, #0a0a0a, #6c5ce7); }
544
+ .cream-preview { background: linear-gradient(135deg, #f5f0e1, #c9a959); }
545
+ .lavender-preview { background: linear-gradient(135deg, #2d2540, #9b59b6); }
546
+ .mint-preview { background: linear-gradient(135deg, #1a332e, #1abc9c); }
547
+ .slate-preview { background: linear-gradient(135deg, #2c3e50, #3498db); }
548
+
549
+ /* ========================================
550
+ Screens
551
+ ======================================== */
552
+ .screen {
553
+ flex: 1;
554
+ display: flex;
555
+ justify-content: center;
556
+ align-items: center;
557
+ padding: 20px;
558
+ }
559
+
560
+ /* ========================================
561
+ Lobby Screen
562
+ ======================================== */
563
+ .lobby-container {
564
+ max-width: 900px;
565
+ width: 100%;
566
+ text-align: center;
567
+ }
568
+
569
+ .lobby-title {
570
+ font-family: 'Playfair Display', serif;
571
+ font-size: 48px;
572
+ margin-bottom: 10px;
573
+ background: linear-gradient(135deg, var(--accent-primary), var(--text-primary));
574
+ -webkit-background-clip: text;
575
+ -webkit-text-fill-color: transparent;
576
+ background-clip: text;
577
+ }
578
+
579
+ .lobby-subtitle {
580
+ color: var(--text-secondary);
581
+ font-size: 18px;
582
+ margin-bottom: 40px;
583
+ }
584
+
585
+ .username-section {
586
+ margin-bottom: 40px;
587
+ }
588
+
589
+ .username-section label {
590
+ display: block;
591
+ margin-bottom: 10px;
592
+ font-weight: 500;
593
+ color: var(--text-secondary);
594
+ }
595
+
596
+ .username-section input {
597
+ width: 100%;
598
+ max-width: 400px;
599
+ padding: 15px 20px;
600
+ font-size: 18px;
601
+ border: 2px solid var(--border-color);
602
+ border-radius: 12px;
603
+ background: var(--bg-secondary);
604
+ color: var(--text-primary);
605
+ text-align: center;
606
+ transition: all 0.3s ease;
607
+ }
608
+
609
+ .username-section input:focus {
610
+ outline: none;
611
+ border-color: var(--accent-primary);
612
+ box-shadow: 0 0 20px rgba(233, 69, 96, 0.2);
613
+ }
614
+
615
+ .lobby-options {
616
+ display: grid;
617
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
618
+ gap: 30px;
619
+ margin-bottom: 40px;
620
+ }
621
+
622
+ .option-card {
623
+ background: var(--bg-secondary);
624
+ border: 1px solid var(--border-color);
625
+ border-radius: 20px;
626
+ padding: 30px;
627
+ transition: all 0.3s ease;
628
+ }
629
+
630
+ .option-card:hover {
631
+ transform: translateY(-5px);
632
+ box-shadow: 0 15px 40px var(--shadow-color);
633
+ border-color: var(--accent-primary);
634
+ }
635
+
636
+ .option-icon {
637
+ width: 80px;
638
+ height: 80px;
639
+ border-radius: 50%;
640
+ background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary));
641
+ display: flex;
642
+ justify-content: center;
643
+ align-items: center;
644
+ margin: 0 auto 20px;
645
+ font-size: 36px;
646
+ color: white;
647
+ }
648
+
649
+ .option-card h3 {
650
+ font-size: 24px;
651
+ margin-bottom: 10px;
652
+ }
653
+
654
+ .option-card p {
655
+ color: var(--text-secondary);
656
+ margin-bottom: 20px;
657
+ }
658
+
659
+ .time-control-section {
660
+ margin-bottom: 20px;
661
+ }
662
+
663
+ .time-control-section label {
664
+ display: block;
665
+ margin-bottom: 10px;
666
+ font-weight: 500;
667
+ color: var(--text-secondary);
668
+ }
669
+
670
+ .time-options {
671
+ display: flex;
672
+ gap: 10px;
673
+ justify-content: center;
674
+ flex-wrap: wrap;
675
+ }
676
+
677
+ .time-btn {
678
+ padding: 10px 20px;
679
+ border: 2px solid var(--border-color);
680
+ border-radius: 8px;
681
+ background: var(--bg-tertiary);
682
+ color: var(--text-primary);
683
+ cursor: pointer;
684
+ transition: all 0.3s ease;
685
+ }
686
+
687
+ .time-btn:hover, .time-btn.active {
688
+ border-color: var(--accent-primary);
689
+ background: var(--accent-primary);
690
+ color: white;
691
+ }
692
+
693
+ .room-code-section input {
694
+ width: 100%;
695
+ padding: 15px;
696
+ font-size: 24px;
697
+ text-align: center;
698
+ text-transform: uppercase;
699
+ letter-spacing: 5px;
700
+ border: 2px solid var(--border-color);
701
+ border-radius: 12px;
702
+ background: var(--bg-tertiary);
703
+ color: var(--text-primary);
704
+ margin-bottom: 20px;
705
+ }
706
+
707
+ .room-code-section input:focus {
708
+ outline: none;
709
+ border-color: var(--accent-primary);
710
+ }
711
+
712
+ /* ========================================
713
+ Buttons
714
+ ======================================== */
715
+ .btn {
716
+ padding: 15px 30px;
717
+ font-size: 16px;
718
+ font-weight: 600;
719
+ border: none;
720
+ border-radius: 12px;
721
+ cursor: pointer;
722
+ display: inline-flex;
723
+ align-items: center;
724
+ gap: 10px;
725
+ transition: all 0.3s ease;
726
+ }
727
+
728
+ .btn-primary {
729
+ background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary));
730
+ color: white;
731
+ }
732
+
733
+ .btn-primary:hover {
734
+ transform: translateY(-3px);
735
+ box-shadow: 0 10px 30px rgba(233, 69, 96, 0.4);
736
+ }
737
+
738
+ .btn-secondary {
739
+ background: var(--bg-tertiary);
740
+ color: var(--text-primary);
741
+ border: 2px solid var(--border-color);
742
+ }
743
+
744
+ .btn-secondary:hover {
745
+ border-color: var(--accent-primary);
746
+ background: var(--accent-primary);
747
+ color: white;
748
+ }
749
+
750
+ .btn-text {
751
+ background: transparent;
752
+ color: var(--accent-primary);
753
+ padding: 10px;
754
+ }
755
+
756
+ .btn-text:hover {
757
+ color: var(--text-primary);
758
+ }
759
+
760
+ .btn-danger {
761
+ background: #e74c3c;
762
+ color: white;
763
+ }
764
+
765
+ .btn-danger:hover {
766
+ background: #c0392b;
767
+ }
768
+
769
+ /* ========================================
770
+ Available Rooms
771
+ ======================================== */
772
+ .available-rooms {
773
+ background: var(--bg-secondary);
774
+ border: 1px solid var(--border-color);
775
+ border-radius: 20px;
776
+ padding: 30px;
777
+ }
778
+
779
+ .available-rooms h3 {
780
+ display: flex;
781
+ align-items: center;
782
+ justify-content: center;
783
+ gap: 10px;
784
+ margin-bottom: 20px;
785
+ }
786
+
787
+ .rooms-list {
788
+ max-height: 200px;
789
+ overflow-y: auto;
790
+ margin-bottom: 15px;
791
+ }
792
+
793
+ .room-item {
794
+ display: flex;
795
+ justify-content: space-between;
796
+ align-items: center;
797
+ padding: 15px;
798
+ background: var(--bg-tertiary);
799
+ border-radius: 10px;
800
+ margin-bottom: 10px;
801
+ transition: all 0.3s ease;
802
+ }
803
+
804
+ .room-item:hover {
805
+ transform: translateX(5px);
806
+ border-left: 3px solid var(--accent-primary);
807
+ }
808
+
809
+ .room-info {
810
+ text-align: left;
811
+ }
812
+
813
+ .room-host {
814
+ font-weight: 600;
815
+ }
816
+
817
+ .room-time {
818
+ font-size: 14px;
819
+ color: var(--text-secondary);
820
+ }
821
+
822
+ .no-rooms {
823
+ color: var(--text-secondary);
824
+ font-style: italic;
825
+ }
826
+
827
+ /* ========================================
828
+ Waiting Screen
829
+ ======================================== */
830
+ .waiting-container {
831
+ text-align: center;
832
+ max-width: 500px;
833
+ }
834
+
835
+ .waiting-animation {
836
+ margin-bottom: 30px;
837
+ }
838
+
839
+ .chess-pieces-animation {
840
+ display: flex;
841
+ justify-content: center;
842
+ gap: 10px;
843
+ font-size: 48px;
844
+ }
845
+
846
+ .chess-pieces-animation span {
847
+ animation: float 2s ease-in-out infinite;
848
+ color: var(--accent-primary);
849
+ }
850
+
851
+ .chess-pieces-animation span:nth-child(1) { animation-delay: 0s; }
852
+ .chess-pieces-animation span:nth-child(2) { animation-delay: 0.2s; }
853
+ .chess-pieces-animation span:nth-child(3) { animation-delay: 0.4s; }
854
+ .chess-pieces-animation span:nth-child(4) { animation-delay: 0.6s; }
855
+ .chess-pieces-animation span:nth-child(5) { animation-delay: 0.8s; }
856
+ .chess-pieces-animation span:nth-child(6) { animation-delay: 1s; }
857
+
858
+ @keyframes float {
859
+ 0%, 100% { transform: translateY(0); }
860
+ 50% { transform: translateY(-15px); }
861
+ }
862
+
863
+ .waiting-container h2 {
864
+ font-size: 32px;
865
+ margin-bottom: 15px;
866
+ }
867
+
868
+ .waiting-container p {
869
+ color: var(--text-secondary);
870
+ margin-bottom: 20px;
871
+ }
872
+
873
+ .room-code-display {
874
+ display: inline-flex;
875
+ align-items: center;
876
+ gap: 15px;
877
+ background: var(--bg-secondary);
878
+ padding: 20px 30px;
879
+ border-radius: 15px;
880
+ border: 2px dashed var(--accent-primary);
881
+ margin-bottom: 20px;
882
+ }
883
+
884
+ .room-code-display span {
885
+ font-size: 36px;
886
+ font-weight: 700;
887
+ letter-spacing: 5px;
888
+ color: var(--accent-primary);
889
+ }
890
+
891
+ .copy-btn {
892
+ background: var(--accent-primary);
893
+ border: none;
894
+ color: white;
895
+ width: 50px;
896
+ height: 50px;
897
+ border-radius: 10px;
898
+ cursor: pointer;
899
+ font-size: 20px;
900
+ transition: all 0.3s ease;
901
+ }
902
+
903
+ .copy-btn:hover {
904
+ transform: scale(1.1);
905
+ }
906
+
907
+ .waiting-info {
908
+ display: flex;
909
+ align-items: center;
910
+ justify-content: center;
911
+ gap: 10px;
912
+ color: var(--text-secondary);
913
+ margin-bottom: 30px;
914
+ }
915
+
916
+ /* ========================================
917
+ Game Screen
918
+ ======================================== */
919
+ .game-screen {
920
+ display: flex;
921
+ gap: 30px;
922
+ padding: 20px;
923
+ justify-content: center;
924
+ align-items: flex-start;
925
+ }
926
+
927
+ .game-container {
928
+ display: flex;
929
+ flex-direction: column;
930
+ align-items: center;
931
+ gap: 15px;
932
+ }
933
+
934
+ /* ========================================
935
+ Player Info
936
+ ======================================== */
937
+ .player-info {
938
+ display: flex;
939
+ align-items: center;
940
+ gap: 15px;
941
+ background: var(--bg-secondary);
942
+ padding: 15px 25px;
943
+ border-radius: 15px;
944
+ min-width: 350px;
945
+ border: 1px solid var(--border-color);
946
+ }
947
+
948
+ .player-avatar {
949
+ width: 50px;
950
+ height: 50px;
951
+ border-radius: 50%;
952
+ background: var(--bg-tertiary);
953
+ display: flex;
954
+ justify-content: center;
955
+ align-items: center;
956
+ font-size: 24px;
957
+ }
958
+
959
+ .opponent-avatar {
960
+ background: linear-gradient(135deg, #333, #555);
961
+ color: white;
962
+ }
963
+
964
+ .self-avatar {
965
+ background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary));
966
+ color: white;
967
+ }
968
+
969
+ .player-details {
970
+ flex: 1;
971
+ }
972
+
973
+ .player-name {
974
+ display: block;
975
+ font-weight: 600;
976
+ font-size: 18px;
977
+ }
978
+
979
+ .player-color {
980
+ font-size: 14px;
981
+ color: var(--text-secondary);
982
+ }
983
+
984
+ .player-timer {
985
+ display: flex;
986
+ align-items: center;
987
+ gap: 10px;
988
+ background: var(--bg-tertiary);
989
+ padding: 10px 20px;
990
+ border-radius: 10px;
991
+ font-size: 24px;
992
+ font-weight: 700;
993
+ font-family: 'Roboto Mono', monospace;
994
+ }
995
+
996
+ .player-timer.low-time {
997
+ background: #e74c3c;
998
+ color: white;
999
+ animation: pulse-warning 1s ease infinite;
1000
+ }
1001
+
1002
+ @keyframes pulse-warning {
1003
+ 0%, 100% { transform: scale(1); }
1004
+ 50% { transform: scale(1.05); }
1005
+ }
1006
+
1007
+ /* ========================================
1008
+ Board Wrapper
1009
+ ======================================== */
1010
+ .board-wrapper {
1011
+ display: flex;
1012
+ align-items: center;
1013
+ gap: 20px;
1014
+ }
1015
+
1016
+ .captured-pieces {
1017
+ width: 50px;
1018
+ display: flex;
1019
+ flex-direction: column;
1020
+ gap: 5px;
1021
+ font-size: 24px;
1022
+ }
1023
+
1024
+ .board-container {
1025
+ position: relative;
1026
+ }
1027
+
1028
+ /* ========================================
1029
+ Chess Board
1030
+ ======================================== */
1031
+ .chessboard {
1032
+ display: grid;
1033
+ grid-template-columns: repeat(8, 1fr);
1034
+ width: 560px;
1035
+ height: 560px;
1036
+ border: 4px solid var(--border-color);
1037
+ border-radius: 8px;
1038
+ overflow: hidden;
1039
+ box-shadow: 0 20px 60px var(--shadow-color);
1040
+ }
1041
+
1042
+ .board-square {
1043
+ width: 70px;
1044
+ height: 70px;
1045
+ display: flex;
1046
+ justify-content: center;
1047
+ align-items: center;
1048
+ font-size: 56px;
1049
+ cursor: pointer;
1050
+ position: relative;
1051
+ transition: background-color 0.2s ease;
1052
+ user-select: none;
1053
+ }
1054
+
1055
+ .board-square.light {
1056
+ background-color: var(--board-light);
1057
+ }
1058
+
1059
+ .board-square.dark {
1060
+ background-color: var(--board-dark);
1061
+ }
1062
+
1063
+ .board-square .piece {
1064
+ cursor: grab;
1065
+ transition: transform 0.1s ease;
1066
+ text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
1067
+ }
1068
+
1069
+ .board-square .piece:active {
1070
+ cursor: grabbing;
1071
+ }
1072
+
1073
+ .board-square.selected {
1074
+ background-color: var(--highlight-selected) !important;
1075
+ }
1076
+
1077
+ .board-square.last-move {
1078
+ background-color: var(--highlight-move) !important;
1079
+ }
1080
+
1081
+ .board-square.legal-move::after {
1082
+ content: '';
1083
+ position: absolute;
1084
+ width: 24px;
1085
+ height: 24px;
1086
+ background: var(--highlight-legal);
1087
+ border-radius: 50%;
1088
+ }
1089
+
1090
+ .board-square.legal-capture::after {
1091
+ content: '';
1092
+ position: absolute;
1093
+ width: 100%;
1094
+ height: 100%;
1095
+ border: 5px solid var(--highlight-capture);
1096
+ border-radius: 50%;
1097
+ box-sizing: border-box;
1098
+ }
1099
+
1100
+ .board-square.can-move {
1101
+ cursor: pointer;
1102
+ }
1103
+
1104
+ /* ========================================
1105
+ Coordinate Labels
1106
+ ======================================== */
1107
+ .board-square .coord-file {
1108
+ position: absolute;
1109
+ bottom: 2px;
1110
+ right: 4px;
1111
+ font-size: 12px;
1112
+ font-weight: 600;
1113
+ opacity: 0.7;
1114
+ }
1115
+
1116
+ .board-square .coord-rank {
1117
+ position: absolute;
1118
+ top: 2px;
1119
+ left: 4px;
1120
+ font-size: 12px;
1121
+ font-weight: 600;
1122
+ opacity: 0.7;
1123
+ }
1124
+
1125
+ .board-square.light .coord-file,
1126
+ .board-square.light .coord-rank {
1127
+ color: var(--board-dark);
1128
+ }
1129
+
1130
+ .board-square.dark .coord-file,
1131
+ .board-square.dark .coord-rank {
1132
+ color: var(--board-light);
1133
+ }
1134
+
1135
+ /* ========================================
1136
+ Check Indicator Ring
1137
+ ======================================== */
1138
+ .check-ring {
1139
+ position: absolute;
1140
+ top: 50%;
1141
+ left: 50%;
1142
+ transform: translate(-50%, -50%);
1143
+ width: 60px;
1144
+ height: 60px;
1145
+ border: 4px solid var(--check-color);
1146
+ border-radius: 50%;
1147
+ animation: check-pulse 1.5s ease-in-out infinite;
1148
+ pointer-events: none;
1149
+ }
1150
+
1151
+ @keyframes check-pulse {
1152
+ 0%, 100% {
1153
+ opacity: 1;
1154
+ transform: translate(-50%, -50%) scale(1);
1155
+ box-shadow: 0 0 20px var(--check-color);
1156
+ }
1157
+ 50% {
1158
+ opacity: 0.5;
1159
+ transform: translate(-50%, -50%) scale(1.15);
1160
+ box-shadow: 0 0 40px var(--check-color);
1161
+ }
1162
+ }
1163
+
1164
+ /* ========================================
1165
+ Game Controls
1166
+ ======================================== */
1167
+ .game-controls {
1168
+ display: flex;
1169
+ gap: 15px;
1170
+ }
1171
+
1172
+ .control-btn {
1173
+ width: 50px;
1174
+ height: 50px;
1175
+ border-radius: 12px;
1176
+ border: 2px solid var(--border-color);
1177
+ background: var(--bg-secondary);
1178
+ color: var(--text-primary);
1179
+ font-size: 20px;
1180
+ cursor: pointer;
1181
+ transition: all 0.3s ease;
1182
+ position: relative;
1183
+ }
1184
+
1185
+ .control-btn:hover {
1186
+ background: var(--accent-primary);
1187
+ border-color: var(--accent-primary);
1188
+ color: white;
1189
+ transform: translateY(-3px);
1190
+ }
1191
+
1192
+ .chat-badge {
1193
+ position: absolute;
1194
+ top: -5px;
1195
+ right: -5px;
1196
+ background: #e74c3c;
1197
+ color: white;
1198
+ width: 20px;
1199
+ height: 20px;
1200
+ border-radius: 50%;
1201
+ font-size: 12px;
1202
+ display: flex;
1203
+ justify-content: center;
1204
+ align-items: center;
1205
+ }
1206
+
1207
+ /* ========================================
1208
+ Side Panel
1209
+ ======================================== */
1210
+ .side-panel {
1211
+ width: 300px;
1212
+ display: flex;
1213
+ flex-direction: column;
1214
+ gap: 20px;
1215
+ }
1216
+
1217
+ .move-history-panel,
1218
+ .chat-panel {
1219
+ background: var(--bg-secondary);
1220
+ border: 1px solid var(--border-color);
1221
+ border-radius: 15px;
1222
+ padding: 20px;
1223
+ }
1224
+
1225
+ .move-history-panel h3,
1226
+ .chat-panel h3 {
1227
+ display: flex;
1228
+ align-items: center;
1229
+ gap: 10px;
1230
+ margin-bottom: 15px;
1231
+ padding-bottom: 10px;
1232
+ border-bottom: 1px solid var(--border-color);
1233
+ }
1234
+
1235
+ .move-history {
1236
+ max-height: 200px;
1237
+ overflow-y: auto;
1238
+ font-family: 'Roboto Mono', monospace;
1239
+ }
1240
+
1241
+ .move-row {
1242
+ display: flex;
1243
+ gap: 10px;
1244
+ padding: 8px;
1245
+ border-radius: 5px;
1246
+ }
1247
+
1248
+ .move-row:nth-child(odd) {
1249
+ background: var(--bg-tertiary);
1250
+ }
1251
+
1252
+ .move-number {
1253
+ width: 30px;
1254
+ color: var(--text-secondary);
1255
+ }
1256
+
1257
+ .move-white,
1258
+ .move-black {
1259
+ flex: 1;
1260
+ cursor: pointer;
1261
+ padding: 2px 5px;
1262
+ border-radius: 3px;
1263
+ transition: background 0.2s ease;
1264
+ }
1265
+
1266
+ .move-white:hover,
1267
+ .move-black:hover {
1268
+ background: var(--accent-primary);
1269
+ color: white;
1270
+ }
1271
+
1272
+ /* ========================================
1273
+ Chat
1274
+ ======================================== */
1275
+ .chat-messages {
1276
+ height: 200px;
1277
+ overflow-y: auto;
1278
+ margin-bottom: 15px;
1279
+ padding: 10px;
1280
+ background: var(--bg-tertiary);
1281
+ border-radius: 10px;
1282
+ }
1283
+
1284
+ .chat-message {
1285
+ margin-bottom: 10px;
1286
+ padding: 8px 12px;
1287
+ background: var(--bg-secondary);
1288
+ border-radius: 8px;
1289
+ }
1290
+
1291
+ .chat-message .sender {
1292
+ font-weight: 600;
1293
+ color: var(--accent-primary);
1294
+ font-size: 14px;
1295
+ }
1296
+
1297
+ .chat-message .text {
1298
+ margin-top: 4px;
1299
+ word-wrap: break-word;
1300
+ }
1301
+
1302
+ .chat-message .time {
1303
+ font-size: 11px;
1304
+ color: var(--text-secondary);
1305
+ margin-top: 4px;
1306
+ }
1307
+
1308
+ .chat-input-container {
1309
+ display: flex;
1310
+ gap: 10px;
1311
+ }
1312
+
1313
+ .chat-input-container input {
1314
+ flex: 1;
1315
+ padding: 12px;
1316
+ border: 1px solid var(--border-color);
1317
+ border-radius: 10px;
1318
+ background: var(--bg-tertiary);
1319
+ color: var(--text-primary);
1320
+ }
1321
+
1322
+ .chat-input-container input:focus {
1323
+ outline: none;
1324
+ border-color: var(--accent-primary);
1325
+ }
1326
+
1327
+ .send-btn {
1328
+ width: 45px;
1329
+ height: 45px;
1330
+ border-radius: 10px;
1331
+ border: none;
1332
+ background: var(--accent-primary);
1333
+ color: white;
1334
+ cursor: pointer;
1335
+ transition: all 0.3s ease;
1336
+ }
1337
+
1338
+ .send-btn:hover {
1339
+ background: var(--accent-secondary);
1340
+ transform: scale(1.05);
1341
+ }
1342
+
1343
+ /* ========================================
1344
+ Modals
1345
+ ======================================== */
1346
+ .modal {
1347
+ position: fixed;
1348
+ top: 0;
1349
+ left: 0;
1350
+ width: 100%;
1351
+ height: 100%;
1352
+ background: var(--modal-bg);
1353
+ display: flex;
1354
+ justify-content: center;
1355
+ align-items: center;
1356
+ z-index: 2000;
1357
+ animation: fadeIn 0.3s ease;
1358
+ }
1359
+
1360
+ @keyframes fadeIn {
1361
+ from { opacity: 0; }
1362
+ to { opacity: 1; }
1363
+ }
1364
+
1365
+ .modal-content {
1366
+ background: var(--bg-secondary);
1367
+ padding: 40px;
1368
+ border-radius: 20px;
1369
+ text-align: center;
1370
+ max-width: 450px;
1371
+ width: 90%;
1372
+ animation: slideUp 0.3s ease;
1373
+ border: 1px solid var(--border-color);
1374
+ }
1375
+
1376
+ @keyframes slideUp {
1377
+ from {
1378
+ opacity: 0;
1379
+ transform: translateY(50px);
1380
+ }
1381
+ to {
1382
+ opacity: 1;
1383
+ transform: translateY(0);
1384
+ }
1385
+ }
1386
+
1387
+ .modal-content h2 {
1388
+ margin-bottom: 15px;
1389
+ display: flex;
1390
+ align-items: center;
1391
+ justify-content: center;
1392
+ gap: 10px;
1393
+ }
1394
+
1395
+ .modal-content p {
1396
+ color: var(--text-secondary);
1397
+ margin-bottom: 25px;
1398
+ }
1399
+
1400
+ .modal-actions {
1401
+ display: flex;
1402
+ gap: 15px;
1403
+ justify-content: center;
1404
+ }
1405
+
1406
+ /* ========================================
1407
+ Game Over Modal
1408
+ ======================================== */
1409
+ .game-over-content .game-over-icon {
1410
+ width: 100px;
1411
+ height: 100px;
1412
+ border-radius: 50%;
1413
+ background: linear-gradient(135deg, #ffd700, #ffb347);
1414
+ display: flex;
1415
+ justify-content: center;
1416
+ align-items: center;
1417
+ margin: 0 auto 25px;
1418
+ font-size: 50px;
1419
+ color: white;
1420
+ animation: trophy-bounce 0.5s ease;
1421
+ }
1422
+
1423
+ @keyframes trophy-bounce {
1424
+ 0%, 100% { transform: scale(1); }
1425
+ 50% { transform: scale(1.2); }
1426
+ }
1427
+
1428
+ .game-over-icon.loss {
1429
+ background: linear-gradient(135deg, #666, #333);
1430
+ }
1431
+
1432
+ .game-over-icon.draw {
1433
+ background: linear-gradient(135deg, #95a5a6, #7f8c8d);
1434
+ }
1435
+
1436
+ .game-over-actions {
1437
+ display: flex;
1438
+ flex-direction: column;
1439
+ gap: 10px;
1440
+ }
1441
+
1442
+ /* ========================================
1443
+ Promotion Modal
1444
+ ======================================== */
1445
+ .promotion-content {
1446
+ padding: 30px;
1447
+ }
1448
+
1449
+ .promotion-pieces {
1450
+ display: flex;
1451
+ justify-content: center;
1452
+ gap: 20px;
1453
+ }
1454
+
1455
+ .promotion-piece {
1456
+ width: 70px;
1457
+ height: 70px;
1458
+ font-size: 50px;
1459
+ border: 2px solid var(--border-color);
1460
+ border-radius: 10px;
1461
+ background: var(--bg-tertiary);
1462
+ cursor: pointer;
1463
+ transition: all 0.3s ease;
1464
+ }
1465
+
1466
+ .promotion-piece:hover {
1467
+ border-color: var(--accent-primary);
1468
+ transform: scale(1.1);
1469
+ background: var(--accent-primary);
1470
+ }
1471
+
1472
+ /* ========================================
1473
+ Disconnect Modal
1474
+ ======================================== */
1475
+ .disconnect-timer {
1476
+ font-size: 48px;
1477
+ font-weight: 700;
1478
+ color: var(--accent-primary);
1479
+ margin: 20px 0;
1480
+ font-family: 'Roboto Mono', monospace;
1481
+ }
1482
+
1483
+ .disconnect-info {
1484
+ font-size: 14px;
1485
+ color: var(--text-secondary);
1486
+ }
1487
+
1488
+ /* ========================================
1489
+ Toast Notifications
1490
+ ======================================== */
1491
+ .toast-container {
1492
+ position: fixed;
1493
+ bottom: 30px;
1494
+ right: 30px;
1495
+ z-index: 3000;
1496
+ display: flex;
1497
+ flex-direction: column;
1498
+ gap: 10px;
1499
+ }
1500
+
1501
+ .toast {
1502
+ background: var(--bg-secondary);
1503
+ border: 1px solid var(--border-color);
1504
+ padding: 15px 25px;
1505
+ border-radius: 12px;
1506
+ display: flex;
1507
+ align-items: center;
1508
+ gap: 12px;
1509
+ box-shadow: 0 10px 30px var(--shadow-color);
1510
+ animation: slideInRight 0.3s ease, fadeOut 0.3s ease 2.7s forwards;
1511
+ max-width: 350px;
1512
+ }
1513
+
1514
+ @keyframes slideInRight {
1515
+ from {
1516
+ opacity: 0;
1517
+ transform: translateX(100px);
1518
+ }
1519
+ to {
1520
+ opacity: 1;
1521
+ transform: translateX(0);
1522
+ }
1523
+ }
1524
+
1525
+ @keyframes fadeOut {
1526
+ from { opacity: 1; }
1527
+ to { opacity: 0; }
1528
+ }
1529
+
1530
+ .toast.success {
1531
+ border-left: 4px solid #27ae60;
1532
+ }
1533
+
1534
+ .toast.success i {
1535
+ color: #27ae60;
1536
+ }
1537
+
1538
+ .toast.error {
1539
+ border-left: 4px solid #e74c3c;
1540
+ }
1541
+
1542
+ .toast.error i {
1543
+ color: #e74c3c;
1544
+ }
1545
+
1546
+ .toast.info {
1547
+ border-left: 4px solid #3498db;
1548
+ }
1549
+
1550
+ .toast.info i {
1551
+ color: #3498db;
1552
+ }
1553
+
1554
+ .toast.warning {
1555
+ border-left: 4px solid #f39c12;
1556
+ }
1557
+
1558
+ .toast.warning i {
1559
+ color: #f39c12;
1560
+ }
1561
+
1562
+ /* ========================================
1563
+ Scrollbar Styling
1564
+ ======================================== */
1565
+ ::-webkit-scrollbar {
1566
+ width: 8px;
1567
+ }
1568
+
1569
+ ::-webkit-scrollbar-track {
1570
+ background: var(--bg-tertiary);
1571
+ border-radius: 4px;
1572
+ }
1573
+
1574
+ ::-webkit-scrollbar-thumb {
1575
+ background: var(--accent-primary);
1576
+ border-radius: 4px;
1577
+ }
1578
+
1579
+ ::-webkit-scrollbar-thumb:hover {
1580
+ background: var(--accent-secondary);
1581
+ }
1582
+
1583
+ /* ========================================
1584
+ Piece Colors
1585
+ ======================================== */
1586
+ .piece-white {
1587
+ color: #ffffff;
1588
+ text-shadow:
1589
+ 1px 1px 0 #000,
1590
+ -1px -1px 0 #000,
1591
+ 1px -1px 0 #000,
1592
+ -1px 1px 0 #000;
1593
+ }
1594
+
1595
+ .piece-black {
1596
+ color: #1a1a1a;
1597
+ text-shadow:
1598
+ 1px 1px 0 #666,
1599
+ -1px -1px 0 #666,
1600
+ 1px -1px 0 #666,
1601
+ -1px 1px 0 #666;
1602
+ }
1603
+
1604
+ /* ========================================
1605
+ Turn Indicator
1606
+ ======================================== */
1607
+ .player-info.active-turn {
1608
+ border: 2px solid var(--accent-primary);
1609
+ box-shadow: 0 0 20px rgba(233, 69, 96, 0.3);
1610
+ }
1611
+
1612
+ /* ========================================
1613
+ Responsive Design
1614
+ ======================================== */
1615
+ @media (max-width: 1200px) {
1616
+ .game-screen {
1617
+ flex-direction: column;
1618
+ align-items: center;
1619
+ }
1620
+
1621
+ .side-panel {
1622
+ width: 100%;
1623
+ max-width: 560px;
1624
+ flex-direction: row;
1625
+ }
1626
+
1627
+ .move-history-panel,
1628
+ .chat-panel {
1629
+ flex: 1;
1630
+ }
1631
+ }
1632
+
1633
+ @media (max-width: 768px) {
1634
+ .header {
1635
+ padding: 10px 15px;
1636
+ }
1637
+
1638
+ .logo-text {
1639
+ font-size: 20px;
1640
+ }
1641
+
1642
+ .lobby-title {
1643
+ font-size: 32px;
1644
+ }
1645
+
1646
+ .lobby-options {
1647
+ grid-template-columns: 1fr;
1648
+ }
1649
+
1650
+ .chessboard {
1651
+ width: 320px;
1652
+ height: 320px;
1653
+ }
1654
+
1655
+ .board-square {
1656
+ width: 40px;
1657
+ height: 40px;
1658
+ font-size: 32px;
1659
+ }
1660
+
1661
+ .board-square .coord-file,
1662
+ .board-square .coord-rank {
1663
+ font-size: 8px;
1664
+ }
1665
+
1666
+ .check-ring {
1667
+ width: 35px;
1668
+ height: 35px;
1669
+ border-width: 3px;
1670
+ }
1671
+
1672
+ .player-info {
1673
+ min-width: 280px;
1674
+ padding: 10px 15px;
1675
+ }
1676
+
1677
+ .player-timer {
1678
+ font-size: 18px;
1679
+ padding: 8px 12px;
1680
+ }
1681
+
1682
+ .side-panel {
1683
+ flex-direction: column;
1684
+ }
1685
+
1686
+ .game-controls {
1687
+ flex-wrap: wrap;
1688
+ justify-content: center;
1689
+ }
1690
+
1691
+ .control-btn {
1692
+ width: 45px;
1693
+ height: 45px;
1694
+ }
1695
+ }
1696
+
1697
+ @media (max-width: 480px) {
1698
+ .chessboard {
1699
+ width: 280px;
1700
+ height: 280px;
1701
+ }
1702
+
1703
+ .board-square {
1704
+ width: 35px;
1705
+ height: 35px;
1706
+ font-size: 28px;
1707
+ }
1708
+
1709
+ .room-code-display span {
1710
+ font-size: 24px;
1711
+ letter-spacing: 3px;
1712
+ }
1713
+
1714
+ .modal-content {
1715
+ padding: 25px;
1716
+ }
1717
+
1718
+ .promotion-piece {
1719
+ width: 55px;
1720
+ height: 55px;
1721
+ font-size: 40px;
1722
+ }
1723
+ }
1724
+
1725
+ /* ========================================
1726
+ Animation Utilities
1727
+ ======================================== */
1728
+ .animate-fade-in {
1729
+ animation: fadeIn 0.5s ease;
1730
+ }
1731
+
1732
+ .animate-slide-up {
1733
+ animation: slideUp 0.5s ease;
1734
+ }
1735
+
1736
+ .animate-pulse {
1737
+ animation: pulse 2s ease infinite;
1738
+ }
1739
+
1740
+ @keyframes pulse {
1741
+ 0%, 100% { opacity: 1; }
1742
+ 50% { opacity: 0.5; }
1743
+ }
1744
+
1745
+ .animate-shake {
1746
+ animation: shake 0.5s ease;
1747
+ }
1748
+
1749
+ @keyframes shake {
1750
+ 0%, 100% { transform: translateX(0); }
1751
+ 25% { transform: translateX(-10px); }
1752
+ 75% { transform: translateX(10px); }
1753
+ }
1754
+
1755
+ /* Move animation */
1756
+ .piece-moving {
1757
+ transition: transform 0.2s ease;
1758
+ z-index: 100;
1759
+ }
1760
+
1761
+ /* Highlight animation for last move */
1762
+ .last-move-highlight {
1763
+ animation: highlight-flash 0.5s ease;
1764
+ }
1765
+
1766
+ @keyframes highlight-flash {
1767
+ 0% { background-color: var(--highlight-move); }
1768
+ 50% { background-color: rgba(255, 255, 0, 0.7); }
1769
+ 100% { background-color: var(--highlight-move); }
1770
+ }
1771
+
1772
+ /* Premove styling */
1773
+ .board-square.premove {
1774
+ background-color: rgba(0, 150, 255, 0.4) !important;
1775
+ }
1776
+
1777
+ /* Board flipped state */
1778
+ .chessboard.flipped {
1779
+ transform: rotate(180deg);
1780
+ }
1781
+
1782
+ .chessboard.flipped .board-square {
1783
+ transform: rotate(180deg);
1784
+ }
1785
+
1786
+ /* Game status indicator */
1787
+ .game-status {
1788
+ position: absolute;
1789
+ top: 50%;
1790
+ left: 50%;
1791
+ transform: translate(-50%, -50%);
1792
+ background: rgba(0, 0, 0, 0.8);
1793
+ color: white;
1794
+ padding: 20px 40px;
1795
+ border-radius: 15px;
1796
+ font-size: 24px;
1797
+ font-weight: 700;
1798
+ z-index: 100;
1799
+ animation: fadeIn 0.3s ease;
1800
+ }
1801
+
1802
+ /* Piece shadows for 3D effect */
1803
+ .board-square .piece {
1804
+ filter: drop-shadow(2px 4px 3px rgba(0, 0, 0, 0.4));
1805
+ }