May 30, 2026
A world map, eight thousand lines, and 12 days left
The complete frontend in one session — SVG world map, floating reactions, split-screen match view, continent filter, and the 12-phase ship plan
The initial commit was a blank Next.js scaffold. This commit is a complete frontend application. Every screen, every interaction, every animation. None of it connects to a real database yet. All of it needs to.
There are 12 days until the opening match.
The map decision
The first real technical decision was the world map renderer. The initial plan was deck.gl — a WebGL-based geospatial rendering library. deck.gl is the right choice for data-dense map visualisations at scale. It is not the right choice for a map that needs to load fast on mobile, show a clean full globe at all times, and display coloured dots with reaction counts.
The replacement is an SVG equirectangular projection using world-atlas
110m TopoJSON. Every country is an SVG path. The full globe is always
visible — no zoom calculations, no viewport management, no WebGL
initialisation path. A ResizeObserver tracks the container; hotspot
label positions are derived from the actual rendered SVG bounds so they
align correctly with reaction dots at any screen size.
The performance difference is significant. Removing deck.gl eliminated the largest bundled dependency and the entire WebGL initialisation path.
The reaction layer
FloatingEmojis — each reaction tap spawns 4–6 emoji particles that float
upward through the map view with staggered delays, scale and fade, and
slight rotation. They dismiss automatically after 2.8 seconds. The effect
is the visual signal that something is happening right now, not just that
a count incremented somewhere.
ReactionPanel shows the live “Vibe right now” — the dominant emotion
in the current reaction window with its percentage and a colour-coded
progress bar. The bar glows in the selected emoji’s colour.
The match experience
SplitScreen renders full-bleed team flags meeting at an animated gold
seam. A live minute badge appears in the top right when a match is in
progress.
MomentDetector handles the big events — goals, red cards, penalties.
A 28px loud label flashes at the screen edges in a two-pulse pattern.
The reaction spike counter shows how many people reacted in the last
30 seconds.
ChantWall is the live text layer — fan chants and “I Was There”
declarations, each with the author’s allegiance colour on the left border.
The continent filter
A ContinentSelector pill bar overlays the top of the map. Six options:
All, Americas, Europe, Africa, Asia, Oceania. Each continent has a precise
SVG viewBox bounding box. Selecting one zooms the map to that region,
filters the visible reaction dots and hotspot labels to that continent’s
countries, and updates the reaction count badge.
computeSvgBounds is a pure function. It recalculates label positions
from the active viewBox on every continent change so dots and labels
stay pixel-aligned at every zoom level.
What’s left
The frontend is done. The plan is 12 phases, written the same day: Supabase setup, auth wiring, real match data from the API-Football feed, real-time reactions via Supabase subscriptions, QR “I Was There” codes at venues, chant submission, moment auto-detection, notifications, and production deploy.
Everything above runs on mock data. The clock is running.
12 days to June 11. The plan exists. The build starts now.