// First-visit case brief: a one-card overlay on the board that tells a new player // everything they need — who's dead/wronged, and what to do about it. Shown once per // case per browser; the full dossier stays one tap away. import { useState } from 'preact/hooks' import { useGame } from '../store' import { hasSeen, markSeen } from '../tips' import { Btn, Chip, Panel } from './components' export function CaseBriefOverlay() { const g = useGame() const c = g.case const key = `brief:${c.id}` const [show, setShow] = useState(() => !hasSeen(key)) if (!show) return null const done = () => { markSeen(key) setShow(false) window.dispatchEvent(new Event('cz-brief-done')) } return (
e.stopPropagation()}>
CASE {c.id} {c.kindLabel || 'HOMICIDE'}
{c.victim.name} {c.victimStatus || 'DECEASED'} · {c.scene}

One of them is lying. Question the suspects, present evidence, and make the accusation.

▸ Start investigating { markSeen(key); setShow(false); g.nav('briefing') }}>Read full case file ▸
) }