grubnykeztime-svg commited on
Commit
df2fba4
·
1 Parent(s): 1b9de1f

fixing diractory

Browse files
pycatan/static/css/style.css ADDED
@@ -0,0 +1,788 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Reset and basic styling */
2
+ * {
3
+ margin: 0;
4
+ padding: 0;
5
+ box-sizing: border-box;
6
+ }
7
+
8
+ :root {
9
+ --primary-color: #2c3e50;
10
+ --secondary-color: #3498db;
11
+ --success-color: #27ae60;
12
+ --danger-color: #e74c3c;
13
+ --warning-color: #f39c12;
14
+ --accent-color: #9b59b6;
15
+ --light-bg: #ecf0f1;
16
+ --border-radius: 12px;
17
+ --shadow: 0 8px 24px rgba(0,0,0,0.15);
18
+ --transition: 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
19
+ }
20
+
21
+ body {
22
+ font-family: 'Segoe UI', 'Roboto', 'Arial', sans-serif;
23
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
24
+ min-height: 100vh;
25
+ padding: 0;
26
+ direction: ltr;
27
+ overflow: hidden;
28
+ color: var(--primary-color);
29
+ }
30
+
31
+ h1 {
32
+ color: white;
33
+ text-align: center;
34
+ margin: 0;
35
+ font-size: 2.2em;
36
+ font-weight: 700;
37
+ text-shadow: 2px 2px 4px rgba(0,0,0,0.2);
38
+ letter-spacing: 1px;
39
+ }
40
+
41
+ .subtitle {
42
+ color: rgba(255,255,255,0.8);
43
+ font-size: 0.9em;
44
+ margin: 5px 0 0 0;
45
+ font-weight: 300;
46
+ }
47
+
48
+ /* Header */
49
+ .game-header {
50
+ width: 100%;
51
+ padding: 20px;
52
+ background: linear-gradient(135deg, rgba(44, 62, 80, 0.95), rgba(52, 152, 219, 0.9));
53
+ box-shadow: var(--shadow);
54
+ border-bottom: 3px solid rgba(255,255,255,0.1);
55
+ }
56
+
57
+ /* מכולת הלוח */
58
+ .game-container {
59
+ display: flex;
60
+ flex-direction: column;
61
+ width: 100%;
62
+ height: 100vh;
63
+ }
64
+
65
+ .content-wrapper {
66
+ display: flex;
67
+ flex: 1;
68
+ gap: 12px;
69
+ padding: 12px;
70
+ overflow: hidden;
71
+ }
72
+
73
+ .board-wrapper {
74
+ flex: 1;
75
+ display: flex;
76
+ justify-content: center;
77
+ align-items: center;
78
+ min-width: 0;
79
+ }
80
+
81
+ .board-container {
82
+ background: linear-gradient(135deg, #3498db, #5dade2);
83
+ border: 3px solid rgba(255,255,255,0.2);
84
+ border-radius: var(--border-radius);
85
+ padding: 12px;
86
+ box-shadow: var(--shadow);
87
+ position: relative;
88
+ overflow: hidden;
89
+ cursor: grab;
90
+ width: 100%;
91
+ height: 100%;
92
+ max-width: 1400px;
93
+ }
94
+
95
+ .board-container:active {
96
+ cursor: grabbing;
97
+ }
98
+
99
+ /* כפתורי בקרה */
100
+ .board-controls {
101
+ position: absolute;
102
+ top: 12px;
103
+ right: 12px;
104
+ z-index: 100;
105
+ display: flex;
106
+ flex-direction: column;
107
+ gap: 8px;
108
+ background: rgba(255,255,255,0.1);
109
+ padding: 8px;
110
+ border-radius: 12px;
111
+ backdrop-filter: blur(10px);
112
+ }
113
+
114
+ .control-btn {
115
+ width: 44px;
116
+ height: 44px;
117
+ border-radius: 10px;
118
+ border: 2px solid rgba(255,255,255,0.3);
119
+ background: linear-gradient(135deg, rgba(255,255,255,0.2), rgba(255,255,255,0.05));
120
+ color: white;
121
+ font-size: 18px;
122
+ cursor: pointer;
123
+ display: flex;
124
+ align-items: center;
125
+ justify-content: center;
126
+ transition: all var(--transition);
127
+ box-shadow: 0 4px 12px rgba(0,0,0,0.15);
128
+ font-weight: 600;
129
+ }
130
+
131
+ .control-btn:hover {
132
+ background: linear-gradient(135deg, rgba(255,255,255,0.3), rgba(255,255,255,0.15));
133
+ transform: translateY(-2px);
134
+ box-shadow: 0 6px 16px rgba(0,0,0,0.2);
135
+ }
136
+
137
+ .control-btn:active {
138
+ transform: translateY(0);
139
+ box-shadow: 0 2px 8px rgba(0,0,0,0.1);
140
+ }
141
+
142
+ /* SVG הלוח */
143
+ #catan-board {
144
+ width: 100%;
145
+ height: 100%;
146
+ transition: transform 0.1s ease;
147
+ }
148
+
149
+ /* Sidebars */
150
+ .sidebar {
151
+ background: rgba(255, 255, 255, 0.95);
152
+ border-radius: var(--border-radius);
153
+ padding: 16px;
154
+ box-shadow: var(--shadow);
155
+ backdrop-filter: blur(10px);
156
+ overflow-y: auto;
157
+ direction: ltr;
158
+ }
159
+
160
+ .sidebar-left {
161
+ width: 300px;
162
+ flex-shrink: 0;
163
+ }
164
+
165
+ .sidebar-right {
166
+ width: 320px;
167
+ flex-shrink: 0;
168
+ }
169
+
170
+ /* משושים */
171
+ .hexagon {
172
+ stroke: #dbc08e;
173
+ stroke-width: 5;
174
+ stroke-linejoin: round;
175
+ vector-effect: non-scaling-stroke;
176
+ cursor: pointer;
177
+ transition: all 0.3s ease;
178
+ }
179
+
180
+ .hexagon:hover {
181
+ opacity: 0.1;
182
+ }
183
+
184
+ /* מספרים על משושים */
185
+ .hex-number {
186
+ font-size: 18px;
187
+ font-weight: bold;
188
+ text-anchor: middle;
189
+ dominant-baseline: middle;
190
+ fill: #2c3e50;
191
+ pointer-events: none;
192
+ text-shadow: 2px 2px 4px rgba(255,255,255,0.8);
193
+ }
194
+
195
+ .hex-number.red {
196
+ fill: #e74c3c;
197
+ font-weight: 900;
198
+ }
199
+
200
+ /* שודד */
201
+ .robber {
202
+ fill: #2c3e50;
203
+ stroke: #34495e;
204
+ stroke-width: 3;
205
+ cursor: pointer;
206
+ filter: drop-shadow(2px 2px 4px rgba(0,0,0,0.5));
207
+ transition: opacity 0.3s ease;
208
+ }
209
+
210
+ .robber:hover {
211
+ opacity: 0.1;
212
+ }
213
+
214
+ .robber-text {
215
+ font-size: 16px;
216
+ font-weight: bold;
217
+ text-anchor: middle;
218
+ dominant-baseline: middle;
219
+ fill: white;
220
+ pointer-events: none;
221
+ }
222
+
223
+ /* יישובים */
224
+ .settlement {
225
+ stroke: #2c3e50;
226
+ stroke-width: 2;
227
+ cursor: pointer;
228
+ filter: drop-shadow(1px 1px 2px rgba(0,0,0,0.3));
229
+ transition: opacity 0.3s ease;
230
+ }
231
+
232
+ .settlement:hover {
233
+ opacity: 0.1;
234
+ }
235
+
236
+ .settlement.player1 { fill: #FF4444; }
237
+ .settlement.player2 { fill: #4444FF; }
238
+ .settlement.player3 { fill: #44FF44; }
239
+ .settlement.player4 { fill: #FFAA00; }
240
+
241
+ /* ערים */
242
+ .city {
243
+ stroke: #2c3e50;
244
+ stroke-width: 3;
245
+ cursor: pointer;
246
+ filter: drop-shadow(2px 2px 3px rgba(0,0,0,0.3));
247
+ transition: opacity 0.3s ease;
248
+ }
249
+
250
+ .city:hover {
251
+ opacity: 0.1;
252
+ }
253
+
254
+ .city.player1 { fill: #FF4444; }
255
+ .city.player2 { fill: #4444FF; }
256
+ .city.player3 { fill: #44FF44; }
257
+ .city.player4 { fill: #FFAA00; }
258
+
259
+ /* דרכים */
260
+ .road {
261
+ stroke-width: 6;
262
+ stroke-linecap: round;
263
+ cursor: pointer;
264
+ transition: all 0.3s ease;
265
+ filter: drop-shadow(1px 1px 2px rgba(0,0,0,0.3));
266
+ }
267
+
268
+ .road:hover {
269
+ opacity: 0.1;
270
+ }
271
+
272
+ .road.player1 { stroke: #FF4444; }
273
+ .road.player2 { stroke: #4444FF; }
274
+ .road.player3 { stroke: #44FF44; }
275
+ .road.player4 { stroke: #FFAA00; }
276
+
277
+ /* קודקודים */
278
+ .vertex {
279
+ fill: #e74c3c;
280
+ stroke: #ffffff;
281
+ stroke-width: 3;
282
+ opacity: 0;
283
+ transition: opacity 0.3s ease;
284
+ cursor: pointer;
285
+ }
286
+
287
+ .vertex:hover {
288
+ opacity: 0.1;
289
+ }
290
+
291
+ .vertices-visible .vertex {
292
+ opacity: 0.9;
293
+ }
294
+
295
+ .vertex-number {
296
+ font-size: 14px;
297
+ font-weight: 900;
298
+ text-anchor: middle;
299
+ dominant-baseline: middle;
300
+ fill: white;
301
+ pointer-events: none;
302
+ opacity: 0;
303
+ transition: opacity 0.3s ease;
304
+ text-shadow:
305
+ -1px -1px 0 #000,
306
+ 1px -1px 0 #000,
307
+ -1px 1px 0 #000,
308
+ 1px 1px 0 #000;
309
+ }
310
+
311
+ .vertices-visible .vertex-number {
312
+ opacity: 1;
313
+ }
314
+
315
+ /* רספונסיביות */
316
+ @media (max-width: 1400px) {
317
+ .sidebar-left,
318
+ .sidebar-right {
319
+ width: 280px;
320
+ }
321
+ }
322
+
323
+ @media (max-width: 1200px) {
324
+ .content-wrapper {
325
+ gap: 8px;
326
+ }
327
+
328
+ .sidebar-left,
329
+ .sidebar-right {
330
+ width: 260px;
331
+ }
332
+ }
333
+
334
+ @media (max-width: 1024px) {
335
+ .content-wrapper {
336
+ flex-wrap: wrap;
337
+ }
338
+
339
+ .sidebar-left,
340
+ .sidebar-right {
341
+ width: 100%;
342
+ max-height: 30vh;
343
+ }
344
+
345
+ .board-wrapper {
346
+ width: 100%;
347
+ min-height: 50vh;
348
+ }
349
+ }
350
+
351
+ @media (max-width: 768px) {
352
+ .game-header {
353
+ padding: 15px;
354
+ }
355
+
356
+ h1 {
357
+ font-size: 1.8em;
358
+ }
359
+
360
+ .subtitle {
361
+ font-size: 0.8em;
362
+ }
363
+
364
+ .content-wrapper {
365
+ padding: 8px;
366
+ }
367
+
368
+ .sidebar-left,
369
+ .sidebar-right {
370
+ width: 100%;
371
+ max-height: 25vh;
372
+ }
373
+
374
+ .board-wrapper {
375
+ width: 100%;
376
+ min-height: 60vh;
377
+ }
378
+
379
+ .board-controls {
380
+ top: 8px;
381
+ right: 8px;
382
+ flex-direction: row;
383
+ gap: 6px;
384
+ }
385
+
386
+ .control-btn {
387
+ width: 40px;
388
+ height: 40px;
389
+ font-size: 16px;
390
+ }
391
+ }
392
+
393
+ @media (max-width: 480px) {
394
+ body {
395
+ padding: 0;
396
+ }
397
+
398
+ .game-header {
399
+ padding: 12px;
400
+ }
401
+
402
+ h1 {
403
+ font-size: 1.4em;
404
+ }
405
+
406
+ .subtitle {
407
+ font-size: 0.7em;
408
+ }
409
+
410
+ .sidebar-left,
411
+ .sidebar-right {
412
+ max-height: 20vh;
413
+ }
414
+
415
+ .game-info,
416
+ .action-log {
417
+ font-size: 0.8em;
418
+ }
419
+ }
420
+
421
+ /* Game Info */
422
+ .game-info {
423
+ display: flex;
424
+ flex-direction: column;
425
+ gap: 10px;
426
+ }
427
+
428
+ .game-info h3 {
429
+ margin: 0;
430
+ color: var(--primary-color);
431
+ font-size: 1.1em;
432
+ border-bottom: 2px solid var(--secondary-color);
433
+ padding-bottom: 8px;
434
+ }
435
+
436
+ .game-info .loading {
437
+ text-align: center;
438
+ color: var(--secondary-color);
439
+ padding: 20px;
440
+ font-style: italic;
441
+ }
442
+
443
+ .player-info {
444
+ margin-bottom: 8px;
445
+ padding: 10px 12px;
446
+ border-radius: 8px;
447
+ border-left: 4px solid transparent;
448
+ background: var(--light-bg);
449
+ cursor: pointer;
450
+ transition: all var(--transition);
451
+ }
452
+
453
+ .player-info:hover {
454
+ background: rgba(52, 152, 219, 0.15);
455
+ transform: translateX(-4px);
456
+ }
457
+
458
+ .player-info.active {
459
+ border-left-color: var(--secondary-color);
460
+ background: rgba(52, 152, 219, 0.2);
461
+ font-weight: 600;
462
+ }
463
+
464
+ .player-info h4 {
465
+ margin: 0 0 6px 0;
466
+ font-size: 0.95em;
467
+ color: var(--primary-color);
468
+ }
469
+
470
+ .player-resources {
471
+ font-size: 0.85em;
472
+ color: #555;
473
+ line-height: 1.4;
474
+ margin: 4px 0;
475
+ }
476
+
477
+ .log-header {
478
+ display: flex;
479
+ justify-content: space-between;
480
+ align-items: center;
481
+ margin-bottom: 12px;
482
+ }
483
+
484
+ .log-header h3 {
485
+ margin: 0;
486
+ color: var(--primary-color);
487
+ font-size: 1.1em;
488
+ border-bottom: 2px solid var(--secondary-color);
489
+ padding-bottom: 8px;
490
+ flex: 1;
491
+ }
492
+
493
+ .clear-log-btn {
494
+ background: var(--light-bg);
495
+ border: none;
496
+ padding: 6px 10px;
497
+ border-radius: 6px;
498
+ cursor: pointer;
499
+ font-size: 0.9em;
500
+ transition: all var(--transition);
501
+ }
502
+
503
+ .clear-log-btn:hover {
504
+ background: var(--danger-color);
505
+ color: white;
506
+ }
507
+
508
+ .action-log {
509
+ display: flex;
510
+ flex-direction: column;
511
+ gap: 6px;
512
+ font-family: 'Consolas', 'Monaco', monospace;
513
+ font-size: 0.85em;
514
+ direction: ltr;
515
+ max-height: calc(100vh - 180px);
516
+ overflow-y: auto;
517
+ }
518
+
519
+ .action-log::-webkit-scrollbar {
520
+ width: 6px;
521
+ }
522
+
523
+ .action-log::-webkit-scrollbar-track {
524
+ background: rgba(0,0,0,0.05);
525
+ border-radius: 3px;
526
+ }
527
+
528
+ .action-log::-webkit-scrollbar-thumb {
529
+ background: rgba(0,0,0,0.2);
530
+ border-radius: 3px;
531
+ }
532
+
533
+ .action-log::-webkit-scrollbar-thumb:hover {
534
+ background: rgba(0,0,0,0.3);
535
+ }
536
+
537
+ .action-log div {
538
+ margin: 0;
539
+ padding: 8px 10px;
540
+ border-radius: 6px;
541
+ border-left: 4px solid var(--secondary-color);
542
+ background: rgba(52, 152, 219, 0.1);
543
+ line-height: 1.3;
544
+ word-break: break-word;
545
+ }
546
+
547
+ .action-log .success {
548
+ color: var(--success-color);
549
+ border-left-color: var(--success-color);
550
+ background: rgba(39, 174, 96, 0.1);
551
+ }
552
+
553
+ .action-log .error {
554
+ color: var(--danger-color);
555
+ border-left-color: var(--danger-color);
556
+ background: rgba(231, 76, 60, 0.1);
557
+ font-weight: 500;
558
+ }
559
+
560
+ .action-log .info {
561
+ color: var(--secondary-color);
562
+ border-left-color: var(--secondary-color);
563
+ background: rgba(52, 152, 219, 0.1);
564
+ }
565
+
566
+ .action-log .log-dice {
567
+ color: var(--warning-color);
568
+ border-left-color: var(--warning-color);
569
+ background: rgba(243, 156, 18, 0.1);
570
+ font-weight: 600;
571
+ }
572
+
573
+ .action-log .log-turn {
574
+ color: white;
575
+ background: linear-gradient(90deg, var(--secondary-color), var(--accent-color));
576
+ border: none;
577
+ text-align: center;
578
+ font-weight: 700;
579
+ padding: 10px;
580
+ font-size: 0.9em;
581
+ border-radius: 8px;
582
+ box-shadow: 0 2px 8px rgba(52, 152, 219, 0.3);
583
+ }
584
+
585
+ .action-log .log-resource {
586
+ color: var(--accent-color);
587
+ border-left-color: var(--accent-color);
588
+ background: rgba(155, 89, 182, 0.1);
589
+ font-style: italic;
590
+ }
591
+
592
+ .action-log .log-build {
593
+ color: var(--success-color);
594
+ border-left-color: var(--success-color);
595
+ background: rgba(39, 174, 96, 0.1);
596
+ font-weight: 600;
597
+ }
598
+
599
+ /* Player Cards Display */
600
+ .player-cards {
601
+ display: none;
602
+ margin-top: 8px;
603
+ padding: 8px;
604
+ background: white;
605
+ border-radius: 6px;
606
+ border: 1px solid rgba(52, 152, 219, 0.2);
607
+ animation: slideDown var(--transition);
608
+ }
609
+
610
+ /* Player Achievements Display */
611
+ .player-achievements {
612
+ margin-top: 5px;
613
+ padding: 6px 10px;
614
+ background: rgba(255, 215, 0, 0.15);
615
+ border-radius: 6px;
616
+ border: 1px solid rgba(255, 215, 0, 0.4);
617
+ font-size: 0.85em;
618
+ font-weight: 600;
619
+ color: var(--primary-color);
620
+ text-align: center;
621
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
622
+ }
623
+
624
+ .player-info.expanded .player-cards {
625
+ display: block;
626
+ }
627
+
628
+ @keyframes slideDown {
629
+ from {
630
+ opacity: 0;
631
+ transform: translateY(-8px);
632
+ }
633
+ to {
634
+ opacity: 1;
635
+ transform: translateY(0);
636
+ }
637
+ }
638
+
639
+ .player-cards div {
640
+ margin-bottom: 6px;
641
+ }
642
+
643
+ .player-cards strong {
644
+ color: var(--primary-color);
645
+ font-size: 0.85em;
646
+ }
647
+
648
+ .card-list {
649
+ list-style: none;
650
+ padding: 0;
651
+ margin: 4px 0 0 0;
652
+ font-size: 0.8em;
653
+ display: flex;
654
+ flex-wrap: wrap;
655
+ gap: 4px;
656
+ }
657
+
658
+ .card-list li {
659
+ display: inline-block;
660
+ padding: 4px 8px;
661
+ background: linear-gradient(135deg, var(--secondary-color), var(--secondary-color));
662
+ color: white;
663
+ border-radius: 4px;
664
+ border: 1px solid rgba(52, 152, 219, 0.3);
665
+ font-weight: 500;
666
+ white-space: nowrap;
667
+ transition: all var(--transition);
668
+ }
669
+
670
+ .card-list li:hover {
671
+ transform: translateY(-2px);
672
+ box-shadow: 0 3px 8px rgba(52, 152, 219, 0.3);
673
+ }
674
+
675
+ /* Modal for Building Costs */
676
+ .modal {
677
+ position: fixed;
678
+ top: 0;
679
+ left: 0;
680
+ width: 100%;
681
+ height: 100%;
682
+ background: rgba(0, 0, 0, 0.5);
683
+ display: flex;
684
+ align-items: center;
685
+ justify-content: center;
686
+ z-index: 1000;
687
+ backdrop-filter: blur(4px);
688
+ animation: fadeIn var(--transition);
689
+ }
690
+
691
+ .modal.hidden {
692
+ display: none;
693
+ }
694
+
695
+ @keyframes fadeIn {
696
+ from {
697
+ opacity: 0;
698
+ }
699
+ to {
700
+ opacity: 1;
701
+ }
702
+ }
703
+
704
+ .modal-content {
705
+ background: white;
706
+ border-radius: var(--border-radius);
707
+ box-shadow: var(--shadow);
708
+ max-width: 500px;
709
+ width: 90%;
710
+ max-height: 80vh;
711
+ overflow-y: auto;
712
+ animation: slideUp var(--transition);
713
+ }
714
+
715
+ @keyframes slideUp {
716
+ from {
717
+ transform: translateY(30px);
718
+ opacity: 0;
719
+ }
720
+ to {
721
+ transform: translateY(0);
722
+ opacity: 1;
723
+ }
724
+ }
725
+
726
+ .modal-header {
727
+ display: flex;
728
+ justify-content: space-between;
729
+ align-items: center;
730
+ padding: 20px;
731
+ border-bottom: 2px solid var(--secondary-color);
732
+ }
733
+
734
+ .modal-header h3 {
735
+ margin: 0;
736
+ color: var(--primary-color);
737
+ font-size: 1.3em;
738
+ }
739
+
740
+ .modal-close {
741
+ background: none;
742
+ border: none;
743
+ font-size: 24px;
744
+ cursor: pointer;
745
+ color: var(--danger-color);
746
+ transition: all var(--transition);
747
+ }
748
+
749
+ .modal-close:hover {
750
+ transform: scale(1.2);
751
+ }
752
+
753
+ .modal-body {
754
+ padding: 20px;
755
+ }
756
+
757
+ .costs-table {
758
+ width: 100%;
759
+ border-collapse: collapse;
760
+ margin-bottom: 16px;
761
+ }
762
+
763
+ .costs-table thead {
764
+ background: linear-gradient(135deg, var(--secondary-color), var(--accent-color));
765
+ color: white;
766
+ }
767
+
768
+ .costs-table th {
769
+ padding: 12px;
770
+ text-align: left;
771
+ font-weight: 600;
772
+ }
773
+
774
+ .costs-table td {
775
+ padding: 12px;
776
+ border-bottom: 1px solid var(--light-bg);
777
+ }
778
+
779
+ .costs-table tbody tr:hover {
780
+ background: rgba(52, 152, 219, 0.1);
781
+ }
782
+
783
+ .costs-note {
784
+ font-size: 0.85em;
785
+ color: #666;
786
+ font-style: italic;
787
+ margin: 0;
788
+ }
pycatan/static/images/Desert.png ADDED
pycatan/static/images/Fields.png ADDED
pycatan/static/images/Forest.png ADDED
pycatan/static/images/Hills.png ADDED
pycatan/static/images/Mountains.png ADDED
pycatan/static/images/Pasture.png ADDED
pycatan/static/js/point_mapping.json ADDED
@@ -0,0 +1,277 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "point_to_coords": {
3
+ "1": [
4
+ 0,
5
+ 0
6
+ ],
7
+ "2": [
8
+ 0,
9
+ 1
10
+ ],
11
+ "3": [
12
+ 0,
13
+ 2
14
+ ],
15
+ "4": [
16
+ 0,
17
+ 3
18
+ ],
19
+ "5": [
20
+ 0,
21
+ 4
22
+ ],
23
+ "6": [
24
+ 0,
25
+ 5
26
+ ],
27
+ "7": [
28
+ 0,
29
+ 6
30
+ ],
31
+ "8": [
32
+ 1,
33
+ 0
34
+ ],
35
+ "9": [
36
+ 1,
37
+ 1
38
+ ],
39
+ "10": [
40
+ 1,
41
+ 2
42
+ ],
43
+ "11": [
44
+ 1,
45
+ 3
46
+ ],
47
+ "12": [
48
+ 1,
49
+ 4
50
+ ],
51
+ "13": [
52
+ 1,
53
+ 5
54
+ ],
55
+ "14": [
56
+ 1,
57
+ 6
58
+ ],
59
+ "15": [
60
+ 1,
61
+ 7
62
+ ],
63
+ "16": [
64
+ 1,
65
+ 8
66
+ ],
67
+ "17": [
68
+ 2,
69
+ 0
70
+ ],
71
+ "18": [
72
+ 2,
73
+ 1
74
+ ],
75
+ "19": [
76
+ 2,
77
+ 2
78
+ ],
79
+ "20": [
80
+ 2,
81
+ 3
82
+ ],
83
+ "21": [
84
+ 2,
85
+ 4
86
+ ],
87
+ "22": [
88
+ 2,
89
+ 5
90
+ ],
91
+ "23": [
92
+ 2,
93
+ 6
94
+ ],
95
+ "24": [
96
+ 2,
97
+ 7
98
+ ],
99
+ "25": [
100
+ 2,
101
+ 8
102
+ ],
103
+ "26": [
104
+ 2,
105
+ 9
106
+ ],
107
+ "27": [
108
+ 2,
109
+ 10
110
+ ],
111
+ "28": [
112
+ 3,
113
+ 0
114
+ ],
115
+ "29": [
116
+ 3,
117
+ 1
118
+ ],
119
+ "30": [
120
+ 3,
121
+ 2
122
+ ],
123
+ "31": [
124
+ 3,
125
+ 3
126
+ ],
127
+ "32": [
128
+ 3,
129
+ 4
130
+ ],
131
+ "33": [
132
+ 3,
133
+ 5
134
+ ],
135
+ "34": [
136
+ 3,
137
+ 6
138
+ ],
139
+ "35": [
140
+ 3,
141
+ 7
142
+ ],
143
+ "36": [
144
+ 3,
145
+ 8
146
+ ],
147
+ "37": [
148
+ 3,
149
+ 9
150
+ ],
151
+ "38": [
152
+ 3,
153
+ 10
154
+ ],
155
+ "39": [
156
+ 4,
157
+ 0
158
+ ],
159
+ "40": [
160
+ 4,
161
+ 1
162
+ ],
163
+ "41": [
164
+ 4,
165
+ 2
166
+ ],
167
+ "42": [
168
+ 4,
169
+ 3
170
+ ],
171
+ "43": [
172
+ 4,
173
+ 4
174
+ ],
175
+ "44": [
176
+ 4,
177
+ 5
178
+ ],
179
+ "45": [
180
+ 4,
181
+ 6
182
+ ],
183
+ "46": [
184
+ 4,
185
+ 7
186
+ ],
187
+ "47": [
188
+ 4,
189
+ 8
190
+ ],
191
+ "48": [
192
+ 5,
193
+ 0
194
+ ],
195
+ "49": [
196
+ 5,
197
+ 1
198
+ ],
199
+ "50": [
200
+ 5,
201
+ 2
202
+ ],
203
+ "51": [
204
+ 5,
205
+ 3
206
+ ],
207
+ "52": [
208
+ 5,
209
+ 4
210
+ ],
211
+ "53": [
212
+ 5,
213
+ 5
214
+ ],
215
+ "54": [
216
+ 5,
217
+ 6
218
+ ]
219
+ },
220
+ "coords_to_point": {
221
+ "0,0": 1,
222
+ "0,1": 2,
223
+ "0,2": 3,
224
+ "0,3": 4,
225
+ "0,4": 5,
226
+ "0,5": 6,
227
+ "0,6": 7,
228
+ "1,0": 8,
229
+ "1,1": 9,
230
+ "1,2": 10,
231
+ "1,3": 11,
232
+ "1,4": 12,
233
+ "1,5": 13,
234
+ "1,6": 14,
235
+ "1,7": 15,
236
+ "1,8": 16,
237
+ "2,0": 17,
238
+ "2,1": 18,
239
+ "2,2": 19,
240
+ "2,3": 20,
241
+ "2,4": 21,
242
+ "2,5": 22,
243
+ "2,6": 23,
244
+ "2,7": 24,
245
+ "2,8": 25,
246
+ "2,9": 26,
247
+ "2,10": 27,
248
+ "3,0": 28,
249
+ "3,1": 29,
250
+ "3,2": 30,
251
+ "3,3": 31,
252
+ "3,4": 32,
253
+ "3,5": 33,
254
+ "3,6": 34,
255
+ "3,7": 35,
256
+ "3,8": 36,
257
+ "3,9": 37,
258
+ "3,10": 38,
259
+ "4,0": 39,
260
+ "4,1": 40,
261
+ "4,2": 41,
262
+ "4,3": 42,
263
+ "4,4": 43,
264
+ "4,5": 44,
265
+ "4,6": 45,
266
+ "4,7": 46,
267
+ "4,8": 47,
268
+ "5,0": 48,
269
+ "5,1": 49,
270
+ "5,2": 50,
271
+ "5,3": 51,
272
+ "5,4": 52,
273
+ "5,5": 53,
274
+ "5,6": 54
275
+ },
276
+ "total_points": 54
277
+ }
pycatan/visualizations/web_visualization.py CHANGED
@@ -52,10 +52,12 @@ class WebVisualization(Visualization):
52
  # Get the directory of this file
53
  import os
54
  viz_dir = os.path.dirname(os.path.abspath(__file__))
 
55
 
56
  # Flask app setup with absolute paths
 
57
  self.app = Flask(__name__,
58
- static_folder=os.path.join(viz_dir, 'static'),
59
  template_folder=os.path.join(viz_dir, 'templates'))
60
 
61
  # Disable Flask logging
 
52
  # Get the directory of this file
53
  import os
54
  viz_dir = os.path.dirname(os.path.abspath(__file__))
55
+ pycatan_dir = os.path.dirname(viz_dir) # Go up one level to pycatan/
56
 
57
  # Flask app setup with absolute paths
58
+ # Static files are in pycatan/static, templates in visualizations/templates
59
  self.app = Flask(__name__,
60
+ static_folder=os.path.join(pycatan_dir, 'static'),
61
  template_folder=os.path.join(viz_dir, 'templates'))
62
 
63
  # Disable Flask logging