Design system · for engineering

Mercury Glass.

A liquid-chrome material system for Showhub: translucent graphite surfaces, a single electric-blue accent, and chrome highlights — slick, restrained, and built to read in dim venues across every surface from a 7″ operator panel to a fleet dashboard.

Dark-firstTouch-firstWCAG AASpace Grotesk + Space Monobackdrop-filter glass
00 Principles

Five rules that make it Mercury#

01 · Material over decoration

Depth comes from translucency, blur and a top specular edge — not borders, gradients-as-fills, or drop shadows used as ornament.

02 · One accent, used sparingly

Electric blue marks the live, the active, the primary. Everything else is graphite and chrome. Colour is earned.

03 · Chrome = the primary action

The brightest object on screen is the thing to tap. Reserve the chrome gradient for one primary per view.

04 · Calm down for data

Show surfaces lean into blur and glow; portals trade blur for solid panels and tabular Space Mono for legibility.

05 · Never colour alone

Module identity always pairs a tint with an icon and a label, so it survives glare, colour-blindness and a room at distance.

01 Colour

Core palette#

Graphite base, cool neutrals, one accent, chrome for highlights. Hexes are the opaque reference values; glass surfaces are these tones at 44–55% over the ambient background. Click any swatch to copy its value.

Per-module accents

Each of the six modules carries a muted-jewel tint. Always paired with the module icon + label — never used as the only signal. Click to copy.

02 Typography

Space Grotesk + Space Mono#

Space Grotesk carries all UI — technical, modern, a little characterful. Space Mono handles every number, timecode, ID, label and status, giving readouts a precise, instrument feel. Both are OFL: self-hostable and embeddable in air-gapped builds.

DisplayGrotesk 700 · -2.5%
Run the whole night
H2 / TitleGrotesk 700 · -2%
Pick a show
H3 / SectionGrotesk 600
Audio zones
BodyGrotesk 400–500 · 15px
Request tracks, play along and vote — all from your phone.
Label / statusMono 700 · +14% · UPPER
● Now singing
NumeralsMono 700 · tabular
99.8% · 1,284 · 20:41
03 Space & radius

An 8-point grid, soft corners#

Spacing scale

TokenUseValue
--space-1Tight — chip/label padding8px
--space-2Default gap between elements12px
--space-3Card padding, list gaps16px
--space-4Panel padding, section rhythm22px
--space-5Screen margins (touch)26px
CLICK A ROW TO COPY THE TOKEN NAME

Corner radius

9 · chips, keys
14 · buttons, tiles
18 · panels, cards
pill · status, tabs

Hardware corners stay soft but never fully round except for status pills and avatars. Touch targets ≥ 44px; primary touch buttons 56–66px.

04 The material

The glass recipe#

Every surface is one base recipe: a blurred, saturated translucent graphite fill, a hairline cool border, an inner top highlight, and a diagonal specular sheen. Glass needs colourful content behind it to read — place panels over the ambient gradient + drifting orbs, never over flat black.

/* base surface — use on every card, bar, tile */
.glass {
  backdrop-filter: blur(26px) saturate(180%);
  background: linear-gradient(160deg,
    rgba(46,51,62,.5), rgba(16,18,24,.44));
  border: 1px solid rgba(184,200,232,.16);
  border-radius: 18px;
  box-shadow:
    inset 0 1px 0 rgba(214,226,255,.18),
    0 18px 40px -18px rgba(0,0,0,.6);
}
/* diagonal specular sheen (::before, z-index 2) */
.glass::before {
  background: linear-gradient(150deg,
    rgba(220,232,255,.14), transparent 40%);
}
This card is the recipe
Blur · saturate · hairline · inner highlight · sheen
ABC
Primary action · chrome
/* chrome control — ONE primary per view */
.btn-chrome {
  background: linear-gradient(160deg,#EEF3FF,#9FB0DE);
  color: #0B0C0F;
  box-shadow:
    inset 0 1px 1px rgba(255,255,255,.8),
    0 12px 28px -10px rgba(174,190,255,.6);
}

Tuning by surface — live

Tuning by surface: show / operator surfaces use blur 26–34px for drama; portals drop to solid #14171D panels (no blur) so dense data stays crisp and AA-safe. Toggle the same panel between the two treatments — the orbs behind it are exactly what production screens drift beneath the glass.

Show surface · blur(26px) saturate(180%)
Now singing — Priya K.
QUEUE 12 · ZONE MAIN DECK · 20:41
05 Components

The kit#

Every specimen below is live — hover, press and type. Chrome buttons lift on hover and depress on press; keys travel 2px; selected chips carry the blue glass fill.

Buttons LIVE

Chrome = primary (one per view). Glass-blue = secondary/active. Ghost = tertiary.

Chips / filters LIVE

Selected chip carries the blue glass fill; rest stay neutral. Click to toggle.

Module tiles LIVE
Karaoke
Live · 12 in queue
Background
4 zones
List rows
T
Tom & JenHold the Line Tonight
P
Priya K.Golden Hour
Input field + key LIVE
Toast & stat LIVE
Jordan added #5
Sessions today
1,284
▲ 12% vs avg
06 Motion

Slick, never frantic#

Motion is smooth and purposeful. Surfaces drift; content fades and slides a short distance; the brand "lenses" into focus. Always honour prefers-reduced-motion and never transition visibility (toggle it instantly; fade opacity instead). Each card below runs the real curve at real duration — replay to scrub.

Screen change
opacity + 24px slide · 280ms ease
SCREEN B

Forward slides left, back slides right. Visibility flips instantly underneath.

Ambient orbs
translate/scale · 24–34s loop
GLASS OVER DRIFT

Background colour fields drift slowly so glass always has live content to refract.

Pop-in
opacity 0→1 + -8px · 500ms

New queue rows / list items settle in from above with the accent border.

Boot / lens
scale .4→1 + deblur · 1.6s
Showhub

The chrome lens forms and sharpens, then the wordmark fades up.

Press
translateY 1–2px · 80–120ms

Keys and buttons depress; chrome buttons lift on hover. Try it — these are live.

Live pulse
opacity 1→.3 · 1.1s loop
On air

Reserved for the on-air dot only — the single looping element allowed on content.

07 Accessibility

Legible in the dark, by anyone#

Contrast — AA minimum

Body text on glass meets 4.5:1; large text and UI meet 3:1. Glass fills are kept opaque enough (≥44%) over controlled backgrounds to hold contrast.

Never colour alone

Status and module identity always pair tint + icon + text label, so meaning survives glare and colour-blindness.

Touch targets

≥44px everywhere; primary show/operator actions 56–66px with generous spacing — usable by non-technical staff at speed.

Distance legibility

Audience surfaces scale type far above UI minimums; status uses pulse + label, not subtle colour shifts.

Reduced motion

All drift, pulse and entrance animations collapse to static end-states under prefers-reduced-motion. This page does the same — try it in your OS settings.

Focus & scale

Accent focus rings on interactive elements; type set in rem so OS text-scaling reflows cleanly. Tab through this page to see the rings.

● Do

  • Put glass over the ambient gradient + orbs so it refracts
  • Keep one chrome primary action per view
  • Pair every module colour with its icon and label
  • Use Space Mono for all numbers and statuses

● Don't

  • Stack glass on flat black — it turns into a grey box
  • Tint large areas with the accent or module colours
  • Transition visibility or loop decorative animation on content
  • Drop below AA to keep a panel more transparent
08 Token reference

tokens.css — canonical values#

The complete :root custom-property set from mercury/tokens.css — the source of truth for every build. Click a row to copy the var() reference. Values here must never drift from the file.

Base, accent & text

TokenUseValue
--bgGraphite base#0B0C0F
--accentThe single electric-blue accent#6E8BFF
--accent-hiAccent text / icons on dark#AEBEFF
--chromeSpecular highlight / lyric fill / chrome buttons#EAF1FF
--inkPrimary text#EBF0FB
--mutSecondary text#9AA6BD
--dimTertiary / mono labels#6B7488

State

TokenUseValue
--okSuccess / online#7BE0A0
--warnWarning / pending#FFC988
--badCritical / on-air#FF8FA0
--karKaraoke state tint#FF8FB0

Borders

TokenUseValue
--brdHairline on glassrgba(184,200,232,.16)
--brd2Stronger hairline / inputsrgba(184,200,232,.26)

Module gels

TokenUseValue
--m-bgmBackground music#7FB0FF
--m-karKaraoke#FF8FB0
--m-vidVideos#B79CFF
--m-gameGames#8FE0B0
--m-bingoBingo#FFC988
--m-adsAds#CFD6E0

Type & radius

TokenUseValue
--font-displayDisplay + UI'Space Grotesk', system-ui, sans-serif
--font-monoData / IDs / labels / clock'Space Mono', monospace
--radiusPanel / card corner18px
CLICK A ROW TO COPY THE VAR() REFERENCE

Fonts are OFL — self-host both families for the air-gapped production build. font-synthesis:none is set on :root so faux bold/italic never sneak in.