Visual language

Color

Brand colors, the scales they come from and the tokens the product is built with.

How our colors work

Our colors come in two layers, the same two the app and the Figma library use.

  • Scales are the raw colors: a primary (blue) scale, an accent (orange) scale, a secondary (navy) scale, a gray scale and the status colors. A scale step has a number, like primary 500, never a name of its own.
  • Tokens are roles. A component never asks for grey 100; it asks for surfaceContainer, and the token points to a step on a scale. Change the step a token points to, and everything that uses the token follows.

The token names follow Material 3, which the app is built on: primary, surface, surfaceContainerLow, onSurface and so on. On means the color of text and icons that sit on top of the color with the same name.

Brand colors

SwatchColorScreen and printUse
primaryprimary 500 C 75, M 56, Y 0, K 0The brand. Logo, app icon, buttons, large surfaces.
secondarysecondary 1000 C 64, M 47, Y 0, K 75 *Ink. Body text, headings, dark surfaces.
accentaccent 500 C 0, M 41, Y 61, K 9 *Marketing only. One highlight per view, and where the website gradients end.

* A starting point, not a proofed build. Confirm with a printer proof before the first print job.

Blue is SimplePark. The logo, the app icon, the main button and the big surfaces that say "this is us" are blue. It is the color of the parking sign that every Dutch driver already looks for. Navy does the reading, and orange is the spark on the website, never in the app. Click a hex to copy it.

Scales

Each scale runs from light to dark. Primary and accent have the brand color in the middle, at 500, with two lighter and two darker steps around it. Secondary is the ink and only gets lighter. The outlined step is the brand color; click a step to copy its hex.

Primary
Accent
Secondary
Grey
Status

Surfaces

A screen is built in layers. The surface is the background; cards, sheets, list rows and fields sit on it in containers. The five container levels go from the same white as the surface to the most set-apart gray, and each level has its own text color. Not all of them are readable text: grey 400 and grey 500 on the first two levels measure 1.9 : 1 and 2.6 : 1, so they are for hints, placeholders and disabled text, never for information, and grey 600 on grey 100 measures 4.2 : 1, which is large text only (see text on color).

surfaceText in onSurface
surfaceContainerLowestText in onSurfaceContainerLowest
surfaceContainerLowText in onSurfaceContainerLow
surfaceContainerText in onSurfaceContainer
surfaceContainerHighText in onSurfaceContainerHigh
surfaceContainerHighestText in onSurfaceContainerHighest
SwatchTokenPoints toUse
surfacewhite The background of a screen.
onSurfacesecondary 1000 Everything you read.
onSurfaceVariantgrey 500 Hints and placeholders.
surfaceContainerLowestwhite A container that sits flat on the surface.
surfaceContainerLowgrey 50 A quiet container.
surfaceContainergrey 100 The default card and field.
surfaceContainerHighgrey 200 A container that stands out.
surfaceContainerHighestgrey 300 The most set-apart container.
outlinegrey 200 Borders.
outlineVariantgrey 100 Dividers.

Brand roles

Where the brand shows in the interface: the main action, navy blocks and light blue tints. The sample text in each swatch is the token's on partner.

SwatchTokenPoints toUse
primaryprimary 500 The main action. Text on it is onPrimary, white.
primaryContainerprimary 500 A filled brand block.
primarySurfaceContainerinfo background A light brand callout, with blue text.
secondarysecondary 1000 Navy blocks and secondary actions.
secondarySurfaceContainersecondary 1000 at 7% A light navy block.
tertiaryprimary 100 Light blue tints and selected states.

Status

Every status comes in two forms: a strong surface, for a dot, a bar or the shape of a badge, and a light container for a message. Each example shows its measured contrast. Text on a strong surface is navy, not white: white measures 1.4 to 3.1 : 1 on them, navy 5.0 : 1 or more.

Success

Paid
successSurface 6.6 : 1 · AA
Your invoice of € 12.50 is paid.
successSurfaceContainer 5.0 : 1 · AA

Warning

Ends soon
warningSurface 7.5 : 1 · AA
Your parking action stops in 15 minutes.
warningSurfaceContainer 5.0 : 1 · AA

Error

Not paid
errorSurface 5.0 : 1 · AA
Your direct debit of € 23.40 did not go through.
errorSurfaceContainer 5.0 : 1 · AA

Info

Note
infoSurface 5.9 : 1 · AA
You can park for up to 2 hours in this zone.
infoSurfaceContainer 5.7 : 1 · AA

Disabled

Off
disabledSurface 11.0 : 1 · AA
This option is not available yet.
disabledSurfaceContainer 5.9 : 1 · AA

The status colors themselves are too light for text. That's what the text steps are for: success text, warning text and error text are readable on their own light container, at 4.5 : 1 or more. Use them for the words in a status tag or message; the status color itself goes to icons, dots and bars. Neutral and blue tags use grey 700 on grey 100 and primary 700 on primary 100, which is why the Info and Disabled messages above are set in grey 700: grey 500 and the disabled color are too light for words. A disabled control itself is exempt from the contrast rules; a message about it is not.

Product colors

Colors with one job in the app.

SwatchTokenPoints toUse
progressIndicatorActiveprimary 500 The filled part of a progress bar.
progressIndicatorInactiveown color The empty part of a progress bar.
mapAreaFillprimary 500 A zone on the map, at low opacity.
mapAreaOutlineown color The border of a zone on the map.
shimmerBlankown color Loading placeholder, light.
shimmerMutedown color Loading placeholder, dark.
licencePlateBackgroundown color A Dutch plate, with navy text.
licencePlateTextown color Belgian plate text, red on white.
scrimblack at 40% Behind a sheet or dialog.
shadowblack at 12% Elevation.

The app has no dark mode yet: the tokens point to the same steps in light and dark. Dark values exist only where a surface needs them today: email and the highlights under text gradients.

Text on color

Which text color goes on which surface, measured against WCAG AA: 4.5 : 1 for small text, 3 : 1 for large text. Every pair names the tokens, so the answer holds wherever the tokens are used.

SwatchPairColorsContrastUse
onSurface on surfacesecondary 1000 on white 15.7 : 1 AAEverything you read in the app, and headings on the website.
text on surfacesecondary 1000 at 78% on white 7.7 : 1 AARunning text on the website.
onPrimary on primarywhite on primary 500 4.4 : 1 Large textButton labels, as a known exception. Otherwise large text only.
primary on surfaceprimary 500 on white 4.4 : 1 Large textLarge text, links, icons and borders.
onSecondary on secondarywhite on secondary 1000 15.7 : 1 AAText on dark surfaces.
onSurfaceContainer on surfaceContainergrey 600 on grey 100 4.2 : 1 Large textSecondary text in a container. Large text only.
onSurfaceVariant on surfacegrey 500 on white 2.7 : 1 FailsHints and placeholders only, never information.
secondary on accentnavy on orange 6.2 : 1 AAText on an orange highlight in marketing.
white on accentwhite on orange 2.5 : 1 FailsNever.
  • White on primary is just under AA for small text. Buttons are the one place we accept that: short, semibold labels in a shape everyone recognizes. Anywhere else, white on blue is large text only.
  • Gray text is for what can be missed: hints, placeholders, timestamps. Only grey 600 and darker pass AA on white; grey 400 and grey 500 are for hints, placeholders and disabled text, never for information. Anything a customer needs to act on is onSurface.
  • Running text on the website is navy softened (#4A536A, secondary 1000 at 78% on white). A page of full navy reads hard; the softened navy keeps the same hue and stays well above AA. Headings, prices and labels stay full navy, so what matters still stands out. On the web it is the --sp-text token.

Proportions

Most of what we make is white and light blue, with blue doing the talking and navy doing the reading. Orange is the spark on the website, not the fire.

Orange

Orange is the one thing we want you to read first. Our idea is parking you don't have to think about, at a price you already know. In marketing and motion, orange marks that price: the amount in a headline, the number that stays when the screen calms down, the one word that tells you what you need to know.

  • One orange thing per view. If two things are orange, neither is the thing to read first.
  • In marketing, orange may mark a price. That is what it is for.
  • In the product, orange stays away from amounts and status. There, orange-ish means warning, and a price must never look like a problem. Amounts in the app are navy.
  • Text on orange is navy, never white.
  • Not for the logo. The logo is always blue or white.
  • No orange on the business pages. That part of the website is navy, so it reads as the serious part at a glance (see website).

Orange sits close to the product's warning color (#F9A037). Until warning moves towards amber, keep the two apart: never orange and warning in the same view.

Gradients

Our website uses gradients to add warmth: blue that runs into orange, the two colors of the brand meeting. They are for marketing, never for the product UI, the logo or anything a customer must read to act.

Click Copy css to copy a gradient.

Text gradients

For one phrase in a headline or a quote, the words we want you to remember. One per view, and only on large text.

SwatchGradientColorsUse
blue text#1F3FA8 to #7F9DFF The default highlight. Dark mode: #6F8DFF to #C2D0FF.
warm text#87381C to #EC9A62 The warm highlight, for a second phrase or a section that needs warmth. Dark mode: #D0703F to #F0A676.

Mesh surfaces

Soft color fields for panels, feature cards, banners and calls to action. Each is a few radial glows over a base gradient, with a film grain on top: an SVG noise texture at 42% opacity, blend mode overlay. Text on a mesh is white or navy, and large. They use only primary, accent and navy, lightened with white or mixed with each other; a hex that is not on a scale is one of those mixes. Why we use a mesh at all, and what each color in it says, is on the graphic elements page.

SwatchGradientColorsUse
cool meshblue to orange The default surface. Pale blue on the left for air, then blue, warming to orange at the bottom right.
warm meshmostly orange A card that should stand apart from the cool ones.
deep meshnavy with blue and orange The dark surface for banners.

Accents

SwatchGradientColorsUse
blue to orange#1F3FA8 to #E98A5A The whole range in one line, for a big closing word or a divider.
avatar#8EA8FF to #E98A5A Behind initials when there is no photo.
  • Gradients run from blue to orange, never the other way round and never in other colors.
  • One gradient element per view, next to flat color everywhere else.
  • Not in the product. The app stays flat: blue, navy and the functional colors.
  • Not on the logo, and not behind small text.

Print

Use the CMYK builds of the brand colors for anything printed, and send the _cmyk.ai logo files to the printer. The logo README explains why the printed blue looks duller than the screen blue, and what to ask a printer when it has to match.

SwatchBlueValueUse
on screenhex For anything on a screen.
in printC 75, M 56, Y 0, K 0 A simulation of the ink. Never use this hex on a screen.
  • Never pick a print color from the screen hex, and never use a screen hex taken from a printed sample. The print swatch above is a simulation of the ink, not a color to use.
  • Tokens, tints and grays are screen colors. In print, use primary, secondary and the accent, and tints of them.