Charts that ship cleanly
Shot maps, timelines, networks, scatter plots, radars, and ranking charts with sensible defaults instead of bare plotting output.
Football charts that feel ready to ship.
Use published components, pitch primitives, and data adapters to build match pages, season summaries, and analysis surfaces without re-solving the same UI problems in every app.
import { ShotMap } from '@withqwerty/campos-react';
import { fromOpta } from '@withqwerty/campos-adapters';
const shots = fromOpta.shots(events, ctx);
<ShotMap shots={shots} />
// Start here, then compose into full match or season pages. Campos gives you publishable football charts and pitch primitives that fit normal React work. Use it for match pages, season summaries, reports, and internal tools without rebuilding football-specific UI from scratch.
Shot maps, timelines, networks, scatter plots, radars, and ranking charts with sensible defaults instead of bare plotting output.
Express any styling logic as a callback — colour by xG threshold, stroke by outcome, shape by position. Constants and maps work too.
The site includes full-page examples so the library is judged as a system, not as disconnected components.
Campos already covers the core chart types and page-building football primitives used across match pages, season summaries, and analysis surfaces.
Half-pitch shot visualisation with xG encoding and presets.
pitchPassing network with nodes, links, and directional flow.
pitchPass trajectories with direction, outcomes, and pitch context.
pitchKickoff lineups and shape views for match pages.
pitchUniform-grid density maps for territory and activity patterns.
pitchSmoothed density surfaces with football-specific pitch framing.
pitchStructured zone-control views for team territory summaries.
pitchMatch xG accumulation over time with goal markers.
timelineMulti-dimensional comparison with size, colour, labels, and guides.
cartesianUnivariate density curves and stacked comparison rows for non-pitch metrics.
cartesianCompact multi-metric profile views for teams and players.
polarRadial percentile profiles for player and team comparisons.
polarLeague-rank progression across a season.
rankingDirectional value-change views over time.
rankingCompact stat strips for scorelines, headers, and summary rails.
uiBring any normalised shot, pass, or event array. Zero-config defaults handle the rest.
Express visual logic as functions — colour, stroke, shape, opacity — using whatever fields your data has.
Use multiple components together on one route instead of treating them as demos only.
@withqwerty/campos-react is the main library package, with
@withqwerty/campos-adapters for provider normalisation,
@withqwerty/campos-schema for canonical types,
@withqwerty/campos-stadia for pitch and goal primitives, and
@withqwerty/campos-static for Node-side export.
The intended path is raw provider payloads into adapter products such as
ShotEvent[] and PassEvent[], then straight into
chart components. Aggregated charts can skip that step and take plain metric
rows directly.
Style props accept constants, maps, or callbacks. The callback gets the point model and returns the style, so most editorial logic stays in normal TypeScript rather than a chart-specific DSL.
Compute helpers are still exported from @withqwerty/campos-react
during alpha. That keeps the public surface smaller while the chart and
model contracts are still being battle-tested.
Static export is a deliberate two-step surface: build an
ExportFrameSpec in React, then render it to SVG or PNG in
Node with @withqwerty/campos-static.
The next pass is about battle-testing complete football pages and landing a first-class callback-based styling system across all components.
npm install @withqwerty/campos-react@alpha
The current docs site tracks the alpha release channel, so
installs should pin @alpha until Campos moves onto the
default npm tag.
npm is the safer first-alpha install path while npm's abbreviated
metadata catches up for newer scoped publishes.