GameSentenceMiner 2.19.16__py3-none-any.whl → 2.20.0__py3-none-any.whl

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.

Potentially problematic release.


This version of GameSentenceMiner might be problematic. Click here for more details.

Files changed (70) hide show
  1. GameSentenceMiner/__init__.py +39 -0
  2. GameSentenceMiner/anki.py +6 -3
  3. GameSentenceMiner/gametext.py +13 -2
  4. GameSentenceMiner/gsm.py +40 -3
  5. GameSentenceMiner/locales/en_us.json +4 -0
  6. GameSentenceMiner/locales/ja_jp.json +4 -0
  7. GameSentenceMiner/locales/zh_cn.json +4 -0
  8. GameSentenceMiner/obs.py +4 -1
  9. GameSentenceMiner/owocr/owocr/ocr.py +304 -134
  10. GameSentenceMiner/owocr/owocr/run.py +1 -1
  11. GameSentenceMiner/ui/anki_confirmation.py +4 -2
  12. GameSentenceMiner/ui/config_gui.py +12 -0
  13. GameSentenceMiner/util/configuration.py +6 -2
  14. GameSentenceMiner/util/cron/__init__.py +12 -0
  15. GameSentenceMiner/util/cron/daily_rollup.py +613 -0
  16. GameSentenceMiner/util/cron/jiten_update.py +397 -0
  17. GameSentenceMiner/util/cron/populate_games.py +154 -0
  18. GameSentenceMiner/util/cron/run_crons.py +148 -0
  19. GameSentenceMiner/util/cron/setup_populate_games_cron.py +118 -0
  20. GameSentenceMiner/util/cron_table.py +334 -0
  21. GameSentenceMiner/util/db.py +236 -49
  22. GameSentenceMiner/util/ffmpeg.py +23 -4
  23. GameSentenceMiner/util/games_table.py +340 -93
  24. GameSentenceMiner/util/jiten_api_client.py +188 -0
  25. GameSentenceMiner/util/stats_rollup_table.py +216 -0
  26. GameSentenceMiner/web/anki_api_endpoints.py +438 -220
  27. GameSentenceMiner/web/database_api.py +955 -1259
  28. GameSentenceMiner/web/jiten_database_api.py +1015 -0
  29. GameSentenceMiner/web/rollup_stats.py +672 -0
  30. GameSentenceMiner/web/static/css/dashboard-shared.css +75 -13
  31. GameSentenceMiner/web/static/css/overview.css +604 -47
  32. GameSentenceMiner/web/static/css/search.css +226 -0
  33. GameSentenceMiner/web/static/css/shared.css +762 -0
  34. GameSentenceMiner/web/static/css/stats.css +221 -0
  35. GameSentenceMiner/web/static/js/components/bar-chart.js +339 -0
  36. GameSentenceMiner/web/static/js/database-bulk-operations.js +320 -0
  37. GameSentenceMiner/web/static/js/database-game-data.js +390 -0
  38. GameSentenceMiner/web/static/js/database-game-operations.js +213 -0
  39. GameSentenceMiner/web/static/js/database-helpers.js +44 -0
  40. GameSentenceMiner/web/static/js/database-jiten-integration.js +750 -0
  41. GameSentenceMiner/web/static/js/database-popups.js +89 -0
  42. GameSentenceMiner/web/static/js/database-tabs.js +64 -0
  43. GameSentenceMiner/web/static/js/database-text-management.js +371 -0
  44. GameSentenceMiner/web/static/js/database.js +86 -718
  45. GameSentenceMiner/web/static/js/goals.js +79 -18
  46. GameSentenceMiner/web/static/js/heatmap.js +29 -23
  47. GameSentenceMiner/web/static/js/overview.js +1205 -339
  48. GameSentenceMiner/web/static/js/regex-patterns.js +100 -0
  49. GameSentenceMiner/web/static/js/search.js +215 -18
  50. GameSentenceMiner/web/static/js/shared.js +193 -39
  51. GameSentenceMiner/web/static/js/stats.js +1536 -179
  52. GameSentenceMiner/web/stats.py +1142 -269
  53. GameSentenceMiner/web/stats_api.py +2104 -0
  54. GameSentenceMiner/web/templates/anki_stats.html +4 -18
  55. GameSentenceMiner/web/templates/components/date-range.html +118 -3
  56. GameSentenceMiner/web/templates/components/html-head.html +40 -6
  57. GameSentenceMiner/web/templates/components/js-config.html +8 -8
  58. GameSentenceMiner/web/templates/components/regex-input.html +160 -0
  59. GameSentenceMiner/web/templates/database.html +564 -117
  60. GameSentenceMiner/web/templates/goals.html +41 -5
  61. GameSentenceMiner/web/templates/overview.html +159 -129
  62. GameSentenceMiner/web/templates/search.html +78 -9
  63. GameSentenceMiner/web/templates/stats.html +159 -5
  64. GameSentenceMiner/web/texthooking_page.py +280 -111
  65. {gamesentenceminer-2.19.16.dist-info → gamesentenceminer-2.20.0.dist-info}/METADATA +43 -2
  66. {gamesentenceminer-2.19.16.dist-info → gamesentenceminer-2.20.0.dist-info}/RECORD +70 -47
  67. {gamesentenceminer-2.19.16.dist-info → gamesentenceminer-2.20.0.dist-info}/WHEEL +0 -0
  68. {gamesentenceminer-2.19.16.dist-info → gamesentenceminer-2.20.0.dist-info}/entry_points.txt +0 -0
  69. {gamesentenceminer-2.19.16.dist-info → gamesentenceminer-2.20.0.dist-info}/licenses/LICENSE +0 -0
  70. {gamesentenceminer-2.19.16.dist-info → gamesentenceminer-2.20.0.dist-info}/top_level.txt +0 -0
@@ -425,6 +425,10 @@ h1 {
425
425
  background: linear-gradient(90deg, var(--success-color), #a5d6a7);
426
426
  }
427
427
 
428
+ .management-card.game-data::before {
429
+ background: linear-gradient(90deg, var(--accent-color), #64b5f6);
430
+ }
431
+
428
432
  .card-header {
429
433
  display: flex;
430
434
  align-items: center;
@@ -1021,6 +1025,23 @@ input[type="date"].dashboard-date-input:hover {
1021
1025
  padding: 8px;
1022
1026
  border-radius: 6px;
1023
1027
  transition: all 0.3s ease;
1028
+ gap: 10px;
1029
+ }
1030
+
1031
+ /* Individual delete button styling */
1032
+ .individual-delete-btn {
1033
+ opacity: 0.7;
1034
+ transition: all 0.3s ease;
1035
+ flex-shrink: 0;
1036
+ }
1037
+
1038
+ .individual-delete-btn:hover {
1039
+ opacity: 1;
1040
+ transform: translateY(-1px);
1041
+ }
1042
+
1043
+ .checkbox-container:hover .individual-delete-btn {
1044
+ opacity: 1;
1024
1045
  }
1025
1046
 
1026
1047
  .checkbox-container.merge-target {
@@ -1046,4 +1067,745 @@ input[type="date"].dashboard-date-input:hover {
1046
1067
  .checkbox-label {
1047
1068
  cursor: pointer;
1048
1069
  transition: color 0.3s ease;
1070
+ }
1071
+
1072
+ /* Game Data Management Styles */
1073
+ .game-data-filters {
1074
+ display: flex;
1075
+ gap: 10px;
1076
+ margin-bottom: 20px;
1077
+ padding-bottom: 15px;
1078
+ border-bottom: 1px solid var(--border-color);
1079
+ }
1080
+
1081
+ .game-data-filters button {
1082
+ flex: 1;
1083
+ }
1084
+
1085
+ .game-data-item {
1086
+ background: var(--bg-secondary);
1087
+ border: 1px solid var(--border-color);
1088
+ border-radius: 8px;
1089
+ padding: 20px;
1090
+ margin-bottom: 15px;
1091
+ transition: all 0.3s ease;
1092
+ }
1093
+
1094
+ .game-data-item:hover {
1095
+ box-shadow: 0 4px 12px var(--shadow-color);
1096
+ border-color: var(--accent-color);
1097
+ }
1098
+
1099
+ .game-header {
1100
+ display: flex;
1101
+ align-items: flex-start;
1102
+ gap: 15px;
1103
+ margin-bottom: 15px;
1104
+ }
1105
+
1106
+ .game-thumbnail,
1107
+ .jiten-thumbnail {
1108
+ width: 60px;
1109
+ height: 60px;
1110
+ object-fit: cover;
1111
+ border-radius: 6px;
1112
+ border: 1px solid var(--border-color);
1113
+ }
1114
+
1115
+ .game-thumbnail-placeholder,
1116
+ .jiten-thumbnail-placeholder {
1117
+ width: 60px;
1118
+ height: 60px;
1119
+ background: var(--bg-tertiary);
1120
+ border: 1px solid var(--border-color);
1121
+ border-radius: 6px;
1122
+ display: flex;
1123
+ align-items: center;
1124
+ justify-content: center;
1125
+ font-size: 24px;
1126
+ }
1127
+
1128
+ .game-info {
1129
+ flex: 1;
1130
+ }
1131
+
1132
+ .game-title {
1133
+ margin: 0 0 5px 0;
1134
+ font-size: 18px;
1135
+ font-weight: 600;
1136
+ color: var(--text-primary);
1137
+ }
1138
+
1139
+ .game-title-en {
1140
+ margin: 0 0 5px 0;
1141
+ font-size: 14px;
1142
+ color: var(--text-secondary);
1143
+ font-weight: 500;
1144
+ }
1145
+
1146
+ .game-title-rom {
1147
+ margin: 0 0 10px 0;
1148
+ font-size: 13px;
1149
+ color: var(--text-tertiary);
1150
+ font-style: italic;
1151
+ }
1152
+
1153
+ .game-type-difficulty {
1154
+ display: flex;
1155
+ gap: 10px;
1156
+ margin-top: 8px;
1157
+ }
1158
+
1159
+ .game-type,
1160
+ .game-difficulty {
1161
+ font-size: 12px;
1162
+ padding: 3px 8px;
1163
+ border-radius: 12px;
1164
+ font-weight: 500;
1165
+ }
1166
+
1167
+ .game-type {
1168
+ background: var(--accent-color);
1169
+ color: white;
1170
+ }
1171
+
1172
+ .game-difficulty {
1173
+ background: var(--warning-color);
1174
+ color: #333;
1175
+ }
1176
+
1177
+ .game-status {
1178
+ display: flex;
1179
+ flex-direction: column;
1180
+ gap: 5px;
1181
+ align-items: flex-end;
1182
+ }
1183
+
1184
+ .status-badge {
1185
+ font-size: 11px;
1186
+ padding: 4px 8px;
1187
+ border-radius: 10px;
1188
+ font-weight: 600;
1189
+ white-space: nowrap;
1190
+ }
1191
+
1192
+ .status-badge.linked {
1193
+ background: var(--success-color);
1194
+ color: white;
1195
+ }
1196
+
1197
+ .status-badge.unlinked {
1198
+ background: var(--warning-color);
1199
+ color: #333;
1200
+ }
1201
+
1202
+ .status-badge.manual {
1203
+ background: var(--accent-color);
1204
+ color: white;
1205
+ }
1206
+
1207
+ .status-badge.completed {
1208
+ background: var(--text-tertiary);
1209
+ color: white;
1210
+ }
1211
+
1212
+ .status-badge.potential {
1213
+ background: var(--accent-color);
1214
+ color: white;
1215
+ }
1216
+
1217
+ .game-stats {
1218
+ display: flex;
1219
+ gap: 15px;
1220
+ margin-bottom: 15px;
1221
+ padding-top: 10px;
1222
+ border-top: 1px solid var(--border-color);
1223
+ font-size: 13px;
1224
+ color: var(--text-tertiary);
1225
+ }
1226
+
1227
+ .stat-item {
1228
+ font-weight: 500;
1229
+ }
1230
+
1231
+ .game-actions {
1232
+ display: flex;
1233
+ gap: 10px;
1234
+ flex-wrap: wrap;
1235
+ }
1236
+
1237
+ .game-actions button {
1238
+ font-size: 13px;
1239
+ padding: 8px 12px;
1240
+ }
1241
+
1242
+ .game-description {
1243
+ margin-top: 15px;
1244
+ padding-top: 15px;
1245
+ border-top: 1px solid var(--border-color);
1246
+ font-size: 14px;
1247
+ color: var(--text-secondary);
1248
+ line-height: 1.5;
1249
+ }
1250
+
1251
+ /* Jiten.moe Search Results */
1252
+ .jiten-result-item {
1253
+ background: var(--bg-tertiary);
1254
+ border: 1px solid var(--border-color);
1255
+ border-radius: 8px;
1256
+ padding: 15px;
1257
+ margin-bottom: 10px;
1258
+ transition: all 0.2s ease;
1259
+ }
1260
+
1261
+ .jiten-result-item:hover {
1262
+ border-color: var(--accent-color);
1263
+ box-shadow: 0 2px 8px var(--shadow-color);
1264
+ }
1265
+
1266
+ .jiten-result-header {
1267
+ display: flex;
1268
+ align-items: flex-start;
1269
+ gap: 12px;
1270
+ }
1271
+
1272
+ .jiten-info {
1273
+ flex: 1;
1274
+ }
1275
+
1276
+ .jiten-title {
1277
+ margin: 0 0 5px 0;
1278
+ font-size: 16px;
1279
+ font-weight: 600;
1280
+ color: var(--text-primary);
1281
+ }
1282
+
1283
+ .jiten-title-en {
1284
+ margin: 0 0 3px 0;
1285
+ font-size: 14px;
1286
+ color: var(--text-secondary);
1287
+ }
1288
+
1289
+ .jiten-title-rom {
1290
+ margin: 0 0 8px 0;
1291
+ font-size: 13px;
1292
+ color: var(--text-tertiary);
1293
+ font-style: italic;
1294
+ }
1295
+
1296
+ .jiten-meta {
1297
+ display: flex;
1298
+ gap: 10px;
1299
+ font-size: 12px;
1300
+ }
1301
+
1302
+ .jiten-type,
1303
+ .jiten-difficulty,
1304
+ .jiten-chars {
1305
+ padding: 2px 6px;
1306
+ border-radius: 8px;
1307
+ font-weight: 500;
1308
+ }
1309
+
1310
+ .jiten-type {
1311
+ background: var(--accent-color);
1312
+ color: white;
1313
+ }
1314
+
1315
+ .jiten-difficulty {
1316
+ background: var(--warning-color);
1317
+ color: #333;
1318
+ }
1319
+
1320
+ .jiten-chars {
1321
+ background: var(--bg-secondary);
1322
+ color: var(--text-secondary);
1323
+ border: 1px solid var(--border-color);
1324
+ }
1325
+
1326
+ .jiten-actions {
1327
+ display: flex;
1328
+ align-items: flex-start;
1329
+ }
1330
+
1331
+ .jiten-description {
1332
+ margin-top: 10px;
1333
+ padding-top: 10px;
1334
+ border-top: 1px solid var(--border-color);
1335
+ font-size: 13px;
1336
+ color: var(--text-tertiary);
1337
+ line-height: 1.4;
1338
+ }
1339
+
1340
+ /* Link Confirmation Preview */
1341
+ .link-preview {
1342
+ margin-bottom: 20px;
1343
+ }
1344
+
1345
+ .current-game,
1346
+ .jiten-game {
1347
+ margin-bottom: 15px;
1348
+ }
1349
+
1350
+ .current-game h4,
1351
+ .jiten-game h4 {
1352
+ margin: 0 0 10px 0;
1353
+ font-size: 16px;
1354
+ font-weight: 600;
1355
+ color: var(--text-primary);
1356
+ }
1357
+
1358
+ .preview-header {
1359
+ display: flex;
1360
+ align-items: center;
1361
+ gap: 10px;
1362
+ }
1363
+
1364
+ .preview-header h5 {
1365
+ margin: 0;
1366
+ font-size: 15px;
1367
+ font-weight: 600;
1368
+ color: var(--text-primary);
1369
+ }
1370
+
1371
+ .preview-header p {
1372
+ margin: 2px 0 0 0;
1373
+ font-size: 13px;
1374
+ color: var(--text-secondary);
1375
+ }
1376
+
1377
+ .preview-stats {
1378
+ font-size: 12px;
1379
+ color: var(--text-tertiary);
1380
+ margin-top: 5px;
1381
+ }
1382
+
1383
+ .info-text {
1384
+ color: var(--text-secondary);
1385
+ margin-bottom: 20px;
1386
+ padding: 10px;
1387
+ background: var(--bg-tertiary);
1388
+ border-radius: 5px;
1389
+ border-left: 4px solid var(--accent-color);
1390
+ }
1391
+
1392
+ .search-info {
1393
+ background: var(--bg-tertiary);
1394
+ padding: 10px;
1395
+ border-radius: 5px;
1396
+ margin-bottom: 15px;
1397
+ border-left: 4px solid var(--accent-color);
1398
+ }
1399
+
1400
+ /* Responsive Design for Game Data */
1401
+ @media (max-width: 768px) {
1402
+ .game-data-filters {
1403
+ flex-direction: column;
1404
+ gap: 8px;
1405
+ }
1406
+
1407
+ .game-header {
1408
+ flex-direction: column;
1409
+ align-items: stretch;
1410
+ }
1411
+
1412
+ .game-thumbnail,
1413
+ .jiten-thumbnail {
1414
+ width: 50px;
1415
+ height: 50px;
1416
+ }
1417
+
1418
+ .game-stats {
1419
+ flex-direction: column;
1420
+ gap: 5px;
1421
+ }
1422
+
1423
+ .game-actions {
1424
+ flex-direction: column;
1425
+ }
1426
+
1427
+ .jiten-result-header {
1428
+ flex-direction: column;
1429
+ gap: 10px;
1430
+ }
1431
+
1432
+ .jiten-meta {
1433
+ flex-wrap: wrap;
1434
+ }
1435
+
1436
+ .preview-header {
1437
+ flex-direction: column;
1438
+ align-items: stretch;
1439
+ gap: 5px;
1440
+ }
1441
+ }
1442
+
1443
+ /* Potential Games Styles */
1444
+ .potential-game-item {
1445
+ background: linear-gradient(135deg, var(--bg-secondary) 0%, var(--bg-tertiary) 100%);
1446
+ border: 2px dashed var(--accent-color);
1447
+ border-radius: 8px;
1448
+ margin-bottom: 16px;
1449
+ padding: 16px;
1450
+ position: relative;
1451
+ transition: all 0.3s ease;
1452
+ }
1453
+
1454
+ .potential-game-item:hover {
1455
+ border-style: solid;
1456
+ transform: translateY(-2px);
1457
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.15);
1458
+ }
1459
+
1460
+ .potential-game-item::before {
1461
+ content: '✨';
1462
+ position: absolute;
1463
+ top: -10px;
1464
+ right: -10px;
1465
+ background: var(--accent-color);
1466
+ color: white;
1467
+ width: 24px;
1468
+ height: 24px;
1469
+ border-radius: 50%;
1470
+ display: flex;
1471
+ align-items: center;
1472
+ justify-content: center;
1473
+ font-size: 12px;
1474
+ z-index: 1;
1475
+ }
1476
+
1477
+ .potential-games-header h3 {
1478
+ color: var(--accent-color);
1479
+ margin: 0 0 10px 0;
1480
+ font-size: 24px;
1481
+ text-align: center;
1482
+ }
1483
+
1484
+ .potential-games-header p {
1485
+ color: var(--text-secondary);
1486
+ margin: 5px 0;
1487
+ text-align: center;
1488
+ font-size: 14px;
1489
+ }
1490
+
1491
+ .potential-games-separator {
1492
+ margin: 30px 0;
1493
+ }
1494
+
1495
+ .potential-games-separator hr {
1496
+ border: none;
1497
+ height: 1px;
1498
+ background: var(--border-color);
1499
+ margin: 0;
1500
+ }
1501
+
1502
+ .potential-games-separator span {
1503
+ background: var(--bg-primary);
1504
+ padding: 0 20px;
1505
+ color: var(--text-secondary);
1506
+ font-weight: 600;
1507
+ font-size: 14px;
1508
+ position: relative;
1509
+ z-index: 1;
1510
+ }
1511
+
1512
+ /* Mobile styles for potential games */
1513
+ @media (max-width: 768px) {
1514
+ .potential-game-item .game-header {
1515
+ flex-direction: column;
1516
+ gap: 12px;
1517
+ }
1518
+
1519
+ .potential-game-item .game-thumbnail-placeholder {
1520
+ align-self: center;
1521
+ width: 60px;
1522
+ height: 60px;
1523
+ font-size: 20px;
1524
+ }
1525
+
1526
+ .potential-game-item .game-actions {
1527
+ justify-content: center;
1528
+ }
1529
+
1530
+ .potential-games-separator span {
1531
+ padding: 0 15px;
1532
+ font-size: 13px;
1533
+ }
1534
+ }
1535
+
1536
+ /* Tab Interface Styles */
1537
+ .modal-tabs {
1538
+ display: flex;
1539
+ border-bottom: 2px solid var(--border-color);
1540
+ background: var(--bg-tertiary);
1541
+ margin: 0;
1542
+ padding: 0;
1543
+ }
1544
+
1545
+ .tab-btn {
1546
+ flex: 1;
1547
+ padding: 15px 20px;
1548
+ border: none;
1549
+ background: transparent;
1550
+ color: var(--text-secondary);
1551
+ font-size: 14px;
1552
+ font-weight: 600;
1553
+ cursor: pointer;
1554
+ transition: all 0.3s ease;
1555
+ border-bottom: 3px solid transparent;
1556
+ position: relative;
1557
+ }
1558
+
1559
+ .tab-btn:hover {
1560
+ background: var(--bg-secondary);
1561
+ color: var(--text-primary);
1562
+ }
1563
+
1564
+ .tab-btn.active {
1565
+ background: var(--bg-secondary);
1566
+ color: var(--accent-color);
1567
+ border-bottom-color: var(--accent-color);
1568
+ }
1569
+
1570
+ .tab-btn.active::after {
1571
+ content: '';
1572
+ position: absolute;
1573
+ bottom: -2px;
1574
+ left: 0;
1575
+ right: 0;
1576
+ height: 2px;
1577
+ background: var(--accent-color);
1578
+ }
1579
+
1580
+ .tab-content {
1581
+ display: none;
1582
+ padding: 0;
1583
+ margin: 0;
1584
+ }
1585
+
1586
+ .tab-content.active {
1587
+ display: block;
1588
+ }
1589
+
1590
+ /* Large Modal Styles */
1591
+ .modal-content[style*="95vw"] {
1592
+ display: flex;
1593
+ flex-direction: column;
1594
+ }
1595
+
1596
+ .modal-content[style*="95vw"] .modal-body {
1597
+ flex: 1;
1598
+ overflow: hidden;
1599
+ display: flex;
1600
+ flex-direction: column;
1601
+ padding: 0;
1602
+ }
1603
+
1604
+ .modal-content[style*="95vw"] .tab-content {
1605
+ padding: 20px;
1606
+ flex: 1;
1607
+ overflow-y: auto;
1608
+ }
1609
+
1610
+ /* Individual Game Action Buttons */
1611
+ .individual-game-actions {
1612
+ display: flex;
1613
+ gap: 10px;
1614
+ margin-top: 10px;
1615
+ }
1616
+
1617
+ .individual-game-actions .action-btn {
1618
+ font-size: 12px;
1619
+ padding: 8px 12px;
1620
+ flex: 1;
1621
+ }
1622
+
1623
+ .unlink-btn {
1624
+ background-color: var(--warning-color);
1625
+ color: #333;
1626
+ border: 2px solid var(--warning-color);
1627
+ }
1628
+
1629
+ .unlink-btn:hover {
1630
+ background-color: #e0a800;
1631
+ transform: translateY(-1px);
1632
+ }
1633
+
1634
+ .delete-lines-btn {
1635
+ background-color: var(--danger-color);
1636
+ color: white;
1637
+ border: 2px solid var(--danger-color);
1638
+ font-weight: 700;
1639
+ }
1640
+
1641
+ .delete-lines-btn:hover {
1642
+ background-color: #c82333;
1643
+ transform: translateY(-1px);
1644
+ box-shadow: 0 4px 12px rgba(220, 53, 69, 0.3);
1645
+ }
1646
+
1647
+ /* Enhanced Game Data Item for Manage Tab */
1648
+ .manage-game-item {
1649
+ background: var(--bg-secondary);
1650
+ border: 1px solid var(--border-color);
1651
+ border-radius: 8px;
1652
+ padding: 20px;
1653
+ margin-bottom: 15px;
1654
+ transition: all 0.3s ease;
1655
+ }
1656
+
1657
+ .manage-game-item:hover {
1658
+ box-shadow: 0 4px 12px var(--shadow-color);
1659
+ border-color: var(--accent-color);
1660
+ }
1661
+
1662
+ /* Dashboard Popup Styles */
1663
+ .dashboard-popup {
1664
+ position: fixed;
1665
+ top: 0;
1666
+ left: 0;
1667
+ width: 100%;
1668
+ height: 100%;
1669
+ background-color: rgba(0, 0, 0, 0.6);
1670
+ display: flex;
1671
+ justify-content: center;
1672
+ align-items: center;
1673
+ z-index: 10000;
1674
+ transition: opacity 0.3s ease;
1675
+ }
1676
+
1677
+ .dashboard-popup.hidden {
1678
+ display: none;
1679
+ }
1680
+
1681
+ .dashboard-popup-content {
1682
+ background: var(--bg-secondary);
1683
+ border-radius: 12px;
1684
+ padding: 30px;
1685
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
1686
+ border: 1px solid var(--border-color);
1687
+ max-width: 400px;
1688
+ width: 90%;
1689
+ text-align: center;
1690
+ animation: popupSlideIn 0.3s ease-out;
1691
+ }
1692
+
1693
+ @keyframes popupSlideIn {
1694
+ from {
1695
+ opacity: 0;
1696
+ transform: translateY(-20px) scale(0.95);
1697
+ }
1698
+ to {
1699
+ opacity: 1;
1700
+ transform: translateY(0) scale(1);
1701
+ }
1702
+ }
1703
+
1704
+ .dashboard-popup-icon {
1705
+ font-size: 48px;
1706
+ margin-bottom: 15px;
1707
+ display: block;
1708
+ }
1709
+
1710
+ .dashboard-popup-message {
1711
+ color: var(--text-primary);
1712
+ font-size: 16px;
1713
+ font-weight: 500;
1714
+ margin-bottom: 20px;
1715
+ line-height: 1.5;
1716
+ }
1717
+
1718
+ .dashboard-popup-btn {
1719
+ background: var(--accent-color);
1720
+ color: white;
1721
+ border: none;
1722
+ padding: 12px 24px;
1723
+ border-radius: 8px;
1724
+ font-size: 14px;
1725
+ font-weight: 600;
1726
+ cursor: pointer;
1727
+ transition: all 0.3s ease;
1728
+ margin: 0 5px;
1729
+ }
1730
+
1731
+ .dashboard-popup-btn:hover {
1732
+ background: #0056b3;
1733
+ transform: translateY(-1px);
1734
+ }
1735
+
1736
+ .dashboard-popup-btn:active {
1737
+ transform: translateY(0);
1738
+ }
1739
+
1740
+ /* Edit Game Modal Styles */
1741
+ #editGameModal .form-group {
1742
+ margin-bottom: 20px;
1743
+ }
1744
+
1745
+ #editGameModal .form-label {
1746
+ display: block;
1747
+ margin-bottom: 8px;
1748
+ font-weight: 600;
1749
+ color: var(--text-primary);
1750
+ }
1751
+
1752
+ #editGameModal .form-input,
1753
+ #editGameModal .form-textarea {
1754
+ width: 100%;
1755
+ padding: 10px;
1756
+ border: 1px solid var(--border-color);
1757
+ border-radius: 5px;
1758
+ background: var(--bg-tertiary);
1759
+ color: var(--text-primary);
1760
+ font-size: 14px;
1761
+ box-sizing: border-box;
1762
+ font-family: inherit;
1763
+ }
1764
+
1765
+ #editGameModal .form-textarea {
1766
+ resize: vertical;
1767
+ min-height: 80px;
1768
+ }
1769
+
1770
+ #editGameModal .form-input:focus,
1771
+ #editGameModal .form-textarea:focus {
1772
+ outline: none;
1773
+ border-color: var(--accent-color);
1774
+ box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.1);
1775
+ }
1776
+
1777
+ #editImagePreview {
1778
+ text-align: center;
1779
+ padding: 10px;
1780
+ background: var(--bg-tertiary);
1781
+ border-radius: 8px;
1782
+ }
1783
+
1784
+ #editImagePreviewImg {
1785
+ display: inline-block;
1786
+ }
1787
+
1788
+ /* Responsive popup styles */
1789
+ @media (max-width: 480px) {
1790
+ .dashboard-popup-content {
1791
+ padding: 20px;
1792
+ margin: 20px;
1793
+ }
1794
+
1795
+ .dashboard-popup-icon {
1796
+ font-size: 36px;
1797
+ margin-bottom: 12px;
1798
+ }
1799
+
1800
+ .dashboard-popup-message {
1801
+ font-size: 14px;
1802
+ margin-bottom: 15px;
1803
+ }
1804
+
1805
+ .dashboard-popup-btn {
1806
+ padding: 10px 20px;
1807
+ font-size: 13px;
1808
+ margin: 5px 2px;
1809
+ width: calc(50% - 4px);
1810
+ }
1049
1811
  }