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:
- Foundations project — what every app shares: brand identity, master palette, type stack, motion principles, voice + tone, a11y baseline, iconography, sound design.
- Designer language designer — calm, dense, monochrome operator chrome optimised for sustained authoring.
- Host language host — two halves: the operator window (Designer-cousin chrome) and the audience window (full Showtime).
- Remote language remote — handheld operator chrome — Designer family with touch density + slightly punchier motion.
- Client language client — full Showtime canvas; vivid palette, gameshow energy, dramatic motion.
- 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 card → palette → typography → motion → density + spacing → ornament → surface 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.infooutline by default;accentfor 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 inchrome.textat the same size. - Audience canvas icons render at 64+ px in
brand.whitewith 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.baseonly. 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-spinnerat 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, timer00: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 controlledmotion.slowreserved 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.slowfor 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-glowouter glow on the Advance button — the only deliberate ornament on Studio chrome.- The audience-mirror frame uses a 2 px
qr.accentring when an advance is in-flight, fading tochrome.borderonce 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.theatretier 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.