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
@@ -156,6 +156,12 @@
156
156
  overflow: hidden;
157
157
  }
158
158
 
159
+ /* Full-Width Current Game Card */
160
+ .dashboard-card.current-game-full-width {
161
+ margin-bottom: 30px;
162
+ padding: 24px;
163
+ }
164
+
159
165
  .dashboard-card:hover {
160
166
  transform: translateY(-2px);
161
167
  box-shadow: 0 8px 24px var(--shadow-color);
@@ -180,6 +186,10 @@
180
186
  background: linear-gradient(90deg, var(--success-color), var(--warning-color));
181
187
  }
182
188
 
189
+ .dashboard-card.today-overview::before {
190
+ background: linear-gradient(90deg, var(--info-color), var(--success-color));
191
+ }
192
+
183
193
  .dashboard-card.date-range::before {
184
194
  background: linear-gradient(90deg, var(--info-color), var(--accent-color));
185
195
  }
@@ -188,6 +198,239 @@
188
198
  margin-bottom: 30px;
189
199
  }
190
200
 
201
+ /* Game Content Grid - Compact horizontal layout */
202
+ .game-content-grid {
203
+ display: flex;
204
+ gap: 20px;
205
+ margin-bottom: 20px;
206
+ padding-bottom: 20px;
207
+ align-items: flex-start;
208
+ }
209
+
210
+ .game-photo-section {
211
+ flex-shrink: 0;
212
+ }
213
+
214
+ .game-photo-img {
215
+ width: 180px;
216
+ height: 240px;
217
+ object-fit: cover;
218
+ border-radius: 8px;
219
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
220
+ border: 1px solid var(--border-color);
221
+ background: var(--bg-tertiary);
222
+ }
223
+
224
+ .game-info-section {
225
+ flex: 1;
226
+ display: flex;
227
+ flex-direction: column;
228
+ gap: 12px;
229
+ min-width: 0;
230
+ }
231
+
232
+ .game-header-row {
233
+ display: flex;
234
+ align-items: center;
235
+ gap: 12px;
236
+ flex-wrap: wrap;
237
+ }
238
+
239
+ .game-titles {
240
+ flex: 1;
241
+ min-width: 0;
242
+ }
243
+
244
+ .game-title-original {
245
+ font-size: 20px;
246
+ font-weight: 600;
247
+ color: var(--text-primary);
248
+ line-height: 1.2;
249
+ margin-bottom: 4px;
250
+ }
251
+
252
+ .game-title-romaji {
253
+ font-size: 14px;
254
+ font-weight: 400;
255
+ color: var(--text-secondary);
256
+ font-style: italic;
257
+ margin-bottom: 2px;
258
+ }
259
+
260
+ .game-title-english {
261
+ font-size: 13px;
262
+ color: var(--text-tertiary);
263
+ }
264
+
265
+ .game-type-badge {
266
+ display: inline-block;
267
+ padding: 6px 14px;
268
+ background: var(--accent-color);
269
+ color: white;
270
+ border-radius: 16px;
271
+ font-size: 11px;
272
+ font-weight: 700;
273
+ text-transform: uppercase;
274
+ letter-spacing: 0.8px;
275
+ white-space: nowrap;
276
+ }
277
+
278
+ .game-description-container {
279
+ position: relative;
280
+ }
281
+
282
+ .game-description {
283
+ font-size: 13px;
284
+ line-height: 1.5;
285
+ color: var(--text-secondary);
286
+ max-height: 3em;
287
+ overflow: hidden;
288
+ position: relative;
289
+ display: -webkit-box;
290
+ -webkit-line-clamp: 2;
291
+ -webkit-box-orient: vertical;
292
+ }
293
+
294
+ /* Game Links Styles */
295
+ .game-links-container {
296
+ display: flex;
297
+ align-items: center;
298
+ gap: 10px;
299
+ margin-top: 12px;
300
+ flex-wrap: wrap;
301
+ }
302
+
303
+ .game-links-label {
304
+ font-size: 12px;
305
+ font-weight: 600;
306
+ color: var(--text-secondary);
307
+ white-space: nowrap;
308
+ }
309
+
310
+ .game-links-pills {
311
+ display: flex;
312
+ gap: 8px;
313
+ flex-wrap: wrap;
314
+ }
315
+
316
+ .game-link-pill {
317
+ display: inline-flex;
318
+ align-items: center;
319
+ padding: 4px 12px;
320
+ background: var(--bg-tertiary);
321
+ border: 1px solid var(--border-color);
322
+ border-radius: 16px;
323
+ font-size: 11px;
324
+ font-weight: 600;
325
+ color: var(--text-primary);
326
+ text-decoration: none;
327
+ transition: all 0.2s ease;
328
+ cursor: pointer;
329
+ white-space: nowrap;
330
+ }
331
+
332
+ .game-link-pill:hover {
333
+ background: var(--accent-color);
334
+ color: white;
335
+ border-color: var(--accent-color);
336
+ transform: translateY(-1px);
337
+ box-shadow: 0 2px 8px rgba(0, 123, 255, 0.3);
338
+ }
339
+
340
+ .game-link-pill:active {
341
+ transform: translateY(0);
342
+ }
343
+
344
+ .game-description.expanded {
345
+ max-height: none;
346
+ -webkit-line-clamp: unset;
347
+ }
348
+
349
+ .description-expand-btn {
350
+ background: none;
351
+ border: none;
352
+ color: var(--accent-color);
353
+ font-size: 12px;
354
+ font-weight: 600;
355
+ cursor: pointer;
356
+ padding: 2px 0;
357
+ margin-top: 4px;
358
+ transition: all 0.2s ease;
359
+ }
360
+
361
+ .description-expand-btn:hover {
362
+ color: var(--accent-color-hover, #0056b3);
363
+ text-decoration: underline;
364
+ }
365
+
366
+ /* Game Progress Bar */
367
+ .game-progress-container {
368
+ margin-top: 4px;
369
+ }
370
+
371
+ .game-progress-header {
372
+ display: flex;
373
+ justify-content: space-between;
374
+ align-items: center;
375
+ margin-bottom: 6px;
376
+ }
377
+
378
+ .game-progress-label {
379
+ font-size: 11px;
380
+ font-weight: 600;
381
+ color: var(--text-secondary);
382
+ text-transform: uppercase;
383
+ letter-spacing: 0.5px;
384
+ }
385
+
386
+ .game-progress-percentage {
387
+ font-size: 14px;
388
+ font-weight: 700;
389
+ color: var(--accent-color);
390
+ }
391
+
392
+ /* Game Progress Timeline */
393
+ .game-progress-timeline {
394
+ display: flex;
395
+ align-items: center;
396
+ gap: 12px;
397
+ margin-top: 8px;
398
+ }
399
+
400
+ .game-progress-date {
401
+ font-size: 11px;
402
+ font-weight: 600;
403
+ color: var(--text-secondary);
404
+ white-space: nowrap;
405
+ min-width: fit-content;
406
+ }
407
+
408
+ .game-progress-date.start-date {
409
+ color: var(--text-tertiary);
410
+ }
411
+
412
+ .game-progress-date.end-date {
413
+ color: var(--success-color);
414
+ font-style: italic;
415
+ }
416
+
417
+ .game-progress-bar {
418
+ flex: 1;
419
+ height: 16px;
420
+ background: var(--bg-tertiary);
421
+ border-radius: 8px;
422
+ overflow: hidden;
423
+ border: 1px solid var(--border-color);
424
+ }
425
+
426
+ .game-progress-fill {
427
+ height: 100%;
428
+ background: linear-gradient(90deg, var(--accent-color), var(--success-color));
429
+ border-radius: 8px;
430
+ transition: width 0.5s cubic-bezier(0.4, 0, 0.2, 1);
431
+ position: relative;
432
+ }
433
+
191
434
  .dashboard-card-header {
192
435
  display: flex;
193
436
  align-items: center;
@@ -195,8 +438,60 @@
195
438
  margin-bottom: 20px;
196
439
  }
197
440
 
441
+ .dashboard-header-actions {
442
+ display: flex;
443
+ flex-direction: column;
444
+ align-items: flex-end;
445
+ gap: 8px;
446
+ }
447
+
448
+ /* Game Completion Button */
449
+ .game-completion-btn {
450
+ background: var(--success-color);
451
+ color: white;
452
+ border: none;
453
+ padding: 6px 14px;
454
+ border-radius: 6px;
455
+ font-size: 12px;
456
+ font-weight: 600;
457
+ cursor: pointer;
458
+ transition: all 0.2s ease;
459
+ white-space: nowrap;
460
+ }
461
+
462
+ .game-completion-btn:hover:not(:disabled) {
463
+ background: #218838;
464
+ transform: translateY(-1px);
465
+ box-shadow: 0 2px 8px rgba(40, 167, 69, 0.3);
466
+ }
467
+
468
+ .game-completion-btn:active:not(:disabled) {
469
+ transform: translateY(0);
470
+ }
471
+
472
+ .game-completion-btn:disabled {
473
+ background: var(--success-color);
474
+ cursor: default;
475
+ opacity: 0.9;
476
+ }
477
+
478
+ .game-completion-btn.completed {
479
+ background: var(--success-color);
480
+ cursor: default;
481
+ }
482
+
483
+ /* Completed Game Card Styling */
484
+ .dashboard-card.current-game-full-width.completed {
485
+ border: 2px solid var(--success-color);
486
+ box-shadow: 0 4px 16px rgba(40, 167, 69, 0.2);
487
+ }
488
+
489
+ .dashboard-card.current-game-full-width.completed::before {
490
+ background: linear-gradient(90deg, var(--success-color), #2ecc71);
491
+ }
492
+
198
493
  .dashboard-card-title {
199
- font-size: 20px;
494
+ font-size: 18px;
200
495
  font-weight: 600;
201
496
  color: var(--text-primary);
202
497
  margin: 0;
@@ -210,10 +505,74 @@
210
505
  opacity: 0.8;
211
506
  }
212
507
 
508
+ /* Session Navigation Buttons */
509
+ .session-navigation {
510
+ display: flex;
511
+ gap: 8px;
512
+ align-items: center;
513
+ }
514
+
515
+ .session-navigation button {
516
+ background: var(--bg-tertiary);
517
+ border: 1px solid var(--border-color);
518
+ color: var(--text-primary);
519
+ font-size: 18px;
520
+ width: 36px;
521
+ height: 36px;
522
+ border-radius: 8px;
523
+ cursor: pointer;
524
+ transition: all 0.2s ease;
525
+ display: flex;
526
+ align-items: center;
527
+ justify-content: center;
528
+ padding: 0;
529
+ }
530
+
531
+ .session-navigation button:hover:not(:disabled) {
532
+ background: var(--accent-color);
533
+ color: white;
534
+ border-color: var(--accent-color);
535
+ transform: translateY(-2px);
536
+ box-shadow: 0 4px 12px rgba(0, 123, 255, 0.3);
537
+ }
538
+
539
+ .session-navigation button:active:not(:disabled) {
540
+ transform: translateY(0);
541
+ }
542
+
543
+ .session-navigation button:disabled {
544
+ opacity: 0.4;
545
+ cursor: not-allowed;
546
+ }
547
+
213
548
  .dashboard-card-subtitle {
214
549
  font-size: 14px;
215
- color: var(--text-tertiary);
550
+ font-weight: 400;
551
+ color: var(--text-secondary);
216
552
  margin: 4px 0 0 0;
553
+ line-height: 1.3;
554
+ }
555
+
556
+ /* Stats Section Headers */
557
+ .stats-section-header {
558
+ display: flex;
559
+ align-items: center;
560
+ gap: 10px;
561
+ margin-bottom: 12px;
562
+ }
563
+
564
+ .stats-section-icon {
565
+ font-size: 20px;
566
+ opacity: 0.9;
567
+ }
568
+
569
+ .stats-section-title {
570
+ font-size: 15px;
571
+ font-weight: 600;
572
+ color: var(--text-primary);
573
+ margin: 0;
574
+ text-transform: uppercase;
575
+ letter-spacing: 0.5px;
217
576
  }
218
577
 
219
578
  /* Stats Grid */
@@ -240,8 +599,8 @@
240
599
  }
241
600
 
242
601
  .dashboard-stat-value {
243
- font-size: 24px;
244
- font-weight: bold;
602
+ font-size: 20px;
603
+ font-weight: 600;
245
604
  color: var(--text-primary);
246
605
  margin-bottom: 4px;
247
606
  display: block;
@@ -319,40 +678,7 @@
319
678
  font-size: 14px;
320
679
  }
321
680
 
322
- /* Date Range Card */
323
- .dashboard-date-range {
324
- display: flex;
325
- gap: 20px;
326
- }
327
-
328
- .dashboard-date-item {
329
- flex: 1;
330
- display: flex;
331
- flex-direction: column;
332
- gap: 6px;
333
- }
334
-
335
- .dashboard-date-item label {
336
- font-size: 13px;
337
- color: var(--text-secondary);
338
- font-weight: 500;
339
- }
340
-
341
- .dashboard-date-input {
342
- padding: 8px 12px;
343
- border: 1px solid var(--border-color);
344
- border-radius: 8px;
345
- background: var(--bg-tertiary);
346
- color: var(--text-primary);
347
- font-size: 14px;
348
- transition: all 0.2s ease;
349
- }
350
-
351
- .dashboard-date-input:focus {
352
- outline: none;
353
- border-color: var(--accent-color);
354
- box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.15);
355
- }
681
+ /* Date Range Card - Styles moved to dashboard-shared.css */
356
682
 
357
683
  /* Tooltip Styles */
358
684
  /* Tooltip styles are now only in shared.css */
@@ -741,6 +1067,164 @@
741
1067
  margin-bottom: 16px;
742
1068
  }
743
1069
 
1070
+ /* Session Game Metadata Styles */
1071
+ .session-game-metadata {
1072
+ display: flex;
1073
+ gap: 16px;
1074
+ margin-bottom: 20px;
1075
+ padding: 16px;
1076
+ background: var(--bg-tertiary);
1077
+ border-radius: 8px;
1078
+ border: 1px solid var(--border-color);
1079
+ align-items: flex-start;
1080
+ }
1081
+
1082
+ .session-game-photo {
1083
+ flex-shrink: 0;
1084
+ }
1085
+
1086
+ .session-game-photo-img {
1087
+ width: 120px;
1088
+ height: 160px;
1089
+ object-fit: cover;
1090
+ border-radius: 6px;
1091
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
1092
+ border: 1px solid var(--border-color);
1093
+ background: var(--bg-secondary);
1094
+ }
1095
+
1096
+ .session-game-info {
1097
+ flex: 1;
1098
+ display: flex;
1099
+ flex-direction: column;
1100
+ gap: 10px;
1101
+ min-width: 0;
1102
+ }
1103
+
1104
+ .session-game-titles {
1105
+ display: flex;
1106
+ flex-direction: column;
1107
+ gap: 3px;
1108
+ }
1109
+
1110
+ .session-game-title-original {
1111
+ font-size: 20px;
1112
+ font-weight: 700;
1113
+ color: var(--text-primary);
1114
+ line-height: 1.2;
1115
+ }
1116
+
1117
+ .session-game-title-romaji {
1118
+ font-size: 13px;
1119
+ font-weight: 500;
1120
+ color: var(--text-secondary);
1121
+ font-style: italic;
1122
+ }
1123
+
1124
+ .session-game-title-english {
1125
+ font-size: 12px;
1126
+ color: var(--text-tertiary);
1127
+ }
1128
+
1129
+ .session-game-type-badge {
1130
+ display: inline-block;
1131
+ padding: 4px 10px;
1132
+ background: var(--accent-color);
1133
+ color: white;
1134
+ border-radius: 12px;
1135
+ font-size: 10px;
1136
+ font-weight: 700;
1137
+ text-transform: uppercase;
1138
+ letter-spacing: 0.6px;
1139
+ white-space: nowrap;
1140
+ width: fit-content;
1141
+ }
1142
+
1143
+ .session-game-description-container {
1144
+ position: relative;
1145
+ }
1146
+
1147
+ .session-game-description {
1148
+ font-size: 12px;
1149
+ line-height: 1.4;
1150
+ color: var(--text-secondary);
1151
+ max-height: 2.8em;
1152
+ overflow: hidden;
1153
+ display: -webkit-box;
1154
+ -webkit-line-clamp: 2;
1155
+ -webkit-box-orient: vertical;
1156
+ }
1157
+
1158
+ .session-game-description.expanded {
1159
+ max-height: none;
1160
+ -webkit-line-clamp: unset;
1161
+ }
1162
+
1163
+ .session-description-expand-btn {
1164
+ background: none;
1165
+ border: none;
1166
+ color: var(--accent-color);
1167
+ font-size: 11px;
1168
+ font-weight: 600;
1169
+ cursor: pointer;
1170
+ padding: 2px 0;
1171
+ margin-top: 3px;
1172
+ transition: all 0.2s ease;
1173
+ }
1174
+
1175
+ .session-description-expand-btn:hover {
1176
+ color: var(--accent-color-hover, #0056b3);
1177
+ text-decoration: underline;
1178
+ }
1179
+
1180
+ .session-game-links-container {
1181
+ display: flex;
1182
+ align-items: center;
1183
+ gap: 8px;
1184
+ flex-wrap: wrap;
1185
+ }
1186
+
1187
+ .session-game-links-label {
1188
+ font-size: 11px;
1189
+ font-weight: 600;
1190
+ color: var(--text-secondary);
1191
+ white-space: nowrap;
1192
+ }
1193
+
1194
+ .session-game-links-pills {
1195
+ display: flex;
1196
+ gap: 6px;
1197
+ flex-wrap: wrap;
1198
+ }
1199
+
1200
+ .session-game-link-pill {
1201
+ display: inline-flex;
1202
+ align-items: center;
1203
+ padding: 3px 10px;
1204
+ background: var(--bg-secondary);
1205
+ border: 1px solid var(--border-color);
1206
+ border-radius: 12px;
1207
+ font-size: 10px;
1208
+ font-weight: 600;
1209
+ color: var(--text-primary);
1210
+ text-decoration: none;
1211
+ transition: all 0.2s ease;
1212
+ cursor: pointer;
1213
+ white-space: nowrap;
1214
+ }
1215
+
1216
+ .session-game-link-pill:hover {
1217
+ background: var(--accent-color);
1218
+ color: white;
1219
+ border-color: var(--accent-color);
1220
+ transform: translateY(-1px);
1221
+ box-shadow: 0 2px 6px rgba(0, 123, 255, 0.25);
1222
+ }
1223
+
1224
+ .session-game-link-pill:active {
1225
+ transform: translateY(0);
1226
+ }
1227
+
744
1228
  /* Responsive Design */
745
1229
  @media (max-width: 768px) {
746
1230
  .dashboard-container {
@@ -753,6 +1237,49 @@
753
1237
  padding: 20px;
754
1238
  }
755
1239
 
1240
+ .dashboard-card.current-game-full-width {
1241
+ padding: 20px;
1242
+ }
1243
+
1244
+ .game-content-grid {
1245
+ flex-direction: column;
1246
+ gap: 16px;
1247
+ align-items: center;
1248
+ }
1249
+
1250
+ .game-photo-section {
1251
+ width: 100%;
1252
+ display: flex;
1253
+ justify-content: center;
1254
+ }
1255
+
1256
+ .game-photo-img {
1257
+ width: 160px;
1258
+ height: 213px;
1259
+ }
1260
+
1261
+ .game-info-section {
1262
+ width: 100%;
1263
+ }
1264
+
1265
+ .game-title-original {
1266
+ font-size: 22px;
1267
+ }
1268
+
1269
+ .game-title-romaji {
1270
+ font-size: 14px;
1271
+ }
1272
+
1273
+ .game-title-english {
1274
+ font-size: 12px;
1275
+ }
1276
+
1277
+ .game-header-row {
1278
+ flex-direction: column;
1279
+ align-items: flex-start;
1280
+ gap: 8px;
1281
+ }
1282
+
756
1283
  .dashboard-stats-grid {
757
1284
  grid-template-columns: repeat(2, 1fr);
758
1285
  gap: 12px;
@@ -771,15 +1298,7 @@
771
1298
  font-size: 18px;
772
1299
  }
773
1300
 
774
- .dashboard-date-range {
775
- flex-direction: column;
776
- gap: 12px;
777
- padding: 12px 16px;
778
- }
779
-
780
- .dashboard-date-item {
781
- width: 100%;
782
- }
1301
+ /* Date range responsive styles now in dashboard-shared.css */
783
1302
 
784
1303
  .goal-progress-grid {
785
1304
  grid-template-columns: 1fr;
@@ -809,6 +1328,10 @@
809
1328
  align-items: flex-start;
810
1329
  gap: 4px;
811
1330
  }
1331
+
1332
+ .game-progress-estimates {
1333
+ gap: 8px;
1334
+ }
812
1335
  }
813
1336
 
814
1337
  @media (max-width: 480px) {
@@ -847,4 +1370,38 @@
847
1370
  .goal-progress-bar {
848
1371
  height: 10px;
849
1372
  }
1373
+
1374
+ .game-progress-date {
1375
+ font-size: 9px;
1376
+ }
1377
+
1378
+ /* Session game metadata responsive */
1379
+ .session-game-metadata {
1380
+ flex-direction: column;
1381
+ gap: 12px;
1382
+ padding: 12px;
1383
+ }
1384
+
1385
+ .session-game-photo {
1386
+ width: 100%;
1387
+ display: flex;
1388
+ justify-content: center;
1389
+ }
1390
+
1391
+ .session-game-photo-img {
1392
+ width: 100px;
1393
+ height: 133px;
1394
+ }
1395
+
1396
+ .session-game-title-original {
1397
+ font-size: 18px;
1398
+ }
1399
+
1400
+ .session-game-title-romaji {
1401
+ font-size: 12px;
1402
+ }
1403
+
1404
+ .session-game-title-english {
1405
+ font-size: 11px;
1406
+ }
850
1407
  }