Map
The map is the ground every panel floats over, drawn quiet so the vehicles carry the colour.
Colours
Land, water, parks, streets, rail, buildings and labels each have a colour per theme. Water is also the colour of the page behind the map. The aircraft have a colour of their own, on Aircraft.
color.map.waterLight#C4D4DDDark#0A1115Sea, lakes and the page behind the mapcolor.map.landLight#EDEFEBDark#151B1ELand, the map's main groundcolor.map.parkLight#D8E4D2Dark#16231EParks and green areascolor.map.streetLight#FFFFFFDark#252D31Roads and streets, drawn over the landcolor.map.airportLight#E2E5E1Dark#1C2326Airport grounds, under the runways and taxiwayscolor.map.runwayLight#CBD1CEDark#2B3438Runways and taxiways, drawn over the airport groundscolor.map.buildingLight#E2E5E0Dark#1A2125Building footprints at close zoom, on the flat mapcolor.map.building-3dLight#D3D9D4Dark#2A33383D buildings, walls and roofs: the map's light shades each face from itcolor.map.railLight#BCC4C1Dark#323C41Rail tracks without a coloured line on themcolor.map.labelLight#66737ADark#7E8B91Place names on land; names on water use color.map.water-labelcolor.map.water-labelLight#5F7A88Dark#4B6774Names of seas, lakes and harbours, set on the watercolor.map.aircraftLight#B3127ADark#F27BC8The aircraft glyph on the map, and nothing else; a no-signal aircraft is grey
Lines and dots
Line widths, dot sizes and the gap between lines that share a track are canvas measures, in px at the default zoom.
Where lines share a track, such as A, B, C, E and H through the centre or M1 and M2, each is drawn as its own strand beside the others, never on top of them. A line's map.strand.* is its place from the track's centre, in steps of its mode's map.track-spacing: the app multiplies the two for the line's offset, such as MapLibre's line-offset, and gives a vehicle on that line the same offset, so it stays on its strand. The order keeps each line on one side of every track it shares, so a strand never crosses another: A, B, C, E, H from one side to the other through the centre, M1 beside M2 and M3 beside M4. The values are the full trunk's, where all five S-tog lines share the track; which lines share a stretch comes from the app's own timetable, and where only some do, the app keeps them in the strands' order, a track spacing apart and centred on the track, so C and H alone sit at −0.5 and +0.5, and a line alone on its track is drawn on the centre.
| Token | Value |
|---|---|
map.dot-radius.busBus dot radius on the map at the default zoom | 3.3 px |
map.dot-radius.metroMetro dot radius on the map at the default zoom | 4.6 px |
map.dot-radius.stogS-tog dot radius on the map at the default zoom | 4.8 px |
map.dot-radius.regionalRegional train dot radius on the map at the default zoom | 5.3 px |
map.line-width.metroMetro line stroke on the map | 3.2 px |
map.line-width.stogS-tog line stroke on the map | 2.5 px |
map.line-width.regionalRegional line stroke on the map | 2.1 px |
map.line-width.focus-extraAdded to the width of a focused line | 1.6 px |
map.line-width.bus-focusBus route drawn only when focused | 4 px |
map.track-spacing.metroGap between parallel metro lines sharing a track | 3.4 px |
map.track-spacing.stogGap between parallel S-tog lines sharing a track | 2.8 px |
map.track-spacing.regionalGap between parallel regional lines sharing a track | 2.8 px |
map.strand.m1Line M1's strand on a shared track, in track spacings from its centre | -0.5 |
map.strand.m2Line M2's strand on a shared track, in track spacings from its centre | 0.5 |
map.strand.m3Line M3's strand on a shared track, in track spacings from its centre | -0.5 |
map.strand.m4Line M4's strand on a shared track, in track spacings from its centre | 0.5 |
map.strand.aLine A's strand on a shared track, in track spacings from its centre | -2 |
map.strand.bLine B's strand on a shared track, in track spacings from its centre | -1 |
map.strand.cLine C's strand on a shared track, in track spacings from its centre | 0 |
map.strand.eLine E's strand on a shared track, in track spacings from its centre | 1 |
map.strand.fLine F's strand on a shared track, in track spacings from its centre | 0 |
map.strand.hLine H's strand on a shared track, in track spacings from its centre | 2 |
Aircraft
Aircraft are the planes over the city, from a feed of their own. They are not vehicles: they have no mode and no line, and they are never counted with the vehicles. Each is drawn as the aircraft glyph, a plane seen from above, in color.map.aircraft, a magenta that no line, mode, status or the brand uses, so a plane never reads as a bus or a train. Aircraft are drawn above the vehicles.
- The glyph is the outline in
packages/perron/icons/aircraft.svg, on its 14 px grid, pointing north. The aircraft's position is the centre of the grid, and the app turns the glyph about it to the aircraft's track, clockwise from north. Its box ismap.aircraft-size.airwide in the air andmap.aircraft-size.groundon the ground, scaled with the zoom as the vehicle dots are. - The halo is the vehicle dots': the outline stroked in
color.data-state.halo,vehicle-dot.halowide on each side, under the glyph, so a plane stands off whatever it crosses. - The legend shows the glyph beside "Planes" after the five states wherever the map shows aircraft: VehicleDotLegend's
aircraftVisible.
An aircraft carries the data states in the vehicle dots' shapes, as far as a plane can take them. Timetable only never applies: an aircraft has no timetable.
| State | Glyph |
|---|---|
| Live | The outline filled in color.map.aircraft |
| Ageing | Filled at vehicle-dot.ageing.fill-opacity, with a rim map.aircraft-stroke-width.ageing wide |
| Estimated | Hollow: no fill, a line map.aircraft-stroke-width.estimated wide |
| No signal | Filled in color.data-state.no-signal, cut by a gap vehicle-dot.no-signal.cut-width wide from the top left of its box to the bottom right |
- Rims are drawn inside the outline: clip to it and stroke twice the width. The glyph then keeps one outer size in every state, as a dot's insets keep its.
- The rims are thinner than a dot's: a plane is narrow, and a dot's 1.8 px ring would fill its body in, so estimated would read as live.
- The cut runs from the top left of the box to the bottom right on the screen, whatever the track, so it reads as the vehicle dots' cut does.
| Token | Value |
|---|---|
map.aircraft-size.airAircraft glyph box on the map at the default zoom, in the air | 18 px |
map.aircraft-size.groundAircraft glyph box on the map at the default zoom, on the ground | 14 px |
map.aircraft-stroke-width.ageingRim of an ageing aircraft, inside its outline | 1 px |
map.aircraft-stroke-width.estimatedOutline of an estimated aircraft, inside its outline | 1.2 px |
color.map.aircraft, in the Colours table, reaches 3:1 on every ground a plane flies or taxis over, in both themes, as WCAG asks of a mark that carries meaning:
| Light | Dark | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Colour | on map.land | on map.water | on map.park | on map.airport | on map.runway | on map.building | on map.building-3d | on map.land | on map.water | on map.park | on map.airport | on map.runway | on map.building | on map.building-3d |
color.map.aircraft | 5.53:1 | 4.20:1 | 4.86:1 | 5.03:1 | 4.13:1 | 5.03:1 | 4.46:1 | 6.99:1 | 7.65:1 | 6.53:1 | 6.41:1 | 5.11:1 | 6.55:1 | 5.18:1 |
3D buildings
The map opens flat and north-up. 3D is a view the rider turns on: the map tilts, up to 60°, and turns, and the buildings rise.
- Where. Buildings rise from zoom 14.
- Heights come from OpenStreetMap and are approximate: a block may stand a storey off, and one with no height recorded stands at a default.
- Colour. A 3D building is one colour,
color.map.building-3d, walls and roof alike: the map's light shades each face from it, so a block reads as a block without a second colour. It is a step further from the land thancolor.map.building, darker in light and lighter in dark, so the walls stand off the ground they rise from. - Over and under. The dots, lines and stops are drawn over the buildings, never hidden behind them. The buildings are drawn at
opacity.map-building-3d, faint enough that the street behind a block shows through it, so a bus on that street, drawn over the block, reads as being behind it rather than on its roof.
| Token | Value |
|---|---|
opacity.map-building-3d3D buildings, faint enough that the street behind a block shows through | 0.6 |
Focus and dimming
When a line is in focus, everything outside it dims: vehicles, lines, stations and labels each to their own opacity, so the focused line reads first without the rest vanishing. Lines at rest are drawn slightly translucent, and live vehicles leave a short trail.
| Token | Value |
|---|---|
opacity.map-dim-vehicleVehicles on lines outside the focus | 0.28 |
opacity.map-dim-lineRail lines outside the focus | 0.16 |
opacity.map-dim-stationStations outside the focus | 0.3 |
opacity.map-dim-labelStation labels outside the focus | 0.45 |
opacity.map-lineMetro and S-tog lines at rest | 0.78 |
opacity.map-line-regionalRegional lines at rest | 0.5 |
opacity.map-trailMotion trail behind live vehicles | 0.32 |