From a7fdab4352998fedfc151ea55bf81e3e818a44ce Mon Sep 17 00:00:00 2001 From: Bernard Siebens Date: Sat, 22 Aug 2026 19:24:11 +0200 Subject: [PATCH] Show blocked sign-ups on mobile instead of silently hiding the event A member excluded from an event's Attendance sync by an open onboarding requirement (events.services.attendance.effective_members) previously just never saw that event anywhere -- no row, no explanation. Two new read-side functions mirror that exclusion instead of hiding it: club.services. onboarding.open_requirements_blocking (per-member, "why") and events. services.attendance.blocked_upcoming_events_for_member (which of their upcoming events are affected). The Calendar now shows those events as a distinct muted "Blocked" row naming the outstanding requirement, and the event detail page shows a "Can't sign up yet" card for the same reason -- no RSVP buttons, no lineup/ referee actions, just the explanation. Write-side blocking (who actually gets an Attendance row, who a coach can select) is untouched. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01ECGMEwrc2k4D8VQuwjstj9 --- club/services/onboarding.py | 22 +++++++ club/tests.py | 29 +++++++++ events/services/__init__.py | 2 + events/services/attendance.py | 47 +++++++++++++- events/tests.py | 63 +++++++++++++++++++ .../mobile/_calendar_blocked_row.html | 40 ++++++++++++ mobile/templates/mobile/calendar.html | 28 +++++---- mobile/templates/mobile/event_detail.html | 24 ++++++- mobile/tests.py | 59 +++++++++++++++++ mobile/views.py | 23 ++++++- static/css/mobile.css | 2 +- 11 files changed, 324 insertions(+), 15 deletions(-) create mode 100644 mobile/templates/mobile/_calendar_blocked_row.html diff --git a/club/services/onboarding.py b/club/services/onboarding.py index 891386f..195199d 100644 --- a/club/services/onboarding.py +++ b/club/services/onboarding.py @@ -172,6 +172,28 @@ def blocked_member_ids_for_event(club, season, event_kind) -> set: return blocked_member_ids +def open_requirements_blocking(member, club, season, event_kind) -> list: + """The specific, still-open `OnboardingRequirement`s blocking `member` from + `event_kind` events this season -- the per-member, explain-*why* mirror of + `blocked_member_ids_for_event`'s bulk set. Built for the member-facing "you + can't sign up for this yet" card (mobile app): unlike that function, this + one is meant to be called once for a person looking at one event, not once + per event for a whole club, so the per-member cost here is fine. + + Empty (never blocked) for a member with no current-season ClubMembership.MEMBER + row -- same "nothing to check" reasoning as blocked_member_ids_for_event's own.""" + membership = ClubMembership.objects.filter(club=club, season=season, member=member, kind=ClubMembership.Kind.MEMBER).first() + if membership is None: + return [] + + blocking = [requirement for requirement in OnboardingRequirement.objects.filter(club=club, is_active=True) if event_kind in requirement.blocked_event_kinds] + if not blocking: + return [] + + resolved_ids = set(MemberRequirementStatus.objects.filter(membership=membership, requirement__in=blocking).filter(_RESOLVED).values_list("requirement_id", flat=True)) + return [requirement for requirement in blocking if requirement.pk not in resolved_ids] + + #: Fee states "clean" enough to activate on -- PARTIALLY_PAID/UNPAID never are. _CLEAN_FEE_STATUSES = (ClubMembership.FeeStatus.PAID, ClubMembership.FeeStatus.WAIVED) diff --git a/club/tests.py b/club/tests.py index 2f47d5b..5bb27e0 100644 --- a/club/tests.py +++ b/club/tests.py @@ -51,6 +51,7 @@ from .services.onboarding import ( mark_bypassed, mark_complete, mark_incomplete, + open_requirements_blocking, ) from .services.seasons import _initial_season_start, _season_end, generate_seasons, resync_seasons from .tenancy import ( @@ -2268,6 +2269,34 @@ class OnboardingRequirementTests(TestCase): self.assertEqual(blocked_member_ids_for_event(self.club, self.season, "game"), set()) + # --- open_requirements_blocking (per-member "why can't I sign up" mirror) --- + def test_open_requirements_blocking_is_empty_when_nothing_is_configured_to_block(self): + self.assertEqual(open_requirements_blocking(self.member, self.club, self.season, "game"), []) + + def test_open_requirements_blocking_returns_the_open_requirement(self): + self.medical.blocked_event_kinds = ["game"] + self.medical.save() + + self.assertEqual(open_requirements_blocking(self.member, self.club, self.season, "game"), [self.medical]) + + def test_open_requirements_blocking_is_kind_specific(self): + self.medical.blocked_event_kinds = ["game"] + self.medical.save() + + self.assertEqual(open_requirements_blocking(self.member, self.club, self.season, "training"), []) + + def test_open_requirements_blocking_excludes_a_resolved_requirement(self): + self.medical.blocked_event_kinds = ["game"] + self.medical.save() + mark_complete(self.membership, self.medical, user=self.staff) + + self.assertEqual(open_requirements_blocking(self.member, self.club, self.season, "game"), []) + + def test_open_requirements_blocking_is_empty_with_no_club_membership(self): + stranger = Member.objects.create(first_name="No", last_name="Membership") + + self.assertEqual(open_requirements_blocking(stranger, self.club, self.season, "game"), []) + # --- approve_all_clean --- def test_approve_all_clean_activates_a_pending_paid_up_fully_checked_member(self): pending = ClubMembership.objects.create(club=self.club, member=Member.objects.create(first_name="Tom", last_name="Roe"), season=self.season, status=ClubMembership.StatusChoices.PENDING, fee_status=ClubMembership.FeeStatus.PAID) diff --git a/events/services/__init__.py b/events/services/__init__.py index 5222ddb..4f52a12 100644 --- a/events/services/__init__.py +++ b/events/services/__init__.py @@ -1,4 +1,5 @@ from .attendance import ( + blocked_upcoming_events_for_member, effective_members, notify_newly_invited, player_attendance_rankings, @@ -20,6 +21,7 @@ from .recurrence import ( __all__ = [ "apply_template", + "blocked_upcoming_events_for_member", "cancel_occurrence", "detach_occurrence", "effective_members", diff --git a/events/services/attendance.py b/events/services/attendance.py index eac4900..0dddc00 100644 --- a/events/services/attendance.py +++ b/events/services/attendance.py @@ -22,7 +22,8 @@ from django.utils.translation import gettext_lazy as _ from django.utils.translation import ngettext from club.models import ClubMembership, Season -from club.services.onboarding import blocked_member_ids_for_event +from club.services.access import current_season +from club.services.onboarding import blocked_member_ids_for_event, open_requirements_blocking from events.models import Attendance, Event from members.models import Member from notifications.services import notify_members @@ -88,6 +89,50 @@ def sync_event_attendances(event): event.attendances.filter(member_id__in=to_remove).delete() +def blocked_upcoming_events_for_member(member, club): + """Upcoming events ``member`` would normally see (via a team roster or a + group they're in) but has no ``Attendance`` row for, because an open + onboarding requirement blocks that event's kind -- the read side of + ``effective_members()``'s own exclusion, which otherwise makes the event + vanish for them with no explanation at all. Built for the member-facing + "why can't I sign up" card (mobile/views.py) rather than the event simply + never appearing. + + Returns ``[(event, [blocking OnboardingRequirement, ...]), ...]``, soonest + first. A member explicitly ``invited_members`` on an event never appears + here -- that bypasses blocking entirely (see ``effective_members``'s own + docstring), so they already have a normal Attendance row for it.""" + season = current_season(club) + if season is None: + return [] + + team_ids = list(TeamMembership.objects.filter(member=member, season=season).values_list("team_id", flat=True)) + group_ids = list(member.group_memberships.values_list("group_id", flat=True)) + if not team_ids and not group_ids: + return [] + + candidates = list( + Event.objects.filter(club=club, cancelled=False, start__gte=timezone.now()) + .filter(Q(teams__id__in=team_ids) | Q(groups__id__in=group_ids)) + .exclude(excluded_members=member) + .distinct() + .order_by("start") + ) + if not candidates: + return [] + + existing_ids = set(Attendance.objects.filter(member=member, event__in=candidates).values_list("event_id", flat=True)) + + results = [] + for event in candidates: + if event.pk in existing_ids: + continue + requirements = open_requirements_blocking(member, club, season, event.kind) + if requirements: + results.append((event, requirements)) + return results + + def notify_newly_invited(member, *, club, events): """One notification (push+email), not one per event -- used when a roster/group change (events/signals.py's sync_on_roster_change/ diff --git a/events/tests.py b/events/tests.py index 7d77726..fe90025 100644 --- a/events/tests.py +++ b/events/tests.py @@ -21,6 +21,7 @@ from teams.models import Position, RefereeLevel, RefereeProfile, StaffAssignment from .admin import EventAdminForm from .models import Attendance, Competition, Event, EventReferee, EventSeries, Lineup, LineupSelection, Location, Opponent, RefereeSignup from .services import ( + blocked_upcoming_events_for_member, cancel_occurrence, detach_occurrence, effective_members, @@ -337,6 +338,68 @@ class EffectiveMembersTests(EventsTestBase): self.assertEqual(self.attendee_ids(event), {self.alice.id, self.bob.id}) + # --- blocked_upcoming_events_for_member (the read-side "why can't I sign up" mirror) --- + + def test_blocked_event_is_reported_with_its_blocking_requirement(self): + self.make_membership(self.alice) + requirement = OnboardingRequirement.objects.create(club=self.club, name="Medical certificate", blocked_event_kinds=["game"]) + event = self.make_event(kind=Event.EventKind.GAME) + event.teams.set([self.team]) + + results = blocked_upcoming_events_for_member(self.alice, self.club) + + self.assertEqual(len(results), 1) + blocked_event, requirements = results[0] + self.assertEqual(blocked_event, event) + self.assertEqual(requirements, [requirement]) + + def test_an_unblocked_member_reports_nothing(self): + # Bob has no ClubMembership row at all in the base fixture -- nothing + # for open_requirements_blocking to find, same as blocked_member_ids_ + # for_event's own "no club membership" case above. + OnboardingRequirement.objects.create(club=self.club, name="Medical certificate", blocked_event_kinds=["game"]) + event = self.make_event(kind=Event.EventKind.GAME) + event.teams.set([self.team]) + + self.assertEqual(blocked_upcoming_events_for_member(self.bob, self.club), []) + + def test_a_kind_the_requirement_does_not_block_reports_nothing(self): + self.make_membership(self.alice) + OnboardingRequirement.objects.create(club=self.club, name="Medical certificate", blocked_event_kinds=["game"]) + event = self.make_event(kind=Event.EventKind.TRAINING) + event.teams.set([self.team]) + + self.assertEqual(blocked_upcoming_events_for_member(self.alice, self.club), []) + + def test_a_resolved_requirement_reports_nothing(self): + membership = self.make_membership(self.alice) + staff = get_user_model().objects.create_user(email="staff2@example.com", password="pw-secret-123") + requirement = OnboardingRequirement.objects.create(club=self.club, name="Medical certificate", blocked_event_kinds=["game"]) + mark_complete(membership, requirement, user=staff) + event = self.make_event(kind=Event.EventKind.GAME) + event.teams.set([self.team]) + + self.assertEqual(blocked_upcoming_events_for_member(self.alice, self.club), []) + + def test_an_explicit_invite_is_not_reported_as_blocked(self): + # invited_members bypasses the block entirely -- Alice already has a + # normal Attendance row for this event, so there's nothing to explain. + self.make_membership(self.alice) + OnboardingRequirement.objects.create(club=self.club, name="Medical certificate", blocked_event_kinds=["game"]) + event = self.make_event(kind=Event.EventKind.GAME) + event.teams.set([self.team]) + event.invited_members.set([self.alice]) + + self.assertEqual(blocked_upcoming_events_for_member(self.alice, self.club), []) + + def test_a_past_blocked_event_is_not_reported(self): + self.make_membership(self.alice) + OnboardingRequirement.objects.create(club=self.club, name="Medical certificate", blocked_event_kinds=["game"]) + event = self.make_event(kind=Event.EventKind.GAME, start=timezone.now() - timedelta(days=1)) + event.teams.set([self.team]) + + self.assertEqual(blocked_upcoming_events_for_member(self.alice, self.club), []) + class AttendanceSyncTests(EventsTestBase): def test_setting_teams_creates_attendance_for_roster(self): diff --git a/mobile/templates/mobile/_calendar_blocked_row.html b/mobile/templates/mobile/_calendar_blocked_row.html new file mode 100644 index 0000000..f25e008 --- /dev/null +++ b/mobile/templates/mobile/_calendar_blocked_row.html @@ -0,0 +1,40 @@ +{% load i18n lucide %} +{% comment %} + One "can't sign up yet" row on M3's Calendar -- a game/practice a managed + person would normally be invited to (via their team/group), but isn't, + because an open onboarding requirement blocks that event's kind (club. + services.onboarding.open_requirements_blocking). Without this the event + would just silently never appear anywhere (events.services.attendance. + effective_members already excludes it from Attendance sync) -- shown + instead, muted, with which requirement is in the way, same "explain, don't + just hide" reasoning as the referee row's own distinct treatment. + + Expects ``row`` ({event, blocked_requirements, blocked_member}) in scope -- + blocked_member is only set once there's more than one managed person to + tell apart, same rule mobile/_calendar_row.html's own ``member`` uses. + No action here at all, not even a link styled as one -- there's nothing + to tap into doing, just an explanation, so it links straight to the event + like every other row rather than growing its own inert button. +{% endcomment %} + +
+
{{ row.event.start|date:"D" }}
+
{{ row.event.start|date:"d" }}
+
+
+
+
+ {% lucide "lock" size=13 stroke_width=2.4 class="shrink-0 text-dim" %} + {{ row.event.title }} +
+
+ {{ row.event.start|date:"H:i" }} + {% if row.blocked_member %}· {{ row.blocked_member.first_name }}{% endif %} + {% for team in row.event.teams.all %}· {{ team.name }}{% endfor %} +
+
+ {% blocktrans with name=row.blocked_requirements.0.name %}Complete “{{ name }}” to sign up{% endblocktrans %} +
+
+ {% trans "Blocked" %} +
diff --git a/mobile/templates/mobile/calendar.html b/mobile/templates/mobile/calendar.html index 79a4ca3..0a2d8c4 100644 --- a/mobile/templates/mobile/calendar.html +++ b/mobile/templates/mobile/calendar.html @@ -8,14 +8,20 @@ docstring -- later_months is a list of {month_start, rows}). No person switcher and no club-wide toggle here -- always every event self.managed_people is invited to, plus (merged into the same - chronological list, own accent colour) any home game self.me is - eligible to referee -- see mobile/_calendar_referee_row.html. A real, - working ?kind= - filter (All/Games/Practices) stands in for the design mock's "Games only" - pill; its List/Month toggle isn't reproduced -- that's a second view - mode, not a filter. -mx-4 (on the row groups only, not this filter row) - breaks the rows out of base.html's shared page padding so they run - edge-to-edge, matching the design canvas's own M3 markup. + chronological list, each its own accent colour/look): + - any home game a managed person is eligible to referee -- see + mobile/_calendar_referee_row.html; + - any event a managed person would normally be invited to but can't sign + up for yet, because an open onboarding requirement blocks it -- see + mobile/_calendar_blocked_row.html. Without this row it would just + silently never appear (events.services.attendance.effective_members + already excludes it), with no explanation at all. + A real, working ?kind= filter (All/Games/Practices) stands in for the + design mock's "Games only" pill; its List/Month toggle isn't reproduced -- + that's a second view mode, not a filter. -mx-4 (on the row groups only, + not this filter row) breaks the rows out of base.html's shared page + padding so they run edge-to-edge, matching the design canvas's own M3 + markup. {% endcomment %} {% block header_extra %} @@ -63,7 +69,7 @@
{% trans "This week" %}
{% for row in this_week %} - {% if row.referee_signup %}{% include "mobile/_calendar_referee_row.html" %}{% else %}{% include "mobile/_calendar_row.html" %}{% endif %} + {% if row.blocked_requirements %}{% include "mobile/_calendar_blocked_row.html" %}{% elif row.referee_signup %}{% include "mobile/_calendar_referee_row.html" %}{% else %}{% include "mobile/_calendar_row.html" %}{% endif %} {% endfor %}
@@ -74,7 +80,7 @@
{% trans "Next week" %}
{% for row in next_week %} - {% if row.referee_signup %}{% include "mobile/_calendar_referee_row.html" %}{% else %}{% include "mobile/_calendar_row.html" %}{% endif %} + {% if row.blocked_requirements %}{% include "mobile/_calendar_blocked_row.html" %}{% elif row.referee_signup %}{% include "mobile/_calendar_referee_row.html" %}{% else %}{% include "mobile/_calendar_row.html" %}{% endif %} {% endfor %}
@@ -85,7 +91,7 @@
{{ month.month_start|date:"F Y" }}
{% for row in month.rows %} - {% if row.referee_signup %}{% include "mobile/_calendar_referee_row.html" %}{% else %}{% include "mobile/_calendar_row.html" %}{% endif %} + {% if row.blocked_requirements %}{% include "mobile/_calendar_blocked_row.html" %}{% elif row.referee_signup %}{% include "mobile/_calendar_referee_row.html" %}{% else %}{% include "mobile/_calendar_row.html" %}{% endif %} {% endfor %}
diff --git a/mobile/templates/mobile/event_detail.html b/mobile/templates/mobile/event_detail.html index 9dc052b..f6cf2a1 100644 --- a/mobile/templates/mobile/event_detail.html +++ b/mobile/templates/mobile/event_detail.html @@ -212,6 +212,28 @@ {% endif %} + {% if blocked_signups %} +
+ {% trans "Can't sign up yet" %} +
+ {% for row in blocked_signups %} + {% if not forloop.first %}
{% endif %} +
+ {% include "mobile/_avatar.html" with person=row.member size_class="h-8 w-8" %} +
+
{{ row.member.get_full_name }}
+
+ {% for requirement in row.requirements %} + {% blocktrans with name=requirement.name %}Complete “{{ name }}”{% endblocktrans %}{% if not forloop.last %}, {% endif %} + {% endfor %} +
+
+
+ {% endfor %} +
+
+ {% endif %} + {% if squad_summary %}
@@ -231,7 +253,7 @@
{% endif %} - {% if not your_answers and not squad_summary and not lineup and not referee_signups %} + {% if not your_answers and not squad_summary and not lineup and not referee_signups and not blocked_signups %}

{% trans "No one you manage is invited to this event." %}

diff --git a/mobile/tests.py b/mobile/tests.py index 8806e27..061db72 100644 --- a/mobile/tests.py +++ b/mobile/tests.py @@ -1007,6 +1007,39 @@ class CalendarViewTests(TestCase): self.assertIn(event, self._events_in_context(response)) + def test_a_blocked_event_shows_up_with_an_explanation_instead_of_disappearing(self): + team = Team.objects.create(club=self.club, name="U16", short_name="U16") + position = Position.objects.create(club=self.club, name="Forward", short_name="F") + TeamMembership.objects.create(team=team, member=self.member, season=self.season, position=position) + OnboardingRequirement.objects.create(club=self.club, name="Medical certificate", blocked_event_kinds=["game"]) + event = self.make_event(title="Cup game", kind=Event.EventKind.GAME) + event.teams.add(team) + self.client.force_login(self.user) + + response = self._get() + + self.assertContains(response, "Cup game") + self.assertContains(response, "Blocked") + self.assertContains(response, "Medical certificate") + self.assertFalse(Attendance.objects.filter(event=event, member=self.member).exists()) + + def test_a_resolved_requirement_shows_the_event_normally_not_blocked(self): + team = Team.objects.create(club=self.club, name="U16", short_name="U16") + position = Position.objects.create(club=self.club, name="Forward", short_name="F") + TeamMembership.objects.create(team=team, member=self.member, season=self.season, position=position) + requirement = OnboardingRequirement.objects.create(club=self.club, name="Medical certificate", blocked_event_kinds=["game"]) + club_membership = ClubMembership.objects.get(club=self.club, member=self.member, season=self.season) + MemberRequirementStatus.objects.create(membership=club_membership, requirement=requirement, is_complete=True) + event = self.make_event(title="Cup game", kind=Event.EventKind.GAME) + event.teams.add(team) + self.client.force_login(self.user) + + response = self._get() + + self.assertContains(response, "Cup game") + self.assertNotContains(response, "Blocked") + self.assertTrue(Attendance.objects.filter(event=event, member=self.member).exists()) + @override_settings(ROSTERCHIEF_BASE_DOMAIN="rosterchief.app", ALLOWED_HOSTS=["rosterchief.app", "ajax-united.rosterchief.app", "testserver"]) class CalendarRefereeSignupTests(TestCase): @@ -1338,6 +1371,32 @@ class EventDetailScreenTests(TestCase): self.assertNotContains(response, 'name="status" value="dropout"') + def test_blocked_signup_shows_why_instead_of_disappearing(self): + OnboardingRequirement.objects.create(club=self.club, name="Medical certificate", blocked_event_kinds=["game"]) + game = Event.objects.create(club=self.club, title="Cup game", kind=Event.EventKind.GAME, start=timezone.now() + datetime.timedelta(days=7)) + game.teams.add(self.team) + self.client.force_login(self.user) + + response = self._get(game) + + self.assertEqual(len(response.context["blocked_signups"]), 1) + self.assertContains(response, "Can't sign up yet") + self.assertContains(response, "Medical certificate") + self.assertFalse(Attendance.objects.filter(event=game, member=self.member).exists()) + + def test_no_blocked_card_once_the_requirement_is_resolved(self): + requirement = OnboardingRequirement.objects.create(club=self.club, name="Medical certificate", blocked_event_kinds=["game"]) + club_membership = ClubMembership.objects.get(club=self.club, member=self.member, season=self.season) + MemberRequirementStatus.objects.create(membership=club_membership, requirement=requirement, is_complete=True) + game = Event.objects.create(club=self.club, title="Cup game", kind=Event.EventKind.GAME, start=timezone.now() + datetime.timedelta(days=7)) + game.teams.add(self.team) + self.client.force_login(self.user) + + response = self._get(game) + + self.assertEqual(response.context["blocked_signups"], []) + self.assertNotContains(response, "Can't sign up yet") + def test_no_referee_card_when_not_invited(self): self.client.force_login(self.user) diff --git a/mobile/views.py b/mobile/views.py index 86055b7..fc25699 100644 --- a/mobile/views.py +++ b/mobile/views.py @@ -24,10 +24,11 @@ from django.views.generic import TemplateView from club.models import ClubMembership from club.services.access import current_season, has_management_access, teams_managed_by from club.services.fees import open_dues_rows -from club.services.onboarding import checklist_for +from club.services.onboarding import checklist_for, open_requirements_blocking from club.services.sponsors import active_sponsors from controlpanel.messages import notify from events.models import Attendance, Event, Lineup, RefereeSignup +from events.services.attendance import blocked_upcoming_events_for_member from events.services.calendar import week_bounds from events.services.lineup import notify_dropout, selected_members_by_position from events.services.referees import RefereeAssignmentError, accept_referee_signup, decline_referee_signup @@ -373,6 +374,16 @@ class CalendarView(PersonScopeMixin, LoginRequiredMixin, TemplateView): ) rows += [{"event": signup.event, "referee_signup": signup, "referee_member": signup.member if show_member else None} for signup in signups] + # A blocked event would otherwise just silently never appear (effective_ + # members() already excludes it from Attendance sync) -- shown here + # instead, with which onboarding requirement is in the way, rather than + # a managed person's game quietly vanishing with no explanation at all. + for person in self.managed_people: + for event, requirements in blocked_upcoming_events_for_member(person, self.request.club): + if kind_filter in self.KIND_FILTERS and event.kind != self.KIND_FILTERS[kind_filter]: + continue + rows.append({"event": event, "blocked_requirements": requirements, "blocked_member": person if show_member else None}) + rows.sort(key=lambda row: row["event"].start) this_week, next_week, later_rows = [], [], [] @@ -477,6 +488,7 @@ class EventDetailView(PersonScopeMixin, LoginRequiredMixin, TemplateView): referee_signups = list(RefereeSignup.objects.filter(event=event, member__in=self.managed_people, status__in=[RefereeSignup.Status.INVITED, RefereeSignup.Status.ACCEPTED]).select_related("member")) your_answers = [] + blocked_signups = [] if self.managed_people: managed_ids = [person.pk for person in self.managed_people] attendances_by_member = {attendance.member_id: attendance for attendance in Attendance.objects.filter(event=event, member_id__in=managed_ids).select_related("member")} @@ -491,6 +503,14 @@ class EventDetailView(PersonScopeMixin, LoginRequiredMixin, TemplateView): for person in self.managed_people: attendance = attendances_by_member.get(person.pk) if attendance is None: + # No Attendance row at all -- either genuinely not invited, or + # excluded by an open onboarding requirement (events.services. + # attendance.effective_members). The latter still deserves an + # explanation here rather than just silently not showing up. + if season is not None: + requirements = open_requirements_blocking(person, self.request.club, season, event.kind) + if requirements: + blocked_signups.append({"member": person, "requirements": requirements}) continue your_answers.append({"member": person, "attendance": attendance, "membership": memberships_by_member.get(person.pk)}) @@ -522,6 +542,7 @@ class EventDetailView(PersonScopeMixin, LoginRequiredMixin, TemplateView): lineup_categories=lineup_categories, referee_signups=referee_signups, your_answers=your_answers, + blocked_signups=blocked_signups, squad_summary=squad_summary, **kwargs, ) diff --git a/static/css/mobile.css b/static/css/mobile.css index 4133df7..007008e 100644 --- a/static/css/mobile.css +++ b/static/css/mobile.css @@ -1,2 +1,2 @@ /*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--font-sans:"Barlow", ui-sans-serif, system-ui, sans-serif;--font-mono:"IBM Plex Mono", ui-monospace, SFMono-Regular, monospace;--color-sky-500:oklch(68.5% .169 237.323);--color-gray-500:oklch(55.1% .027 264.364);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-wide:.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--font-display:"Barlow Condensed", ui-sans-serif, system-ui, sans-serif;--color-ink:#0b1220;--color-navy:var(--tenant-navy,#101e36);--color-steel:#1b2b47;--color-hairline:#1e2b42;--color-paper:#f4f5f7;--color-line:#e3e6eb;--color-rule:#eef0f3;--color-edge:#d6dae1;--color-stroke:#c9cfd8;--color-muted:#6c7787;--color-dim:#8b95a4;--color-slate:#3a4658;--color-on-dark:#93a0b4;--color-on-dark-dim:#7c8aa0;--color-on-dark-faint:#5c6b85;--color-club:var(--tenant-club,#e4002b);--color-club-dark:var(--tenant-club-dark,#b00021);--color-club-content:var(--tenant-club-content,#fff);--color-ok:#14a05a;--color-ok-bg:#e6f6ee;--color-ok-border:#bfe7d3;--color-ok-text:#0c7a43;--color-warn:#f0a22e;--color-warn-bg:#fff5e4;--color-warn-border:#f6e0b8;--color-warn-text:#9a6410;--color-warn-deep:#7a4e08;--color-danger-bg:#fdecec;--color-danger-border:#f5c9ce;--color-info:#14b8e8;--color-info-bg:#eaf7fc;--color-info-border:#c3e7f4;--color-info-text:#0a6f91;--color-ice:#14b8e8;--color-ice-ink:#04212c;--color-referee:#7c4dff;--color-referee-bg:#f1ecff;--color-referee-border:#d9caff;--color-referee-text:#5b2fd6;--color-row-sel:#fff7f8;--color-row-focus:#f4f9ff;--color-subhead:#f8f9fa;--radius-box:.875rem}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}body{background:var(--color-paper);color:var(--color-slate);font-family:var(--font-sans);padding-top:env(safe-area-inset-top);padding-bottom:env(safe-area-inset-bottom)}[x-cloak]{display:none!important}}@layer components{.app-header{padding:max(env(safe-area-inset-top), 14px) 16px 14px;background:var(--color-navy);color:#fff;flex-shrink:0}.app-crest{object-fit:cover;border-radius:999px;flex-shrink:0;width:32px;height:32px}.app-crest-fallback{background:var(--color-club);color:var(--color-club-content);font-family:var(--font-display);justify-content:center;align-items:center;font-size:.75rem;font-weight:800;display:flex}.scrollbar-hide{scrollbar-width:none;-ms-overflow-style:none}.scrollbar-hide::-webkit-scrollbar{display:none}.role-switcher{background:var(--color-steel);border-radius:999px;gap:4px;margin-top:10px;padding:4px;display:flex}.role-switcher-item{height:36px;font-family:var(--font-display);letter-spacing:.1em;text-transform:uppercase;color:var(--color-on-dark);border-radius:999px;flex:1;justify-content:center;align-items:center;font-size:.875rem;font-weight:800;display:flex}.role-switcher-item-active{color:var(--color-ink);background:#fff}.role-switcher-item-active-ice{background:var(--color-ice);color:var(--color-ice-ink)}.tab-bar{border-top:1px solid var(--color-line);padding:8px 8px max(env(safe-area-inset-bottom), 26px);background:#fff;flex-shrink:0;display:flex}.tab-bar-item{height:48px;color:var(--color-dim);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:3px;display:flex}.tab-bar-item-active{color:var(--color-club)}.tab-bar-label{font-family:var(--font-display);letter-spacing:.08em;text-transform:uppercase;font-size:.75rem;font-weight:700}.btn{height:46px;font-family:var(--font-display);letter-spacing:.1em;text-transform:uppercase;cursor:pointer;white-space:nowrap;border:none;border-radius:.5rem;justify-content:center;align-items:center;gap:.5rem;padding-inline:1.25rem;font-size:1rem;font-weight:800;display:inline-flex}.btn:disabled{opacity:.45;cursor:not-allowed}.btn-primary{background:var(--color-club);color:#fff}.btn-dark{background:var(--color-ink);color:#fff}.btn-positive{background:var(--color-ok);color:#fff}.btn-secondary{border:1.5px solid var(--color-stroke);color:var(--color-ink);background:#fff}.btn-ghost-on-dark{color:#fff;background:#ffffff26}.pill{font-family:var(--font-display);letter-spacing:.1em;text-transform:uppercase;border-radius:999px;align-items:center;padding:5px 10px;font-size:.75rem;font-weight:700;display:inline-flex}.pill-ok{background:var(--color-ok-bg);color:var(--color-ok-text);border:1px solid var(--color-ok-border)}.pill-danger{background:var(--color-danger-bg);color:var(--color-club-dark);border:1px solid var(--color-danger-border)}.pill-warn{background:var(--color-warn-bg);color:var(--color-warn-text);border:1px solid var(--color-warn-border)}.pill-info{background:var(--color-info-bg);color:var(--color-info-text);border:1px solid var(--color-info-border)}.pill-neutral{background:var(--color-rule);color:#4a5566;border:1px solid #dde1e7}.pill-referee{background:var(--color-referee-bg);color:var(--color-referee-text);border:1px solid var(--color-referee-border)}.person-chip{border:1.5px solid var(--color-line);color:var(--color-muted);background:#fff;border-radius:999px;flex-shrink:0;align-items:center;gap:6px;padding:4px 10px 4px 4px;display:flex}.person-chip-active{border-color:var(--color-ink);color:var(--color-ink)}.person-chip-avatar{background:var(--color-stroke);color:#fff;width:22px;height:22px;font-family:var(--font-display);border-radius:999px;flex-shrink:0;justify-content:center;align-items:center;font-size:.6875rem;font-weight:800;display:flex}.person-chip-active .person-chip-avatar{background:var(--color-club)}.person-chip-label{font-family:var(--font-display);letter-spacing:.06em;text-transform:uppercase;font-size:.8125rem;font-weight:700}.m-card{border:1px solid var(--color-line);border-radius:var(--radius-box);background:#fff}.m-card-dark{background:var(--color-ink);color:#fff;border-radius:var(--radius-box)}.coach-header{padding:max(env(safe-area-inset-top), 14px) 16px 14px;background:var(--color-ink);color:#fff;flex-shrink:0}.coach-sheet{background:var(--color-paper);flex:1;overflow-y:auto}.coach-tab-bar{background:var(--color-ink);border-top:1px solid var(--color-hairline);padding:8px 8px max(env(safe-area-inset-bottom), 26px);flex-shrink:0;display:flex;position:relative}.coach-tab-bar-item{height:48px;color:var(--color-on-dark);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:3px;display:flex}.coach-tab-bar-item-active{color:var(--color-ice)}.coach-tab-bar-add{flex:1;justify-content:center;align-items:flex-start;display:flex}.coach-tab-bar-add-button{background:var(--color-ice);width:48px;height:48px;color:var(--color-ice-ink);border:4px solid var(--color-ink);border-radius:999px;justify-content:center;align-items:center;margin-top:-20px;display:flex;box-shadow:0 2px 10px #00000059}}@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-x-3{inset-inline:calc(var(--spacing) * 3)}.-top-1{top:calc(var(--spacing) * -1)}.top-0{top:0}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-\[3px\]{top:3px}.top-full{top:100%}.-right-1{right:calc(var(--spacing) * -1)}.right-0{right:0}.right-2{right:calc(var(--spacing) * 2)}.right-\[3px\]{right:3px}.bottom-0{bottom:0}.bottom-full{bottom:100%}.left-0{left:0}.left-1\.5{left:calc(var(--spacing) * 1.5)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-3{left:calc(var(--spacing) * 3)}.left-\[3px\]{left:3px}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.col-span-2{grid-column:span 2/span 2}.col-span-full{grid-column:1/-1}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.my-2{margin-block:calc(var(--spacing) * 2)}.my-3{margin-block:calc(var(--spacing) * 3)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-6{margin-block:calc(var(--spacing) * 6)}.ms-auto{margin-inline-start:auto}.-mt-0\.5{margin-top:calc(var(--spacing) * -.5)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.-mt-4{margin-top:calc(var(--spacing) * -4)}.-mt-5{margin-top:calc(var(--spacing) * -5)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-auto{margin-top:auto}.mr-1{margin-right:var(--spacing)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-3\.5{margin-bottom:calc(var(--spacing) * 3.5)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.mb-auto{margin-bottom:auto}.-ml-2\.5{margin-left:calc(var(--spacing) * -2.5)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-8\.5{height:calc(var(--spacing) * 8.5)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-44{height:calc(var(--spacing) * 44)}.h-48{height:calc(var(--spacing) * 48)}.h-72{height:calc(var(--spacing) * 72)}.h-\[3px\]{height:3px}.h-\[7px\]{height:7px}.h-\[19px\]{height:19px}.h-\[22px\]{height:22px}.h-\[30px\]{height:30px}.h-\[34px\]{height:34px}.h-\[38px\]{height:38px}.h-\[52px\]{height:52px}.h-\[54px\]{height:54px}.h-\[68px\]{height:68px}.h-\[104px\]{height:104px}.h-\[180px\]{height:180px}.h-\[190px\]{height:190px}.h-\[220px\]{height:220px}.h-\[330px\]{height:330px}.h-\[560px\]{height:560px}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-full{max-height:100%}.min-h-6{min-height:calc(var(--spacing) * 6)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-screen{min-height:100vh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-9\.5{width:calc(var(--spacing) * 9.5)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-23{width:calc(var(--spacing) * 23)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-40{width:calc(var(--spacing) * 40)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-60{width:calc(var(--spacing) * 60)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-80{width:calc(var(--spacing) * 80)}.w-\[3px\]{width:3px}.w-\[7px\]{width:7px}.w-\[36rem\]{width:36rem}.w-\[68px\]{width:68px}.w-\[236px\]{width:236px}.w-\[460px\]{width:460px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-40{max-width:calc(var(--spacing) * 40)}.max-w-\[35\%\]{max-width:35%}.max-w-\[91vw\]{max-width:91vw}.max-w-\[1440px\]{max-width:1440px}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-4{min-width:calc(var(--spacing) * 4)}.min-w-40{min-width:calc(var(--spacing) * 40)}.min-w-\[19px\]{min-width:19px}.min-w-\[220px\]{min-width:220px}.flex-1{flex:1}.flex-\[3\]{flex:3}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-pointer{cursor:pointer}.resize{resize:both}.scrollbar-gutter-stable{scrollbar-gutter:stable}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-10{gap:calc(var(--spacing) * 10)}.gap-px{gap:1px}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-rule>:not(:last-child)){border-color:var(--color-rule)}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[10px\]{border-radius:10px}.rounded-\[14px\]{border-radius:14px}.rounded-box{border-radius:var(--radius-box)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[\#2C3B56\]{border-color:#2c3b56}.border-\[\#DDE1E7\]{border-color:#dde1e7}.border-club{border-color:var(--color-club)}.border-danger-border{border-color:var(--color-danger-border)}.border-edge{border-color:var(--color-edge)}.border-ice{border-color:var(--color-ice)}.border-info{border-color:var(--color-info)}.border-info-border{border-color:var(--color-info-border)}.border-ink{border-color:var(--color-ink)}.border-line{border-color:var(--color-line)}.border-on-dark-faint{border-color:var(--color-on-dark-faint)}.border-rule{border-color:var(--color-rule)}.border-stroke{border-color:var(--color-stroke)}.border-warn{border-color:var(--color-warn)}.border-warn-border{border-color:var(--color-warn-border)}.border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.border-white\/20{border-color:color-mix(in oklab, var(--color-white) 20%, transparent)}}.border-white\/30{border-color:#ffffff4d}@supports (color:color-mix(in lab, red, red)){.border-white\/30{border-color:color-mix(in oklab, var(--color-white) 30%, transparent)}}.border-l-club{border-left-color:var(--color-club)}.border-l-club-dark{border-left-color:var(--color-club-dark)}.border-l-info{border-left-color:var(--color-info)}.border-l-transparent{border-left-color:#0000}.border-l-warn{border-left-color:var(--color-warn)}.bg-\[var\(--club\)\]{background-color:var(--club)}.bg-black\/20{background-color:#0003}@supports (color:color-mix(in lab, red, red)){.bg-black\/20{background-color:color-mix(in oklab, var(--color-black) 20%, transparent)}}.bg-club{background-color:var(--color-club)}.bg-danger-bg{background-color:var(--color-danger-bg)}.bg-edge{background-color:var(--color-edge)}.bg-hairline{background-color:var(--color-hairline)}.bg-ice{background-color:var(--color-ice)}.bg-info{background-color:var(--color-info)}.bg-info-bg{background-color:var(--color-info-bg)}.bg-ink{background-color:var(--color-ink)}.bg-line{background-color:var(--color-line)}.bg-navy{background-color:var(--color-navy)}.bg-ok{background-color:var(--color-ok)}.bg-paper{background-color:var(--color-paper)}.bg-referee{background-color:var(--color-referee)}.bg-row-focus{background-color:var(--color-row-focus)}.bg-row-sel{background-color:var(--color-row-sel)}.bg-rule{background-color:var(--color-rule)}.bg-steel{background-color:var(--color-steel)}.bg-steel\/60{background-color:#1b2b4799}@supports (color:color-mix(in lab, red, red)){.bg-steel\/60{background-color:color-mix(in oklab, var(--color-steel) 60%, transparent)}}.bg-subhead{background-color:var(--color-subhead)}.bg-warn{background-color:var(--color-warn)}.bg-warn-bg{background-color:var(--color-warn-bg)}.bg-white{background-color:var(--color-white)}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.bg-white\/10{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.bg-white\/15{background-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.bg-white\/15{background-color:color-mix(in oklab, var(--color-white) 15%, transparent)}}.stroke-2{stroke-width:2px}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-4\.5{padding:calc(var(--spacing) * 4.5)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-10{padding:calc(var(--spacing) * 10)}.p-\[18px\]{padding:18px}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-4\.5{padding-inline:calc(var(--spacing) * 4.5)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-7{padding-inline:calc(var(--spacing) * 7)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-\[3px\]{padding-inline:3px}.px-\[18px\]{padding-inline:18px}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-14{padding-block:calc(var(--spacing) * 14)}.py-\[5px\]{padding-block:5px}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-3\.5{padding-top:calc(var(--spacing) * 3.5)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pb-0{padding-bottom:0}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-\[22px\]{padding-bottom:22px}.pb-\[26px\]{padding-bottom:26px}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-display{font-family:var(--font-display)}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.text-\[17px\]{font-size:17px}.text-\[19px\]{font-size:19px}.text-\[22px\]{font-size:22px}.text-\[34px\]{font-size:34px}.text-\[56px\]{font-size:56px}.leading-\[\.94\]{--tw-leading:.94;line-height:.94}.leading-\[\.95\]{--tw-leading:.95;line-height:.95}.leading-\[\.96\]{--tw-leading:.96;line-height:.96}.leading-\[\.98\]{--tw-leading:.98;line-height:.98}.leading-\[1\.05\]{--tw-leading:1.05;line-height:1.05}.leading-\[1\.5\]{--tw-leading:1.5;line-height:1.5}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[\.04em\]{--tw-tracking:.04em;letter-spacing:.04em}.tracking-\[\.06em\]{--tw-tracking:.06em;letter-spacing:.06em}.tracking-\[\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[\#4A5566\]{color:#4a5566}.text-club{color:var(--color-club)}.text-club-content{color:var(--color-club-content)}.text-club-dark{color:var(--color-club-dark)}.text-dim{color:var(--color-dim)}.text-edge{color:var(--color-edge)}.text-gray-500{color:var(--color-gray-500)}.text-ice{color:var(--color-ice)}.text-ice-ink{color:var(--color-ice-ink)}.text-info{color:var(--color-info)}.text-info-text{color:var(--color-info-text)}.text-ink{color:var(--color-ink)}.text-muted{color:var(--color-muted)}.text-ok{color:var(--color-ok)}.text-ok-text{color:var(--color-ok-text)}.text-on-dark{color:var(--color-on-dark)}.text-on-dark-dim{color:var(--color-on-dark-dim)}.text-on-dark-faint{color:var(--color-on-dark-faint)}.text-referee{color:var(--color-referee)}.text-sky-500{color:var(--color-sky-500)}.text-slate{color:var(--color-slate)}.text-warn{color:var(--color-warn)}.text-warn-deep{color:var(--color-warn-deep)}.text-warn-text{color:var(--color-warn-text)}.text-white{color:var(--color-white)}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab, red, red)){.text-white\/80{color:color-mix(in oklab, var(--color-white) 80%, transparent)}}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.accent-ink{accent-color:var(--color-ink)}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-\[\.72\]{opacity:.72}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[-24px_0_60px_rgba\(11\,18\,32\,\.2\)\]{--tw-shadow:-24px 0 60px var(--tw-shadow-color,#0b122033);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_24px_60px_rgba\(11\,18\,32\,\.18\)\]{--tw-shadow:0 24px 60px var(--tw-shadow-color,#0b12202e);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[inset_3px_0_0_var\(--color-info\)\]{--tw-shadow:inset 3px 0 0 var(--tw-shadow-color,var(--color-info));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.placeholder\:text-dim::placeholder{color:var(--color-dim)}.placeholder\:text-on-dark::placeholder{color:var(--color-on-dark)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.empty\:hidden:empty{display:none}@media (hover:hover){.hover\:border-white:hover{border-color:var(--color-white)}.hover\:bg-ink:hover{background-color:var(--color-ink)}.hover\:bg-rule:hover{background-color:var(--color-rule)}.hover\:bg-steel:hover{background-color:var(--color-steel)}.hover\:bg-subhead:hover{background-color:var(--color-subhead)}.hover\:bg-white\/25:hover{background-color:#ffffff40}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/25:hover{background-color:color-mix(in oklab, var(--color-white) 25%, transparent)}}.hover\:text-ink:hover{color:var(--color-ink)}.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:border-ink:focus{border-color:var(--color-ink)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.has-checked\:border-ink:has(:checked){border-color:var(--color-ink)}.has-checked\:bg-ink:has(:checked){background-color:var(--color-ink)}.has-checked\:text-white:has(:checked){color:var(--color-white)}@media (min-width:40rem){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:block{display:block}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:h-16{height:calc(var(--spacing) * 16)}.sm\:w-16{width:calc(var(--spacing) * 16)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:gap-3{gap:calc(var(--spacing) * 3)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}@media (min-width:48rem){.md\:col-span-2{grid-column:span 2/span 2}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}}@media (min-width:64rem){.lg\:flex{display:flex}.lg\:w-fit{width:fit-content}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}@media (min-width:80rem){.xl\:sticky{position:sticky}.xl\:top-4{top:calc(var(--spacing) * 4)}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-\[1\.2fr_1fr\]{grid-template-columns:1.2fr 1fr}.xl\:grid-cols-\[1\.6fr_1fr\]{grid-template-columns:1.6fr 1fr}.xl\:grid-cols-\[1\.35fr_1fr\]{grid-template-columns:1.35fr 1fr}.xl\:self-start{align-self:flex-start}}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}}@font-face{font-family:Barlow;font-style:normal;font-weight:400;font-display:swap;src:url(../fonts/barlow-latin-400-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Barlow;font-style:normal;font-weight:500;font-display:swap;src:url(../fonts/barlow-latin-500-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Barlow;font-style:normal;font-weight:600;font-display:swap;src:url(../fonts/barlow-latin-600-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Barlow;font-style:normal;font-weight:700;font-display:swap;src:url(../fonts/barlow-latin-700-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Barlow Condensed;font-style:normal;font-weight:600;font-display:swap;src:url(../fonts/barlow-condensed-latin-600-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Barlow Condensed;font-style:normal;font-weight:700;font-display:swap;src:url(../fonts/barlow-condensed-latin-700-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Barlow Condensed;font-style:normal;font-weight:800;font-display:swap;src:url(../fonts/barlow-condensed-latin-800-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(../fonts/ibm-plex-mono-latin-400-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(../fonts/ibm-plex-mono-latin-500-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes pulse{50%{opacity:.5}} \ No newline at end of file +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--font-sans:"Barlow", ui-sans-serif, system-ui, sans-serif;--font-mono:"IBM Plex Mono", ui-monospace, SFMono-Regular, monospace;--color-sky-500:oklch(68.5% .169 237.323);--color-gray-500:oklch(55.1% .027 264.364);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-wide:.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--font-display:"Barlow Condensed", ui-sans-serif, system-ui, sans-serif;--color-ink:#0b1220;--color-navy:var(--tenant-navy,#101e36);--color-steel:#1b2b47;--color-hairline:#1e2b42;--color-paper:#f4f5f7;--color-line:#e3e6eb;--color-rule:#eef0f3;--color-edge:#d6dae1;--color-stroke:#c9cfd8;--color-muted:#6c7787;--color-dim:#8b95a4;--color-slate:#3a4658;--color-on-dark:#93a0b4;--color-on-dark-dim:#7c8aa0;--color-on-dark-faint:#5c6b85;--color-club:var(--tenant-club,#e4002b);--color-club-dark:var(--tenant-club-dark,#b00021);--color-club-content:var(--tenant-club-content,#fff);--color-ok:#14a05a;--color-ok-bg:#e6f6ee;--color-ok-border:#bfe7d3;--color-ok-text:#0c7a43;--color-warn:#f0a22e;--color-warn-bg:#fff5e4;--color-warn-border:#f6e0b8;--color-warn-text:#9a6410;--color-warn-deep:#7a4e08;--color-danger-bg:#fdecec;--color-danger-border:#f5c9ce;--color-info:#14b8e8;--color-info-bg:#eaf7fc;--color-info-border:#c3e7f4;--color-info-text:#0a6f91;--color-ice:#14b8e8;--color-ice-ink:#04212c;--color-referee:#7c4dff;--color-referee-bg:#f1ecff;--color-referee-border:#d9caff;--color-referee-text:#5b2fd6;--color-row-sel:#fff7f8;--color-row-focus:#f4f9ff;--color-subhead:#f8f9fa;--radius-box:.875rem}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}body{background:var(--color-paper);color:var(--color-slate);font-family:var(--font-sans);padding-top:env(safe-area-inset-top);padding-bottom:env(safe-area-inset-bottom)}[x-cloak]{display:none!important}}@layer components{.app-header{padding:max(env(safe-area-inset-top), 14px) 16px 14px;background:var(--color-navy);color:#fff;flex-shrink:0}.app-crest{object-fit:cover;border-radius:999px;flex-shrink:0;width:32px;height:32px}.app-crest-fallback{background:var(--color-club);color:var(--color-club-content);font-family:var(--font-display);justify-content:center;align-items:center;font-size:.75rem;font-weight:800;display:flex}.scrollbar-hide{scrollbar-width:none;-ms-overflow-style:none}.scrollbar-hide::-webkit-scrollbar{display:none}.role-switcher{background:var(--color-steel);border-radius:999px;gap:4px;margin-top:10px;padding:4px;display:flex}.role-switcher-item{height:36px;font-family:var(--font-display);letter-spacing:.1em;text-transform:uppercase;color:var(--color-on-dark);border-radius:999px;flex:1;justify-content:center;align-items:center;font-size:.875rem;font-weight:800;display:flex}.role-switcher-item-active{color:var(--color-ink);background:#fff}.role-switcher-item-active-ice{background:var(--color-ice);color:var(--color-ice-ink)}.tab-bar{border-top:1px solid var(--color-line);padding:8px 8px max(env(safe-area-inset-bottom), 26px);background:#fff;flex-shrink:0;display:flex}.tab-bar-item{height:48px;color:var(--color-dim);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:3px;display:flex}.tab-bar-item-active{color:var(--color-club)}.tab-bar-label{font-family:var(--font-display);letter-spacing:.08em;text-transform:uppercase;font-size:.75rem;font-weight:700}.btn{height:46px;font-family:var(--font-display);letter-spacing:.1em;text-transform:uppercase;cursor:pointer;white-space:nowrap;border:none;border-radius:.5rem;justify-content:center;align-items:center;gap:.5rem;padding-inline:1.25rem;font-size:1rem;font-weight:800;display:inline-flex}.btn:disabled{opacity:.45;cursor:not-allowed}.btn-primary{background:var(--color-club);color:#fff}.btn-dark{background:var(--color-ink);color:#fff}.btn-positive{background:var(--color-ok);color:#fff}.btn-secondary{border:1.5px solid var(--color-stroke);color:var(--color-ink);background:#fff}.btn-ghost-on-dark{color:#fff;background:#ffffff26}.pill{font-family:var(--font-display);letter-spacing:.1em;text-transform:uppercase;border-radius:999px;align-items:center;padding:5px 10px;font-size:.75rem;font-weight:700;display:inline-flex}.pill-ok{background:var(--color-ok-bg);color:var(--color-ok-text);border:1px solid var(--color-ok-border)}.pill-danger{background:var(--color-danger-bg);color:var(--color-club-dark);border:1px solid var(--color-danger-border)}.pill-warn{background:var(--color-warn-bg);color:var(--color-warn-text);border:1px solid var(--color-warn-border)}.pill-info{background:var(--color-info-bg);color:var(--color-info-text);border:1px solid var(--color-info-border)}.pill-neutral{background:var(--color-rule);color:#4a5566;border:1px solid #dde1e7}.pill-referee{background:var(--color-referee-bg);color:var(--color-referee-text);border:1px solid var(--color-referee-border)}.person-chip{border:1.5px solid var(--color-line);color:var(--color-muted);background:#fff;border-radius:999px;flex-shrink:0;align-items:center;gap:6px;padding:4px 10px 4px 4px;display:flex}.person-chip-active{border-color:var(--color-ink);color:var(--color-ink)}.person-chip-avatar{background:var(--color-stroke);color:#fff;width:22px;height:22px;font-family:var(--font-display);border-radius:999px;flex-shrink:0;justify-content:center;align-items:center;font-size:.6875rem;font-weight:800;display:flex}.person-chip-active .person-chip-avatar{background:var(--color-club)}.person-chip-label{font-family:var(--font-display);letter-spacing:.06em;text-transform:uppercase;font-size:.8125rem;font-weight:700}.m-card{border:1px solid var(--color-line);border-radius:var(--radius-box);background:#fff}.m-card-dark{background:var(--color-ink);color:#fff;border-radius:var(--radius-box)}.coach-header{padding:max(env(safe-area-inset-top), 14px) 16px 14px;background:var(--color-ink);color:#fff;flex-shrink:0}.coach-sheet{background:var(--color-paper);flex:1;overflow-y:auto}.coach-tab-bar{background:var(--color-ink);border-top:1px solid var(--color-hairline);padding:8px 8px max(env(safe-area-inset-bottom), 26px);flex-shrink:0;display:flex;position:relative}.coach-tab-bar-item{height:48px;color:var(--color-on-dark);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:3px;display:flex}.coach-tab-bar-item-active{color:var(--color-ice)}.coach-tab-bar-add{flex:1;justify-content:center;align-items:flex-start;display:flex}.coach-tab-bar-add-button{background:var(--color-ice);width:48px;height:48px;color:var(--color-ice-ink);border:4px solid var(--color-ink);border-radius:999px;justify-content:center;align-items:center;margin-top:-20px;display:flex;box-shadow:0 2px 10px #00000059}}@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-x-3{inset-inline:calc(var(--spacing) * 3)}.-top-1{top:calc(var(--spacing) * -1)}.top-0{top:0}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-\[3px\]{top:3px}.top-full{top:100%}.-right-1{right:calc(var(--spacing) * -1)}.right-0{right:0}.right-2{right:calc(var(--spacing) * 2)}.right-\[3px\]{right:3px}.bottom-0{bottom:0}.bottom-full{bottom:100%}.left-0{left:0}.left-1\.5{left:calc(var(--spacing) * 1.5)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-3{left:calc(var(--spacing) * 3)}.left-\[3px\]{left:3px}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.col-span-2{grid-column:span 2/span 2}.col-span-full{grid-column:1/-1}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.my-2{margin-block:calc(var(--spacing) * 2)}.my-3{margin-block:calc(var(--spacing) * 3)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-6{margin-block:calc(var(--spacing) * 6)}.ms-auto{margin-inline-start:auto}.-mt-0\.5{margin-top:calc(var(--spacing) * -.5)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.-mt-4{margin-top:calc(var(--spacing) * -4)}.-mt-5{margin-top:calc(var(--spacing) * -5)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-auto{margin-top:auto}.mr-1{margin-right:var(--spacing)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-3\.5{margin-bottom:calc(var(--spacing) * 3.5)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.mb-auto{margin-bottom:auto}.-ml-2\.5{margin-left:calc(var(--spacing) * -2.5)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-8\.5{height:calc(var(--spacing) * 8.5)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-44{height:calc(var(--spacing) * 44)}.h-48{height:calc(var(--spacing) * 48)}.h-72{height:calc(var(--spacing) * 72)}.h-\[3px\]{height:3px}.h-\[7px\]{height:7px}.h-\[19px\]{height:19px}.h-\[22px\]{height:22px}.h-\[30px\]{height:30px}.h-\[34px\]{height:34px}.h-\[38px\]{height:38px}.h-\[52px\]{height:52px}.h-\[54px\]{height:54px}.h-\[68px\]{height:68px}.h-\[104px\]{height:104px}.h-\[180px\]{height:180px}.h-\[190px\]{height:190px}.h-\[220px\]{height:220px}.h-\[330px\]{height:330px}.h-\[560px\]{height:560px}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[70vh\]{max-height:70vh}.max-h-full{max-height:100%}.min-h-6{min-height:calc(var(--spacing) * 6)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-screen{min-height:100vh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-9\.5{width:calc(var(--spacing) * 9.5)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-23{width:calc(var(--spacing) * 23)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-40{width:calc(var(--spacing) * 40)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-60{width:calc(var(--spacing) * 60)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-80{width:calc(var(--spacing) * 80)}.w-\[3px\]{width:3px}.w-\[7px\]{width:7px}.w-\[36rem\]{width:36rem}.w-\[68px\]{width:68px}.w-\[236px\]{width:236px}.w-\[460px\]{width:460px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-40{max-width:calc(var(--spacing) * 40)}.max-w-\[35\%\]{max-width:35%}.max-w-\[91vw\]{max-width:91vw}.max-w-\[1440px\]{max-width:1440px}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-4{min-width:calc(var(--spacing) * 4)}.min-w-40{min-width:calc(var(--spacing) * 40)}.min-w-\[19px\]{min-width:19px}.min-w-\[220px\]{min-width:220px}.flex-1{flex:1}.flex-\[3\]{flex:3}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-pointer{cursor:pointer}.resize{resize:both}.scrollbar-gutter-stable{scrollbar-gutter:stable}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-10{gap:calc(var(--spacing) * 10)}.gap-px{gap:1px}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-rule>:not(:last-child)){border-color:var(--color-rule)}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-y-visible{overflow-y:visible}.rounded{border-radius:.25rem}.rounded-\[10px\]{border-radius:10px}.rounded-\[14px\]{border-radius:14px}.rounded-box{border-radius:var(--radius-box)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[\#2C3B56\]{border-color:#2c3b56}.border-\[\#DDE1E7\]{border-color:#dde1e7}.border-club{border-color:var(--color-club)}.border-danger-border{border-color:var(--color-danger-border)}.border-edge{border-color:var(--color-edge)}.border-ice{border-color:var(--color-ice)}.border-info{border-color:var(--color-info)}.border-info-border{border-color:var(--color-info-border)}.border-ink{border-color:var(--color-ink)}.border-line{border-color:var(--color-line)}.border-on-dark-faint{border-color:var(--color-on-dark-faint)}.border-rule{border-color:var(--color-rule)}.border-stroke{border-color:var(--color-stroke)}.border-warn{border-color:var(--color-warn)}.border-warn-border{border-color:var(--color-warn-border)}.border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.border-white\/20{border-color:color-mix(in oklab, var(--color-white) 20%, transparent)}}.border-white\/30{border-color:#ffffff4d}@supports (color:color-mix(in lab, red, red)){.border-white\/30{border-color:color-mix(in oklab, var(--color-white) 30%, transparent)}}.border-l-club{border-left-color:var(--color-club)}.border-l-club-dark{border-left-color:var(--color-club-dark)}.border-l-info{border-left-color:var(--color-info)}.border-l-transparent{border-left-color:#0000}.border-l-warn{border-left-color:var(--color-warn)}.bg-\[var\(--club\)\]{background-color:var(--club)}.bg-black\/20{background-color:#0003}@supports (color:color-mix(in lab, red, red)){.bg-black\/20{background-color:color-mix(in oklab, var(--color-black) 20%, transparent)}}.bg-club{background-color:var(--color-club)}.bg-danger-bg{background-color:var(--color-danger-bg)}.bg-edge{background-color:var(--color-edge)}.bg-hairline{background-color:var(--color-hairline)}.bg-ice{background-color:var(--color-ice)}.bg-info{background-color:var(--color-info)}.bg-info-bg{background-color:var(--color-info-bg)}.bg-ink{background-color:var(--color-ink)}.bg-line{background-color:var(--color-line)}.bg-navy{background-color:var(--color-navy)}.bg-ok{background-color:var(--color-ok)}.bg-paper{background-color:var(--color-paper)}.bg-referee{background-color:var(--color-referee)}.bg-row-focus{background-color:var(--color-row-focus)}.bg-row-sel{background-color:var(--color-row-sel)}.bg-rule{background-color:var(--color-rule)}.bg-steel{background-color:var(--color-steel)}.bg-steel\/60{background-color:#1b2b4799}@supports (color:color-mix(in lab, red, red)){.bg-steel\/60{background-color:color-mix(in oklab, var(--color-steel) 60%, transparent)}}.bg-subhead{background-color:var(--color-subhead)}.bg-warn{background-color:var(--color-warn)}.bg-warn-bg{background-color:var(--color-warn-bg)}.bg-white{background-color:var(--color-white)}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.bg-white\/10{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.bg-white\/15{background-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.bg-white\/15{background-color:color-mix(in oklab, var(--color-white) 15%, transparent)}}.stroke-2{stroke-width:2px}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-4\.5{padding:calc(var(--spacing) * 4.5)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-10{padding:calc(var(--spacing) * 10)}.p-\[18px\]{padding:18px}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-4\.5{padding-inline:calc(var(--spacing) * 4.5)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-7{padding-inline:calc(var(--spacing) * 7)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-\[3px\]{padding-inline:3px}.px-\[18px\]{padding-inline:18px}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-14{padding-block:calc(var(--spacing) * 14)}.py-\[5px\]{padding-block:5px}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-3\.5{padding-top:calc(var(--spacing) * 3.5)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pb-0{padding-bottom:0}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-\[22px\]{padding-bottom:22px}.pb-\[26px\]{padding-bottom:26px}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-display{font-family:var(--font-display)}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.text-\[17px\]{font-size:17px}.text-\[19px\]{font-size:19px}.text-\[22px\]{font-size:22px}.text-\[34px\]{font-size:34px}.text-\[56px\]{font-size:56px}.leading-\[\.94\]{--tw-leading:.94;line-height:.94}.leading-\[\.95\]{--tw-leading:.95;line-height:.95}.leading-\[\.96\]{--tw-leading:.96;line-height:.96}.leading-\[\.98\]{--tw-leading:.98;line-height:.98}.leading-\[1\.05\]{--tw-leading:1.05;line-height:1.05}.leading-\[1\.5\]{--tw-leading:1.5;line-height:1.5}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[\.04em\]{--tw-tracking:.04em;letter-spacing:.04em}.tracking-\[\.06em\]{--tw-tracking:.06em;letter-spacing:.06em}.tracking-\[\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[\#4A5566\]{color:#4a5566}.text-club{color:var(--color-club)}.text-club-content{color:var(--color-club-content)}.text-club-dark{color:var(--color-club-dark)}.text-dim{color:var(--color-dim)}.text-edge{color:var(--color-edge)}.text-gray-500{color:var(--color-gray-500)}.text-ice{color:var(--color-ice)}.text-ice-ink{color:var(--color-ice-ink)}.text-info{color:var(--color-info)}.text-info-text{color:var(--color-info-text)}.text-ink{color:var(--color-ink)}.text-muted{color:var(--color-muted)}.text-ok{color:var(--color-ok)}.text-ok-text{color:var(--color-ok-text)}.text-on-dark{color:var(--color-on-dark)}.text-on-dark-dim{color:var(--color-on-dark-dim)}.text-on-dark-faint{color:var(--color-on-dark-faint)}.text-referee{color:var(--color-referee)}.text-sky-500{color:var(--color-sky-500)}.text-slate{color:var(--color-slate)}.text-warn{color:var(--color-warn)}.text-warn-deep{color:var(--color-warn-deep)}.text-warn-text{color:var(--color-warn-text)}.text-white{color:var(--color-white)}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab, red, red)){.text-white\/80{color:color-mix(in oklab, var(--color-white) 80%, transparent)}}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.accent-ink{accent-color:var(--color-ink)}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-\[\.72\]{opacity:.72}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[-24px_0_60px_rgba\(11\,18\,32\,\.2\)\]{--tw-shadow:-24px 0 60px var(--tw-shadow-color,#0b122033);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_24px_60px_rgba\(11\,18\,32\,\.18\)\]{--tw-shadow:0 24px 60px var(--tw-shadow-color,#0b12202e);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[inset_3px_0_0_var\(--color-info\)\]{--tw-shadow:inset 3px 0 0 var(--tw-shadow-color,var(--color-info));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.placeholder\:text-dim::placeholder{color:var(--color-dim)}.placeholder\:text-on-dark::placeholder{color:var(--color-on-dark)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.empty\:hidden:empty{display:none}@media (hover:hover){.hover\:border-white:hover{border-color:var(--color-white)}.hover\:bg-ink:hover{background-color:var(--color-ink)}.hover\:bg-rule:hover{background-color:var(--color-rule)}.hover\:bg-steel:hover{background-color:var(--color-steel)}.hover\:bg-subhead:hover{background-color:var(--color-subhead)}.hover\:bg-white\/25:hover{background-color:#ffffff40}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/25:hover{background-color:color-mix(in oklab, var(--color-white) 25%, transparent)}}.hover\:text-ink:hover{color:var(--color-ink)}.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:border-ink:focus{border-color:var(--color-ink)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.has-checked\:border-ink:has(:checked){border-color:var(--color-ink)}.has-checked\:bg-ink:has(:checked){background-color:var(--color-ink)}.has-checked\:text-white:has(:checked){color:var(--color-white)}@media (min-width:40rem){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:block{display:block}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:h-16{height:calc(var(--spacing) * 16)}.sm\:w-16{width:calc(var(--spacing) * 16)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:gap-3{gap:calc(var(--spacing) * 3)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}@media (min-width:48rem){.md\:col-span-2{grid-column:span 2/span 2}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}}@media (min-width:64rem){.lg\:flex{display:flex}.lg\:w-fit{width:fit-content}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}@media (min-width:80rem){.xl\:sticky{position:sticky}.xl\:top-4{top:calc(var(--spacing) * 4)}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-\[1\.2fr_1fr\]{grid-template-columns:1.2fr 1fr}.xl\:grid-cols-\[1\.6fr_1fr\]{grid-template-columns:1.6fr 1fr}.xl\:grid-cols-\[1\.35fr_1fr\]{grid-template-columns:1.35fr 1fr}.xl\:self-start{align-self:flex-start}}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}}@font-face{font-family:Barlow;font-style:normal;font-weight:400;font-display:swap;src:url(../fonts/barlow-latin-400-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Barlow;font-style:normal;font-weight:500;font-display:swap;src:url(../fonts/barlow-latin-500-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Barlow;font-style:normal;font-weight:600;font-display:swap;src:url(../fonts/barlow-latin-600-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Barlow;font-style:normal;font-weight:700;font-display:swap;src:url(../fonts/barlow-latin-700-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Barlow Condensed;font-style:normal;font-weight:600;font-display:swap;src:url(../fonts/barlow-condensed-latin-600-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Barlow Condensed;font-style:normal;font-weight:700;font-display:swap;src:url(../fonts/barlow-condensed-latin-700-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Barlow Condensed;font-style:normal;font-weight:800;font-display:swap;src:url(../fonts/barlow-condensed-latin-800-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(../fonts/ibm-plex-mono-latin-400-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(../fonts/ibm-plex-mono-latin-500-normal.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes pulse{50%{opacity:.5}} \ No newline at end of file