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.

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

%%{init: {"theme":"base","themeVariables":{"fontFamily":"Inter, system-ui, sans-serif","fontSize":"14px","primaryColor":"#FFFFFF","primaryBorderColor":"#FF009F","primaryTextColor":"#1F1933","secondaryColor":"#F0EBE3","secondaryBorderColor":"#16B2EB","secondaryTextColor":"#1F1933","tertiaryColor":"#F8F5F0","tertiaryBorderColor":"#5A536B","tertiaryTextColor":"#1F1933","lineColor":"#5A536B","edgeLabelBackground":"#F8F5F0","mainBkg":"#F8F5F0","clusterBkg":"#F0EBE3","clusterBorder":"#DDD5C8","titleColor":"#1F1933","nodeBorder":"#5A536B"},"flowchart":{"useMaxWidth":true,"htmlLabels":true,"curve":"basis","padding":20,"nodeSpacing":70,"rankSpacing":80}}}%% flowchart LR MS[Main shell
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

%%{init: {"theme":"base","themeVariables":{"fontFamily":"Inter, system-ui, sans-serif","fontSize":"14px","primaryColor":"#FFFFFF","primaryBorderColor":"#FF009F","primaryTextColor":"#1F1933","secondaryColor":"#F0EBE3","secondaryBorderColor":"#16B2EB","secondaryTextColor":"#1F1933","tertiaryColor":"#F8F5F0","tertiaryBorderColor":"#5A536B","tertiaryTextColor":"#1F1933","lineColor":"#5A536B","edgeLabelBackground":"#F8F5F0","mainBkg":"#F8F5F0","clusterBkg":"#F0EBE3","clusterBorder":"#DDD5C8","titleColor":"#1F1933","nodeBorder":"#5A536B"},"flowchart":{"useMaxWidth":true,"htmlLabels":true,"curve":"basis","padding":20,"nodeSpacing":70,"rankSpacing":80}}}%% flowchart LR D1[Push-to-Host dialog
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

%%{init: {"theme":"base","themeVariables":{"fontFamily":"Inter, system-ui, sans-serif","fontSize":"14px","primaryColor":"#FFFFFF","primaryBorderColor":"#FF009F","primaryTextColor":"#1F1933","secondaryColor":"#F0EBE3","secondaryBorderColor":"#16B2EB","secondaryTextColor":"#1F1933","tertiaryColor":"#F8F5F0","tertiaryBorderColor":"#5A536B","tertiaryTextColor":"#1F1933","lineColor":"#5A536B","edgeLabelBackground":"#F8F5F0","mainBkg":"#F8F5F0","clusterBkg":"#F0EBE3","clusterBorder":"#DDD5C8","titleColor":"#1F1933","nodeBorder":"#5A536B"},"flowchart":{"useMaxWidth":true,"htmlLabels":true,"curve":"basis","padding":20,"nodeSpacing":70,"rankSpacing":80}}}%% flowchart LR TR[Toolbar ▸ Run / F5] --> SPAWN[Spawn local Quiz.Host] SPAWN --> RUN[Host running] RUN -->|Esc| MS[Designer main shell] classDef terminal fill:#E8F5EC,stroke:#36D17B,stroke-width:2px,color:#1F1933,rx:14,ry:14 class MS terminal

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

%%{init: {"theme":"base","themeVariables":{"fontFamily":"Inter, system-ui, sans-serif","fontSize":"14px","primaryColor":"#FFFFFF","primaryBorderColor":"#FF009F","primaryTextColor":"#1F1933","secondaryColor":"#F0EBE3","secondaryBorderColor":"#16B2EB","secondaryTextColor":"#1F1933","tertiaryColor":"#F8F5F0","tertiaryBorderColor":"#5A536B","tertiaryTextColor":"#1F1933","lineColor":"#5A536B","edgeLabelBackground":"#F8F5F0","mainBkg":"#F8F5F0","clusterBkg":"#F0EBE3","clusterBorder":"#DDD5C8","titleColor":"#1F1933","nodeBorder":"#5A536B"},"flowchart":{"useMaxWidth":true,"htmlLabels":true,"curve":"basis","padding":20,"nodeSpacing":70,"rankSpacing":80}}}%% flowchart LR OPEN[View menu / statusbar count] --> L[Library panel] L -->|+ Import…| LIP[OS file picker] L -->|click asset| LP[Library picker · binds to property]

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

QUIZ NIGHT

Theming

Two independent theme layers, both Beta:

  1. 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.
  2. 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

Samples

FamilySample
Bebas Neue · headlineQUIZ NIGHT TONIGHT
Bebas Neue · score42
Inter · bodyA quick brown fox jumps over the lazy dog.
JetBrains Mono · metadatacore.multiple-choice-input v1.0.0

Visual motifs

Iconography

Motion

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:

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

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

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.