Skip to content
Lukas Sabaliauskas

Web Design / App Design

Minimalist F1 Circuit Collection

Print & Illustration · 2023

Minimalist F1 Circuit Collection — project cover image

Platform

Product / UX / UI / Frontend (React + TypeScript)

Role

Web + PWA (offline-ready)

Overview

"Circuit Collection" is a minimalist Formula 1 2026-season poster gallery Web application. It presents SVG circuit track layouts rendered as stroked elements on dark, theme-able cards. Each track has a special color, and the gallery has many features. It has themes, multiple card formats, export capabilities, a 3D globe map view, live F1 standings data, weather information, compare mode, slideshow, and eleven hidden Easter eggs.

The application is built as a single-page React app (no routing needed) with a focus on pixel-perfect rendering, smooth animations, and a premium Dark aesthetic inspired by F1 broadcast graphics.

The problem

Most circuit diagrams you find online are just static images with varying styles. I wanted to create a space where the circuits felt like a cohesive collection. They should look good, like posters, but also useful for real use. They should show what's coming up, where things are, and what's happening right now.

Goals

Make circuit layouts feel premium and consistent across the whole season

Enable fast exploration: search, filter, favorites, quick navigation

Provide meaningful season context: next race, timeline, standings, weather

Support sharing and making: SVG/PNG export and batch download

Keep UX smooth at scale: large grid performance and responsive layout

Users and use cases

Fans who want a satisfying way to browse circuits like a gallery

Creators who want poster exports (SVG/PNG) for wallpapers, prints, sharing

Curious explorers who want map-based discovery and "what's next"

UX decisions (key choices and rationale)

1) Two exploration modes: Grid + Map

Grid supports "poster browsing" (fast scanning, collecting, favoriting).

Map supports geographic curiosity: "Where are the races?"

This intentionally serves two mindsets: visual collecting vs spatial exploration.

2) Fullscreen detail modal (not a page jump)

A circuit opens into a fullscreen modal so the user stays anchored in the collection, while still getting an immersive view with left/right navigation, swipe, and arrow keys.

3) "Next race" as a first-class UI concept

The app detects the upcoming race and threads it through the UX:

Highlighted card and timeline emphasis

Countdown and weather

Quick-jump affordances

This reduces "what do I click?" friction and adds season relevance.

4) Power features without UI clutter

I kept the interface minimal but made speed available:

Ctrl/Cmd+K to focus search

Keyboard navigation and shortcuts help ("?")

Context menu actions (open/compare/export/copy SVG)

5) Lightweight progress motivation

Tracking viewed circuits adds a subtle completion loop for exploration without forcing gamification.

Design decisions (visual system)

Poster-first aesthetic

Dark, restrained UI so the track artwork is always the hero - less chrome, more "collector poster."

SVG craft for "premium linework"

Each circuit uses layered strokes (glow → core → highlight) and optional ripple/echo effects to create depth while preserving clarity at any scale.

Consistent UI tokens

Whole-pixel typography and shared button components keep the experience crisp and cohesive across lots of controls, states, and layouts.

Theme system as a feature

43+ built-in themes plus a custom theme builder lets users make the collection feel personal (not just "skin-deep" styling).

Feature set

Core features

49 circuits (2026 season and classic/historic set) with metadata

Card formats: portrait/square/landscape + A3/phone/desktop

Search + filters (country chips, favorites, and logic)

Detail modal with navigation and sharing/export entry points

Export: PNG (2x), full SVG, minimal SVG, copy SVG, batch Zip

Season context: timeline, next race, countdown, weather, and standings

Persistence: favorites, viewed, preferences, themes via localStorage

PWA + offline caching via service worker strategy

Nice features

3D flip “trading card” back with stats

Compare mode (side-by-side stats)

Slideshow mode (fullscreen playback)

Mobile shake-to-shuffle and shuffle cascade animation

Easter eggs (Konami, Matrix/DRS/Rain, Lights Out sequence, for example)

Technical decisions that protect UX

IntersectionObserver lazy rendering (LazyCard) to keep the grid smooth and responsive

150ms debounced search for responsive filtering

URL state sharing (theme/format/search/track) for deep links without heavy routing

Service worker caching tiers for fast repeat loads and offline resilience

What this project shows

End-to-end UX thinking: browse → discover → focus → export/share

Strong design systems: themes, formats, consistent components

Craft + polish: SVG rendering quality, motion details, keyboard UX

Performance awareness: smooth interaction at collection scale

The site is current and can be updated or modified with additional functions and features.

Scroll down this page to explore webpage Showcase. You can click on the thumbnail to open the Gallery mode view.

Core tools and overall SPA approach

Circuit Collection is a poster gallery for Formula One circuits (season and classics). Each circuit is represented by a manually traced SVG track path plus metadata (stats, colors, layout), rendered into a consistent poster template with many themes and formats.

Key capabilities

Browse circuits with search, filters, country chips, and favorites

Detail modal for full poster view + fast navigation (keys/swipe)

Flip cards to a stats “trading card” back side

Compare two circuits side-by-side

Fullscreen slideshow mode

Globe map view (interactive SVG orthographic projection)

Export posters as PNG/SVG, or batch export a Zip

Share state via URL query params

Works offline as a PWA with update banners

Tech stack

Core

React 18+ (functional components, hooks)

TypeScript (strict)

Tailwind CSS v4

Vite (build tool)

Animation

Motion (Framer Motion successor) via motion/react

CSS @keyframes for lightweight effects (draw-on strokes, pulsing dots, subtle glows)

UI libraries

Lucide React (icons)

Radix UI (primitives: collapsible, calendar, etc.)

Sonner (toast notifications)

Export

html-to-image ( toPng ) for PNG export

JSZip for batch export archives

FileSaver.js to trigger downloads

Data sources

Jolpica F1 API (Ergast successor) for live standings

Open-Meteo API for weather (no key required)

Natural Earth 110m land boundaries (TopoJSON via CDN) for the globe map

Fonts

Inter (body, 300/400/500)

Titillium Web (headings/labels/captions, 300/400/500/700)

Data model

Circuits dataset: 49 total (24 season / 25 classic-historic)

Each circuit includes: manually traced SVG path, viewBox, accent color

Optional start position metadata

Stats + location fields (laps, length, lap record, first GP, turns, direction, country/city)

Rendering and theming

Posters are layered SVG strokes (glow/core/highlight), with “draw-on” animation

Start/finish marker + pulse effects; hover scale/glow interactions

43+ themes (including team-inspired palettes)

Theme controls: background gradient + optional patterns (dots/grid/cross/scanlines/tiles/none)

Text/accent colors (per-track or fixed), stroke styles, optional echo/ripple layers

Optional “flag fill” mode

Theme Builder for custom themes + persistence

Formats: portrait/square/landscape/A3/phone/desktop + grid density modes

Core UI flows

Search across track name, country, city, and IDs; shortcut: Ctrl/Cmd + K

Country “flag chips” for quick filtering; favorites stored persistently

Detail modal: navigate (buttons/keyboard/swipe), export/share/compare/add-to-calendar (ICS)

3D flip between poster front and stats back; mobile long-press support

Compare mode: two circuits + stats table, swap actions

Slideshow: fullscreen auto-advance, timing controls, keyboard shortcuts

Map view: orthographic SVG globe (no WebGL), dots plotted via lat/lng

Season features (live)

Next race detection → highlights circuit + countdown + timeline emphasis

Weather via Open-Meteo with caching + manual refresh controls

Standings via Jolpica API with cache indicators + fallback handling

Export and sharing

PNG export: DOM-to-image via html-to-image at 2× scale

SVG export: “full” vs “minimal”, plus copy-to-clipboard

Batch export: zip of visible posters (2× PNG) with progress UI + cancel

URL state: sync track/theme/format/search/filter/favorites into query params for deep links

State, performance, accessibility, and PWA

Centralized state via useGalleryState custom hook (no external store)

localStorage: preferences, favorites/viewed, weather cache, custom themes

Performance: IntersectionObserver lazy rendering (LazyCard), memoization, debounced search, batched animations

Accessibility: skip link, semantic structure, keyboard navigation + focus management, print stylesheet

PWA: service worker app-shell + API/image caching, offline + update banners

Extras: optional easter eggs (Konami triggers, special visual modes, shake-to-shuffle) without blocking core UX