import { useEffect, useState, type CSSProperties } from 'react'; import { REVIVE_TIMER_SECONDS } from '../shared/constants'; import { useT, t } from '../i18n'; interface DeathScreenProps { visible: boolean; onRevive: () => void; /** Free revives left for non-subscribers; omit when subscribed / unlimited. */ revivesRemaining?: number; } /** Full-screen dimming; `pointerEvents: 'none'` so HUD controls (e.g. hero sheet) stay clickable. */ const overlayStyle: CSSProperties = { position: 'absolute', top: 0, left: 0, width: '100%', height: '100%', backgroundColor: 'rgba(0, 0, 0, 0.7)', display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', zIndex: 100, transition: 'opacity 0.5s ease', pointerEvents: 'none', }; /** Death UI captures taps; overlay around it passes clicks through to the game HUD. */ const deathPanelStyle: CSSProperties = { display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 24, pointerEvents: 'auto', }; const titleStyle: CSSProperties = { fontSize: 36, fontWeight: 900, color: '#cc3333', textShadow: '0 0 20px rgba(204, 51, 51, 0.5)', letterSpacing: 4, }; const timerStyle: CSSProperties = { fontSize: 48, fontWeight: 700, color: '#ffffff', fontVariantNumeric: 'tabular-nums', }; const buttonStyle: CSSProperties = { padding: '14px 40px', fontSize: 18, fontWeight: 700, color: '#fff', backgroundColor: '#cc3333', border: 'none', borderRadius: 8, cursor: 'pointer', transition: 'background-color 0.2s', }; export function DeathScreen({ visible, onRevive, revivesRemaining }: DeathScreenProps) { const tr = useT(); const [timer, setTimer] = useState(REVIVE_TIMER_SECONDS); const canRevive = revivesRemaining === undefined || revivesRemaining > 0; // Countdown timer useEffect(() => { if (!visible) { setTimer(REVIVE_TIMER_SECONDS); return; } const interval = setInterval(() => { setTimer((t) => { if (t <= 1) { clearInterval(interval); return 0; } return t - 1; }); }, 1000); return () => clearInterval(interval); }, [visible]); // Auto-revive when timer hits 0 (only if server still allows free revives) useEffect(() => { if (visible && timer === 0 && canRevive) { onRevive(); } }, [visible, timer, onRevive, canRevive]); if (!visible) return null; return (