Live Quiz Platform

Design Specification

Status Draft
Audience Designers, engineers, brand stakeholders
Generated 2026-06-10
Source of truth .claude/context/knowledgebase/design-spec.md

Single source for brand identity, design tokens, and the four per-app design languages — Designer, Host, Remote, Client — plus a cross-app Comparison matrix. Single source for brand identity, design languages, and design tokens across all four apps. Where this page disagrees with anything older in the codebase or knowledgebase, this page wins — open an issue to reconcile.

How this spec is organised

The platform ships one shared brand expressed as four distinct design languages, one per app. The structure mirrors that:

  1. Foundations project — what every app shares: brand identity, master palette, type stack, motion principles, voice + tone, a11y baseline, iconography, sound design.
  2. Designer language designer — calm, dense, monochrome operator chrome optimised for sustained authoring.
  3. Host language host — two halves: the operator window (Designer-cousin chrome) and the audience window (full Showtime).
  4. Remote language remote — handheld operator chrome — Designer family with touch density + slightly punchier motion.
  5. Client language client — full Showtime canvas; vivid palette, gameshow energy, dramatic motion.
  6. Comparison matrix project — side-by-side view: accent · surface · type scale · motion intensity · density · ornament — read these 4 columns to grok the family at a glance.

Each app section follows the same shape: tone cardpalettetypographymotiondensity + spacingornamentsurface map. Scope chips on H2s drive the per-app filtered docs view; *{project}* sections appear in every per-app view.

Final brand product name is deferred to Beta — see open questions. Apps are referred to by engineering names (Quiz.Designer, Quiz.Host, Quiz.Client, Quiz.Remote).


Foundations project

Brand identity

Asset Treatment
Wordmark Bold, slightly condensed uppercase display face, white fill with heavy black drop shadow. Final wording locked at Beta.
Tagline Clean uppercase sans, lighter weight, white on dark, neon underline accent. Final wording locked at Beta.
Logomark Stylised Q with a checkmark tucked inside it in hot magenta with a black drop shadow. Iconographic, not an initialism.
Mascot Friendly cartoon smartphone — pink/magenta body, big cartoon eyes, white-gloved waving hand, white shoes. Rigged once, reused across all four apps with context-appropriate poses. Rig lands at Beta.

Master tone: live quiz on a Saturday night, televised. High contrast, vibrant gradients, neon edges on Showtime surfaces; calm and utilitarian on operator chrome. Mascot keeps warmth and humour under the energy.

Master palette (foundation tokens)

Every per-app palette below is derived from this master scale. Two colour families: Showtime (vivid brand, gameshow energy) drives Client + Host audience; Studio (chrome neutrals + restrained accents) drives Designer, Host operator, Remote.

Showtime brand hues

Token Hex Usage
brand.magenta #FF009F Primary brand accent; logomark; key CTAs; big-reveal highlights.
brand.electric-blue #16B2EB Secondary brand accent; live-state indicators; secondary CTAs.
brand.deep-purple #961EEF Transitional gradient stop; high-energy backgrounds; big-reveal stages.
brand.white #FFFFFF Wordmark fill; primary text on dark.
brand.near-black #0F0B1A Primary text on light; neutral surfaces. Slight purple tint reads brand-consistent.

Brand gradient — linear, left→right: magenta → deep-purple → electric-blue. Reserved for hero surfaces on the audience canvas. Never on operator chrome.

Neon glow — outer glow (high blur, brand-coloured, additive blend) on framed canvas surfaces, big-reveal headings, active leaderboard rows. Use sparingly. Never on operator chrome.

Studio chrome neutrals — dark (default)

Token Hex Usage
chrome.base #11101A Application window background; canvas backdrop. Deep cool indigo.
chrome.panel #181722 Top toolbar; dialog body; popovers; primary inset surface.
chrome.paper #1F1E2A Side panels; titlebar; statusbar.
chrome.raised #1E1D29 Selected row; input fill; segment-control background.
chrome.hover #272636 Hover state for rows and buttons.
chrome.border rgba(200,195,200,0.09) Hairline divider. 1 px, never thicker.
chrome.border-strong rgba(200,195,200,0.18) Active border on focused / selected raised elements.
chrome.text #E0DDDA Primary copy. Warm off-white.
chrome.text-muted #928E97 Secondary copy, helper text, panel headings.
chrome.text-subtle #5C5862 Labels, metadata, mono runs, statusbar text.
chrome.tint radial peach @ 6% Page-level bg-glow over chrome.base.

Studio chrome neutrals — light

Token Hex Usage
chrome.base #F5F2EE Application window. Warm cream, never bone-white.
chrome.panel #FFFFFF Top toolbar; card; input fill; dialog body.
chrome.paper #ECE7E0 Side panels; statusbar; secondary surface.
chrome.raised #ECE7E0 Selected row; segment-control background.
chrome.hover #D4CFC8 Strong hover; pressed state.
chrome.border rgba(31,28,36,0.10) Hairline divider. Warm ink.
chrome.border-strong rgba(31,28,36,0.18) Active border on focused / selected raised elements.
chrome.text #1F1C24 Primary copy. Warm-near-black.
chrome.text-muted #5F5C68 Secondary copy, helper text.
chrome.text-subtle #959099 Labels, metadata, mono runs.
chrome.tint radial peach @ 14% Page-level bg-glow. Carries the warm signature on light.

Status hues (shared)

Token Hex Role
status.mint #36D17B Save / connection / pair success; auto-save dot; live indicator.
status.amber #FFA94D Unsaved-changes dot; transfer-pending dot; reconnecting dot; timer-low; caution.
status.crimson #E63946 Destructive action; validation-error border; failure banner.

Typography stack

Role Family Usage
Display Bebas Neue Headings, numerals (scores, timers), hero copy. Tall condensed uppercase, tight tracking, drop shadow on dark.
Body Inter UI labels, paragraphs, dialog copy. Geometric sans, sentence case, generous line-height.
Mono JetBrains Mono Codes, timestamps, debug, metadata labels, keyboard shortcuts in menus.

Rules (every app):

  • No more than two type families visible at once on operator chrome; Showtime surfaces may use all three.
  • Headings uppercase, bold, tight letter-spacing, drop shadow on dark.
  • Numerals on Showtime surfaces use the display face for impact; on operator chrome they use mono so they read as metadata.

Motion principles

  • Confident and snappy. Spring-driven transitions with slight overshoot. Avoid lazy ease-in/out.
  • Operator chrome — short and quiet. Animations < 200 ms; no overshoot; no glow pulses; never decorative.
  • Audience canvas — large and theatrical. Big reveals combine scale + glow pulse + branded audio sting. Reserve for genuine reveals.
  • Idle states on Showtime — mascot in subtle motion (idle bob, blink) over abstract spinners.
Token Duration Easing Use
motion.fast 120 ms cubic-bezier(.4,0,.2,1) Hover, focus ring, micro-interaction
motion.base 200 ms cubic-bezier(.4,0,.2,1) Dialog open/close, panel slide, tab switch
motion.slow 360 ms spring 380 stiffness 26 damping Operator stage transitions, panel pop
motion.theatre 600–1200 ms bespoke per moment Reveal, leaderboard swell, round-change

Voice and tone

  • Friendly and confident — host who knows the room and is having fun.
  • Concise — pub-quiz rhythm; copy that drags kills the energy.
  • Playful, not silly — wit and mild theatre.
  • Inclusive — no in-jokes, no jargon.

Operator chrome leans further toward concise + tool-like (no marketing lift, no hype). Audience canvas leans further toward theatre (energy, callouts, branded warmth).

A11y baseline

Every app clears axe-core wcag2aa + wcag21aa at landing.

  • Keyboard reaches every action. Visible focus ring on every focusable element (status.info outline by default; accent for primary-action focus).
  • All dialogs / menus / tool windows trap focus, restore focus on close, expose ARIA roles + labels.
  • Colour contrast ≥ 4.5:1 for body, ≥ 3:1 for large display + UI graphics.
  • Motion respects prefers-reduced-motion: theatre + spring overshoot collapse to linear fade ≤ 200 ms.
  • Text never relies on colour alone — pair with an icon, label, or pattern.

Iconography

  • Bold and chunky, geometric, weight matches the display typography. No hairlines.
  • External imagery (photos, screenshots) sits inside framed cards with neon-glow borders on Showtime, hairline borders on operator chrome.
  • Operator chrome icons render at 16–20 px in chrome.text-muted; primary-action icons render in chrome.text at the same size.
  • Audience canvas icons render at 64+ px in brand.white with optional glow.

Sound design

Full audio language lands at Beta:

  • Stings — correct, incorrect, time-up, lock, big reveal, end of round, end of quiz.
  • Transitions — slide-advance whoosh, leaderboard reveal swell, round-change motif.
  • Big-reveal audio — branded sting paired with the visual reveal motif.
  • Ambient music bed (light) — optional between rounds; muted during questions.
  • Buzzer jingles (Alpha — earlier than the rest). Teams pick at join (F-CL-15); Host plays on first-press win (F-HO-27). Author-supplied; small built-in default library (F-DE-29). Mixed at the same loudness band as branded stings.

Mix for venue noise: stings cut through pub ambient without being intrusive.

Team identity

client host

Each team bundles name, colour (Beta), avatar (premade or photo, Alpha), buzzer jingle (Alpha) at join. Identity carries through every Host moment featuring the team: leaderboard rows, big-reveal callouts, correct-answer pings, buzzer-win playback. Team photos render at a fixed circular crop at leaderboard scale and a larger square crop on the join-screen roster.

Spacing scale

8 px base: 4, 8, 16, 24, 32, 48, 64, 96. No other values. Applies to every app.

Token namespace convention

Namespace Belongs to Loaded when
--brand-* Foundations — magenta scale, fonts, motion tokens, status hues Every app
--chrome-* Studio chrome neutrals + accents Designer, Host operator window, Remote
--qd-* Designer-specific overrides on chrome (density, accent saturation) Designer only
--qh-* Host-operator-specific overrides on chrome Host operator window only
--qr-* Remote-specific overrides on chrome (touch density, motion intensity) Remote only
--qc-* Client surface tokens (Showtime applied to phone/tablet) Client only
--stage-* Audience-canvas Showtime tokens — applied inside the embedded canvas region in any app Host audience window; the embedded preview region in Designer / Host operator / Remote

Foundation --brand-* + the relevant per-app --qX-* (or --stage-* inside canvas regions) are the only namespaces a component should reference. --chrome-* is shared across Studio apps; the per-app --qX-* overlay is what tunes intensity per app. Hard rule: no --qc-* / --stage-* reference on operator chrome; no --chrome-* reference inside an audience canvas region.


Designer language designer

Tone card

Calm, dense, monochrome. A serious authoring tool. The work is the quiz; the chrome stays out of the way. Magenta accent reserved for the single primary action per surface. Operator vibe — Figma + IDE, not gameshow.

Hero swatches:

Surface Accent Text
Dark #11101A #FF3D9A #E0DDDA
Light #F5F2EE #E5217F #1F1C24

Palette

Inherits --chrome-* from Foundations. Designer-specific overlay (--qd-*):

Dark:

Token Hex Notes
qd.accent #FF3D9A Warm pink; primary CTA only (Save when dirty, Push to Host, Run from slide)
qd.info #5FA0A8 Generic focus ring; secondary CTA
qd.tint #C89070 Page-level bg-glow over chrome.base at 6% radial

Light:

Token Hex Notes
qd.accent #E5217F Same role; slightly less luminous on light
qd.info #3F767E
qd.tint #A5673F Page-level bg-glow at 14% radial

Default theme: Light. Long authoring sessions read easier on light backgrounds. Dark is one toggle away.

Typography

  • Body — Inter, 13 px primary, 12 px tool buttons + panel headers, 11 px panel titles.
  • Display — Bebas Neue, sparingly. Dialog headlines (≥ 24 px), welcome screen, section dividers in long dialogs.
  • Mono — JetBrains Mono carries weight here. Slide indices, session codes, file paths, version numbers, save timestamps, type labels, panel-title labels (SLIDES · 20), keyboard shortcuts in menus, statusbar items. Mono is the structural signal: this is metadata.

Panel titles uppercase mono with 3 px letter-spacing. Tool-button labels sentence-case Inter. Statusbar items uppercase mono.

Motion

  • Tier: motion.fast + motion.base only. No theatre, no spring overshoot.
  • Dialog open ≤ 200 ms fade + 4 px translate. Panel resize / drag = instant (no animated tween).
  • Loading spinners minimal — Material mat-progress-spinner at chrome-text-subtle.
  • No mascot in operator chrome.

Density + spacing

  • Spacing base 8 px. Default surface padding 16 px; dense panels (slide list rows) 8–10 px vertical.
  • Minimum interactive target 24×24 px (mouse-first). Touch targets ≥ 32×32 only inside menus.
  • Information density high: master-detail panels, long lists, multi-column layouts.

Ornament

Effectively none. The chrome reads flat. The only decorative element is the qd.tint radial bg-glow over chrome.base. Borders are 1 px hairlines; corners are 4–8 px radius. No glow, no gradient, no texture.

Surface map

Region Spec
Toolbar (top) 52 px, chrome.panel, logomark left, document name centre, tool-button groups + primary CTA right.
Left panel — slide list 240 px, chrome.paper, mono panel title, slide rows with index + thumbnail + meta. Active row: chrome.raised + 2 px qd.accent inset shadow left.
Canvas (centre) chrome.base backdrop with 24 px grid. Embedded 16:9 canvas renders --stage-* tokens. Floating canvas toolbar bottom-centred.
Right panel — properties inspector 280 px, chrome.paper, mono panel title, property groups separated by 1 px borders. Inputs chrome.raised. Focus ring qd.info.
Statusbar (bottom) 28 px, chrome.paper, mono items, status.mint / status.amber dots.
Welcome screen Hero lockup top-anchored, recent panel right. Magenta drop-shadow on logomark, accent CTA glow @ 30%.

Host language host

Two halves. The operator window is a Designer cousin — calm chrome. The audience window is full Showtime — every brand-loud rule applies. A 16:9 mirror of the audience window also renders inside the operator window so the operator sees what teams see without picking up a Client.

Operator window

Tone card

Designer-cousin chrome, slightly more theatrical. Operator at the back of the room reads off a dark surface in low light. Same neutrals as Designer; CTA buttons run a hair larger; one tier more motion on the audience-mirror preview.

Hero swatches:

Surface Accent Text
Dark (default) #11101A #FF3D9A #E0DDDA
Light #F5F2EE #E5217F #1F1C24

Palette

Inherits --chrome-*. Host-operator overlay (--qh-*):

Token Hex (dark) Hex (light) Notes
qh.accent #FF3D9A #E5217F Primary action — Start Session, Resume
qh.info #5FA0A8 #3F767E Secondary actions — Discover Hosts, Reveal
qh.tint #C89070 #A5673F Same page-level bg-glow as Designer
qh.live #36D17B #36D17B "Live" indicator dot on session HUD (mint stays vibrant on both themes)

Default theme: Dark. Low-light venues; operator at the back of the room reads dark better.

Typography

Identical to Designer except:

  • Session HUD uppercase mono (slide index 12/42, timer 00:23, score totals).
  • Operator labels for primary controls are sentence-case Inter at 14 px (slightly larger than Designer's 12 px tool labels) for glance-readability from a distance.

Motion

  • Tier: motion.fast + motion.base + a controlled motion.slow reserved for the audience-mirror "slide advanced" pulse.
  • The audience-mirror preview region renders theatre motion at half-intensity so the operator sees what's about to happen without distraction.

Density + spacing

  • Same 8 px base. Surface padding 16–20 px; control bar rows 12 px tall (vs Designer's 8 px).
  • Primary control buttons (Advance / Reveal / Lock / Timer / End) 44×44 px minimum — operator may be standing, may be hurried.

Ornament

Minimal. Audience-mirror region is wrapped in a 1 px chrome.border-strong frame with no glow.

Surface map

Region Spec
Title bar Same vocabulary as Designer. Mono session code (7K2-9P) visible.
Audience-mirror Sized to projector / TV aspect, framed by chrome.base, renders the current slide using --stage-* Showtime tokens at full saturation.
Host-notes pane chrome.paper, generous line-height (1.55) for session-running distance. Inter body; chrome.text-muted for code refs.
Control bar (bottom) chrome.panel. Primary actions (Advance, Reveal, Lock, Timer, End Session). Mono session HUD on right (slide index, timer, score totals).
Connected-clients list chrome.paper showing each team's name + colour dot + connection status. Mint = connected; amber = recently dropped; crimson = disconnected.

Audience window

Pure Showtime — see the Client language section. The audience window is logically a full-screen Client canvas without input handlers, sized to the connected display. Every --stage-* token applies; operator chrome rules do not.


Remote language remote

Tone card

Pocket controller — utility, with one tier more flare than Designer. Quizmaster walks the room. Buttons are big; labels are bold; the audience-mirror pulses gently on every advance so the operator feels the connection.

Hero swatches:

Surface Accent Text
Dark (default) #11101A #FF3D9A #E0DDDA
Light #F5F2EE #E5217F #1F1C24

Palette

Inherits --chrome-*. Remote overlay (--qr-*):

Token Hex (dark) Hex (light) Notes
qr.accent #FF3D9A #E5217F Primary action — Advance
qr.accent-glow rgba(255,61,154,0.45) rgba(229,33,127,0.30) Soft outer glow on the Advance button (the one ornament permitted on Studio chrome)
qr.info #5FA0A8 #3F767E Secondary control surfaces
qr.tint #C89070 #A5673F Same page-level bg-glow

Default theme: Dark. Quizmaster walks low-light venues; dark reduces glare.

Typography

  • Body — Inter, 15 px primary (larger than Designer for arm's-length reading).
  • Display — Bebas Neue on the session code + slide index HUD up top.
  • Mono — JetBrains Mono for control-group labels (NAV, REVEAL, LOCK, TIMER), 11 px uppercase with 3 px letter-spacing.

Motion

  • Tier: motion.fast + motion.base + motion.slow for the audience-mirror advance pulse.
  • The Advance button is permitted a 200 ms spring-overshoot press feedback. No other control gets a spring.
  • Reduced-motion preference collapses the Advance spring to a linear fade.

Density + spacing

  • Phone-first. Surface padding 20 px.
  • Action buttons ≥ 56×56 pt; primary action (Advance) larger and visually distinct (typically 96 pt wide × 64 pt tall on the bottom centre).
  • Audience-mirror at top is responsive — fills width, height locked to 16:9 ratio.

Ornament

  • qr.accent-glow outer glow on the Advance button — the only deliberate ornament on Studio chrome.
  • The audience-mirror frame uses a 2 px qr.accent ring when an advance is in-flight, fading to chrome.border once acknowledged.

Surface map

Region Spec
Top bar 44 px, chrome.panel, paired-Host name centre, pairing status dot right. Logomark optional.
Audience-mirror 16:9 aspect, full Showtime inside using --stage-*, framed by chrome.base.
Host-notes pane chrome.paper, generous Inter line-height for read-while-walking.
Control surface chrome.panel. Primary action (Advance) — qr.accent fill, qr.accent-glow outer glow, 56×56 pt min. Secondary actions (back, reveal, lock, timer override, score override) chrome.raised 44×44 pt min. Heavy mono labels above each group (NAV, REVEAL, LOCK, TIMER).
Splash / discover Welcome surface — brand gradient hero allowed here per the Showtime rules.

Client language client

Tone card

Full Showtime — gameshow on a phone. Vivid magenta + electric blue + deep purple, dramatic motion, neon edges, ornamental gradients. Teams should feel they're holding a piece of the TV show. The opposite end of the family from Designer.

Hero swatches:

Background Primary Accent Text
Dark theme brand gradient #FF009F #16B2EB #FFFFFF
Light theme (per-quiz) warm cream #E5217F #3F767E #0F0B1A

Palette

Showtime brand hues drive everything. Client surface tokens (--qc-*):

Dark (default brand theme):

Token Hex Usage
qc.surface-base #0F0B1A Backdrop behind the brand-gradient hero
qc.surface-card rgba(15,11,26,0.65) Option cards, input fills (over the gradient)
qc.surface-card-edge rgba(255,255,255,0.10) Hairline edge on cards
qc.text #FFFFFF Primary copy on Showtime backgrounds
qc.text-muted rgba(255,255,255,0.72) Secondary copy
qc.text-subtle rgba(255,255,255,0.48) Helper labels, time-remaining mono
qc.primary #FF009F Primary CTA — Submit, Buzz, Confirm
qc.primary-glow rgba(255,0,159,0.55) Outer glow on primary CTA
qc.secondary #16B2EB Secondary CTA — Skip, Back
qc.purple #961EEF Mid-gradient stop; option-card accent on hover

Light (per-quiz theme — light):

Token Hex Usage
qc.surface-base #F5F2EE Backdrop
qc.surface-card #FFFFFF Option cards
qc.surface-card-edge rgba(15,11,26,0.10) Hairline edge
qc.text #0F0B1A Primary copy
qc.text-muted #5F5C68 Secondary copy
qc.text-subtle #959099 Helper labels
qc.primary #E5217F Primary CTA
qc.primary-glow rgba(229,33,127,0.35) Glow toned down on light
qc.secondary #3F767E Secondary CTA
qc.purple #7B1FBF Purple accent (Showtime-on-light)

Custom per-quiz brand presets (Stretch) override these tokens via the quiz manifest's theme field.

Typography

  • Display — Bebas Neue, used prominently: question titles, score numerals, timer countdown, team names on leaderboard. 32 px on phones, 56 px on tablets.
  • Body — Inter, 16 px primary, 14 px helper.
  • Mono — JetBrains Mono, used sparingly: time-remaining mono digit (00:23), session code.

Question titles uppercase with letter-spacing: 0.02em and a 2 px text-shadow on dark.

Motion

  • Full theatre. Spring transitions with overshoot for slide advance, leaderboard reveal, big-reveal moments.
  • motion.theatre tier on every "reveal" (answer, leaderboard, mini-game scoring).
  • Buzzer-press response: 80 ms scale-up + magenta glow pulse + haptic.
  • Reduced-motion: theatre + spring collapse to linear fade ≤ 200 ms; haptics preserved.

Density + spacing

  • Phone-first responsive layout. Anchored regions and stacks adapt across phone / tablet / portrait / landscape.
  • Primary actions in the thumb-reachable lower half. Tap targets ≥ 44×44 pt.
  • Spacing: 16 px between distinct controls; 24–32 px between sections; 48 px hero offset.

Ornament

Heavy by design:

  • Brand-gradient backdrop on every slide hero.
  • Neon glow on the primary CTA (qc.primary-glow), on the leaderboard row of the leading team, on big-reveal headings.
  • Low-poly facet textures as subtle overlays on gradients (Beta).
  • Mascot on launch, empty states, loading, end-of-quiz. Pose matches context (Beta rig).

Surface map

Region Spec
Join screen Brand-gradient hero, mascot lower-right, team-name field bottom-anchored, primary CTA qc.primary with glow.
Question hero Top half: question text Bebas Neue. Bottom half: input affordance. Optional media inset between.
Input affordance Varies by object type — multiple-choice cards, free-text field, A–Z grid, buzzer button. All use qc.surface-card with qc.surface-card-edge.
Timer Bebas Neue countdown, mono digits when ≤ 10 s. status.amber glow at ≤ 5 s.
Leaderboard Team rows ranked, leader row has qc.primary-glow outer glow. Display-face team names + numerals.
Buzzer-press feedback Scale-up + magenta flash + haptic + buzzer-jingle playback on Host.

Stage tokens (audience canvas) project

The stage is the audience-facing canvas surface. It is rendered by:

  • The Host audience window (full screen)
  • The embedded preview canvas in Designer's centre area
  • The embedded preview canvas in the Host operator window
  • The audience-mirror region in the Remote app

All four render the same Showtime tokens, namespaced --stage-*. Inside a stage region the operator-chrome rules don't apply: --brand-* foundation + --stage-* win.

Token Hex (dark theme) Hex (light theme) Notes
stage.base #0F0B1A #F5F2EE Stage backdrop behind the brand gradient
stage.gradient linear-gradient(90deg, #FF009F, #961EEF, #16B2EB) (same hues, lower opacity overlay) Hero gradient on slide entrance
stage.text #FFFFFF #0F0B1A Primary copy on stage
stage.text-shadow 0 4px 12px rgba(0,0,0,0.55) 0 2px 6px rgba(15,11,26,0.18) Display drop shadow
stage.glow-primary rgba(255,0,159,0.55) rgba(229,33,127,0.32) Neon glow on hero copy + leaderboard leader
stage.glow-secondary rgba(22,178,235,0.45) rgba(63,118,126,0.28) Secondary glow (info badges, timer-low warning at high values)

Stage tokens are theme-aware: the per-quiz theme field (dark, light, Stretch brand presets) chooses which column applies.


Comparison matrix project

Dimension Designer Host operator Remote Client (stage)
Tone Calm tool Calm tool + theatre preview Tool + 1 tier flare Full gameshow
Default theme Light Dark Dark Dark brand
Surface base #F5F2EE (light) / #11101A (dark) same same #0F0B1A
Primary accent #E5217F / #FF3D9A (warm pink) same same #FF009F (hot magenta)
Secondary accent #3F767E / #5FA0A8 (muted teal) same same #16B2EB (electric blue)
Display use Sparingly — dialog heads only Sparingly + session HUD Bebas on HUD up top Heavy — every question title + numeral
Body size 13 px 13 px (controls 14 px) 15 px 16 px
Mono usage Heavy — metadata signal Heavy + session HUD Group labels Time-remaining only
Motion tiers fast, base fast, base, slow fast, base, slow full + theatre
Motion spring None Reserved for audience-mirror Advance button only Everywhere on reveals
Density High — IDE feel Medium — distance read Touch — handheld Touch — thumb-first
Min tap target 24×24 px 44×44 px 56×56 px primary 44×44 px
Ornament None Frame on audience-mirror Glow on Advance only Gradient + glow + neon + texture
Mascot No No Welcome surface only Yes — idle, empty, end
Reduced-motion fallback n/a (no motion to collapse) Mirror pulse → linear fade Spring → linear fade Theatre → linear fade ≤ 200 ms

Read the family: every column shares --brand-* foundation tokens (palette master scale, fonts, motion timing, status hues). What changes per column is intensity — display use, motion tier, ornament density, target size. Designer is the floor; Client is the ceiling; Host operator + Remote sit in between with Host slightly more restrained and Remote one tier more punchy.


Phase notes

  • MVP / Alpha ship visually utilitarian. Showtime brand-true treatment lands at Beta; mascot rig, audio language, branded transitions all land then.
  • Per-quiz theme on Host / Client / Remote ships at Beta. MVP ships the default dark brand theme only. Light + custom brand presets land at Beta + Stretch.
  • Designer chrome ships dark and light at MVP because the operator surface is the only one users live inside for hours before Beta lands.
  • Custom per-quiz brand presets are Stretch.