The Beautiful Game's Global Shuffle
An interactive data visualization exploring 19,454 football transfers across Europe's top 5 leagues from 2016 to 2025, built in the style of The Pudding.

⨠Features
- Interactive Scrolling Experience: Scroll-driven story that reveals insights as you progress
- Sticky Visualizations: Charts stay in view while contextual text updates
- Smooth Transitions: Elegant opacity and state changes as you scroll
š Data Visualizations
- Transfer Activity Timeline - Line chart showing yearly transfer trends
- Nationality Breakdown - Bar chart of most transferred nationalities
- League Flow Diagram - Visualization of player movement between leagues
- Position Analysis - Bar chart showing transfers by player position
š Interactive Club Explorer
- Smart Search: Autocomplete search with keyboard navigation
- Comprehensive Stats:
- Total transfers (incoming/outgoing)
- Total spent/received
- Net spend calculation
- Timeline Visualization: Grouped bar chart of yearly transfer activity
- Transfer Cards: Detailed view of individual transfers with:
- Player information (name, position, nationality)
- Transfer direction (incoming/outgoing)
- Transfer type and fee
- Source and destination clubs
- Filter Views:
- Recent transfers
- All incoming transfers
- All outgoing transfers
- Top transfers by fee
š± Responsive Design
- Mobile-First: Optimized for all screen sizes
- Adaptive Layouts: Scrollytelling sections stack on mobile
- Touch-Friendly: Large tap targets and smooth interactions
š Getting Started
Prerequisites
Installation
# Install dependencies
npm install
# Start development server
npm run dev
# Build for production
npm run build
# Preview production build
npm run preview
The app will be available at http://localhost:5174/
š Data Source
Dataset: Guardian.co.uk Transfer Windows Coverage (2016-2025)
- Records: 19,454 transfers
- Leagues: Premier League, La Liga, Bundesliga, Serie A, Ligue 1
- Years: 2016-2025
- Fields: Player name, nationality, position, clubs, transfer fees, dates, and more
Data from: Guardian Football Transfers Dataset
š ļø Tech Stack
- Svelte 5 - Reactive UI framework with runes ($state, $derived, $effect)
- Vite - Fast build tool and dev server
- D3.js - Data visualization libraries:
- d3-scale - Scale functions for mapping data to visual properties
- d3-array - Data manipulation utilities
- d3-shape - Path generators for complex shapes
- d3-format - Number formatting
- Intersection Observer API - Scroll-triggered events for scrollytelling
š Project Structure
src/
āāā components/
ā āāā helpers/
ā ā āāā Scrolly.svelte # Scrollytelling component
ā ā āāā ClubSearch.svelte # Autocomplete search
ā ā āāā TransferCard.svelte # Individual transfer display
ā āāā charts/
ā ā āāā BarChart.svelte # Horizontal bar charts
ā ā āāā LineChart.svelte # Time series line chart
ā ā āāā FlowChart.svelte # League flow visualization
ā ā āāā GroupedBarChart.svelte # Grouped bars for comparisons
ā āāā ClubExplorer.svelte # Main club explorer component
ā āāā App.svelte # Main application
āāā data/
ā āāā transfers.csv # Raw transfer data
ā āāā processData.js # Data processing utilities
āāā main.js # Application entry point
šØ Design Philosophy
Inspired by The Pudding's approach to visual essays:
- Narrative-First: Every visualization tells a story
- Simplicity & Clarity: Clean layouts with generous white space
- Accessibility: Keyboard navigation, semantic HTML, ARIA labels
- Mobile-First: Touch-friendly, responsive design
- Progressive Disclosure: Information revealed through interaction
š Key Components
Uses Intersection Observer API to track scroll position and trigger state changes:
<Scrolly bind:value={currentStep}>
<div class="step">Content here</div>
</Scrolly>
Club Explorer
Interactive search and exploration of club transfer history:
- Real-time search filtering
- Dynamic statistics calculation
- Multiple view modes
- Responsive card layouts
Data Processing
Utility functions for analyzing transfer data:
getAllClubs() - Get list of all clubs
getClubTransferStats() - Calculate transfer statistics
getClubTransfersByYear() - Yearly breakdown
getClubTopTransfers() - Highest-fee transfers
š Future Enhancements
š License
This project is open source and available under the MIT License.
š Acknowledgments
š¤ Contributing
Contributions, issues, and feature requests are welcome! Feel free to check the issues page.
Built with ā¤ļø using Svelte and D3.js ⢠Inspired by The Pudding