Skip to the content

Honest

Every vehicle shows how fresh its data is, and every sentence says no more than the data knows.

Calm

The map and the vehicles carry the colour. The interface around them is ink, glass and neutral surfaces, with the brand yellow kept for the main action.

Of Copenhagen

The operators' own line colours, the city's names, Danish and English side by side, the 24-hour clock.

Semantic colours89 colours, light and darkDefaultsurface.defaultRaisedsurface.raisedInsetsurface.insetInversesurface.inversePrimarytext.primarySecondarytext.secondaryBrandsurface.brandBrand subtlesurface.brand-subtleSuccessstatus.successWarningstatus.warningDangerstatus.dangerInfostatus.infoLine colours, with their namesM1M2M3M4ABCEFHPrimitive colours38 stepsneutral050100300400500600700800900950blue100300500700900green100300500700900orange100300500700900red100300500700900yellow100300500550600700900The palette holds Perron's raw colour values.TypographyFamiljen GroteskDisplay: headings and the wordmarkSchibsted GroteskSentences, labels, controls and small headings: every role but the large headings and the figuresJetBrains MonoData: times, countdowns, counts and data ages. Always tabular figures.displayKongens Nytorv48 pxheading-lgDepartures24 pxheading-mdLine M3, Cityringen20 pxbodySignal fault at Danshøj. Trains run every 10 minutes.14 pxlabelShow departures13 pxoverlineNext departures11 pxdata08:14 +3 min ~08:2112 px7 of the 17 roles. Every piece of text on this site is set with one.Spacingspace.0502 pxspace.1004 pxspace.1506 pxspace.2008 pxspace.30012 pxspace.40016 pxspace.50020 pxspace.60024 pxspace.80032 px9 steps, from 2 px to 32 px. space.300 is 12 px.Radius and focusxs, 4 pxsm, 6 pxmd, 8 pxlg, 12 pxxl, 16 pxfull, 9999 pxFocusOne ring, 2 px wide, 2 px from the element.ElevationThe map is the ground; everything else floats over it, and depth shows first in the surface colour, then in a shadow.Motioneasing.sheetduration.sheet 320 mseasing.standardduration.camera 750 msduration.report-pulse 1100 msMotion explains a change of place. Under reduced motion, transitions take 0.01 ms.Icons24 filesOne small set, drawn for Mylder.LogosThe mark is a bus dot, an S-tog dot and an estimated ring: three of the ways a vehicle can look on the map.Layoutcompact-phone380 pxHide the brand markphone760 pxBottom sheets, compact top bartablet1180 pxHide city name, day and legenddesktop1400 pxBelow it, the filter chips marked "Later", for filters still to come, are hiddenAccessibilityWCAG 2.2 AAtext.primary on surface.default17.3:115.3:1text.success on surface.inset4.7:16.3:1Part of it the build proves on every change: npm run check fails when any check below breaks. The rest no build can see, so a person checks it on every screen before it ships.Content designSignal fault at Danshøj. Trains between Flintholm and Ny Ellebjerg run slower than planned.08:144 min45 km/h−1—≈~NowEvery 3 minEvery 3 to 4 minCancelledHow every word in Mylder reads: plain sentences, exact about certainty, in English, Danish, Swedish and Norwegian Bokmål.

Only on a live map

Using the tokens

  • Install @mylder/perron and load @mylder/perron/perron.css once at the app root. It brings the fonts, the custom properties for both themes and for reduced motion, the typography classes and a few page defaults.
  • Pages name tokens the way the sources do, color.text.primary. In CSS that token is var(--perron-color-text-primary): --perron-, then the name with dots as hyphens. Never copy a value.
  • In script, @mylder/perron/tokens.ts has every value per theme, typed by name, and the reduced motion values under modifiers.
  • Light is the default theme. Set data-theme="dark" on any element for dark; without it, the system's dark mode applies. Reduced motion follows the system setting on its own.
  • Icons and logos are SVG files in @mylder/perron/icons/ and @mylder/perron/logos/, listed with their use in icons.json and logos.json.
  • A token changes only in Perron's own repository, in packages/perron/tokens/*.tokens.json, followed by npm run tokens. Never edit a generated file, or a table on these pages, by hand.
/* once, at the app root */
import '@mylder/perron/perron.css'

.departure {
  color: var(--perron-color-text-primary);
  padding: var(--perron-space-300);
  font: var(--perron-typography-body);
}