1. Stable byDay map key: use UTC date string (scheduledAt.slice(0,10))
instead of toLocaleDateString so server and client always produce the
same Map structure, eliminating the key={day} hydration tree mismatch.
2. Correct time localization: render UTC time as the stable SSR value,
then replace with the user's local time in useEffect after hydration.
Removes suppressHydrationWarning from both elements.
3. Fix groups vs visibleGroups: the JSX was iterating the unfiltered
groups array, making the showEmpty filter a no-op. Now uses
visibleGroups.map so groups with no activity are properly hidden.
4. Sync view after revalidation: add useEffect that advances the tab
from "groups" to "playoffs" when bracketHasTeams flips true during
an active session, without overriding a deliberate manual selection.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011Bo6Rsmg8FosYcDJsg14tX
Default to Groups tab instead of Bracket when no teams have been
assigned to the knockout bracket yet (group stage still in progress).
Fix match kick-off times showing in UTC server timezone by adding
suppressHydrationWarning so React uses the client's local timezone
during hydration.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011Bo6Rsmg8FosYcDJsg14tX