@four-leaf-studios/rl-overlay 1.0.4 → 1.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 (51) hide show
  1. package/.github/copilot-instructions.md +70 -0
  2. package/dist/index.cjs.js +271 -10567
  3. package/dist/index.cjs.js.map +1 -1
  4. package/dist/index.esm.js +300 -10579
  5. package/dist/index.esm.js.map +1 -1
  6. package/dist/types/Overlay.d.ts +5 -6
  7. package/dist/types/OverlaySlot.d.ts +9 -0
  8. package/dist/types/index.d.ts +2 -0
  9. package/dist/types/registry.d.ts +2 -0
  10. package/package.json +12 -5
  11. package/src/Overlay.tsx +43 -41
  12. package/src/OverlaySlot.tsx +35 -0
  13. package/src/Player.tsx +1 -0
  14. package/src/PlayerBoost.tsx +4 -1
  15. package/src/Scoreboard.tsx +1 -0
  16. package/src/ScoreboardGameBox.tsx +2 -4
  17. package/src/ScoreboardSeriesBox.tsx +2 -3
  18. package/src/ScoreboardTeam.tsx +1 -0
  19. package/src/StatItem.tsx +4 -1
  20. package/src/TargetBoost.tsx +1 -0
  21. package/src/TargetPlayer.tsx +15 -3
  22. package/src/TargetPlayerLocation.tsx +1 -0
  23. package/src/TargetPlayerStats.tsx +1 -1
  24. package/src/Team.tsx +1 -0
  25. package/src/Timer.tsx +7 -4
  26. package/src/css/Florida_Tech.css +696 -0
  27. package/src/css/Horizon_Hues.css +618 -0
  28. package/src/css/Neo_Glass.css +674 -0
  29. package/src/css/Obsidian_Glide.css +646 -0
  30. package/src/css/RLCS_2024.css +566 -0
  31. package/src/css/RLCS_2025.css +524 -0
  32. package/src/css/Shaded_blocks.css +594 -0
  33. package/src/index.ts +2 -0
  34. package/src/registry.ts +19 -0
  35. package/src/types.d.ts +20 -0
  36. package/test-overlay/public/mock-css.css +294 -372
  37. package/test-overlay/src/App.jsx +28 -28
  38. package/tests/BroadcastContext.test.tsx +41 -0
  39. package/tests/Overlay.test.tsx +106 -0
  40. package/tests/OverlaySlot.test.tsx +79 -0
  41. package/tests/PlayerBoost.test.tsx +47 -0
  42. package/tests/Replay.test.tsx +29 -0
  43. package/tests/ScoreboardGameBox.test.tsx +35 -0
  44. package/tests/ScoreboardSeriesBox.test.tsx +48 -0
  45. package/tests/StatItem.test.tsx +33 -0
  46. package/tests/__mocks__/@four-leaf-studios/rl-socket-hook.ts +10 -0
  47. package/tests/fixtures.ts +96 -0
  48. package/tests/registry.test.ts +27 -0
  49. package/tests/setup.ts +1 -0
  50. package/tsconfig.json +16 -20
  51. package/vitest.config.ts +9 -0
@@ -0,0 +1,566 @@
1
+ /* RLCS 2024 Theme */
2
+ @font-face {
3
+ font-family: "Aldrich";
4
+ font-style: normal;
5
+ font-weight: 400;
6
+ font-display: swap;
7
+ src: url(https://fonts.gstatic.com/s/aldrich/v21/MCoTzAn-1s3IGyJMVacY3w.woff2)
8
+ format("woff2");
9
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
10
+ U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193,
11
+ U+2212, U+2215, U+FEFF, U+FFFD;
12
+ }
13
+
14
+ /* Global font override */
15
+ body,
16
+ .overlay {
17
+ font-family: "Aldrich", sans-serif;
18
+ --fallback-darker-mutual: black;
19
+ }
20
+
21
+ .top_bar {
22
+ height: 30px;
23
+ background-color: #0b1013;
24
+ color: #94adcb;
25
+ font-size: 22px;
26
+ font-weight: bold;
27
+ text-transform: uppercase;
28
+ width: 792px;
29
+ padding-left: 25px;
30
+ padding-right: 25px;
31
+ }
32
+
33
+ .main_bar {
34
+ font-weight: bold;
35
+ }
36
+
37
+ .name_box {
38
+ font-size: 30px;
39
+ height: 60px;
40
+ width: 300px;
41
+ justify-content: center;
42
+ align-items: center;
43
+ text-align: center;
44
+
45
+ text-transform: uppercase;
46
+ text-overflow: ellipsis;
47
+ white-space: nowrap;
48
+ overflow: hidden;
49
+ }
50
+
51
+ .left_name_box {
52
+ margin-right: 0px;
53
+ background: linear-gradient(
54
+ 180deg,
55
+ var(--team-left-primary) 0%,
56
+ var(--team-left-primary) 7px,
57
+ #1d1e23 8px,
58
+ var(--team-left-primary) 200%,
59
+ rgba(44, 88, 116, 1) 100%
60
+ );
61
+ padding-top: 10px;
62
+ border-top: 1px solid var(--team-left-primary-light);
63
+ }
64
+
65
+ .right_name_box {
66
+ margin-left: 0px;
67
+ background: linear-gradient(
68
+ 180deg,
69
+ var(--team-right-primary) 0%,
70
+ var(--team-right-primary) 7px,
71
+ #1d1e23 8px,
72
+ var(--team-right-primary) 200%,
73
+ #7e4b35 100%
74
+ );
75
+ padding-top: 10px;
76
+ border-top: 1px solid var(--team-right-primary-light);
77
+ }
78
+
79
+ .logo_box {
80
+ padding: 10px;
81
+ width: 100px;
82
+ position: relative;
83
+ background: #131217;
84
+ height: 100%;
85
+ }
86
+
87
+ .left_logo_box {
88
+ left: 100px;
89
+ transform: translateX(-100%);
90
+ clip-path: polygon(0 0, 100% 0%, 100% 100%, 16px 100%, 0 calc(100% - 16px));
91
+ }
92
+
93
+ .right_logo_box {
94
+ right: 100px;
95
+ transform: translateX(100%);
96
+ clip-path: polygon(
97
+ 0% 0%,
98
+ 100% 0,
99
+ 100% calc(100% - 16px),
100
+ calc(100% - 16px) 100%,
101
+ 0% 100%
102
+ );
103
+ }
104
+
105
+ .score_box {
106
+ font-size: 52px;
107
+ height: 70px;
108
+ width: 80px;
109
+ color: white;
110
+ }
111
+
112
+ .left_score_box {
113
+ background: var(--team-left-primary);
114
+ border-top: 1px solid var(--team-left-primary-light);
115
+ }
116
+
117
+ .right_score_box {
118
+ background: var(--team-right-primary);
119
+ border-top: 1px solid var(--team-right-primary);
120
+ }
121
+
122
+ .time_box {
123
+ background: #ffffff;
124
+ color: black;
125
+ font-size: 50px;
126
+ font-weight: bold;
127
+ height: 70px;
128
+ width: 160px;
129
+ border-top: 1px solid #363f4b;
130
+ }
131
+
132
+ .bottom_bar {
133
+ height: 14px;
134
+ top: -1.1px;
135
+ }
136
+
137
+ .series_box {
138
+ background-color: #1a1c22;
139
+ width: 251px;
140
+ height: 17px;
141
+ margin-top: 0px;
142
+ }
143
+
144
+ .left_series_box {
145
+ margin-right: 0px;
146
+ padding-right: 5px;
147
+ padding-left: 5px;
148
+ justify-content: end;
149
+ clip-path: polygon(100% 0, 100% 100%, 8px 100%, 0% calc(100% - 8px), 0 0);
150
+ }
151
+
152
+ .right_series_box {
153
+ margin-left: 0px;
154
+ padding-left: 5px;
155
+ padding-right: 5px;
156
+ justify-content: start;
157
+ flex-direction: row-reverse;
158
+ clip-path: polygon(
159
+ 100% 0,
160
+ 100% calc(100% - 8px),
161
+ calc(100% - 8px) 100%,
162
+ 0 100%,
163
+ 0 0
164
+ );
165
+ }
166
+
167
+ .series_score_box {
168
+ margin-left: auto;
169
+ margin-right: auto;
170
+ }
171
+
172
+ .series_score_box_point {
173
+ height: 5px;
174
+ width: 35px;
175
+ border-radius: 2px;
176
+ border: 2px solid #aaa;
177
+ }
178
+
179
+ .series_score_box_empty {
180
+ height: 5px;
181
+ width: 35px;
182
+ background-color: #000;
183
+ border-radius: 2px;
184
+ border: 2px solid #444;
185
+ border-bottom: 2px solid #333;
186
+ border-right: 2px solid #333;
187
+ }
188
+
189
+ .left_series_score_box_point {
190
+ background-color: var(--team-left-primary);
191
+ margin-left: 7px;
192
+ margin-right: 3px;
193
+ border-top: 2px solid var(--team-left-primary);
194
+ border-left: 2px solid var(--team-left-primary);
195
+ border-right: 2px solid var(--team-left-primary-dark);
196
+ border-bottom: 2px solid var(--team-left-primary-dark);
197
+ }
198
+
199
+ .left_series_score_box_empty {
200
+ margin-left: 7px;
201
+ margin-right: 3px;
202
+ }
203
+
204
+ .right_series_score_box_point {
205
+ background-color: var(--team-right-primary);
206
+ margin-left: 7px;
207
+ margin-right: 7px;
208
+ border-top: 2px solid var(--team-right-primary);
209
+ border-left: 2px solid var(--team-right-primary);
210
+ border-right: 2px solid var(--team-right-primary-dark);
211
+ border-bottom: 2px solid var(--team-right-primary-dark);
212
+ }
213
+
214
+ .right_series_score_box_empty {
215
+ margin-left: 7px;
216
+ margin-right: 7px;
217
+ }
218
+
219
+ .game_box {
220
+ background-color: #13131a;
221
+ font-size: 23px;
222
+ font-weight: bold;
223
+ letter-spacing: 3px;
224
+ width: 320px;
225
+ height: 31px;
226
+ margin-top: 0px;
227
+ clip-path: polygon(
228
+ 100% 0,
229
+ 100% calc(100% - 8px),
230
+ calc(100% - 8px) 100%,
231
+ 8px 100%,
232
+ 0% calc(100% - 8px),
233
+ 0 0
234
+ );
235
+ }
236
+
237
+ .series_info_box {
238
+ height: 30px;
239
+ background-color: #0b1013;
240
+ color: #94adcb;
241
+ font-size: 22px;
242
+ font-weight: bold;
243
+ text-transform: uppercase;
244
+ width: 792px;
245
+ padding-left: 25px;
246
+ padding-right: 25px;
247
+ }
248
+
249
+ .team_box {
250
+ color: white;
251
+ position: absolute;
252
+ top: 25px;
253
+ }
254
+
255
+ .scoreboard_team_box {
256
+ max-height: 72px;
257
+ }
258
+
259
+ .left_team_box {
260
+ left: -10px;
261
+ }
262
+
263
+ .right_team_box {
264
+ right: -10px;
265
+ }
266
+
267
+ .player_box {
268
+ height: 36px;
269
+ width: 300px;
270
+ margin-bottom: 5px;
271
+ font-weight: bold;
272
+ background-color: #1e1e23;
273
+ }
274
+
275
+ .left_player_box {
276
+ left: -15px;
277
+ clip-path: polygon(
278
+ calc(100% - 3px) 0,
279
+ 100% 3px,
280
+ 100% calc(100% - 3px),
281
+ calc(100% - 3px) 100%,
282
+ 0 100%,
283
+ 0 0
284
+ );
285
+ }
286
+
287
+ .right_player_box {
288
+ right: -15px;
289
+ clip-path: polygon(
290
+ 3px 0%,
291
+ 100% 0,
292
+ 100% 100%,
293
+ 3px 100%,
294
+ 0% calc(100% - 3px),
295
+ 0% 3px
296
+ );
297
+ }
298
+
299
+ .player_name {
300
+ font-size: 20px;
301
+ position: absolute;
302
+ top: 3px;
303
+ text-transform: uppercase;
304
+ text-overflow: ellipsis;
305
+ max-width: 190px;
306
+ white-space: nowrap;
307
+ overflow: hidden;
308
+ }
309
+
310
+ .left_player_name {
311
+ left: 45px;
312
+ }
313
+
314
+ .right_player_name {
315
+ right: 45px;
316
+ }
317
+
318
+ .player_boost {
319
+ font-size: 20px;
320
+ position: absolute;
321
+ font-weight: bold;
322
+ top: 3px;
323
+ text-transform: uppercase;
324
+ }
325
+
326
+ .left_player_boost {
327
+ right: 10px;
328
+ color: #fff;
329
+ }
330
+
331
+ .right_player_boost {
332
+ left: 10px;
333
+ color: #fff;
334
+ }
335
+
336
+ .boost_meter {
337
+ width: 245px;
338
+ height: 5px;
339
+ margin-top: 27px;
340
+ margin-left: auto;
341
+ margin-right: auto;
342
+ background-color: #000;
343
+ }
344
+
345
+ .left_boost_meter {
346
+ margin-right: 10px;
347
+ }
348
+
349
+ .right_boost_meter {
350
+ margin-left: 10px;
351
+ }
352
+
353
+ .left_boost_meter_bar {
354
+ background-color: var(--team-left-primary);
355
+ }
356
+
357
+ .right_boost_meter_bar {
358
+ background-color: var(--team-right-primary);
359
+ }
360
+
361
+ .stat_box {
362
+ background-color: rgba(0, 0, 0, 0.8);
363
+ height: 60px;
364
+ padding-right: 25px;
365
+ padding-bottom: 5px;
366
+ display: flex;
367
+ background: linear-gradient(0deg, #373b48 5px, #1a1c22 5px, #1a1c22 100%);
368
+ border-top: 1px solid #363f4b;
369
+ margin: 30px;
370
+ }
371
+
372
+ .stat_box_player {
373
+ padding-inline: 20px;
374
+ background: #373b48;
375
+ font-size: 20px;
376
+ text-transform: uppercase;
377
+ text-overflow: ellipsis;
378
+ max-width: 200px;
379
+ white-space: nowrap;
380
+ overflow: hidden;
381
+ font-weight: 900;
382
+ height: 100%;
383
+ display: flex;
384
+ justify-content: center;
385
+ align-items: center;
386
+ }
387
+
388
+ .stat_box_statistic {
389
+ display: flex;
390
+ flex-direction: column;
391
+ align-items: center;
392
+ margin: auto;
393
+ margin-left: 30px;
394
+ }
395
+
396
+ .stat_box_statistic_value {
397
+ font-size: 28px;
398
+ font-weight: bold;
399
+ }
400
+
401
+ .stat_box_statistic_name {
402
+ font-size: 20px;
403
+ order: 0;
404
+ }
405
+
406
+ .stat_box_statistic_player_id,
407
+ .stat_box_statistic_player_team,
408
+ .stat_box_statistic_player_location,
409
+ .stat_box_statistic_player_touches {
410
+ display: none;
411
+ }
412
+
413
+ /* Target Boost (the circular meter) */
414
+ .target_boost {
415
+ font-size: 3rem;
416
+ font-weight: bold;
417
+ position: absolute;
418
+ bottom: 0;
419
+ right: 0;
420
+ margin-left: auto;
421
+ width: 200px;
422
+ height: 200px;
423
+ margin-bottom: 50px;
424
+ margin-right: 50px;
425
+ border-radius: 50%;
426
+ display: flex;
427
+ flex-direction: column;
428
+ align-items: center;
429
+ justify-content: center;
430
+ color: white;
431
+ overflow: hidden;
432
+ transition: opacity 0.3s ease, transform 0.3s ease;
433
+ }
434
+
435
+ .left_target_boost.target_boost {
436
+ color: var(--team-0-secondary);
437
+ }
438
+
439
+ .right_target_boost.target_boost {
440
+ color: var(--team-1-secondary);
441
+ }
442
+
443
+ .target_boost.entering {
444
+ animation: fadeIn 0.5s ease-in-out;
445
+ }
446
+
447
+ .target_boost.exiting {
448
+ animation: fadeOut 0.5s ease-in-out;
449
+ }
450
+
451
+ .left_target_boost {
452
+ border: 5px solid #1e1e23;
453
+ background: #07132d;
454
+ }
455
+
456
+ .right_target_boost {
457
+ border: 5px solid #1e1e23;
458
+ background: #1e1e23;
459
+ }
460
+
461
+ .target_boost_container {
462
+ width: 100%;
463
+ height: 100%;
464
+ display: flex;
465
+ flex-direction: column;
466
+ align-items: center;
467
+ justify-content: center;
468
+ border-radius: 50%;
469
+ }
470
+
471
+ .left_target_boost_container {
472
+ }
473
+
474
+ .right_target_boost_container {
475
+ }
476
+
477
+ .target_boost_meter {
478
+ position: absolute;
479
+ height: 100%;
480
+ width: 100%;
481
+ border-radius: 50%;
482
+ display: flex;
483
+ justify-content: center;
484
+ align-items: center;
485
+ transition: all 0.5s ease-in-out;
486
+ }
487
+
488
+ .left_target_boost_meter {
489
+ background: conic-gradient(
490
+ var(--team-left-primary-dark) calc(90deg * var(--target_boost) / 100),
491
+ var(--team-left-primary-light) calc(180deg * var(--target_boost) / 100),
492
+ var(--team-left-primary-light) calc(30deg * var(--target_boost) / 100),
493
+ var(--team-left-primary) calc(270deg * var(--target_boost) / 100),
494
+ var(--team-left-primary-dark) calc(360deg * var(--target_boost) / 100),
495
+ var(--fallback-darker-mutual) calc(0deg * var(--target_boost) / 100)
496
+ ) !important;
497
+ transition: all 0.5s ease-in-out;
498
+ }
499
+
500
+ .right_target_boost_meter {
501
+ background: conic-gradient(
502
+ var(--team-right-primary-dark) calc(90deg * var(--target_boost) / 100),
503
+ var(--team-right-primary-light) calc(180deg * var(--target_boost) / 100),
504
+ var(--team-right-primary-light) calc(30deg * var(--target_boost) / 100),
505
+ var(--team-right-primary) calc(270deg * var(--target_boost) / 100),
506
+ var(--team-right-primary-dark) calc(360deg * var(--target_boost) / 100),
507
+ var(--fallback-darker-mutual) calc(0deg * var(--target_boost) / 100)
508
+ ) !important;
509
+
510
+ transition: all 0.5s ease-in-out;
511
+ }
512
+
513
+ .target_boost_meter_inner {
514
+ position: absolute;
515
+ margin: auto;
516
+ width: 80%;
517
+ height: 80%;
518
+ border-radius: 50%;
519
+ z-index: 50;
520
+ }
521
+
522
+ .left_target_boost_meter_inner {
523
+ background: #1e1e23;
524
+ }
525
+
526
+ .right_target_boost_meter_inner {
527
+ background: #1e1e23;
528
+ }
529
+
530
+ .target_boost_svg {
531
+ position: absolute;
532
+ width: 100%;
533
+ height: 100%;
534
+ z-index: 500;
535
+ display: flex;
536
+ justify-content: center;
537
+ align-items: center;
538
+ }
539
+
540
+ .target_boost_svg_circle {
541
+ stroke-dasharray: 4 25%;
542
+ stroke-width: 41;
543
+ stroke-dashoffset: 18;
544
+ fill: transparent;
545
+ }
546
+
547
+ .left_target_boost_svg_circle {
548
+ stroke: #1e1e23;
549
+ }
550
+
551
+ .right_target_boost_svg_circle {
552
+ stroke: #1e1e23;
553
+ }
554
+
555
+ .target_boost_value {
556
+ position: absolute;
557
+ z-index: 500;
558
+ }
559
+
560
+ .left_target_boost_value {
561
+ color: var(--team-left-primary);
562
+ }
563
+
564
+ .right_target_boost_value {
565
+ color: var(--team-right-primary);
566
+ }