Live Quiz Platform — Designer app
Combined app document — Designer app
| Status | Draft |
| App | Designer app |
| Generated | 2026-06-05 |
| Source of truth | .claude/context/apps/designer.md |
The authoring app — a content-creation tool used to build quizzes that the Host will play. Ships in MVP on Windows and macOS from a single Tauri 2 + Angular 21 codebase, desktop only. Browser-hosted authoring is a future Web Designer Stretch; iPad / Android tablet authoring is a further Stretch derived from it.
Overview
The Designer is a single Tauri 2 desktop shell hosting an Angular 21 application. Tauri's tiny Rust shell wires the native OS surface — custom titlebar (Win 11 Mica, macOS traffic-lights inset), multi-window via WebviewWindow, native menus, native file dialogs, mDNS via the mdns-sd crate, subprocess spawn for Run from slide. The Angular workspace under Quiz.Designer/src/ holds every authoring component (Angular Material + Angular CDK) and every business-logic service (TypeScript). A PlatformAdapter interface keeps the component layer shell-agnostic so the eventual Web Designer Stretch lands a BrowserPlatformAdapter instead of a frontend rewrite; v1 only ever ships the Tauri impl. ng serve runs the Angular workspace in plain Chromium as the Playwright-driveable visual-verification target — dev infrastructure, not a shipped product. Slide preview is a dedicated Quiz.Preview Unity project, built only for WebGL, embedded inline as a <canvas> in the Designer's main WebView; ~95-98% pixel fidelity vs native Host (accepted trade-off — see Designer Shell — Pixel-fidelity trade-off).
Authoring follows a PowerPoint-style model: a quiz is an ordered list of slides, optionally grouped into rounds. Each slide owns a fixed-resolution Host canvas (TV/projector format) and a responsive Client canvas (phone/tablet format). Authors place typed elements on each canvas via drag-and-drop from a palette of object types. F5 runs the quiz from slide 1, Shift+F5 runs from the current slide — both spawn the native Quiz.Host binary as a subprocess via Tauri's process plugin.
For the cross-cutting requirements, scope, and platform list, see the project PRD. For the architecture's rationale (why Tauri + Angular, why WebGL preview, what was rejected), see Decisions. For the cross-language contract that lets Angular and the Unity apps share schemas without a shared runtime library, see Repository Layout — Cross-language contract.
User flows
Per-flow diagrams (lifecycle, File menu, authoring loop, push, run-from-slide, library) live on the dedicated flow page, each linked to its relevant UI mockups. Every surface is catalogued in the surfaces matrix.
- Full flow diagrams — App lifecycle · File menu · authoring loop · Push to Host · Run from slide · Library. Each flow links to the mockups it touches.
- Surface inventory matrix — Every chrome / menu / dialog / panel / context-menu / shortcut with
leads-totargets, phase tags, FR references. - Mockup launcher → — Browse every static mockup in one browser tab. Sidebar nav + dark / light toggle + scale + resolution controls.
Architecture
The top-level Designer architecture is in Designer Shell — single Tauri 2 process + Angular 21 application + an embedded Quiz.Preview Unity WebGL build inside the main WebView. The page includes the inline architecture diagram. Subsystem-level pages will be authored alongside the implementation work tracked in the Build Plan — Designer.
Design notes
The brand identity, palette, typography, and motion language are project-wide and live in the Design Specification. The operator-chrome rules for Designer specifically live in the Studio Design Spec. Designer-specific design notes are tagged *{designer}*.
Build plan
The Designer's items are part of the single project Build Plan. Each section there carries an app-scope chip; filter visually for designer.
User flows — detail
Surface-to-surface navigation flows for the Designer. Each diagram shows the happy path forward only — same-screen edits (drag, type, click property, undo / redo, save) live in prose under the diagram rather than as self-loops on the canvas. Authoring conventions and theme tokens live in .claude/skills/mermaid-diagrams/SKILL.md.
Surfaces referenced here are defined in Designer surfaces. Functional requirements are in Functional Requirements — Designer.
2. File menu
Mockups: File menu · Recent files · Preferences · Restore from backup
The File menu is a fan-out — every item launches an action and returns to the Main shell (or exits). Drawn as a list because there's no per-item flow, just per-item destination:
| Item | Shortcut | Destination |
|---|---|---|
| New quiz… | Ctrl N |
New-quiz dialog → Main shell |
| Open… | Ctrl O |
OS file picker → Main shell |
| Open recent ▸ | — | Recent submenu → Main shell |
| Save | Ctrl S |
Inline save · status pulse |
| Save as… | Ctrl Shift S |
OS save picker → Main shell |
| ▸ Run from slide | F5 |
Spawns local Host process — see flow 5 |
| Push to Host… | — | See flow 4 |
| Restore from backup… | — | Restore dialog → Main shell |
| Import quiz package… | — | OS picker → Main shell |
Export .quiz… |
— | OS save picker |
| Preferences… | Ctrl , |
Preferences dialog (modal — Theme · Autosave · Defaults) |
| Sign in… Stretch | — | Sign-in dialog |
| Quit | Ctrl Q |
Quit-unsaved if dirty, else Exit |
3. Authoring loop
Mockups: Main shell · Slide selected · Element selected · Multi-select · Slide context menu · Element context menu · Round context menu
slide list + canvas + right pane] -->|click slide| SS[Slide selected] SS -->|click element| ES[Element selected] ES -->|right pane| RPI[Properties inspector
shared block + reveal + lock + type editor]
Three selection states inside the Main shell — slide-selected, element-selected, multi-select — drive what the right pane shows (slide properties / element properties / multi-select summary / Insert palette). Selection is the loop, not the navigation.
Slide-list context menu (right-click a row): Duplicate · Move to round ▸ · New round from selection · Focus notes pane · Delete. Each mutates the slide list in place.
Round-header context menu: Rename (inline) · Round scoring (opens right pane) · Ungroup · Delete round + slides (confirm).
Element-canvas context menu (right-click an element): Cut / Copy / Paste / Duplicate · Bring to front / Send to back / forward / backward · Copy to other canvas · Lock / Unlock · Delete.
All context actions stay in the Main shell — they edit the model, the canvas + right pane re-render, and undo (Ctrl Z) reverses every step. No navigation.
4. Push to Host
Mockups: Push to Host · Transferring
Bonjour host list] -->|pick host| D2[Transferring
chunked CRC32 + resume] D2 -->|host accepts| D3[Done banner] D3 --> MS[Main shell] classDef terminal fill:#E8F5EC,stroke:#36D17B,stroke-width:2px,color:#1F1933,rx:14,ry:14 class MS terminal
Failure branches (each surfaces inside the dialog, no separate screen): host rejects → returns to host picker; connection drops → in-place resume-from-offset, progress bar reflects retries; CRC fail → automatic re-send of failed chunks.
5. Run from slide (local)
Mockups: Main shell — preview mode
Designer process stays alive while the Host child runs. On a multi-display setup the Host opens its operator + audience windows automatically. Esc inside the Host quits the child and returns focus to the Designer.
6. Library
Mockups: Library panel · Library picker · Import resource
Asset row context menu (right-click): Rename · Replace file… (→ OS picker) · Reveal in OS browser · Delete (confirm if in use). Each mutates the panel in place. The picker (modal) is the only navigational sub-screen — it returns to Main shell with the picked asset wired to the active property field.
See also: Designer surfaces · Architecture — Designer shell · Functional Requirements — Designer.
Design specification — cross-cutting brand
Shared brand language across all four apps (see Applications). Source of truth for cross-cutting requirement F-X-3. Brand-true treatment lands at Beta; MVP and Alpha are visually utilitarian. Operator-chrome rules for Designer / Host operator / Remote live in Design Specification — Studio.
Final product / brand name deferred to Beta — see open questions. This spec refers to apps by engineering project names (Quiz.Designer, Quiz.Host, Quiz.Client, Quiz.Remote).
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. |
Tone: live quiz on a Saturday night, televised. High contrast, vibrant gradients, neon edges. Mascot keeps warmth and humour under the energy.
Colour palette
Core hues
| Token | Hex | Usage |
|---|---|---|
color.magenta |
#FF009F |
Primary brand accent; logomark; key CTAs; big-reveal highlights. |
color.electric-blue |
#16B2EB |
Secondary brand accent; live-state indicators; secondary CTAs. |
color.deep-purple |
#961EEF |
Transitional gradient stop; high-energy backgrounds; big-reveal stages. |
color.white |
#FFFFFF |
Wordmark fill; primary text on dark. |
color.near-black |
#0F0B1A |
Primary text on light; neutral surfaces. Slight purple tint reads brand-consistent. |
Gradients + glow
- Brand gradient — linear, left→right:
magenta → deep-purple → electric-blue. Reserved for hero surfaces. - Subtle backdrop — brand gradient with low-opacity low-poly facet overlay. For content-heavy surfaces.
- Neon glow — outer glow (high blur, brand-coloured, additive blend) on framed surfaces, big-reveal headings, active leaderboard rows. Use sparingly.
Theming
Two independent theme layers, both Beta:
- Studio operator-chrome theme designer host remote — calm low-chroma chrome for Designer, the Host operator window, and Remote. Each ships light + dark. See Design Specification — Studio. Only the Client phone and the Host audience window render full Showtime.
- Per-quiz theme on Host / Client / Remote hostclientremote — quiz manifest declares a theme (enum:
dark,light, brand presets). Default is dark brand theme. Richer custom palettes are Stretch.
Studio chrome theme and per-quiz theme are independent — an author might author in light Studio chrome but ship a dark-themed quiz.
Typography
| Role | Family |
|---|---|
| Display / headings / numerals (scores, timers, countdowns) | Bebas Neue — tall condensed uppercase, tight tracking, drop shadow on dark. |
| Body / UI | Inter — geometric sans, sentence case, generous line-height. |
| Mono (codes, timestamps, debug, metadata labels) | JetBrains Mono. |
Rules
- Headings uppercase, bold, tight letter-spacing, drop shadow on dark.
- No more than two type families visible at once.
- Numbers (scores, timers) use the display face for impact.
Samples
| Family | Sample |
|---|---|
| Bebas Neue · headline | QUIZ NIGHT TONIGHT |
| Bebas Neue · score | 42 |
| Inter · body | A quick brown fox jumps over the lazy dog. |
| JetBrains Mono · metadata | core.multiple-choice-input v1.0.0 |
Visual motifs
- Neon glow borders on hero panels, leaderboards, big-reveal stages.
- Low-poly facet textures as subtle overlays on gradients.
- Gradient backdrops — full saturation for hero only; tone down for content-heavy.
- Cartoon mascot on launch, empty states, loading, end-of-quiz. Pose matches context.
Iconography
- Bold and chunky, geometric, weight matches the display typography. No hairlines.
- External imagery (photos, screenshots) sits inside framed cards with neon-glow borders.
Motion
- Confident and snappy. Spring-driven transitions with slight overshoot. Avoid lazy ease-in/out.
- Big reveals — combined scale + glow pulse + branded audio sting. Reserve for genuine reveals.
- Idle states — mascot in subtle motion (idle bob, blink) over abstract spinners.
Implementation details, performance budgets, and engine-side mechanics live in Architecture — Tech Stack and Non-Functional Requirements.
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. Premade avatars use the same crop so the leaderboard reads consistently regardless of source.
Layout and spacing
Spacing scale — 8 px base: 4, 8, 16, 24, 32, 48, 64, 96. No other values.
Designer chrome designer
Tablet/desktop layout outside the canvases. Master-detail panels, denser information, designed for sustained authoring. Renders against the Designer's chosen Studio theme.
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.
Design specification — Studio operator chrome
Operator-facing chrome for Designer, the Host operator window, and Remote. Where this page and the cross-cutting Design Specification disagree, this page wins for chrome surfaces; where this page is silent, fall back to the cross-cutting spec.
Principle — chrome calm, canvas loud. Operator surfaces sit at low chroma; the embedded canvas / audience-mirror region inside each operator app renders full Showtime.
Which surface gets which theme
| App | Surface | Theme |
|---|---|---|
| Quiz.Designer | Entire app (chrome + dialogs). Preview canvas renders Showtime inside. | Studio. |
| Quiz.Host | Audience window (projector / TV). | Showtime — see design-spec.md. |
| Quiz.Host | Operator window (laptop / iPad). The embedded audience preview renders Showtime. | Studio. |
| Quiz.Client | Entire app. Team phone, audience-facing. | Showtime — see design-spec.md. |
| Quiz.Remote | Entire app. The embedded audience-mirror renders Showtime. | Studio. |
Chrome surface tokens
Scheme: Indigo Nebula. Dark = deep cool indigo with subtle warm-peach tint glow. Light = warm cream paper with the same peach tint, visible. The chrome stays flat — only the page-level bg-glow carries any gradient.
Dark theme — deep indigo, warm-peach undertone
| Token | Hex | Usage |
|---|---|---|
chrome.base |
#11101A |
Application window background; canvas / mirror 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, slide names, headings. 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. Anchors warm undertone behind cool surfaces. |
Light theme — warm cream, visible peach wash
| Token | Hex | Usage |
|---|---|---|
chrome.base |
#F5F2EE |
Application window; canvas / mirror backdrop. 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; hover-into-selected. |
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 over chrome.base. Carries the scheme's warm signature on light. |
Brand-hue ration in chrome
The chrome accents diverge from the Showtime brand-locked colors. Studio's three accent slots are studio-specific values, not the cross-cutting branding.jpg magenta / electric-blue / deep-purple.
| Hue (slot) | Dark | Light | Where it appears | Where it does not |
|---|---|---|---|---|
accent (warm pink) |
#FF3D9A |
#E5217F |
Logomark tile in toolbar (rounded square, accent fill, white "Q"); primary CTA (Designer Push to Host / New Quiz / Save when unsaved; Host Start Session / Resume; Remote Advance); active-row left-edge indicator (2 px inset shadow); focus ring on text inputs only for the primary action. | Panel fills, surface gradients, large area accents, hover backgrounds, decorative use. |
info (muted teal) |
#5FA0A8 |
#3F767E |
Generic focus ring (input, button); inline links; secondary CTA (Designer Reconnect, Host Discover Hosts, Remote Re-pair); info badges; selection outline on canvas elements. | Panel fills, hero gradients. |
tint (warm peach) |
#C89070 |
#A5673F |
Page-level bg-glow only — radial wash behind chrome.base. Drives the row-hover wash at low alpha. |
Anywhere directly on chrome surfaces; on canvas-rendered content. |
Showtime brand hues (magenta #FF009F, electric-blue #16B2EB, deep-purple #961EEF) appear only inside the embedded canvas / audience-mirror region — never on Studio chrome. The mockups render Studio chrome accents for slide-thumbnail decoration purely as approximation; live Quiz.Preview renders Showtime at full saturation per the cross-cutting Design Specification.
Showtime warm-support hues (coral, sunshine, rose, peach) do not appear in Studio chrome — canvas / mirror only.
Status hues
| Token | Hex | Role |
|---|---|---|
mint |
#36D17B |
Save / connection / pair success; auto-save dot; live indicator when Hosts have clients connected. |
amber |
#FFA94D |
Unsaved-changes dot (Designer titlebar); transfer-pending dot (Host); reconnecting dot (Remote); timer-low; caution states. |
crimson |
#E63946 |
Destructive action (Delete Quiz, End Session, Unpair); validation-error border; failure banner. |
Typography in chrome
- Body — Inter, 13 px primary, 12 px tool buttons / panel headers, 11 px panel titles.
- Display — Bebas Neue, sparingly. Dialog headlines (≥ 24 px), welcome / discover surfaces, 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.
Statusbar uppercase mono (AUTOSAVE 14:32, BUILD 2026.05.13). Side-panel titles uppercase mono with 3 px letter-spacing. Tool-button labels sentence-case Inter.
Per-app components
Designer
| Region | Spec |
|---|---|
| Toolbar (top) | 52 px, chrome.panel, logomark left, document name, 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 accent inset shadow left. |
| Canvas (centre) | chrome.base backdrop with 24 px grid. Embedded 16:9 canvas renders full Showtime. 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 info. |
| Statusbar (bottom) | 28 px, chrome.paper, mono items, mint / amber status dots. |
Host operator window
| Region | Spec |
|---|---|
| Title bar | Same vocabulary as Designer. Mono session code (7K2-9P) visible. |
| Audience-mirror | Sized to projector / TV aspect (typically 16:9), framed by chrome.base, renders the current slide at full Showtime saturation. |
| Host-notes pane | chrome.paper, generous line-height 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. |
Remote
| 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, framed by chrome.base. |
| Host-notes pane | chrome.paper, generous Inter line-height for read-while-walking. |
| Control surface | chrome.panel. Primary action (Advance) — accent fill, 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 cross-cutting spec. |
Default theme per app
| App | Default | Why |
|---|---|---|
| Quiz.Designer | Light | Long authoring sessions — easier on the eyes for hours. |
| Quiz.Host operator | Dark | Sessions in low-light venues; operator at the back of the room reads better off dark. |
| Quiz.Remote | Dark | Quizmaster walks low-light venues; dark reduces glare. |
All three ship the other theme too, selectable in settings. Per-quiz theme on the Host audience window and Client is independent.