@vatvaghool/create-ipl-dashboard 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +75 -0
  2. package/package.json +27 -0
  3. package/src/generate-template.mjs +73 -0
  4. package/src/index.mjs +98 -0
  5. package/src/prompts.mjs +78 -0
  6. package/src/scaffold.mjs +129 -0
  7. package/src/scraper.mjs +79 -0
  8. package/template/.dockerignore +13 -0
  9. package/template/AGENTS.md +5 -0
  10. package/template/Dockerfile.sync +14 -0
  11. package/template/README.md +160 -0
  12. package/template/app/api/ipl/data.ts +24 -0
  13. package/template/app/api/ipl/route.ts +505 -0
  14. package/template/app/api/ipl/transfers/route.ts +261 -0
  15. package/template/app/api/ipl/transfers/transform.ts +156 -0
  16. package/template/app/api/ipl/transform.ts +20 -0
  17. package/template/app/api/ipl/upcoming-matches/route.ts +18 -0
  18. package/template/app/api/ops/status/route.ts +225 -0
  19. package/template/app/components/AIRoasting.tsx +278 -0
  20. package/template/app/components/ColorWave.tsx +193 -0
  21. package/template/app/components/CrownBattle.tsx +207 -0
  22. package/template/app/components/DashboardContent.tsx +377 -0
  23. package/template/app/components/FantasyStockTicker.tsx +192 -0
  24. package/template/app/components/FireworksBurst.tsx +225 -0
  25. package/template/app/components/LiveMatchTicker.tsx +117 -0
  26. package/template/app/components/MatchRecapScroll.tsx +135 -0
  27. package/template/app/components/MatchStoryScrubber.tsx +274 -0
  28. package/template/app/components/PerformanceTracker.tsx +132 -0
  29. package/template/app/components/ProgressGlowRings.tsx +157 -0
  30. package/template/app/components/TeamDNAScanner.tsx +238 -0
  31. package/template/app/components/ThemeToggle.tsx +74 -0
  32. package/template/app/components/dashboard/CaptainBoard.tsx +138 -0
  33. package/template/app/components/dashboard/ChartBoard.tsx +162 -0
  34. package/template/app/components/dashboard/LatestBadge.tsx +23 -0
  35. package/template/app/components/dashboard/LedgerTable.tsx +385 -0
  36. package/template/app/components/dashboard/SectionCard.tsx +59 -0
  37. package/template/app/components/dashboard/StickyMini.tsx +20 -0
  38. package/template/app/components/dashboard/index.ts +6 -0
  39. package/template/app/components/ui/DashboardChartFrame.tsx +74 -0
  40. package/template/app/components/ui/DoodleSpinner.tsx +15 -0
  41. package/template/app/components/ui/TeamPills.tsx +41 -0
  42. package/template/app/data/match-points.ts +3 -0
  43. package/template/app/data/teams.ts +32 -0
  44. package/template/app/globals.css +1267 -0
  45. package/template/app/hooks/dashboard/index.ts +1 -0
  46. package/template/app/hooks/dashboard/useDashboardModel.ts +25 -0
  47. package/template/app/hooks/dashboardCache.ts +53 -0
  48. package/template/app/hooks/dashboardPolling.ts +53 -0
  49. package/template/app/hooks/snapshotCache.ts +47 -0
  50. package/template/app/hooks/useDashboardData.ts +28 -0
  51. package/template/app/layout.tsx +75 -0
  52. package/template/app/lib/aiAgent.ts +444 -0
  53. package/template/app/lib/config.ts +29 -0
  54. package/template/app/lib/dashboard/index.ts +1 -0
  55. package/template/app/lib/dashboard/model.ts +257 -0
  56. package/template/app/lib/dashboardData.ts +50 -0
  57. package/template/app/lib/dashboardView.ts +22 -0
  58. package/template/app/lib/detailedData.ts +112 -0
  59. package/template/app/lib/matchStatus.ts +28 -0
  60. package/template/app/lib/matches.ts +131 -0
  61. package/template/app/lib/teamBadges.ts +223 -0
  62. package/template/app/lib/upcomingMatches.ts +154 -0
  63. package/template/app/lib/useDb.ts +29 -0
  64. package/template/app/lib/utils/diff.ts +24 -0
  65. package/template/app/lib/utils/getChartColor.ts +17 -0
  66. package/template/app/lib/utils/getStdDeviation.ts +6 -0
  67. package/template/app/lib/utils/time.ts +40 -0
  68. package/template/app/lib/utils.ts +70 -0
  69. package/template/app/page.tsx +15 -0
  70. package/template/app/store/dashboardStore.ts +85 -0
  71. package/template/app/types/dashboard.ts +75 -0
  72. package/template/app/types.ts +130 -0
  73. package/template/app/utils/dashboard/index.ts +72 -0
  74. package/template/eslint.config.mjs +18 -0
  75. package/template/infra/cloud-run/README.md +68 -0
  76. package/template/infra/cloud-run/sync-job.yaml +32 -0
  77. package/template/infra/cutover/README.md +84 -0
  78. package/template/infra/vercel/README.md +57 -0
  79. package/template/next.config.ts +7 -0
  80. package/template/package-lock.json +7330 -0
  81. package/template/package.json +47 -0
  82. package/template/packages/ipl-dashboard-utils/README.md +316 -0
  83. package/template/packages/ipl-dashboard-utils/package.json +34 -0
  84. package/template/packages/ipl-dashboard-utils/src/index.ts +22 -0
  85. package/template/packages/ipl-dashboard-utils/src/transform.ts +687 -0
  86. package/template/packages/ipl-dashboard-utils/src/types.ts +88 -0
  87. package/template/packages/ipl-dashboard-utils/tsconfig.build.json +17 -0
  88. package/template/postcss.config.mjs +7 -0
  89. package/template/scripts/capture-ipl-auth.mjs +54 -0
  90. package/template/scripts/deploy-cloud-run-sync.sh +48 -0
  91. package/template/scripts/deploy-cloud-scheduler.sh +42 -0
  92. package/template/scripts/dev-simple.js +31 -0
  93. package/template/scripts/dev-welcome.mjs +38 -0
  94. package/template/scripts/monitor-ops-status.sh +50 -0
  95. package/template/scripts/seed-mongodb.ts +115 -0
  96. package/template/scripts/sync-cloud.mjs +50 -0
  97. package/template/scripts/sync-ipl.mjs +238 -0
  98. package/template/scripts/sync-transfers-daily.mjs +175 -0
  99. package/template/scripts/verify-production.mjs +108 -0
  100. package/template/tests/coverage-gaps.test.ts +290 -0
  101. package/template/tests/dashboard-polling.test.ts +96 -0
  102. package/template/tests/detailed-data.test.ts +60 -0
  103. package/template/tests/ipl-transform.test.ts +590 -0
  104. package/template/tests/transfers-route.test.ts +109 -0
  105. package/template/tests/upcoming-matches.test.ts +34 -0
  106. package/template/tests/utils-and-cache.test.ts +267 -0
  107. package/template/tsconfig.json +35 -0
  108. package/template/vercel.json +7 -0
@@ -0,0 +1,1267 @@
1
+ @import "tailwindcss";
2
+
3
+ :root {
4
+ --paper: #f3e7cd;
5
+ --paper-2: #ead9b5;
6
+ --paper-3: #dbc59b;
7
+ --panel: rgba(255, 250, 239, 0.82);
8
+ --panel-strong: rgba(255, 248, 235, 0.94);
9
+ --ink: #2b1d16;
10
+ --ink-soft: #6d5447;
11
+ --ink-faint: #9d8573;
12
+ --line: rgba(64, 38, 27, 0.2);
13
+ --shadow: rgba(82, 52, 34, 0.18);
14
+ --grid: rgba(123, 87, 68, 0.11);
15
+ --marker-yellow: #f2d469;
16
+ --marker-pink: #f0b3c3;
17
+ --marker-blue: #a8cee5;
18
+ --marker-green: #b9d79c;
19
+ --marker-orange: #e9b285;
20
+ --chalk: #fff7e9;
21
+ --accent-cyan: #b8d4f0;
22
+ --accent-magenta: #f0b3c3;
23
+ --accent-amber: #fdd0b2;
24
+ --accent-lime: #b9d79c;
25
+ --accent-blue: #a8cee5;
26
+ --accent-red: #f0b3c3;
27
+ --accent-purple: #d4c5f9;
28
+ --accent-chalk: #f3e7cd;
29
+ --border: var(--line);
30
+ --text: var(--ink);
31
+ }
32
+
33
+ [data-theme="dark"] {
34
+ --paper: #181411;
35
+ --paper-2: #241d19;
36
+ --paper-3: #302722;
37
+ --panel: rgba(31, 24, 20, 0.88);
38
+ --panel-strong: rgba(36, 28, 23, 0.96);
39
+ --ink: #f6efe3;
40
+ --ink-soft: #c9b89d;
41
+ --ink-faint: #95826a;
42
+ --line: rgba(255, 245, 232, 0.18);
43
+ --shadow: rgba(0, 0, 0, 0.36);
44
+ --grid: rgba(255, 255, 255, 0.06);
45
+ --marker-yellow: #f0d15d;
46
+ --marker-pink: #ea8bb8;
47
+ --marker-blue: #6dc7ff;
48
+ --marker-green: #9fe38a;
49
+ --marker-orange: #ffb37c;
50
+ --chalk: #f5eee3;
51
+ --accent-cyan: #6dc7ff;
52
+ --accent-magenta: #ea8bb8;
53
+ --accent-amber: #ffb37c;
54
+ --accent-lime: #9fe38a;
55
+ --accent-blue: #6dc7ff;
56
+ --accent-red: #ea8bb8;
57
+ --accent-purple: #b99cf5;
58
+ --accent-chalk: #181411;
59
+ --border: var(--line);
60
+ --text: var(--ink);
61
+ }
62
+
63
+ html {
64
+ height: 100%;
65
+ background: var(--paper);
66
+ }
67
+
68
+ body {
69
+ min-height: 100%;
70
+ margin: 0;
71
+ color: var(--ink);
72
+ font-family: var(--font-sans), cursive;
73
+ font-size: 17px;
74
+ background:
75
+ radial-gradient(
76
+ circle at 15% 12%,
77
+ rgba(255, 255, 255, 0.24),
78
+ transparent 20%
79
+ ),
80
+ radial-gradient(
81
+ circle at 82% 10%,
82
+ rgba(255, 210, 150, 0.12),
83
+ transparent 18%
84
+ ),
85
+ radial-gradient(
86
+ circle at 20% 84%,
87
+ rgba(168, 206, 229, 0.1),
88
+ transparent 16%
89
+ ),
90
+ repeating-linear-gradient(
91
+ 180deg,
92
+ transparent 0,
93
+ transparent 31px,
94
+ var(--grid) 31px,
95
+ var(--grid) 32px
96
+ ),
97
+ linear-gradient(
98
+ 90deg,
99
+ transparent 0 52px,
100
+ rgba(194, 97, 80, 0.16) 52px 54px,
101
+ transparent 54px
102
+ ),
103
+ linear-gradient(180deg, var(--paper), var(--paper-2));
104
+ letter-spacing: 0.01em;
105
+ }
106
+
107
+ body::before,
108
+ body::after {
109
+ content: "";
110
+ position: fixed;
111
+ pointer-events: none;
112
+ inset: 0;
113
+ }
114
+
115
+ body::before {
116
+ background:
117
+ radial-gradient(
118
+ circle at 12% 78%,
119
+ rgba(120, 76, 43, 0.13),
120
+ transparent 10%
121
+ ),
122
+ radial-gradient(circle at 86% 68%, rgba(146, 94, 55, 0.08), transparent 7%),
123
+ radial-gradient(circle at 76% 24%, rgba(188, 142, 91, 0.08), transparent 8%);
124
+ mix-blend-mode: multiply;
125
+ }
126
+
127
+ body::after {
128
+ inset: auto 0 0;
129
+ height: 14px;
130
+ background: linear-gradient(
131
+ 90deg,
132
+ transparent 0%,
133
+ var(--paper) 7%,
134
+ transparent 12%,
135
+ transparent 18%,
136
+ var(--paper) 22%,
137
+ transparent 27%,
138
+ transparent 34%,
139
+ var(--paper) 39%,
140
+ transparent 44%,
141
+ transparent 58%,
142
+ var(--paper) 64%,
143
+ transparent 68%,
144
+ transparent 77%,
145
+ var(--paper) 82%,
146
+ transparent 88%,
147
+ var(--paper) 100%
148
+ );
149
+ }
150
+
151
+ * {
152
+ box-sizing: border-box;
153
+ }
154
+
155
+ a {
156
+ color: inherit;
157
+ text-decoration: none;
158
+ }
159
+
160
+ button,
161
+ input,
162
+ textarea,
163
+ select {
164
+ font: inherit;
165
+ }
166
+
167
+ .text-ink {
168
+ color: var(--ink);
169
+ }
170
+
171
+ .dashboard-shell {
172
+ position: relative;
173
+ min-height: 100vh;
174
+ padding-bottom: 4rem;
175
+ }
176
+
177
+ .scrapbook-topbar {
178
+ position: sticky;
179
+ top: 0;
180
+ z-index: 40;
181
+ padding: 0.8rem 1rem 0;
182
+ backdrop-filter: blur(8px);
183
+ }
184
+
185
+ .dashboard-page {
186
+ max-width: 1280px;
187
+ margin: 0 auto;
188
+ padding: 1rem 1rem 4rem;
189
+ }
190
+
191
+ .page-crumbs {
192
+ display: flex;
193
+ align-items: center;
194
+ justify-content: space-between;
195
+ gap: 1rem;
196
+ margin-bottom: 1rem;
197
+ }
198
+
199
+ .crumb-line {
200
+ display: flex;
201
+ flex-wrap: wrap;
202
+ gap: 0.6rem;
203
+ }
204
+
205
+ .scribble-pill {
206
+ display: inline-flex;
207
+ align-items: center;
208
+ border: 1.5px solid var(--line);
209
+ border-radius: 999px 920px 980px 999px;
210
+ padding: 0.34rem 0.78rem;
211
+ background: color-mix(in srgb, var(--panel) 88%, transparent);
212
+ box-shadow: 2px 3px 0 color-mix(in srgb, var(--shadow) 45%, transparent);
213
+ font-family: var(--font-note), cursive;
214
+ font-size: 0.82rem;
215
+ transform: rotate(-1.3deg);
216
+ }
217
+
218
+ .scribble-pill-soft {
219
+ background: color-mix(in srgb, var(--marker-blue) 28%, var(--panel-strong));
220
+ }
221
+
222
+ .scribble-pill-pink {
223
+ background: color-mix(in srgb, var(--marker-pink) 34%, var(--panel-strong));
224
+ }
225
+
226
+ .theme-toggle {
227
+ display: inline-flex;
228
+ align-items: center;
229
+ gap: 0.5rem;
230
+ border: 2px solid var(--line);
231
+ border-radius: 22px 18px 25px 19px;
232
+ background: var(--panel-strong);
233
+ color: var(--ink);
234
+ padding: 0.35rem 0.65rem;
235
+ box-shadow: 3px 4px 0 color-mix(in srgb, var(--shadow) 42%, transparent);
236
+ cursor: pointer;
237
+ transition:
238
+ transform 160ms ease,
239
+ box-shadow 160ms ease;
240
+ }
241
+
242
+ .theme-toggle:hover {
243
+ transform: translateY(-1px) rotate(-1deg);
244
+ box-shadow: 5px 7px 0 color-mix(in srgb, var(--shadow) 44%, transparent);
245
+ }
246
+
247
+ .theme-toggle-doodle {
248
+ display: grid;
249
+ place-items: center;
250
+ width: 1.6rem;
251
+ height: 1.6rem;
252
+ border: 1.5px dashed var(--line);
253
+ border-radius: 999px;
254
+ font-size: 0.85rem;
255
+ }
256
+
257
+ .theme-toggle-copy {
258
+ display: flex;
259
+ flex-direction: column;
260
+ align-items: flex-start;
261
+ line-height: 1.05;
262
+ }
263
+
264
+ .theme-toggle-copy span {
265
+ font-family: var(--font-note), cursive;
266
+ font-size: 0.78rem;
267
+ }
268
+
269
+ .theme-toggle-copy small {
270
+ color: var(--ink-faint);
271
+ font-size: 0.68rem;
272
+ }
273
+
274
+ .paper-hero,
275
+ .paper-card {
276
+ position: relative;
277
+ background: linear-gradient(
278
+ 180deg,
279
+ color-mix(in srgb, var(--panel-strong) 94%, transparent),
280
+ color-mix(in srgb, var(--panel) 92%, transparent)
281
+ );
282
+ border: 2px solid var(--line);
283
+ box-shadow:
284
+ 0 20px 40px color-mix(in srgb, var(--shadow) 42%, transparent),
285
+ inset 0 0 0 1px color-mix(in srgb, white 25%, transparent);
286
+ overflow: hidden;
287
+ }
288
+
289
+ .paper-hero::before,
290
+ .paper-card::before {
291
+ content: "";
292
+ position: absolute;
293
+ inset: 8px;
294
+ border: 1px dashed color-mix(in srgb, var(--line) 75%, transparent);
295
+ pointer-events: none;
296
+ border-radius: inherit;
297
+ }
298
+
299
+ .paper-hero {
300
+ display: grid;
301
+ grid-template-columns: minmax(0, 1.6fr) minmax(260px, 0.8fr);
302
+ gap: 1rem;
303
+ padding: 0.9rem;
304
+ border-radius: 28px 32px 26px 34px;
305
+ margin-bottom: 0.8rem;
306
+ transform: rotate(-0.35deg);
307
+ }
308
+
309
+ .paper-hero-main {
310
+ position: relative;
311
+ padding-right: 0.5rem;
312
+ }
313
+
314
+ .scribble-kicker {
315
+ display: inline-block;
316
+ margin-bottom: 0.2rem;
317
+ color: var(--ink-soft);
318
+ font-family: var(--font-note), cursive;
319
+ font-size: 0.82rem;
320
+ letter-spacing: 0.04em;
321
+ text-transform: uppercase;
322
+ }
323
+
324
+ .hero-title {
325
+ margin: 0;
326
+ font-family: var(--font-display), cursive;
327
+ font-size: clamp(2.2rem, 6vw, 3.8rem);
328
+ line-height: 0.95;
329
+ letter-spacing: -0.02em;
330
+ }
331
+
332
+ .hero-title span {
333
+ color: color-mix(in srgb, var(--ink) 78%, var(--marker-orange));
334
+ }
335
+
336
+ .hero-copy {
337
+ max-width: 42rem;
338
+ margin: 0.5rem 0 0;
339
+ color: var(--ink-soft);
340
+ font-size: 0.85rem;
341
+ line-height: 1.5;
342
+ }
343
+
344
+ .hero-annotations {
345
+ display: flex;
346
+ flex-wrap: wrap;
347
+ gap: 0.4rem;
348
+ margin-top: 0.5rem;
349
+ }
350
+
351
+ .crossed-label {
352
+ position: relative;
353
+ display: inline-flex;
354
+ align-items: center;
355
+ font-family: var(--font-note), cursive;
356
+ color: var(--ink-faint);
357
+ padding: 0.35rem 0.1rem;
358
+ }
359
+
360
+ .crossed-label::after {
361
+ content: "";
362
+ position: absolute;
363
+ left: -0.15rem;
364
+ right: -0.15rem;
365
+ top: 50%;
366
+ height: 2px;
367
+ background: color-mix(in srgb, #bd4636 70%, transparent);
368
+ transform: rotate(-6deg);
369
+ }
370
+
371
+ .sticky-stack {
372
+ display: grid;
373
+ gap: 0.5rem;
374
+ align-content: start;
375
+ }
376
+
377
+ .sticky-mini {
378
+ min-height: auto;
379
+ padding: 0.5rem;
380
+ border: 1.5px dashed var(--line);
381
+ border-radius: 18px 16px 20px 14px;
382
+ background: color-mix(in srgb, var(--panel) 90%, transparent);
383
+ display: grid;
384
+ gap: 0.1rem;
385
+ position: relative;
386
+ }
387
+
388
+ .sticky-mini::before {
389
+ content: "";
390
+ position: absolute;
391
+ top: -0.5rem;
392
+ left: 50%;
393
+ width: 5rem;
394
+ height: 1.1rem;
395
+ background: rgba(255, 250, 240, 0.35);
396
+ border: 1px dashed rgba(255, 255, 255, 0.4);
397
+ transform: translateX(-50%) rotate(-2deg);
398
+ }
399
+
400
+ .sticky-mini-yellow {
401
+ background: color-mix(in srgb, var(--marker-yellow) 82%, var(--panel-strong));
402
+ transform: rotate(-3deg);
403
+ }
404
+
405
+ .sticky-mini-blue {
406
+ background: color-mix(in srgb, var(--marker-blue) 76%, var(--panel-strong));
407
+ transform: rotate(2.5deg);
408
+ }
409
+
410
+ .sticky-mini-pink {
411
+ background: color-mix(in srgb, var(--marker-pink) 78%, var(--panel-strong));
412
+ transform: rotate(-1.2deg);
413
+ }
414
+
415
+ .sticky-mini-title,
416
+ .sticky-mini-note {
417
+ margin: 0;
418
+ font-family: var(--font-note), cursive;
419
+ }
420
+
421
+ .sticky-mini-title {
422
+ font-size: 0.84rem;
423
+ color: var(--ink-soft);
424
+ text-transform: uppercase;
425
+ letter-spacing: 0.04em;
426
+ }
427
+
428
+ .sticky-mini-value {
429
+ margin: 0.35rem 0;
430
+ font-size: 1.52rem;
431
+ line-height: 1.1;
432
+ font-family: var(--font-display), cursive;
433
+ }
434
+
435
+ .sticky-mini-note {
436
+ font-size: 0.86rem;
437
+ }
438
+
439
+ .hero-doodles {
440
+ position: absolute;
441
+ inset: auto 1.2rem 1rem auto;
442
+ pointer-events: none;
443
+ }
444
+
445
+ .doodle-circle {
446
+ position: absolute;
447
+ border: 2px solid color-mix(in srgb, var(--ink-soft) 55%, transparent);
448
+ border-radius: 999px;
449
+ }
450
+
451
+ .doodle-circle-a {
452
+ width: 5rem;
453
+ height: 2.8rem;
454
+ right: 6rem;
455
+ top: -2rem;
456
+ transform: rotate(-14deg);
457
+ }
458
+
459
+ .doodle-circle-b {
460
+ width: 3.3rem;
461
+ height: 3.3rem;
462
+ right: 1rem;
463
+ top: -0.6rem;
464
+ border-style: dashed;
465
+ }
466
+
467
+ .doodle-arrow {
468
+ position: absolute;
469
+ right: 1.8rem;
470
+ top: 1.7rem;
471
+ font-family: var(--font-note), cursive;
472
+ color: var(--ink-faint);
473
+ transform: rotate(6deg);
474
+ }
475
+
476
+ .doodle-arrow::after {
477
+ content: "↘";
478
+ display: inline-block;
479
+ margin-left: 0.35rem;
480
+ }
481
+
482
+ .dashboard-grid {
483
+ display: grid;
484
+ grid-template-columns: repeat(12, minmax(0, 1fr));
485
+ gap: 1rem;
486
+ }
487
+
488
+ .span-4 {
489
+ grid-column: span 4;
490
+ }
491
+
492
+ .span-5 {
493
+ grid-column: span 5;
494
+ }
495
+
496
+ .span-6 {
497
+ grid-column: span 6;
498
+ }
499
+
500
+ .span-7 {
501
+ grid-column: span 7;
502
+ }
503
+
504
+ .span-8 {
505
+ grid-column: span 8;
506
+ }
507
+
508
+ .span-12 {
509
+ grid-column: span 12;
510
+ }
511
+
512
+ .section-card {
513
+ border-radius: 24px 28px 22px 26px;
514
+ padding: 1.2rem;
515
+ background: linear-gradient(
516
+ 180deg,
517
+ color-mix(in srgb, var(--paper-strong) 92%, transparent),
518
+ color-mix(in srgb, var(--paper) 86%, transparent)
519
+ );
520
+ border: 1.5px dashed var(--line);
521
+ box-shadow:
522
+ 0 18px 24px color-mix(in srgb, var(--shadow) 30%, transparent),
523
+ inset 0 0 0 1px color-mix(in srgb, white 18%, transparent);
524
+ }
525
+
526
+ .section-tape {
527
+ position: absolute;
528
+ top: -0.45rem;
529
+ right: 1.6rem;
530
+ width: 6.5rem;
531
+ height: 1.2rem;
532
+ background: rgba(255, 247, 230, 0.38);
533
+ transform: rotate(4deg);
534
+ border: 1px dashed rgba(255, 255, 255, 0.45);
535
+ }
536
+
537
+ .section-head {
538
+ display: flex;
539
+ justify-content: space-between;
540
+ align-items: flex-start;
541
+ gap: 1rem;
542
+ margin-bottom: 1rem;
543
+ }
544
+
545
+ .section-title {
546
+ margin: 0;
547
+ font-family: var(--font-display), cursive;
548
+ font-size: 2rem;
549
+ line-height: 0.96;
550
+ }
551
+
552
+ .ledger-note {
553
+ margin: 0.22rem 0 0;
554
+ color: var(--ink-soft);
555
+ font-family: var(--font-note), cursive;
556
+ font-size: 0.88rem;
557
+ line-height: 1.55;
558
+ }
559
+
560
+ .pencil-mark {
561
+ color: var(--ink-faint);
562
+ font-size: 1.15rem;
563
+ transform: rotate(14deg);
564
+ }
565
+
566
+ .leader-list,
567
+ .insight-grid,
568
+ .captain-grid {
569
+ display: grid;
570
+ gap: 0.8rem;
571
+ }
572
+ .leader-list {
573
+ grid-template-columns: repeat(2, minmax(0, 1fr));
574
+ }
575
+ .captain-grid {
576
+ grid-template-columns: repeat(2, minmax(0, 1fr));
577
+ }
578
+ .hover-jitter {
579
+ transition:
580
+ transform 180ms ease,
581
+ box-shadow 180ms ease;
582
+ }
583
+ .hover-jitter:hover {
584
+ transform: translateY(-2px) rotate(-0.5deg);
585
+ box-shadow: 0 18px 26px color-mix(in srgb, var(--shadow) 28%, transparent);
586
+ }
587
+
588
+ .leader-card {
589
+ display: grid;
590
+ grid-template-columns: auto minmax(0, 1fr);
591
+ gap: 0.9rem;
592
+ align-items: start;
593
+ padding: 0.95rem;
594
+ border: 1.5px solid var(--line);
595
+ border-radius: 20px 18px 22px 16px;
596
+ background: color-mix(in srgb, var(--panel-strong) 92%, transparent);
597
+ }
598
+
599
+ .leader-rank {
600
+ min-width: 3.1rem;
601
+ padding: 0.55rem 0.7rem;
602
+ border-radius: 18px 16px 20px 14px;
603
+ border: 1.5px dashed var(--line);
604
+ background: color-mix(in srgb, var(--marker-yellow) 34%, var(--panel-strong));
605
+ font-family: var(--font-note), cursive;
606
+ font-size: 1rem;
607
+ text-align: center;
608
+ }
609
+
610
+ .leader-copy-top {
611
+ display: flex;
612
+ align-items: center;
613
+ justify-content: space-between;
614
+ gap: 0.75rem;
615
+ }
616
+
617
+ .leader-copy-top h3,
618
+ .captain-team,
619
+ .bar-label {
620
+ margin: 0;
621
+ font-size: 1.04rem;
622
+ font-weight: 700;
623
+ }
624
+
625
+ .leader-points {
626
+ margin: 0.3rem 0 0.35rem;
627
+ font-family: var(--font-display), cursive;
628
+ font-size: 1.65rem;
629
+ line-height: 1;
630
+ }
631
+
632
+ .leader-meta {
633
+ display: flex;
634
+ flex-wrap: wrap;
635
+ gap: 0.4rem 0.8rem;
636
+ color: var(--ink-soft);
637
+ font-family: var(--font-note), cursive;
638
+ font-size: 0.8rem;
639
+ }
640
+
641
+ .insight-grid {
642
+ grid-template-columns: repeat(2, minmax(0, 1fr));
643
+ }
644
+
645
+ .insight-note {
646
+ min-height: 8.5rem;
647
+ padding: 0.95rem;
648
+ border-radius: 18px 14px 22px 16px;
649
+ border: 1.5px solid var(--line);
650
+ background: linear-gradient(
651
+ 180deg,
652
+ color-mix(in srgb, var(--note-accent) 34%, var(--panel-strong)),
653
+ color-mix(in srgb, var(--panel) 88%, transparent)
654
+ );
655
+ transform: rotate(-1deg);
656
+ }
657
+
658
+ .insight-note:nth-child(even) {
659
+ transform: rotate(1.1deg);
660
+ }
661
+
662
+ .insight-note-title {
663
+ margin: 0 0 0.55rem;
664
+ font-family: var(--font-note), cursive;
665
+ font-size: 0.84rem;
666
+ text-transform: uppercase;
667
+ color: var(--ink-soft);
668
+ }
669
+
670
+ .insight-note-body {
671
+ margin: 0;
672
+ line-height: 1.55;
673
+ }
674
+
675
+ .insight-note-footer {
676
+ margin-top: 0.75rem;
677
+ color: var(--ink);
678
+ font-size: 0.95rem;
679
+ letter-spacing: 0.02em;
680
+ }
681
+
682
+ .summary-grid-compact {
683
+ display: grid;
684
+ grid-template-columns: repeat(6, minmax(0, 1fr));
685
+ gap: 0.75rem;
686
+ }
687
+
688
+ @media (max-width: 1024px) {
689
+ .summary-grid-compact {
690
+ grid-template-columns: repeat(3, minmax(0, 1fr));
691
+ }
692
+ }
693
+
694
+ @media (max-width: 640px) {
695
+ .summary-grid-compact {
696
+ grid-template-columns: repeat(2, minmax(0, 1fr));
697
+ }
698
+ }
699
+
700
+ .summary-card-compact {
701
+ min-height: auto;
702
+ padding: 0.65rem;
703
+ border-radius: 12px 10px 14px 12px;
704
+ border: 1px solid var(--line);
705
+ background: linear-gradient(
706
+ 135deg,
707
+ color-mix(in srgb, var(--note-accent) 28%, var(--panel-strong)),
708
+ color-mix(in srgb, var(--panel) 92%, transparent)
709
+ );
710
+ transform: rotate(-0.5deg);
711
+ display: flex;
712
+ flex-direction: column;
713
+ justify-content: space-between;
714
+ }
715
+
716
+ .summary-card-compact:nth-child(even) {
717
+ transform: rotate(0.5deg);
718
+ }
719
+
720
+ .summary-card-title {
721
+ margin: 0 0 0.35rem;
722
+ font-family: var(--font-note), cursive;
723
+ font-size: 0.8rem;
724
+ text-transform: uppercase;
725
+ color: var(--ink-soft);
726
+ letter-spacing: 0.04em;
727
+ font-weight: 700;
728
+ }
729
+
730
+ .summary-card-value {
731
+ margin: 0.2rem 0;
732
+ color: var(--ink);
733
+ font-size: 0.88rem;
734
+ line-height: 1.2;
735
+ word-break: break-word;
736
+ }
737
+
738
+ .summary-card-meta {
739
+ margin: 0.3rem 0 0;
740
+ color: var(--ink-soft);
741
+ font-size: 0.78rem;
742
+ letter-spacing: 0.02em;
743
+ }
744
+
745
+ .gap-to-next-list-compact {
746
+ display: flex;
747
+ flex-direction: column;
748
+ gap: 0.5rem;
749
+ }
750
+
751
+ .gap-item-single-line {
752
+ display: flex;
753
+ align-items: center;
754
+ gap: 0.6rem;
755
+ padding: 0.5rem 0.65rem;
756
+ border-radius: 8px 6px 10px 8px;
757
+ border: 1px dashed var(--line);
758
+ background: linear-gradient(
759
+ 135deg,
760
+ color-mix(in srgb, var(--panel) 95%, white 5%),
761
+ color-mix(in srgb, var(--panel-strong) 90%, transparent 10%)
762
+ );
763
+ transform: rotate(-0.2deg);
764
+ }
765
+
766
+ .gap-item-single-line:nth-child(even) {
767
+ transform: rotate(0.2deg);
768
+ }
769
+
770
+ .gap-badge-mini {
771
+ display: inline-flex;
772
+ align-items: center;
773
+ justify-content: center;
774
+ min-width: 1.8rem;
775
+ height: 1.8rem;
776
+ border-radius: 999px;
777
+ border: 1px solid var(--line);
778
+ color: white;
779
+ font-weight: 900;
780
+ font-size: 0.82rem;
781
+ flex-shrink: 0;
782
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
783
+ }
784
+
785
+ .gap-team-label {
786
+ min-width: 5rem;
787
+ color: var(--ink);
788
+ font-weight: 700;
789
+ font-size: 0.8rem;
790
+ letter-spacing: 0.02em;
791
+ flex-shrink: 0;
792
+ }
793
+
794
+ .gap-bar-inline {
795
+ flex: 1;
796
+ display: flex;
797
+ align-items: center;
798
+ }
799
+
800
+ .gap-bar-inline-track {
801
+ width: 100%;
802
+ height: 0.8rem;
803
+ border-radius: 999px;
804
+ overflow: hidden;
805
+ background: color-mix(in srgb, var(--panel-strong) 100%, transparent);
806
+ position: relative;
807
+ }
808
+
809
+ .gap-bar-inline-fill {
810
+ height: 100%;
811
+ border-radius: 999px;
812
+ transition: width 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
813
+ min-width: 0.3rem;
814
+ position: relative;
815
+ }
816
+
817
+ .gap-bar-inline-fill::after {
818
+ content: "";
819
+ position: absolute;
820
+ top: 0;
821
+ left: 0;
822
+ right: 0;
823
+ bottom: 0;
824
+ border-radius: 999px;
825
+ background: linear-gradient(
826
+ 90deg,
827
+ rgba(255, 255, 255, 0.3) 0%,
828
+ transparent 50%
829
+ );
830
+ }
831
+
832
+ .gap-value-mini {
833
+ color: var(--ink);
834
+ font-size: 0.8rem;
835
+ min-width: 2.5rem;
836
+ text-align: right;
837
+ font-family: var(--font-mono);
838
+ flex-shrink: 0;
839
+ }
840
+
841
+ .bar-board {
842
+ display: grid;
843
+ gap: 0.9rem;
844
+ }
845
+
846
+ .bar-row {
847
+ display: grid;
848
+ grid-template-columns: minmax(0, 1.1fr) minmax(0, 2fr) auto;
849
+ gap: 0.8rem;
850
+ align-items: center;
851
+ }
852
+
853
+ .bar-labels {
854
+ min-width: 0;
855
+ }
856
+
857
+ .bar-sublabel,
858
+ .bar-value {
859
+ font-family: var(--font-note), cursive;
860
+ font-size: 0.8rem;
861
+ color: var(--ink-soft);
862
+ }
863
+
864
+ .bar-track {
865
+ position: relative;
866
+ height: 1rem;
867
+ border-radius: 999px;
868
+ overflow: hidden;
869
+ border: 1.5px solid var(--line);
870
+ background: color-mix(in srgb, var(--paper-3) 28%, transparent);
871
+ }
872
+
873
+ .bar-fill {
874
+ position: absolute;
875
+ inset: 0 auto 0 0;
876
+ border-radius: 999px 14px 18px 999px;
877
+ background: linear-gradient(
878
+ 90deg,
879
+ color-mix(in srgb, var(--bar-color) 78%, transparent),
880
+ color-mix(in srgb, white 16%, var(--bar-color))
881
+ );
882
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.16);
883
+ }
884
+
885
+ .captain-grid {
886
+ grid-template-columns: repeat(2, minmax(0, 1fr));
887
+ }
888
+
889
+ .captain-scrap {
890
+ border: 1px solid var(--line);
891
+ padding: 0.85rem;
892
+ min-height: 6.2rem;
893
+ border-radius: 18px;
894
+ background: color-mix(in srgb, var(--panel) 96%, white 4%);
895
+ }
896
+
897
+ @media (min-width: 1280px) {
898
+ .captain-grid {
899
+ grid-template-columns: repeat(4, minmax(0, 1fr));
900
+ }
901
+ }
902
+
903
+ .captain-scrap-0,
904
+ .captain-scrap-1,
905
+ .captain-scrap-2 {
906
+ transform: none;
907
+ }
908
+
909
+ .captain-top {
910
+ display: flex;
911
+ justify-content: space-between;
912
+ align-items: flex-start;
913
+ gap: 0.75rem;
914
+ }
915
+
916
+ .captain-team.compact {
917
+ margin: 0;
918
+ font-size: 0.95rem;
919
+ font-weight: 700;
920
+ }
921
+
922
+ .captain-icon {
923
+ display: inline-flex;
924
+ align-items: center;
925
+ justify-content: center;
926
+ width: 2.4rem;
927
+ height: 2.4rem;
928
+ border-radius: 999px;
929
+ border: 1px solid var(--line);
930
+ background: color-mix(in srgb, white 92%, var(--panel) 8%);
931
+ }
932
+
933
+ .captain-players.compact-grid {
934
+ display: grid;
935
+ grid-template-columns: 1fr 1fr;
936
+ gap: 0.6rem;
937
+ margin-top: 0.85rem;
938
+ }
939
+
940
+ .captain-role {
941
+ display: flex;
942
+ align-items: center;
943
+ gap: 0.5rem;
944
+ }
945
+
946
+ .captain-badge {
947
+ display: inline-flex;
948
+ align-items: center;
949
+ justify-content: center;
950
+ width: 2rem;
951
+ height: 2rem;
952
+ border-radius: 999px;
953
+ font-family: var(--font-note), cursive;
954
+ font-size: 0.8rem;
955
+ font-weight: 800;
956
+ flex-shrink: 0;
957
+ }
958
+
959
+ .captain-badge-pink {
960
+ background: color-mix(in srgb, var(--marker-pink) 44%, var(--panel-strong));
961
+ border: 1.5px solid color-mix(in srgb, var(--marker-pink) 60%, var(--line));
962
+ color: var(--ink);
963
+ }
964
+
965
+ .captain-badge-blue {
966
+ background: color-mix(in srgb, var(--marker-blue) 44%, var(--panel-strong));
967
+ border: 1.5px solid color-mix(in srgb, var(--marker-blue) 60%, var(--line));
968
+ color: var(--ink);
969
+ }
970
+
971
+ .captain-player {
972
+ margin: 0;
973
+ font-size: 0.88rem;
974
+ font-weight: 700;
975
+ line-height: 1.25;
976
+ color: var(--ink);
977
+ }
978
+
979
+ .captain-player-sub {
980
+ margin: 0;
981
+ font-size: 0.95rem;
982
+ font-weight: 800;
983
+ color: var(--ink);
984
+ letter-spacing: 0.02em;
985
+ }
986
+
987
+ .captain-player-sub-pts {
988
+ font-size: 0.82rem;
989
+ font-weight: 600;
990
+ color: var(--ink-soft);
991
+ letter-spacing: 0.06em;
992
+ }
993
+
994
+ .ledger-shell {
995
+ overflow-x: auto;
996
+ border: 1.5px dashed var(--line);
997
+ background: color-mix(in srgb, var(--panel) 90%, transparent);
998
+ padding: 0.2rem;
999
+ }
1000
+
1001
+ .ledger-table {
1002
+ width: 100%;
1003
+ min-width: 640px;
1004
+ border-collapse: collapse;
1005
+ font-size: 0.93rem;
1006
+ }
1007
+
1008
+ .ledger-table th,
1009
+ .ledger-table td {
1010
+ padding: 0.72rem 0.8rem;
1011
+ border-bottom: 1px dashed color-mix(in srgb, var(--line) 82%, transparent);
1012
+ text-align: left;
1013
+ color: var(--ink);
1014
+ }
1015
+
1016
+ .ledger-table th {
1017
+ font-family: var(--font-note), cursive;
1018
+ font-size: 0.84rem;
1019
+ text-transform: uppercase;
1020
+ letter-spacing: 0.03em;
1021
+ color: var(--ink-soft);
1022
+ }
1023
+
1024
+ .ledger-table tbody tr:nth-child(odd) {
1025
+ background: color-mix(in srgb, var(--panel) 78%, transparent);
1026
+ }
1027
+
1028
+ .ticker-shell {
1029
+ display: flex;
1030
+ flex-direction: row;
1031
+ align-items: stretch;
1032
+ border: 1.5px solid color-mix(in srgb, var(--accent-magenta) 20%, var(--line));
1033
+ border-radius: 999px;
1034
+ background: color-mix(in srgb, var(--accent-magenta) 5%, var(--panel-strong) 95%);
1035
+ box-shadow: 0 2px 6px color-mix(in srgb, var(--shadow) 18%, transparent);
1036
+ height: 2rem;
1037
+ overflow: hidden;
1038
+ }
1039
+
1040
+ .ticker-label {
1041
+ display: flex;
1042
+ align-items: center;
1043
+ gap: 0.35rem;
1044
+ padding: 0 0.5rem;
1045
+ white-space: nowrap;
1046
+ border-right: 1px solid color-mix(in srgb, var(--line) 30%, transparent);
1047
+ flex-shrink: 0;
1048
+ }
1049
+
1050
+ .ticker-label-date {
1051
+ font-family: var(--font-note), cursive;
1052
+ font-size: 0.82rem;
1053
+ font-weight: 700;
1054
+ color: var(--ink);
1055
+ }
1056
+
1057
+ .ticker-label-time {
1058
+ font-family: var(--font-mono);
1059
+ font-size: 0.8rem;
1060
+ font-weight: 600;
1061
+ color: var(--ink-soft);
1062
+ }
1063
+
1064
+ .ticker-window {
1065
+ flex: 1;
1066
+ overflow: hidden;
1067
+ display: flex;
1068
+ align-items: center;
1069
+ padding: 0;
1070
+ }
1071
+
1072
+ .ticker-track {
1073
+ display: flex;
1074
+ width: max-content;
1075
+ align-items: center;
1076
+ gap: 0;
1077
+ }
1078
+
1079
+ .ticker-chip {
1080
+ display: inline-flex;
1081
+ align-items: center;
1082
+ gap: 0.4rem;
1083
+ white-space: nowrap;
1084
+ padding: 0 0.6rem;
1085
+ font-size: 0.78rem;
1086
+ line-height: 1;
1087
+ border-right: 1px solid color-mix(in srgb, var(--line) 15%, transparent);
1088
+ }
1089
+
1090
+ .ticker-matchup {
1091
+ font-weight: 700;
1092
+ color: var(--ink);
1093
+ }
1094
+
1095
+ .ticker-vs {
1096
+ font-weight: 400;
1097
+ color: var(--ink-faint);
1098
+ margin: 0 0.15rem;
1099
+ }
1100
+
1101
+ .ticker-note {
1102
+ color: var(--ink-faint);
1103
+ font-size: 0.8rem;
1104
+ display: inline-flex;
1105
+ align-items: center;
1106
+ gap: 0.2rem;
1107
+ }
1108
+
1109
+ .dashboard-empty-state {
1110
+ display: grid;
1111
+ min-height: 100vh;
1112
+ place-items: center;
1113
+ padding: 2rem;
1114
+ }
1115
+
1116
+ .paper-card-compact {
1117
+ max-width: 32rem;
1118
+ width: 100%;
1119
+ border-radius: 26px 30px 22px 24px;
1120
+ padding: 1.5rem;
1121
+ }
1122
+
1123
+ .paper-card-center {
1124
+ text-align: center;
1125
+ }
1126
+
1127
+ .scribble-button {
1128
+ appearance: none;
1129
+ border: 2px solid var(--line);
1130
+ background: color-mix(in srgb, var(--marker-yellow) 48%, var(--panel-strong));
1131
+ color: var(--ink);
1132
+ border-radius: 999px;
1133
+ padding: 0.7rem 1rem;
1134
+ cursor: pointer;
1135
+ box-shadow: 3px 5px 0 color-mix(in srgb, var(--shadow) 36%, transparent);
1136
+ }
1137
+
1138
+ .scribble-button:hover,
1139
+ .hover-jitter:hover {
1140
+ animation: hand-jitter 260ms ease-in-out 1;
1141
+ }
1142
+
1143
+ .doodle-spinner {
1144
+ width: 3.8rem;
1145
+ height: 3.8rem;
1146
+ margin: 0 auto;
1147
+ stroke: var(--ink-soft);
1148
+ stroke-width: 1.8;
1149
+ fill: none;
1150
+ animation: wobble-spin 2.8s linear infinite;
1151
+ }
1152
+
1153
+ .doodle-spinner circle:nth-child(2) {
1154
+ stroke: var(--marker-blue);
1155
+ animation: dash-swing 1.4s ease-in-out infinite alternate;
1156
+ }
1157
+
1158
+ .doodle-spinner circle:nth-child(3) {
1159
+ stroke: var(--marker-pink);
1160
+ animation: dash-swing 1.7s ease-in-out infinite alternate-reverse;
1161
+ }
1162
+
1163
+ @keyframes wobble-spin {
1164
+ 0% {
1165
+ transform: rotate(0deg) scale(1);
1166
+ }
1167
+ 30% {
1168
+ transform: rotate(108deg) scale(1.01);
1169
+ }
1170
+ 60% {
1171
+ transform: rotate(216deg) scale(0.99);
1172
+ }
1173
+ 100% {
1174
+ transform: rotate(360deg) scale(1);
1175
+ }
1176
+ }
1177
+
1178
+ @keyframes dash-swing {
1179
+ from {
1180
+ stroke-dashoffset: 0;
1181
+ }
1182
+ to {
1183
+ stroke-dashoffset: 12;
1184
+ }
1185
+ }
1186
+
1187
+ @keyframes hand-jitter {
1188
+ 0% {
1189
+ transform: rotate(0deg) translate3d(0, 0, 0);
1190
+ }
1191
+ 25% {
1192
+ transform: rotate(-0.8deg) translate3d(1px, -1px, 0);
1193
+ }
1194
+ 50% {
1195
+ transform: rotate(0.9deg) translate3d(-1px, 1px, 0);
1196
+ }
1197
+ 75% {
1198
+ transform: rotate(-0.4deg) translate3d(0.5px, 0, 0);
1199
+ }
1200
+ 100% {
1201
+ transform: rotate(0deg) translate3d(0, 0, 0);
1202
+ }
1203
+ }
1204
+
1205
+ @media (max-width: 1024px) {
1206
+ .paper-hero {
1207
+ grid-template-columns: 1fr;
1208
+ }
1209
+
1210
+ .span-12,
1211
+ .span-8,
1212
+ .span-7,
1213
+ .span-6,
1214
+ .span-5,
1215
+ .span-4 {
1216
+ grid-column: span 12;
1217
+ }
1218
+ }
1219
+
1220
+ @media (max-width: 720px) {
1221
+ .dashboard-page {
1222
+ padding-inline: 0.75rem;
1223
+ }
1224
+
1225
+ .ticker-shell {
1226
+ height: auto;
1227
+ flex-wrap: wrap;
1228
+ border-radius: 16px;
1229
+ padding: 0.25rem 0;
1230
+ }
1231
+
1232
+ .ticker-label {
1233
+ width: 100%;
1234
+ justify-content: center;
1235
+ border-right: none;
1236
+ border-bottom: 1px solid color-mix(in srgb, var(--line) 15%, transparent);
1237
+ padding: 0.15rem 0.5rem;
1238
+ }
1239
+
1240
+ .page-crumbs,
1241
+ .bar-row,
1242
+ .leader-copy-top {
1243
+ grid-template-columns: 1fr;
1244
+ display: grid;
1245
+ }
1246
+
1247
+ .page-crumbs {
1248
+ display: flex;
1249
+ flex-direction: column;
1250
+ align-items: stretch;
1251
+ }
1252
+
1253
+ .theme-toggle {
1254
+ width: 100%;
1255
+ justify-content: center;
1256
+ }
1257
+
1258
+ .insight-grid,
1259
+ .captain-grid {
1260
+ grid-template-columns: 1fr;
1261
+ }
1262
+
1263
+ .hero-title {
1264
+ font-size: clamp(2.6rem, 14vw, 4.2rem);
1265
+ }
1266
+
1267
+ }