-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinvitational.html
More file actions
1034 lines (1007 loc) · 56.4 KB
/
Copy pathinvitational.html
File metadata and controls
1034 lines (1007 loc) · 56.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<meta name="format-detection" content="telephone=no, date=no, address=no, email=no" />
<title>2026 Invitational · TRACKRAT Sprint Club · Austin, TX</title>
<meta name="description" content="The 2026 TRACKRAT Invitational: 60m, 100m, 200m, 400m, 4x100 and 4x400 relays on October 18, 2026, 9:00–11:00 AM at 4401 Tilley St, Austin, TX. RSVP open on Sweatpals." />
<link rel="canonical" href="https://www.trackratsprint.club/invitational" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="TRACKRAT Sprint Club" />
<meta property="og:title" content="2026 Invitational · TRACKRAT Sprint Club" />
<meta property="og:description" content="October 18, 2026 · 9:00–11:00 AM · 4401 Tilley St, Austin, TX. 60m, 100m, 200m, 400m, 4x100 and 4x400 relays. RSVP open." />
<meta property="og:url" content="https://www.trackratsprint.club/invitational" />
<meta property="og:image" content="https://www.trackratsprint.club/og-invitational.png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:image:alt" content="TRACKRAT. Greatness is calling. The 2026 TRACKRAT Invitational in Austin, TX: 60m, 100m, 200m, 400m, 4x100 and 4x400." />
<meta property="og:locale" content="en_US" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="2026 Invitational · TRACKRAT Sprint Club" />
<meta name="twitter:description" content="October 18, 2026 · 9:00–11:00 AM · 4401 Tilley St, Austin, TX. 60m, 100m, 200m, 400m, 4x100 and 4x400 relays. RSVP open." />
<meta name="twitter:image" content="https://www.trackratsprint.club/og-invitational.png" />
<meta name="twitter:site" content="@trackratsprints" />
<meta name="twitter:creator" content="@trackratsprints" />
<meta name="geo.region" content="US-TX" />
<meta name="geo.placename" content="Austin" />
<meta name="theme-color" content="#000000" />
<link rel="icon" href="/favicon.ico" sizes="any">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<link rel="manifest" href="/site.webmanifest">
<meta name="apple-mobile-web-app-title" content="TRACKRAT">
<!-- Self-hosted fonts. @font-face declarations live in the inline <style>
below; preload the two above-the-fold fonts (Fugaz One wordmark + IBM
Plex Mono 400 body) so they fetch in parallel with the HTML parse. -->
<link rel="preload" as="font" type="font/woff2" href="/fonts/fugaz-one-latin.woff2" crossorigin>
<link rel="preload" as="font" type="font/woff2" href="/fonts/ibm-plex-mono-400-latin.woff2" crossorigin>
<script defer src="/_vercel/insights/script.js"></script>
<script defer src="/_vercel/speed-insights/script.js"></script>
<style>
/* Self-hosted fonts (latin subset). font-display: swap keeps the page
readable in a fallback font until the woff2 downloads. */
@font-face { font-family: 'Fugaz One'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/fugaz-one-latin.woff2') format('woff2'); }
@font-face { font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/ibm-plex-mono-400-latin.woff2') format('woff2'); }
@font-face { font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 500; font-display: swap; src: url('/fonts/ibm-plex-mono-500-latin.woff2') format('woff2'); }
@font-face { font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 600; font-display: swap; src: url('/fonts/ibm-plex-mono-600-latin.woff2') format('woff2'); }
@font-face { font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 700; font-display: swap; src: url('/fonts/ibm-plex-mono-700-latin.woff2') format('woff2'); }
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
:root {
--orange: #FF4D1F;
--black: #000000;
--white: #FFFFFF;
}
html, body { height: 100%; }
body {
font-family: 'IBM Plex Mono', monospace;
background: var(--orange);
color: var(--black);
/* overflow-x only — clipping y makes zoomed/reflowed content
unreachable (WCAG 1.4.4 / 1.4.10) */
overflow-x: hidden;
-webkit-font-smoothing: antialiased;
}
a {
text-decoration: none;
color: inherit;
-webkit-tap-highlight-color: transparent;
}
a:hover { opacity: 0.6; transition: opacity 0.2s ease; }
nav {
position: absolute;
top: 0;
left: 0;
right: 0;
z-index: 100;
display: flex;
justify-content: center;
align-items: center;
padding: 24px 40px;
font-size: 13px;
letter-spacing: 0.05em;
}
nav .nav-left {
font-family: 'Fugaz One', 'Arial Black', sans-serif;
font-size: 18px;
letter-spacing: -0.14em;
position: absolute;
left: 40px;
}
nav .nav-center {
display: flex;
gap: 28px;
font-weight: 500;
align-items: center;
}
/* ---- DESKTOP EVENTS DROPDOWN ---- */
.nav-dropdown { position: relative; display: inline-flex; align-items: center; }
.nav-dropdown-trigger {
background: transparent; border: none; cursor: pointer; color: inherit;
font-family: inherit; font-size: inherit; font-weight: inherit;
letter-spacing: inherit; padding: 0;
display: inline-flex; align-items: center; gap: 6px;
}
.nav-dropdown-trigger:hover { opacity: 0.6; transition: opacity 0.2s ease; }
.nav-dropdown-caret { width: 9px; height: 9px; display: block; transition: transform 0.2s ease; }
.nav-dropdown:hover .nav-dropdown-caret,
.nav-dropdown:focus-within .nav-dropdown-caret,
.nav-dropdown.is-open .nav-dropdown-caret { transform: rotate(180deg); }
.nav-dropdown-panel {
position: absolute; top: 100%; left: 50%;
transform: translateX(-50%) translateY(6px);
min-width: 230px; background: var(--black);
border: 1px solid rgba(255,255,255,0.16);
padding: 8px; display: flex; flex-direction: column;
opacity: 0; visibility: hidden; pointer-events: none;
transition: opacity 0.18s ease, transform 0.18s ease; z-index: 120;
}
.nav-dropdown:hover .nav-dropdown-panel,
.nav-dropdown:focus-within .nav-dropdown-panel,
.nav-dropdown.is-open .nav-dropdown-panel {
opacity: 1; visibility: visible; pointer-events: auto;
transform: translateX(-50%) translateY(0);
}
.nav-dropdown-panel a {
color: var(--white); font-size: 12px; letter-spacing: 0.08em;
font-weight: 500; padding: 11px 14px; white-space: nowrap;
}
.nav-dropdown-panel a:hover { color: var(--orange); opacity: 1; }
/* Collapse nav to the hamburger before the centered link bar crowds the
absolute wordmark (the multi-item nav overlaps it below ~860px). */
@media (max-width: 880px) {
nav { justify-content: space-between; padding: 16px 20px; }
nav .nav-left { position: static; font-size: 16px; flex-shrink: 0; }
nav .nav-center { display: none !important; }
.menu-toggle { display: block !important; }
}
/* ---- MOBILE MENU TOGGLE ---- */
.menu-toggle {
display: none;
position: relative;
width: 32px;
height: 32px;
background: transparent;
border: none;
cursor: pointer;
padding: 0;
z-index: 200;
color: var(--black);
}
.menu-toggle span {
position: absolute;
left: 4px;
right: 4px;
height: 2px;
background: currentColor;
transition: transform 0.3s ease, opacity 0.2s ease, top 0.3s ease;
}
.menu-toggle span:nth-child(1) { top: 10px; }
.menu-toggle span:nth-child(2) { top: 16px; }
.menu-toggle span:nth-child(3) { top: 22px; }
.menu-toggle.is-open {
color: var(--white);
}
.menu-toggle.is-open span:nth-child(1) {
top: 16px;
transform: rotate(45deg);
}
.menu-toggle.is-open span:nth-child(2) { opacity: 0; }
.menu-toggle.is-open span:nth-child(3) {
top: 16px;
transform: rotate(-45deg);
}
/* ---- MOBILE MENU OVERLAY ---- */
.mobile-menu {
position: fixed;
inset: 0;
z-index: 150;
background: var(--black);
display: none;
flex-direction: column;
padding: 18px 32px 28px;
opacity: 0;
transition: opacity 0.3s ease;
overflow-y: auto;
}
.mobile-menu.is-open { display: flex; opacity: 1; }
/* Header: wordmark (-> home) + explicit close X. Lives INSIDE the overlay
so the close control is always above the overlay content (the old
hamburger-morph X was buried under this overlay by a z-index stacking
trap: nav's z-index:100 context capped the toggle below the 150 overlay). */
.mobile-menu-header {
display: flex; align-items: center; justify-content: space-between;
width: 100%; flex-shrink: 0;
}
.mobile-menu-wordmark {
font-family: 'Fugaz One', 'Arial Black', sans-serif; letter-spacing: -0.14em;
font-size: 18px; color: var(--white);
}
.mobile-menu-close {
background: transparent; border: none; cursor: pointer;
width: 44px; height: 44px; margin-right: -10px; padding: 0;
color: var(--white); display: flex; align-items: center; justify-content: center;
}
.mobile-menu-close svg { width: 26px; height: 26px; display: block; }
.mobile-menu-close:hover { color: var(--orange); }
/* flex: 1 0 auto, NOT `flex: 1; min-height: 0`: with both accordions
open the list is taller than the space left between header and footer.
A shrinkable box centers that overflow, spilling SHOP over the wordmark
and OFFTRACK over the footer line with no way to reach them. Growing to
content height instead lets .mobile-menu's overflow-y: auto scroll it.
`safe center` keeps the top edge reachable if a box is ever clamped. */
.mobile-menu-links {
flex: 1 0 auto;
display: flex; flex-direction: column; justify-content: center;
justify-content: safe center;
align-items: flex-start; width: 100%;
padding-bottom: 14px;
}
.mobile-menu-links > a,
.mobile-accordion-trigger {
font-size: clamp(30px, 7.5vw, 44px);
font-family: 'Fugaz One', 'Arial Black', sans-serif;
letter-spacing: -0.04em;
color: var(--white);
padding: 12px 0; width: 100%;
background: transparent; border: none; text-align: left; cursor: pointer;
display: flex; align-items: center; justify-content: space-between;
transform: translateX(-20px); opacity: 0;
transition: transform 0.4s ease, opacity 0.4s ease, color 0.2s ease;
}
.mobile-menu.is-open .mobile-menu-links > a,
.mobile-menu.is-open .mobile-accordion-trigger { transform: translateX(0); opacity: 1; }
.mobile-menu.is-open .mobile-menu-links > *:nth-child(1) { transition-delay: 0.05s; }
.mobile-menu.is-open .mobile-menu-links > *:nth-child(2) { transition-delay: 0.12s; }
.mobile-menu.is-open .mobile-menu-links > *:nth-child(3) { transition-delay: 0.19s; }
.mobile-menu.is-open .mobile-menu-links > *:nth-child(4) { transition-delay: 0.26s; }
.mobile-menu.is-open .mobile-menu-links > *:nth-child(5) { transition-delay: 0.33s; }
.mobile-menu-links a:hover, .mobile-menu-links a:active,
.mobile-accordion-trigger:hover { color: var(--orange); }
.mobile-menu-footer {
flex-shrink: 0;
font-size: 10px; letter-spacing: 0.3em;
opacity: 0.4; font-weight: 600; color: var(--white);
}
/* ---- MOBILE EVENTS ACCORDION ---- */
.mobile-menu.is-open .mobile-menu-links > *:nth-child(6) { transition-delay: 0.40s; }
.mobile-menu.is-open .mobile-menu-links > *:nth-child(7) { transition-delay: 0.47s; }
.mobile-accordion-trigger .acc-caret { width: 18px; height: 18px; flex-shrink: 0; transition: transform 0.2s ease; }
.mobile-accordion-trigger[aria-expanded="true"] .acc-caret { transform: rotate(180deg); }
.mobile-accordion-panel {
display: none; flex-direction: column; align-items: flex-start;
width: 100%; padding: 2px 0 10px 18px;
}
.mobile-accordion-panel.is-open { display: flex; }
.mobile-accordion-panel a {
font-family: 'Fugaz One', 'Arial Black', sans-serif; letter-spacing: -0.03em;
font-size: clamp(19px, 5vw, 26px); color: var(--white);
padding: 9px 0;
}
.mobile-accordion-panel a:hover { color: var(--orange); }
body.menu-open { overflow: hidden; }
.page {
width: 100%;
position: relative; /* containing block for .site-footer, see below */
height: 100vh;
height: 100dvh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
padding: 40px;
}
/* One display scale drives both hero lines so 2026 always renders at
the same width as TRACKRAT INVITATIONAL. The 5x ratio is what desktop
has always used; previously each line had its own clamp and they hit
their floors at different viewports, so the year came out short on
mobile. The vw cap keeps the year inside the padding below ~330px. */
/* Outlined artwork, inlined rather than used as <img src>: SVG-as-img can
render blank on iOS Safari and this is the hero. Its own canvas is
1123x941 but the ink is only 1100.9x478.3 at (13.4, 205.6), so the
viewBox is re-cropped to the ink. One width drives it; aspect does the
rest. Canonical copy: /lockup-tri26.svg (see the markup note below). */
/* h1 must be full width: as a shrink-to-fit flex item its own width
would be what the lockup's 100% resolves against. */
h1 { width: 100%; line-height: 0; margin-bottom: 24px; }
.lockup { width: min(500px, 100%); height: auto; display: block; margin: 0 auto; }
.sr-only {
position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
}
/* Trailing padding offsets the letter-spacing added after the last
glyph, so the line stays optically centered. */
.tagline {
/* The vw cap keeps the tracked-out line on one line below ~366px;
it does not bind at any wider viewport. */
font-size: min(clamp(15px, 2vw, 22px), calc(5.4vw - 4.5px));
font-weight: 700;
letter-spacing: 0.3em;
padding-left: 0.3em;
line-height: 1.4;
}
/* Event lineup leads, at the larger of the two treatments. Each
separator is glued to the token before it with a non-breaking space,
so if the line wraps on a narrow screen it breaks after a "·" and
never starts a line with one. */
.events {
font-size: clamp(14px, 1.8vw, 20px);
letter-spacing: 0.24em;
margin-top: 40px;
font-weight: 700;
line-height: 1.8;
}
.when {
margin-top: 30px;
font-size: clamp(13px, 1.5vw, 16px);
font-weight: 700;
letter-spacing: 0.2em;
line-height: 1.9;
}
.rsvp {
display: inline-block;
margin-top: 36px;
padding: 14px 22px;
background: var(--black);
color: var(--orange);
font-size: 13px;
font-weight: 700;
letter-spacing: 0.2em;
text-transform: uppercase;
transition: transform 0.15s ease, opacity 0.2s ease;
}
.rsvp:hover { transform: translateY(-1px); opacity: 0.95; }
/* ---- START LIST (below the fold) ---- */
.startlist { max-width: 940px; margin: 0 auto; padding: 0 40px 120px; }
.sl-title {
font-family: 'Fugaz One', 'Arial Black', sans-serif;
letter-spacing: -0.03em;
/* Measured, not guessed: ATHLETES renders 4.84px wide per px of font
size, and the note line beneath it is 478px of ink, so 99px is
parity and 104px clears it. The floor keeps it near the note's
wrapped width on a phone without touching the 327px column. */
font-size: clamp(62px, 8.2vw, 104px);
line-height: 1;
text-align: center;
}
.sl-note {
font-size: 13px; font-weight: 700; letter-spacing: 0.2em;
line-height: 1.9; margin-top: 18px; text-align: center;
}
.sl-note-sm { font-size: 11px; letter-spacing: 0.18em; margin-top: 4px; }
/* Live dot. The start list is regenerated by hand, so this is what says the
timestamp beside it is current rather than whatever the browser cached.
Green is off-palette deliberately: a status light that matched the page
would stop reading as a status light. */
.sl-live {
display: inline-block; width: 9px; height: 9px; border-radius: 50%;
background: #34C759; margin-left: 11px; vertical-align: 1px;
box-shadow: 0 0 5px 0 rgba(52, 199, 89, 0.75);
animation: sl-blip 1.4s ease-in-out infinite;
}
/* The dot's own fill brightens as the ring goes out, because the ring alone
was too quiet to read as movement. It shifts between two opaque greens
rather than fading: a translucent green over Sprint Orange mixes to olive
on the way down, which looks like a rendering fault rather than a pulse. */
@keyframes sl-blip {
0% { background: #34C759;
box-shadow: 0 0 5px 0 rgba(52,199,89,0.75), 0 0 0 0 rgba(52,199,89,0.6); }
55% { background: #5FE08A;
box-shadow: 0 0 9px 1px rgba(52,199,89,0.9), 0 0 0 9px rgba(52,199,89,0); }
100% { background: #34C759;
box-shadow: 0 0 5px 0 rgba(52,199,89,0.75), 0 0 0 0 rgba(52,199,89,0); }
}
/* The glow stays, the pulse goes: it is decoration, and a dot that throbs
forever is exactly what this media query exists for. */
@media (prefers-reduced-motion: reduce) {
.sl-live { animation: none; }
}
.sl-grid {
display: grid; grid-template-columns: 1fr 1fr;
gap: 0 48px; margin-top: 52px;
}
.sl-race { border-top: 2px solid var(--black); padding: 16px 0 26px; }
.sl-race h3 {
font-size: 15px; font-weight: 700; letter-spacing: 0.16em;
display: flex; align-items: baseline; justify-content: space-between; gap: 14px;
}
/* Solid black at a smaller size rather than dimmed black: over Sprint
Orange a low-alpha black reads brown, not grey. */
/* The transparent top and bottom border is load-bearing. Without it a
plain count is 5px shorter than a chipped one, so a race that went
near-full grew its h3 and pushed HEAT 2 down 5px against the race
beside it. Vertical only, so the count still sits flush with the
column's right edge while every state is exactly the same height. */
.sl-count {
font-size: 11px; font-weight: 700; letter-spacing: 0.14em; white-space: nowrap;
border: 0 solid transparent; border-width: 2px 0; padding: 3px 0;
}
/* The two chips that interrupt. FULL inverts, because it is the one state
that changes what you do next. Near-full only outlines: still urgent,
but a page of solid black chips would flatten the difference between
'hurry' and 'too late'. Both keep the 5px of vertical box the plain
state has, so swapping between them moves nothing. */
.sl-count.is-full {
background: var(--black); color: var(--orange);
border: 2px solid var(--black); padding: 3px 6px;
}
.sl-count.is-low { border: 2px solid var(--black); padding: 3px 6px; }
.sl-race ul { list-style: none; margin-top: 14px; }
/* 28.5px, not the 1.9 it was expressed as: a relative line-height scales
with font-size, so the smaller OPEN rows below came out 22.8px against a
name's 28.5px and every heat holding one sat short. That put HEAT 2 at a
different height in each column. Fixed in px, a lane is a lane whatever
is written in it. */
.sl-race li { font-size: 15px; font-weight: 500; line-height: 28.5px; }
/* An empty lane, not a competitor. Tracked caps at a smaller size reads as
a label rather than a name, which is the same device the HEAT and team
lines use. No dimming: black at low alpha over Sprint Orange goes brown. */
.sl-race li.sl-open {
font-size: 12px; font-weight: 700; letter-spacing: 0.2em;
}
/* Outlined rather than solid, matching the near-full header chip: this is a
thing still to be sorted, not a settled fact. Solid black at a small size
rather than any dimming, since black at low alpha over Sprint Orange
reads brown. */
.sl-flag {
display: inline-block; font-size: 10px; font-weight: 700;
letter-spacing: 0.14em; line-height: 1; padding: 3px 6px;
border: 2px solid var(--black); margin-left: 10px; vertical-align: 2px;
}
.sl-team {
font-size: 12px; font-weight: 700; letter-spacing: 0.18em; margin-top: 18px;
display: flex; align-items: baseline; gap: 12px;
/* Pushes the count to the far edge of the column. At the old 12px gap
'HEAT 1' and its count ran together and read as one number. A team
name is the only child on its line, so it still sits flush left. */
justify-content: space-between;
}
.sl-empty { font-size: 13px; font-weight: 500; margin-top: 14px; }
@media (max-width: 700px) {
.startlist { padding: 0 24px 96px; }
.sl-grid { grid-template-columns: 1fr; gap: 0; margin-top: 36px; }
}
.when .w-seg { white-space: nowrap; }
@media (max-width: 768px) {
.when .w-dot { display: none; }
.when .w-time { display: block; }
}
/* Phones: the hero inverted, with the supporting copy (215px) outweighing
the lockup (128px), which is the opposite of the desktop proportion.
Narrower page padding lets the lockup take ~89% of the width instead of
79%, and tighter leading and gaps pull the copy back under it. */
@media (max-width: 600px) {
.page { padding: 20px; }
h1 { margin-bottom: 18px; }
.events { margin-top: 24px; line-height: 1.55; }
.when { margin-top: 20px; line-height: 1.65; }
.rsvp { margin-top: 26px; }
}
@media (max-width: 768px) {
nav {
padding: 16px 20px;
justify-content: space-between;
}
nav .nav-left {
position: static;
font-size: 16px;
flex-shrink: 0;
}
nav .nav-center {
display: none;
}
.menu-toggle {
display: block;
}
}
@media (max-width: 420px) {
nav .nav-left { font-size: 14px; }
}
/* ---- SOCIAL FOOTER ---- */
/* Static and last in the document, matching index.html. It was fixed to
the viewport while this page was exactly one screen tall; now that the
start list sits below the fold a fixed bar would ride on top of the
entries for the whole scroll. */
.site-footer {
padding: 8px 40px 34px;
display: flex;
justify-content: center;
}
/* Scroll affordance, same treatment as the homepage's. */
.scroll-cue {
position: absolute;
bottom: 32px;
left: 50%;
transform: translateX(-50%);
font-size: 10px;
letter-spacing: 0.4em;
font-weight: 600;
animation: bob 2.2s ease-in-out infinite;
}
@keyframes bob {
0%, 100% { transform: translate(-50%, 0); }
50% { transform: translate(-50%, 6px); }
}
/* ---- SOCIAL ICONS ---- */
.socials { display: flex; align-items: center; gap: 6px; }
.socials a {
display: inline-flex; align-items: center; justify-content: center;
padding: 11px; /* 18px icon + padding = 40px touch target */
}
.socials svg { width: 18px; height: 18px; fill: currentColor; display: block; }
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
</style>
</head>
<body>
<nav>
<a href="/" class="nav-left wordmark">TRACKRAT</a>
<div class="nav-center">
<a href="https://shop.trackratsprint.club" target="_blank" rel="noopener">[ SHOP ]</a>
<a href="/schedule">[ SCHEDULE ]</a>
<a href="/brand">[ BRAND ]</a>
<div class="nav-dropdown">
<button class="nav-dropdown-trigger" type="button" aria-haspopup="true" aria-expanded="false" aria-controls="clubMenu">
[ CLUB ]
<svg class="nav-dropdown-caret" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="6 9 12 15 18 9"></polyline></svg>
</button>
<div class="nav-dropdown-panel" id="clubMenu" role="menu">
<a href="/podium" role="menuitem">PODIUM</a>
<a href="/dashboard" role="menuitem">PERSONAL RECORDS</a>
<a href="/waiver" role="menuitem">WAIVER</a>
<a href="/dashboard#PARTNERS" role="menuitem">PARTNERS</a>
<a href="/dashboard#gallery" role="menuitem">GALLERY</a>
</div>
</div>
<div class="nav-dropdown">
<button class="nav-dropdown-trigger" type="button" aria-haspopup="true" aria-expanded="false" aria-controls="eventsMenu">
[ EVENTS ]
<svg class="nav-dropdown-caret" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="6 9 12 15 18 9"></polyline></svg>
</button>
<div class="nav-dropdown-panel" id="eventsMenu" role="menu">
<a href="/invitational" role="menuitem">INVITATIONAL</a>
<a href="/offtrack" role="menuitem">OFFTRACK</a>
</div>
</div>
</div>
<button class="menu-toggle" id="menuToggle" aria-label="Open menu" aria-expanded="false" aria-controls="mobileMenu">
<span></span>
<span></span>
<span></span>
</button>
</nav>
<!-- MOBILE MENU OVERLAY -->
<div class="mobile-menu" id="mobileMenu" aria-hidden="true">
<div class="mobile-menu-header">
<a href="/" class="mobile-menu-wordmark" aria-label="TRACKRAT — home">TRACKRAT</a>
<button class="mobile-menu-close" id="menuClose" type="button" aria-label="Close menu">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true">
<line x1="5" y1="5" x2="19" y2="19"></line>
<line x1="19" y1="5" x2="5" y2="19"></line>
</svg>
</button>
</div>
<div class="mobile-menu-links">
<a href="https://shop.trackratsprint.club" target="_blank" rel="noopener">SHOP</a>
<a href="/schedule">SCHEDULE</a>
<a href="/brand">BRAND</a>
<button class="mobile-accordion-trigger" type="button" aria-expanded="false" aria-controls="mobileClub">
CLUB
<svg class="acc-caret" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="6 9 12 15 18 9"></polyline></svg>
</button>
<div class="mobile-accordion-panel" id="mobileClub">
<a href="/podium">PODIUM</a>
<a href="/dashboard">PERSONAL RECORDS</a>
<a href="/waiver">WAIVER</a>
<a href="/dashboard#PARTNERS">PARTNERS</a>
<a href="/dashboard#gallery">GALLERY</a>
</div>
<button class="mobile-accordion-trigger" type="button" aria-expanded="false" aria-controls="mobileEvents">
EVENTS
<svg class="acc-caret" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="6 9 12 15 18 9"></polyline></svg>
</button>
<div class="mobile-accordion-panel" id="mobileEvents">
<a href="/invitational">INVITATIONAL</a>
<a href="/offtrack">OFFTRACK</a>
</div>
</div>
<div class="mobile-menu-footer">TRACKRAT SPRINT CLUB</div>
</div>
<main class="page">
<h1>
<!-- Real text for crawlers; the artwork below carries the visuals.
The two paths are inlined from /lockup-tri26.svg, which is the
canonical copy. If that file changes, re-inline both paths here:
print/invitational-sponsorship/build_onepager.py asserts these
match and will fail the PDF build if they drift. -->
<span class="sr-only">TRACKRAT Invitational 2026</span>
<svg class="lockup" viewBox="13.4 205.6 1100.9 478.3" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
<path fill="currentColor" d="M88.0123 223.6H60.7951L49.8418 286H29.8161L40.7694 223.6H13.4415L16.5394 206.34H91.1102L88.0123 223.6ZM120.13 206.34C128.538 206.34 134.513 208.184 138.053 211.872C140.709 214.675 142.036 218.215 142.036 222.493C142.036 223.968 141.889 225.517 141.594 227.14L140.045 235.77C139.16 240.564 137.611 244.437 135.398 247.387C133.259 250.337 130.862 252.439 128.206 253.693L138.274 286H115.925L106.632 256.238H99.7721L95.2359 286H73.9931L88.0443 206.34H120.13ZM113.159 223.6H104.861L101.985 242.851H109.73C113.639 242.851 116.442 241.929 118.138 240.085C119.835 238.167 120.683 235.659 120.683 232.561C120.683 226.587 118.175 223.6 113.159 223.6ZM173.817 286L174.481 268.63H156.004L150.583 286H129.451L157.885 206.34H194.396L194.839 286H173.817ZM169.281 225.702L160.541 253.804H175.034L176.251 225.702H169.281ZM221.129 287.549C210.582 287.549 203.28 285.262 199.223 280.689C196.42 277.444 195.019 272.908 195.019 267.081C195.019 264.573 195.277 261.881 195.793 259.004L200.329 233.557C203.648 214.896 215.634 205.565 236.287 205.565C244.843 205.565 251.334 207.409 255.759 211.097C260.185 214.712 262.398 219.69 262.398 226.034C262.398 228.984 261.955 231.934 261.07 234.885C260.259 237.761 259.447 239.9 258.636 241.302L257.419 243.515H237.836C240.27 240.712 241.487 236.729 241.487 231.566C241.487 228.836 240.786 226.697 239.385 225.148C237.983 223.526 235.918 222.714 233.189 222.714C225.739 222.714 221.314 226.845 219.912 235.106L216.04 257.455C215.671 259.373 215.487 261.254 215.487 263.098C215.487 267.966 218.4 270.4 224.227 270.4C231.234 270.4 235.439 266.454 236.84 258.561H256.755L256.202 261.77C253.252 278.956 241.561 287.549 221.129 287.549ZM329.828 206.34L304.492 246.502L315.777 286H294.755L286.457 256.791H277.717L272.517 286H252.602L266.653 206.34H286.568L280.704 239.532H287.785L308.807 206.34H329.828ZM359.175 206.34C367.584 206.34 373.558 208.184 377.099 211.872C379.754 214.675 381.082 218.215 381.082 222.493C381.082 223.968 380.934 225.517 380.639 227.14L379.09 235.77C378.205 240.564 376.656 244.437 374.443 247.387C372.304 250.337 369.907 252.439 367.252 253.693L377.32 286H354.971L345.677 256.238H338.817L334.281 286H313.039L327.09 206.34H359.175ZM352.205 223.6H343.907L341.03 242.851H348.775C352.684 242.851 355.487 241.929 357.184 240.085C358.88 238.167 359.728 235.659 359.728 232.561C359.728 226.587 357.22 223.6 352.205 223.6ZM412.863 286L413.527 268.63H395.05L389.628 286H368.496L396.931 206.34H433.442L433.884 286H412.863ZM408.326 225.702L399.586 253.804H414.08L415.297 225.702H408.326ZM504.694 223.6H477.477L466.524 286H446.498L457.451 223.6H430.123L433.221 206.34H507.792L504.694 223.6ZM539.05 206.34L525.11 286H505.084L519.135 206.34H539.05ZM604.025 206.34L590.084 286H570.058L556.118 242.408L548.594 286H528.569L542.62 206.34H563.199L576.918 247.055L584.11 206.34H604.025ZM626.292 266.638L647.314 206.34H668.889L638.684 286H603.28L602.394 206.34H624.08L623.748 266.638H626.292ZM687.082 206.34L673.141 286H653.116L667.167 206.34H687.082ZM755.486 223.6H728.269L717.316 286H697.29L708.243 223.6H680.915L684.013 206.34H758.584L755.486 223.6ZM774.48 286L775.144 268.63H756.667L751.246 286H730.114L758.548 206.34H795.059L795.501 286H774.48ZM769.944 225.702L761.203 253.804H775.697L776.914 225.702H769.944ZM866.311 223.6H839.094L828.141 286H808.115L819.068 223.6H791.74L794.838 206.34H869.409L866.311 223.6ZM886.258 206.34L872.318 286H852.292L866.343 206.34H886.258ZM918.816 205.565C936.592 205.565 945.48 212.831 945.48 227.361C945.48 229.795 945.221 232.414 944.705 235.217L940.833 257.344C939.062 267.597 935.227 275.194 929.326 280.136C923.425 285.078 915.128 287.549 904.432 287.549C893.737 287.549 886.288 285.078 882.083 280.136C879.207 276.743 877.768 272.059 877.768 266.085C877.768 263.43 878.063 260.516 878.654 257.344L882.526 235.217C885.993 215.449 898.089 205.565 918.816 205.565ZM907.42 270.4C911.108 270.4 914.058 269.441 916.271 267.523C918.484 265.606 920.033 262.065 920.918 256.902L924.679 235.659C924.901 234.184 925.011 232.856 925.011 231.676C925.011 225.702 921.987 222.714 915.939 222.714C908.342 222.862 903.805 227.177 902.33 235.659L898.569 256.902C898.274 258.746 898.126 260.664 898.126 262.655C898.126 267.818 901.224 270.4 907.42 270.4ZM1012.53 206.34L998.593 286H978.568L964.627 242.408L957.104 286H937.078L951.129 206.34H971.708L985.427 247.055L992.619 206.34H1012.53ZM1041.44 286L1042.1 268.63H1023.63L1018.21 286H997.074L1025.51 206.34H1062.02L1062.46 286H1041.44ZM1036.9 225.702L1028.16 253.804H1042.66L1043.87 225.702H1036.9ZM1111.21 286H1060.76L1074.81 206.34H1094.73L1083.77 268.74H1114.31L1111.21 286Z"/>
<path fill="currentColor" d="M134.228 460.798C134.228 470.255 135.37 477.266 137.652 481.831H51.0736C49.1171 474.005 48.1388 463.896 48.1388 451.504C48.1388 412.046 61.3457 380.578 87.7596 357.099C114.5 333.294 152.653 321.391 202.22 321.391C281.461 321.391 321.082 353.349 321.082 417.264C321.082 440.091 315.538 461.45 304.451 481.342C293.364 500.908 279.831 517.049 263.852 529.767C247.873 542.159 231.894 553.083 215.916 562.54C199.937 571.671 186.078 579.497 174.338 586.019C162.599 592.215 156.24 596.943 155.262 600.204V600.693H285.863L272.167 677H16.3443L22.7032 640.803C26.2903 620.259 34.1166 601.998 46.1822 586.019C58.2478 569.714 71.9438 556.996 87.2704 547.866C102.597 538.735 118.739 529.767 135.696 520.963C152.979 511.832 168.632 503.843 182.654 496.994C196.676 489.82 208.252 480.69 217.383 469.602C226.84 458.515 231.568 446.123 231.568 432.427C231.568 408.948 218.361 397.209 191.948 397.209C173.686 397.209 159.501 403.079 149.392 414.818C139.283 426.231 134.228 441.558 134.228 460.798ZM468.678 321.391C545.637 321.391 584.116 355.958 584.116 425.09C584.116 437.808 582.812 451.83 580.203 467.157L568.463 535.637C559.985 585.53 542.376 622.705 515.636 647.162C489.222 671.619 452.373 683.848 405.089 683.848C358.131 683.848 325.684 671.782 307.749 647.651C295.683 631.02 289.65 608.52 289.65 580.149C289.65 566.453 290.955 551.616 293.564 535.637L305.303 467.157C322.26 369.98 376.718 321.391 468.678 321.391ZM378.675 564.986C378.675 593.682 391.882 608.03 418.296 608.03C434.601 608.03 447.808 602.65 457.917 591.889C468.352 581.127 476.015 561.725 480.906 533.68L492.157 469.113C494.113 458.352 495.092 449.058 495.092 441.232C495.092 411.883 482.048 397.209 455.96 397.209C422.698 397.861 401.828 421.829 393.349 469.113L381.61 533.68C379.653 545.746 378.675 556.181 378.675 564.986ZM660.977 460.798C660.977 470.255 662.118 477.266 664.401 481.831H577.822C575.866 474.005 574.887 463.896 574.887 451.504C574.887 412.046 588.094 380.578 614.508 357.099C641.248 333.294 679.401 321.391 728.968 321.391C808.21 321.391 847.83 353.349 847.83 417.264C847.83 440.091 842.287 461.45 831.199 481.342C820.112 500.908 806.579 517.049 790.6 529.767C774.622 542.159 758.643 553.083 742.664 562.54C726.685 571.671 712.826 579.497 701.087 586.019C689.347 592.215 682.988 596.943 682.01 600.204V600.693H812.612L798.916 677H543.093L549.452 640.803C553.039 620.259 560.865 601.998 572.931 586.019C584.996 569.714 598.692 556.996 614.019 547.866C629.345 538.735 645.487 529.767 662.444 520.963C679.727 511.832 695.38 503.843 709.402 496.994C723.424 489.82 735.001 480.69 744.132 469.602C753.588 458.515 758.317 446.123 758.317 432.427C758.317 408.948 745.11 397.209 718.696 397.209C700.435 397.209 686.249 403.079 676.14 414.818C666.031 426.231 660.977 441.558 660.977 460.798ZM1001.3 470.581C1029.67 470.581 1050.86 478.081 1064.88 493.081C1079.23 507.756 1086.41 527.158 1086.41 551.29C1086.41 593.03 1073.69 625.64 1048.25 649.119C1022.82 672.272 984.991 683.848 934.772 683.848C884.553 683.848 850.476 673.739 832.541 653.521C820.149 639.173 813.953 619.118 813.953 593.356C813.953 582.269 815.095 570.366 817.377 557.649L837.432 445.145C852.107 362.643 904.282 321.391 993.959 321.391C1032.11 321.391 1060.97 328.239 1080.54 341.935C1100.1 355.305 1109.89 374.056 1109.89 398.187C1109.89 407.644 1108.42 416.775 1105.48 425.579C1102.88 434.058 1100.1 440.254 1097.17 444.167L1092.77 450.037H1006.19C1014.01 441.884 1017.93 431.775 1017.93 419.709C1017.93 404.709 1005.37 397.209 980.263 397.209C949.283 397.209 930.533 415.47 924.011 451.993L920.587 470.581H1001.3ZM959.719 536.615H909.337L906.891 550.8C905.586 558.953 904.934 567.105 904.934 575.258C904.934 597.106 917.652 608.03 943.088 608.03C978.632 608.03 996.404 594.334 996.404 566.942C996.404 546.724 984.176 536.615 959.719 536.615Z"/>
</svg>
</h1>
<p class="tagline">GREATNESS IS CALLING</p>
<p class="events">60M · 100M · 200M · 400M · 4×100 · 4×400</p>
<p class="when"><span class="w-seg">OCTOBER 18, 2026</span><span class="w-dot"> · </span><span class="w-seg w-time">9:00 – 11:00 AM</span><br><span class="w-seg">4401 TILLEY ST, AUSTIN, TX</span></p>
<a class="rsvp" href="https://events.sweatpals.com/ca3b412e" target="_blank" rel="noopener">RSVP ON SWEATPALS</a>
<a href="#entries" class="scroll-cue" aria-label="Scroll to the entry list">SCROLL ↓</a>
</main>
<!-- START LIST. Generated from the Sweatpals export by
scratchpad/gen-startlist.py; re-run it and replace this whole
section when entries change, and update the timestamp with it.
Names and events ONLY: the export also carries emails and phone
numbers and this repo is public. -->
<section class="startlist" id="entries" aria-labelledby="entries-heading">
<h2 class="sl-title" id="entries-heading">ATHLETES</h2>
<p class="sl-note">LAST UPDATED SEP 17, 2026 AT 8:19 AM CT<span class="sl-live" aria-hidden="true"></span></p>
<p class="sl-note sl-note-sm">HEATS ARE PROVISIONAL AND FINALIZED ON THE DAY OF THE RACE.</p>
<div class="sl-grid">
<div class="sl-race">
<h3>60M MEN’S <span class="sl-count">8 OF 12</span></h3>
<p class="sl-team">HEAT 1 <span class="sl-count">6 ATHLETES</span></p>
<ul>
<li>Andrew Gruninger</li>
<li>Ankith Harathi</li>
<li>Brandon Jones</li>
<li>Bryan Tran</li>
<li>Matthew Bacchus</li>
<li>Paris Desean Odem</li>
</ul>
<p class="sl-team">HEAT 2 <span class="sl-count">2 ATHLETES</span></p>
<ul>
<li>Rikin Tanna</li>
<li>Tony Byerly</li>
<li class="sl-open">OPEN</li>
<li class="sl-open">OPEN</li>
<li class="sl-open">OPEN</li>
<li class="sl-open">OPEN</li>
</ul>
</div>
<div class="sl-race">
<h3>60M WOMEN’S <span class="sl-count">9 OF 12</span></h3>
<p class="sl-team">HEAT 1 <span class="sl-count">6 ATHLETES</span></p>
<ul>
<li>Ashley Fairley</li>
<li>Emily Knippa</li>
<li>Kristy Harris</li>
<li>Lindsey Quebedeaux</li>
<li>Mandy Peña</li>
<li>Monica Kirkpatrick</li>
</ul>
<p class="sl-team">HEAT 2 <span class="sl-count">3 ATHLETES</span></p>
<ul>
<li>Natalie Woodham</li>
<li>Robyn Moss</li>
<li>Ximena Ramos</li>
<li class="sl-open">OPEN</li>
<li class="sl-open">OPEN</li>
<li class="sl-open">OPEN</li>
</ul>
</div>
<div class="sl-race">
<h3>100M MEN’S <span class="sl-count">9 OF 12</span></h3>
<p class="sl-team">HEAT 1 <span class="sl-count">6 ATHLETES</span></p>
<ul>
<li>Advay Ramesh</li>
<li>Andrew Gruninger</li>
<li>Brandon Jones</li>
<li>Bryan Tran</li>
<li>Paris Desean Odem</li>
<li>Rathu Jammula</li>
</ul>
<p class="sl-team">HEAT 2 <span class="sl-count">3 ATHLETES</span></p>
<ul>
<li>Rikin Tanna</li>
<li>Tony Byerly</li>
<li>Tyriq Valentine</li>
<li class="sl-open">OPEN</li>
<li class="sl-open">OPEN</li>
<li class="sl-open">OPEN</li>
</ul>
</div>
<div class="sl-race">
<h3>100M WOMEN’S <span class="sl-count is-low">2 SPOTS LEFT</span></h3>
<p class="sl-team">HEAT 1 <span class="sl-count">6 ATHLETES</span></p>
<ul>
<li>Ashley Fairley</li>
<li>Elif Yurtsever</li>
<li>Emily Knippa</li>
<li>Kristy Harris</li>
<li>Mandy Peña</li>
<li>Robyn Moss</li>
</ul>
<p class="sl-team">HEAT 2 <span class="sl-count">4 ATHLETES</span></p>
<ul>
<li>Sarah Boyd</li>
<li>Tori Hinojosa</li>
<li>Vanessa Bacorn</li>
<li>Ximena Ramos</li>
<li class="sl-open">OPEN</li>
<li class="sl-open">OPEN</li>
</ul>
</div>
<div class="sl-race">
<h3>200M MEN’S <span class="sl-count is-low">2 SPOTS LEFT</span></h3>
<p class="sl-team">HEAT 1 <span class="sl-count">6 ATHLETES</span></p>
<ul>
<li>Alex West</li>
<li>Andrew Gruninger</li>
<li>Brandon Jones</li>
<li>Jorge Munoz</li>
<li>Myles Cooper</li>
<li>O’Shea Wilson</li>
</ul>
<p class="sl-team">HEAT 2 <span class="sl-count">4 ATHLETES</span></p>
<ul>
<li>Rathu Jammula</li>
<li>Sebastian Koran</li>
<li>Tony Byerly</li>
<li>Tyriq Valentine</li>
<li class="sl-open">OPEN</li>
<li class="sl-open">OPEN</li>
</ul>
</div>
<div class="sl-race">
<h3>200M WOMEN’S <span class="sl-count is-low">1 SPOT LEFT</span></h3>
<p class="sl-team">HEAT 1 <span class="sl-count">6 ATHLETES</span></p>
<ul>
<li>Ashley Fairley</li>
<li>Clare Bramhall</li>
<li>Kristy Harris</li>
<li>Mandy Peña</li>
<li>Mia Constantin</li>
<li>Natalie Woodham</li>
</ul>
<p class="sl-team">HEAT 2 <span class="sl-count">5 ATHLETES</span></p>
<ul>
<li>Sarah Boyd</li>
<li>Tori Hinojosa</li>
<li>Vanessa Bacorn</li>
<li>Ximena Ramos</li>
<li>Zoe Wright</li>
<li class="sl-open">OPEN</li>
</ul>
</div>
<div class="sl-race">
<h3>400M MEN’S <span class="sl-count">8 OF 12</span></h3>
<p class="sl-team">HEAT 1 <span class="sl-count">6 ATHLETES</span></p>
<ul>
<li>Alex West</li>
<li>Bradley Gardner</li>
<li>Bryan Tran</li>
<li>Cory Mull</li>
<li>Derwood Kirby</li>
<li>Jayman Peterson</li>
</ul>
<p class="sl-team">HEAT 2 <span class="sl-count">2 ATHLETES</span></p>
<ul>
<li>Michael Brown</li>
<li>Nicolas Sawyer</li>
<li class="sl-open">OPEN</li>
<li class="sl-open">OPEN</li>
<li class="sl-open">OPEN</li>
<li class="sl-open">OPEN</li>
</ul>
</div>
<div class="sl-race">
<h3>400M WOMEN’S <span class="sl-count">9 OF 12</span></h3>
<p class="sl-team">HEAT 1 <span class="sl-count">6 ATHLETES</span></p>
<ul>
<li>Genesis Garay</li>
<li>Jaymie Ruskovich</li>
<li>Kelly Ferraro</li>
<li>Kristin Malone</li>
<li>L. Morgan Kelley</li>
<li>Lindsey Quebedeaux</li>
</ul>
<p class="sl-team">HEAT 2 <span class="sl-count">3 ATHLETES</span></p>
<ul>
<li>Mia Constantin</li>
<li>Sarah Boyd</li>
<li>Vanessa Bacorn</li>
<li class="sl-open">OPEN</li>
<li class="sl-open">OPEN</li>
<li class="sl-open">OPEN</li>
</ul>
</div>
<div class="sl-race">
<h3>4×100 MEN’S <span class="sl-count">2 OF 6</span></h3>
<p class="sl-team">BLIND HANDOFF</p>
<ul>
<li>Ankith Harathi</li>
<li>John Kim <span class="sl-flag">UNPAID</span></li>
<li>Rikin Tanna</li>
<li>TBD <span class="sl-flag">UNPAID</span></li>
</ul>
<p class="sl-team">GO MARK</p>
<ul>
<li>Matthew Bacchus</li>
<li>TBD</li>
<li>TBD</li>
<li>TBD</li>
</ul>
<p class="sl-team">LOOKING FOR A TEAM</p>
<ul>
<li>Advay Ramesh</li>
<li>Derwood Kirby</li>
<li>O’Shea Wilson</li>
</ul>
</div>
<div class="sl-race">
<h3>4×100 WOMEN’S <span class="sl-count">2 OF 6</span></h3>
<p class="sl-team">SHREVEPORT SPEED</p>
<ul>
<li>Lindsey Quebedeaux</li>
<li>Mandy Peña</li>
<li>Natalie Woodham</li>
<li>Ximena Ramos</li>
</ul>
<p class="sl-team">CLEAN EXCHANGE</p>
<ul>
<li>Aliyah Hale</li>
<li>Ashley Fairley</li>
<li>Kennedy</li>
<li>Zoe Wright</li>
</ul>
<p class="sl-team">LOOKING FOR A TEAM</p>
<ul>
<li>Emily Knippa</li>
<li>Monica Kirkpatrick</li>
</ul>
</div>
<div class="sl-race">
<h3>4×400 CO-ED <span class="sl-count is-low">2 TEAMS LEFT</span></h3>
<p class="sl-team">LACTIC</p>
<ul>
<li>Davicia Weekly</li>
<li>Isaiah Weekly</li>
<li>Myles Cooper</li>
<li>Vanessa Bacorn</li>
</ul>
<p class="sl-team">OXYGEN DEBT</p>
<ul>
<li>Dre Nuzum</li>
<li>Issac Nelson Jr</li>
<li>Jaymie Ruskovich</li>
<li>Zulema Nguyen</li>
</ul>
<p class="sl-team">REDLINE</p>
<ul>
<li>Jorge Munoz</li>
<li>TBD <span class="sl-flag">UNPAID</span></li>
<li>TBD <span class="sl-flag">UNPAID</span></li>
<li>TBD <span class="sl-flag">UNPAID</span></li>
</ul>
<p class="sl-team">NEGATIVE SPLIT</p>
<ul>
<li>Bryson Reynolds</li>
<li>Caleb Schnatz</li>
<li>Janine Dias</li>
<li>Zoe Herman</li>
</ul>
<p class="sl-team">LOOKING FOR A TEAM</p>
<ul>
<li>Derwood Kirby</li>
<li>Jayman Peterson</li>
<li>Rathu Jammula</li>
</ul>
</div>
</div>
</section>
<footer class="site-footer">
<div class="socials">
<a href="https://instagram.com/trackratsprintclub/" target="_blank" rel="noopener" aria-label="TRACKRAT on Instagram">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 0C8.74 0 8.333.015 7.053.072 5.775.132 4.905.333 4.14.63c-.789.306-1.459.717-2.126 1.384S.935 3.35.63 4.14C.333 4.905.131 5.775.072 7.053.012 8.333 0 8.74 0 12s.015 3.667.072 4.947c.06 1.277.261 2.148.558 2.913.306.788.717 1.459 1.384 2.126.667.666 1.336 1.079 2.126 1.384.766.296 1.636.499 2.913.558C8.333 23.988 8.74 24 12 24s3.667-.015 4.947-.072c1.277-.06 2.148-.262 2.913-.558.788-.306 1.459-.718 2.126-1.384.666-.667 1.079-1.335 1.384-2.126.296-.765.499-1.636.558-2.913.06-1.28.072-1.687.072-4.947s-.015-3.667-.072-4.947c-.06-1.277-.262-2.149-.558-2.913-.306-.789-.718-1.459-1.384-2.126C21.319 1.347 20.651.935 19.86.63c-.765-.297-1.636-.499-2.913-.558C15.667.012 15.26 0 12 0zm0 2.16c3.203 0 3.585.016 4.85.071 1.17.055 1.805.249 2.227.415.562.217.96.477 1.382.896.419.42.679.819.896 1.381.164.422.36 1.057.413 2.227.057 1.266.07 1.646.07 4.85s-.015 3.585-.074 4.85c-.061 1.17-.256 1.805-.421 2.227-.224.562-.479.96-.899 1.382-.419.419-.824.679-1.38.896-.42.164-1.065.36-2.235.413-1.274.057-1.649.07-4.859.07-3.211 0-3.586-.015-4.859-.074-1.171-.061-1.816-.256-2.236-.421-.569-.224-.96-.479-1.379-.899-.421-.419-.69-.824-.9-1.38-.165-.42-.359-1.065-.42-2.235-.045-1.26-.061-1.649-.061-4.844 0-3.196.016-3.586.061-4.861.061-1.17.255-1.814.42-2.234.21-.57.479-.96.9-1.381.419-.419.81-.689 1.379-.898.42-.166 1.051-.361 2.221-.421 1.275-.045 1.65-.06 4.859-.06l.045.03zm0 3.678c-3.405 0-6.162 2.76-6.162 6.162 0 3.405 2.76 6.162 6.162 6.162 3.405 0 6.162-2.76 6.162-6.162 0-3.405-2.76-6.162-6.162-6.162zM12 16c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4zm7.846-10.405c0 .795-.646 1.44-1.44 1.44-.795 0-1.44-.646-1.44-1.44 0-.794.646-1.439 1.44-1.439.793-.001 1.44.645 1.44 1.439z"/></svg>
</a>
<a href="https://discord.gg/vrfmSKJX29" target="_blank" rel="noopener" aria-label="TRACKRAT on Discord">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189z"/></svg>
</a>
<a href="https://strava.app.link/gsKU2Bt654b" target="_blank" rel="noopener" aria-label="TRACKRAT on Strava">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M15.387 17.944l-2.089-4.116h-3.065L15.387 24l5.15-10.172h-3.066m-7.008-5.599l2.836 5.598h4.172L10.463 0l-7 13.828h4.169"/></svg>
</a>
<a href="https://www.tiktok.com/@trackratsprintclub" target="_blank" rel="noopener" aria-label="TRACKRAT on TikTok">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12.525.02c1.31-.02 2.61-.01 3.91-.02.08 1.53.63 3.09 1.75 4.17 1.12 1.11 2.7 1.62 4.24 1.79v4.03c-1.44-.05-2.89-.35-4.2-.97-.57-.26-1.1-.59-1.62-.93-.01 2.92.01 5.84-.02 8.75-.08 1.4-.54 2.79-1.35 3.94-1.31 1.92-3.58 3.17-5.91 3.21-1.43.08-2.86-.31-4.08-1.03-2.02-1.19-3.44-3.37-3.65-5.71-.02-.5-.03-1-.01-1.49.18-1.9 1.12-3.72 2.58-4.96 1.66-1.44 3.98-2.13 6.15-1.72.02 1.48-.04 2.96-.04 4.44-.99-.32-2.15-.23-3.02.37-.63.41-1.11 1.04-1.36 1.75-.21.51-.15 1.07-.14 1.61.24 1.64 1.82 3.02 3.5 2.87 1.12-.01 2.19-.66 2.77-1.61.19-.33.4-.67.41-1.06.1-1.79.06-3.57.07-5.36.01-4.03-.01-8.05.02-12.07z"/></svg>
</a>
<a href="https://maps.app.goo.gl/yoBk8ZwNajAHBNzt6" target="_blank" rel="noopener" aria-label="TRACKRAT on Google">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133-1.147 1.147-2.933 2.4-6.053 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z"/></svg>
</a>
<a href="https://github.com/zainbacchus/TRACKRAT" target="_blank" rel="noopener" aria-label="TRACKRAT on GitHub">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>
</a>
</div>
</footer>
<!-- Structured data: the Invitational as a schema.org Event. RSVP is live
on Sweatpals (offers.url below); startDate/endDate carry the announced
9:00–11:00 AM CDT window. -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Event",
"name": "2026 TRACKRAT Invitational",
"description": "The 2026 TRACKRAT Invitational, a community sprint meet hosted by TRACKRAT in Austin, TX. Events: 60m, 100m, 200m, 400m, 4x100 relay and 4x400 relay. RSVP open on Sweatpals.",
"startDate": "2026-10-18T09:00:00-05:00",
"endDate": "2026-10-18T11:00:00-05:00",
"eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
"eventStatus": "https://schema.org/EventScheduled",
"image": "https://www.trackratsprint.club/og-invitational.png",
"url": "https://www.trackratsprint.club/invitational",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"url": "https://events.sweatpals.com/ca3b412e"
},
"location": {
"@type": "Place",
"name": "4401 Tilley St",
"geo": { "@type": "GeoCoordinates", "latitude": 30.29591, "longitude": -97.69453 },
"address": {
"@type": "PostalAddress",
"streetAddress": "4401 Tilley St",
"addressLocality": "Austin",
"addressRegion": "TX",
"postalCode": "78723",
"addressCountry": "US"
}
},
"organizer": {
"@type": "SportsClub",
"@id": "https://www.trackratsprint.club/#club",
"name": "TRACKRAT Sprint Club",
"alternateName": "TRACKRAT",
"url": "https://www.trackratsprint.club/"
}
}
</script>
<script>
const menuToggle = document.getElementById('menuToggle');
const mobileMenu = document.getElementById('mobileMenu');
const menuClose = document.getElementById('menuClose');
function closeMenu() {
menuToggle.classList.remove('is-open');
mobileMenu.classList.remove('is-open');
document.body.classList.remove('menu-open');
menuToggle.setAttribute('aria-expanded', 'false');
mobileMenu.setAttribute('aria-hidden', 'true');
menuToggle.focus();
}
function openMenu() {
menuToggle.classList.add('is-open');
mobileMenu.classList.add('is-open');
document.body.classList.add('menu-open');
menuToggle.setAttribute('aria-expanded', 'true');
mobileMenu.setAttribute('aria-hidden', 'false');
menuClose.focus();
}
menuToggle.addEventListener('click', openMenu);
menuClose.addEventListener('click', closeMenu);
mobileMenu.querySelectorAll('a').forEach(link => link.addEventListener('click', closeMenu));
// Desktop dropdowns (Club + Events) — hover/focus is CSS; this adds click + a11y.
const navDropdowns = Array.from(document.querySelectorAll('.nav-dropdown'));
function closeNavDropdowns() {
navDropdowns.forEach(dd => {
dd.classList.remove('is-open');
dd.querySelector('.nav-dropdown-trigger').setAttribute('aria-expanded', 'false');
});
}
navDropdowns.forEach(dd => {
const trigger = dd.querySelector('.nav-dropdown-trigger');
trigger.addEventListener('click', e => {