{
  "version": 3,
  "sources": ["rally-quick.jsx"],
  "sourcesContent": ["/* FACT Rallye: Schnellstart „Mit Freunden, sofort los“ (Spec 06_Planung/specs/2026-10-17-rallye-organizer-design.md §10)\n *\n * window.RallyQuickStart({ theme, lang, userId, user, userPosition, currentCity, initialCode, onExit, onSignup, onStarted })\n *   Ein Bildschirm: Dauer, Spielart (ein Team / zwei Teams), Name. Baut die Route ab der\n *   aktuellen Position (RallyEngine.quickTour), legt das Event mit organizerMode 'player' an,\n *   tritt selbst bei und ruft onStarted(code). Danach übernimmt RallyPlay.\n *\n * Bausteine, die rally-play.jsx für Schnellstart-Events einbindet:\n *   window.RallyQuickLobby({ event, players, me, isHost, lang, theme, showToast, onStart })\n *   window.RallyQuickScore({ event, answers, teamNo, lang })                  Zwischenstand bei einem Team\n *   window.RallyQuickSolo({ event, answers, finishes, players, lang, theme, isHost, onEnd })   Ergebnis bei einem Team\n *   window.RallyQuickSaveTour({ event, lang })                                Gastgeber: Tour speichern\n *\n * Globaler Babel-Scope: Top-Level-Namen beginnen mit RallyQuick / rallyQuick / RAL_QUICK_.\n * Lädt nach rally-play.jsx (nutzt RallyPlayShell, RallyPlayTitle, RallyPlayBody, RallyPlayNotice, RallyPlayLink).\n */\n\nconst RAL_QUICK_FALLBACK = { lat: 48.1374, lng: 11.5755, label: 'Marienplatz' };\nconst RAL_QUICK_GPS_WAIT_MS = 8000;      // so lange beim Tippen auf GPS warten, dann Marienplatz\nconst RAL_QUICK_SAVED_KEY = 'fact_rally_quick_saved';\n\n// ── Helfer ────────────────────────────────────────────────────────────────────\nfunction rallyQuickT(key, lang, vars) {\n  let s = t(key, lang);\n  if (vars) Object.keys(vars).forEach(k => { s = s.split('{' + k + '}').join(String(vars[k])); });\n  return s;\n}\nfunction rallyQuickIsSingle(event) {\n  return !!event && ((event.teams && event.teams.length === 1) || +event.teamCount === 1);\n}\nfunction rallyQuickHostName(event, players, lang) {\n  const n = event && event.tour && event.tour.hostName;\n  if (n) return n;\n  // Ohne hostName (Event aus der Rallye-Planung) ist der erste Beitretende nicht unbedingt die Spielleitung\n  return t('rally.quick.lobby.someone', lang);\n}\nfunction rallyQuickCopy(text) {\n  const fallback = () => {\n    try {\n      const ta = document.createElement('textarea');\n      ta.value = text;\n      ta.setAttribute('readonly', '');\n      ta.style.cssText = 'position:fixed;top:-1000px;opacity:0;';\n      document.body.appendChild(ta);\n      ta.select();\n      const ok = document.execCommand('copy');\n      document.body.removeChild(ta);\n      return ok;\n    } catch (e) { return false; }\n  };\n  if (navigator.clipboard && navigator.clipboard.writeText) {\n    return navigator.clipboard.writeText(text).then(() => true).catch(() => fallback());\n  }\n  return Promise.resolve(fallback());\n}\nfunction rallyQuickSavedMap() {\n  try { return JSON.parse(localStorage.getItem(RAL_QUICK_SAVED_KEY) || '{}') || {}; } catch (e) { return {}; }\n}\nfunction rallyQuickMarkSaved(eventId, tourId) {\n  try {\n    const m = rallyQuickSavedMap();\n    m[eventId] = tourId || true;\n    localStorage.setItem(RAL_QUICK_SAVED_KEY, JSON.stringify(m));\n  } catch (e) {}\n}\n// Supabase: Gastgeber braucht eine Sitzung (RLS owner_id = auth.uid()). Ohne Konto anonym anmelden.\nasync function rallyQuickEnsureSession() {\n  const S = window.RallyStore;\n  if (!S || S.mode !== 'supabase') return true;\n  const sb = window.sb;\n  if (!sb || !sb.auth) return false;\n  try {\n    const r = await sb.auth.getSession();\n    if (r && r.data && r.data.session) return true;\n  } catch (e) {}\n  if (typeof sb.auth.signInAnonymously !== 'function') return false;\n  try {\n    const r = await sb.auth.signInAnonymously();\n    // Gast-Anmeldung im Projekt abgeschaltet: kein Netzproblem, sondern Konto nötig\n    if (r && r.error && (r.error.code === 'anonymous_provider_disabled' || r.error.status === 422)) return 'account';\n    return !!(r && !r.error && r.data && (r.data.session || r.data.user));\n  } catch (e) { return false; }\n}\nfunction rallyQuickPlayerList(players, me, hostName, lang, single, event) {\n  return (\n    <div style={{ display: 'flex', flexDirection: 'column', gap: 8, marginTop: 10 }}>\n      {players.map((p, i) => {\n        const team = !single && p.team != null ? (event.teams || []).find(tm => +tm.no === +p.team) : null;\n        return (\n          <div key={p.id} style={{ display: 'flex', alignItems: 'center', gap: 10, minHeight: 34 }}>\n            <span aria-hidden=\"true\" style={{\n              width: 34, height: 34, borderRadius: '50%', flexShrink: 0,\n              background: i === 0 ? 'var(--coin-soft)' : 'var(--surface-2)',\n              display: 'flex', alignItems: 'center', justifyContent: 'center',\n              fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 15, color: 'var(--ink-2)',\n            }}>{String(p.name || '?').trim().charAt(0).toUpperCase()}</span>\n            <span style={{ flex: 1, minWidth: 0, fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 16, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{p.name}</span>\n            {team && <span aria-hidden=\"true\" style={{ fontSize: 18 }}>{team.emoji}</span>}\n            {i === 0 && p.name === hostName && <RallyChip icon=\"⭐\">{t('rally.quick.lobby.host', lang)}</RallyChip>}\n            {me && p.id === me.id && <RallyChip active>{t('rally.play.you', lang)}</RallyChip>}\n          </div>\n        );\n      })}\n    </div>\n  );\n}\n\n// Auswahlkarte (Radio) für die Spielart\nfunction RallyQuickOption({ on, icon, title, desc, onClick }) {\n  return (\n    <button type=\"button\" role=\"radio\" aria-checked={on} className=\"rally-tap\" onClick={onClick}\n      aria-label={title + '. ' + desc} style={{\n      display: 'flex', alignItems: 'flex-start', gap: 12, width: '100%', padding: '14px 14px', borderRadius: 18,\n      cursor: 'pointer', textAlign: 'left', color: 'var(--ink)',\n      background: on ? 'var(--stamp-soft)' : 'var(--surface)',\n      border: on ? '2px solid var(--stamp)' : '1.5px solid var(--border-2)',\n      boxShadow: on ? '0 3px 0 var(--stamp-deep)' : '0 2px 0 var(--border-2)',\n    }}>\n      <span aria-hidden=\"true\" style={{\n        width: 44, height: 44, flexShrink: 0, borderRadius: 14, fontSize: 24,\n        display: 'flex', alignItems: 'center', justifyContent: 'center',\n        background: on ? 'var(--stamp)' : 'var(--surface-2)',\n      }}>{icon}</span>\n      <span style={{ minWidth: 0, flex: 1 }}>\n        <span style={{ display: 'block', fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 17, lineHeight: 1.2 }}>{title}</span>\n        <span style={{ display: 'block', marginTop: 4, fontFamily: RAL_FONT_B, fontWeight: 500, fontSize: 14, lineHeight: 1.45, color: 'var(--ink-2)' }}>{desc}</span>\n      </span>\n    </button>\n  );\n}\n\n// ══════════════════════════════════════════════════════════════════════════════\n// Einrichten\n// ══════════════════════════════════════════════════════════════════════════════\nfunction RallyQuickStart({ theme = 'light', lang = 'de', userId, user, userPosition, currentCity, initialCode, onExit, onSignup, onStarted }) {\n  rallyEnsureStyles();\n  const [duration, setDuration] = React.useState(60);\n  const [teams, setTeams] = React.useState(1);\n  // Feld startet leer, gemerkter bzw. Profil-Name nur als Vorschlag (geteilte Handys)\n  const [name, setName] = React.useState('');\n  const suggestName = React.useMemo(() => rallyPlayInitialName(user), []); // eslint-disable-line react-hooks/exhaustive-deps\n  const nameRef = React.useRef(null);\n  const [phase, setPhase] = React.useState(null);       // null | 'locating' | 'building'\n  const [err, setErr] = React.useState(null);\n  const [nameErr, setNameErr] = React.useState(false);\n  const geo = useRallyGeo();\n  const mountedAt = React.useRef(Date.now());\n  const now = useRallyNow(1000);\n  const appPos = userPosition && isFinite(userPosition.lat) && isFinite(userPosition.lng) ? { lat: userPosition.lat, lng: userPosition.lng } : null;\n  const pos = geo.pos || appPos;\n  const posRef = React.useRef(pos);\n  posRef.current = pos;\n  const geoFailed = !pos && (!!geo.error || now - mountedAt.current > RAL_QUICK_GPS_WAIT_MS);\n  const offline = window.RallyStore && window.RallyStore.degraded;\n\n  const waitForPos = async () => {\n    if (posRef.current) return posRef.current;\n    if (geo.error) return null;\n    const left = RAL_QUICK_GPS_WAIT_MS - (Date.now() - mountedAt.current);\n    const until = Date.now() + Math.max(1500, left);\n    while (Date.now() < until) {\n      await new Promise(r => setTimeout(r, 250));\n      if (posRef.current) return posRef.current;\n    }\n    return null;\n  };\n\n  const go = async () => {\n    if (phase) return;\n    const nm = name.trim();\n    if (!nm) { setNameErr(true); setErr(null); return; }\n    setErr(null); setNameErr(false);\n    setPhase('locating');\n    try {\n      const p = await waitForPos();\n      setPhase('building');\n      // Rendering zulassen, damit „Route wird gebaut“ sichtbar ist, bevor die Engine rechnet\n      await new Promise(r => setTimeout(r, 30));\n      const start = p\n        ? { lat: p.lat, lng: p.lng, label: t('rally.quick.startLabel', lang), generic: true }\n        : { ...RAL_QUICK_FALLBACK };\n      const E = window.RallyEngine;\n      const facts = window.FACTS || [];\n      const base = { start, durationMin: duration, teamCount: teams, lang, seed: Math.floor(Math.random() * 2147483647) };\n      let tour = E.quickTour(facts, { ...base, city: currentCity || '' });\n      // Stadtname aus der Karte passt nicht immer zum city-Feld der Fakten: dann ohne Filter\n      if ((tour.stations || []).length < 3 && currentCity) tour = E.quickTour(facts, { ...base, city: '' });\n      if ((tour.stations || []).length < 3) {\n        setErr(rallyQuickT('rally.quick.err.few', lang, { min: rallyFmtMin(duration, lang) }));\n        setPhase(null);\n        return;\n      }\n      const title = t('rally.quick.eventTitle', lang);\n      tour.title = title;\n      tour.hostName = nm;\n\n      const S = window.RallyStore;\n      await S.init();\n      const sess = await rallyQuickEnsureSession();\n      if (sess !== true) { setErr(t(sess === 'account' ? 'rally.quick.err.account' : 'rally.quick.err.auth', lang)); setPhase(null); return; }\n      const ev = await S.createEvent(tour, {\n        title, teamCount: teams, assignMode: 'random', organizerMode: 'player', lang,\n      });\n      const r = await S.joinEvent(ev.code, { name: nm });\n      rallyPlaySaveName(nm);\n      // Aktive Teilnahme direkt merken, damit RallyPlay ohne Umweg über den Beitreten-Schritt startet\n      if (typeof rallyPlayWriteActive === 'function') {\n        rallyPlayWriteActive({ eventId: r.event.id, code: r.event.code, playerId: r.player.id, deviceId: rallyPlayDeviceId() });\n      }\n      onStarted && onStarted(ev.code);\n    } catch (e) {\n      console.warn('[RallyQuickStart]', e);\n      setErr(t(e && e.code === 'not_owner' ? 'rally.quick.err.auth' : 'rally.quick.err.generic', lang));\n      setPhase(null);\n    }\n  };\n\n  const busy = !!phase;\n  const durOpts = ((window.RallyEngine && window.RallyEngine.QUICK_DURATIONS) || [30, 60, 90])\n    .map(m => ({ value: m, label: rallyFmtMin(m, lang) }));\n\n  let startLine, startTone = 'info', startIcon = '📍';\n  if (pos) startLine = t('rally.quick.start.found', lang);\n  else if (geoFailed) { startLine = t('rally.quick.start.fallback', lang); startTone = 'gold'; startIcon = '🗺️'; }\n  else { startLine = t('rally.quick.start.waiting', lang); startIcon = '📡'; }\n\n  return (\n    <RallyPlayShell scrollKey=\"quick\">\n      {/* Zurück oben, wo man ihn erwartet (unten gibt es ihn zusätzlich) */}\n      <button type=\"button\" onClick={() => onExit && onExit()} style={{\n        alignSelf: 'flex-start', minHeight: 44, padding: '8px 14px 8px 10px', borderRadius: 999, cursor: 'pointer',\n        border: '1px solid var(--line, rgba(0,0,0,0.12))', background: 'transparent', color: 'var(--ink)',\n        fontFamily: 'Nunito, sans-serif', fontWeight: 800, fontSize: 14,\n      }}>‹ {t('rally.quick.back', lang)}</button>\n      <div style={{ paddingTop: 0 }}>\n        <RallyKicker>{t('rally.quick.kicker', lang)}</RallyKicker>\n        <RallyPlayTitle style={{ marginTop: 6 }}>{t('rally.quick.title', lang)}</RallyPlayTitle>\n        <RallyPlayBody style={{ marginTop: 8 }}>{t('rally.quick.body', lang)}</RallyPlayBody>\n      </div>\n\n      <div>\n        <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 16, marginBottom: 8 }}>{t('rally.quick.duration', lang)}</div>\n        <RallySegmented options={durOpts} value={duration} onChange={v => { setDuration(v); setErr(null); }} ariaLabel={t('rally.quick.duration', lang)} />\n      </div>\n\n      <div>\n        <div id=\"rally-quick-how\" style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 16, marginBottom: 8 }}>{t('rally.quick.how', lang)}</div>\n        <div role=\"radiogroup\" aria-labelledby=\"rally-quick-how\" style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n          <RallyQuickOption on={teams === 1} icon=\"🤝\" title={t('rally.quick.together', lang)} desc={t('rally.quick.togetherDesc', lang)} onClick={() => setTeams(1)} />\n          <RallyQuickOption on={teams === 2} icon=\"⚔️\" title={t('rally.quick.versus', lang)} desc={t('rally.quick.versusDesc', lang)} onClick={() => setTeams(2)} />\n        </div>\n      </div>\n\n      <RallyField label={t('rally.quick.name', lang)} hint={t('rally.quick.nameHint', lang)} htmlFor=\"rally-quick-name\"\n        error={nameErr ? t('rally.quick.err.name', lang) : null}>\n        <RallyInput id=\"rally-quick-name\" ref={nameRef} value={name} maxLength={24} autoComplete=\"off\" invalid={nameErr}\n          placeholder={t('rally.quick.namePh', lang)}\n          onChange={e => { setName(e.target.value); setNameErr(false); }}\n          onKeyDown={e => { if (e.key === 'Enter') go(); }}\n          style={{ fontSize: 18, minHeight: 56 }} />\n      </RallyField>\n      {suggestName && !name.trim() && (\n        <div style={{ display: 'flex', marginTop: -6 }}>\n          <RallyChip keepFocus icon=\"👋\" onClick={() => {\n            setName(suggestName); setNameErr(false);\n            try { if (nameRef.current && document.activeElement === nameRef.current) nameRef.current.blur(); } catch (e) {}\n          }}>{rallyQuickT('rally.play.join.suggest', lang, { name: suggestName })}</RallyChip>\n        </div>\n      )}\n\n      <RallyPlayNotice icon={startIcon} tone={startTone}>\n        <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900 }}>{pos || !geoFailed ? t('rally.quick.startLabel', lang) : RAL_QUICK_FALLBACK.label}</div>\n        <div style={{ marginTop: 2 }}>{startLine}</div>\n      </RallyPlayNotice>\n      {geo.debug && <RallyGeoNotice geo={geo} lang={lang} />}\n      {offline && <RallyPlayNotice icon=\"📶\" tone=\"warn\">{t('rally.quick.offline', lang)}</RallyPlayNotice>}\n\n      {err && <RallyPlayNotice icon=\"⚠️\" tone=\"warn\">{err}</RallyPlayNotice>}\n\n      <RallyButton size=\"lg\" full icon={busy ? '⏳' : '🚀'} disabled={busy} onClick={go}>\n        {phase === 'locating' ? t('rally.quick.locating', lang)\n          : phase === 'building' ? t('rally.quick.building', lang)\n          : t('rally.quick.cta', lang)}\n      </RallyButton>\n      <div style={{ display: 'flex', justifyContent: 'center' }}>\n        <RallyPlayLink onClick={() => onExit && onExit()}>{t('rally.quick.back', lang)}</RallyPlayLink>\n      </div>\n    </RallyPlayShell>\n  );\n}\n\n// ══════════════════════════════════════════════════════════════════════════════\n// Warteraum (Gastgeber und Freunde)\n// ══════════════════════════════════════════════════════════════════════════════\nfunction RallyQuickLobby({ event, players, me, isHost, lang, theme, showToast }) {\n  const [busy, setBusy] = React.useState(false);\n  const geo = useRallyGeo();   // fragt die Standort-Erlaubnis schon beim Warten ab\n  const single = rallyQuickIsSingle(event);\n  const hostName = rallyQuickHostName(event, players, lang);\n  const start = event.tour && event.tour.start;\n  const ready = window.RallyEngine.quickStartReadiness(event.teamCount, players.length);\n  const url = rallyJoinUrl(event.code);\n\n  const share = async () => {\n    const text = rallyQuickT('rally.quick.lobby.shareText', lang, { code: event.code });\n    if (navigator.share) {\n      try { await navigator.share({ title: event.title || 'FACT', text, url }); return; }\n      catch (e) { if (e && e.name === 'AbortError') return; }\n    }\n    const ok = await rallyQuickCopy(text + '\\n' + url);\n    showToast(t(ok ? 'rally.quick.lobby.copied' : 'rally.quick.lobby.copyFailed', lang));\n  };\n  const copyCode = async () => {\n    const ok = await rallyQuickCopy(event.code);\n    showToast(t(ok ? 'rally.quick.lobby.codeCopied' : 'rally.quick.lobby.copyFailed', lang));\n  };\n  const startNow = async () => {\n    if (busy || !ready.ok) return;\n    setBusy(true);\n    try { await window.RallyStore.startEvent(event.id); }\n    catch (e) {\n      showToast(e && e.code === 'team_empty'\n        ? rallyQuickT('rally.quick.lobby.needMore', lang, { n: Math.max(1, ready.missing) })\n        : rallyPlayErrText(e, lang));\n      setBusy(false);\n    }\n  };\n\n  const modeLine = (\n    <RallyPlayNotice icon={single ? '🤝' : '⚔️'}>{t(single ? 'rally.quick.lobby.modeOne' : 'rally.quick.lobby.modeTwo', lang)}</RallyPlayNotice>\n  );\n  const whoIn = (\n    <RallyCard padding={16}>\n      <RallyKicker color=\"var(--ink-2)\">{rallyQuickT('rally.quick.lobby.whoIn', lang, { n: players.length })}</RallyKicker>\n      {rallyQuickPlayerList(players, me, hostName, lang, single, event)}\n    </RallyCard>\n  );\n  // Freunde sehen „Treffpunkt: Startpunkt von Anna“, der Gastgeber den Ort (falls es einen gibt)\n  const generic = rallyPlayStartIsGeneric(start);\n  const meetLine = !start ? ''\n    : isHost\n      ? t('rally.quick.lobby.meet', lang) + (start.label && !generic ? ': ' + start.label : '')\n      : t('rally.quick.lobby.meetJoin', lang) + ': ' + rallyPlayStartLabel(event, lang, false);\n  const shiftedM = Math.round(Number(event.tour && event.tour.startShiftedM) || 0);\n  // Weg zum verlegten Start: zählt schon zur gewählten Zeit (RallyEngine.quickTour, walkToStartMin)\n  const walkMin = Math.round(Number(event.tour && event.tour.walkToStartMin) || 0);\n  const walkLine = walkMin > 0 ? rallyQuickT('rally.quick.lobby.walk', lang, { min: rallyFmtMin(walkMin, lang) }) : '';\n  const shifted = isHost && (shiftedM > 100 || walkMin > 0) && start ? (\n    <RallyPlayNotice icon=\"🧭\" tone=\"gold\">\n      <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900 }}>\n        {rallyQuickT('rally.quick.lobby.shifted', lang, { label: start.label || t('rally.quick.startGeneric', lang), n: rallyFmtNum(shiftedM, lang, 0) })}\n      </div>\n      <div style={{ marginTop: 2 }}>{t('rally.quick.lobby.shiftedBody', lang)}</div>\n      {walkLine && <div style={{ marginTop: 6, fontFamily: RAL_FONT_D, fontWeight: 800 }}>🚶 {walkLine}</div>}\n    </RallyPlayNotice>\n  ) : (!isHost && walkMin > 0 && start ? <RallyPlayNotice icon=\"🚶\">{walkLine}</RallyPlayNotice> : null);\n  const meetMap = start ? (\n    <div>\n      <RallyKicker color=\"var(--ink-2)\" style={{ marginBottom: 8 }}>{meetLine}</RallyKicker>\n      <RallyMap height={160} theme={theme} lang={lang} center={start} zoom={16} interactive={false}\n        markers={[{ id: 'start', kind: 'start', lat: start.lat, lng: start.lng, title: start.label }]} />\n    </div>\n  ) : null;\n\n  if (!isHost) {\n    return (\n      <React.Fragment>\n        <RallyCard accent padding={18}>\n          <RallyKicker>{t('rally.play.lobby.kicker', lang)}</RallyKicker>\n          <RallyPlayTitle size={26} style={{ marginTop: 6 }}>{rallyQuickT('rally.play.lobby.hello', lang, { name: me.name })}</RallyPlayTitle>\n        </RallyCard>\n        <div role=\"status\" style={{\n          display: 'flex', alignItems: 'center', gap: 12, padding: '14px 16px', borderRadius: 16,\n          background: 'var(--coin-soft)', border: '1px solid rgba(245,197,24,0.45)',\n        }}>\n          <RallyPlayPulseDot color=\"var(--coin)\" />\n          <div style={{ minWidth: 0 }}>\n            <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 18, overflowWrap: 'anywhere' }}>{rallyQuickT('rally.quick.lobby.waitHost', lang, { name: hostName })}</div>\n            <div style={{ fontFamily: RAL_FONT_B, fontSize: 14, lineHeight: 1.45, color: 'var(--ink-2)', marginTop: 2 }}>{t('rally.quick.lobby.waitHostBody', lang)}</div>\n          </div>\n        </div>\n        {modeLine}\n        {whoIn}\n        {shifted}\n        {meetMap}\n        <RallyPlayGermanOnly event={event} lang={lang} />\n        <RallyPlayNotice icon=\"📍\">{t('rally.quick.lobby.tip', lang)}</RallyPlayNotice>\n        {geo.error && <RallyGeoNotice geo={geo} lang={lang} />}\n      </React.Fragment>\n    );\n  }\n\n  // Späteinstieg ist Standard (Spec §11 P5): dann nicht behaupten, nach dem Start käme niemand mehr dazu\n  const lateOk = !(event.settings && event.settings.lateJoin === false);\n  const reason = !ready.ok\n    ? rallyQuickT('rally.quick.lobby.needMore', lang, { n: ready.missing })\n    : t((players.length <= 1 && single ? 'rally.quick.lobby.needOne' : 'rally.quick.lobby.ready') + (lateOk ? 'Late' : ''), lang);\n  // Zwei Teams bei genau drei Leuten: 1 gegen 2. Ein Tipp macht ein gemeinsames Team daraus.\n  const unfair = !single && +event.teamCount === 2 && players.length === 3;\n  const makeOneTeam = async () => {\n    if (busy) return;\n    setBusy(true);\n    try {\n      // Ein Team: wie beim Einrichten kein Tempo-Bonus (niemand zum Überholen)\n      const tour = { ...event.tour, settings: { ...((event.tour && event.tour.settings) || {}), speedWeight: 'off', defaultTeamCount: 1 } };\n      await window.RallyStore.updateEvent(event.id, { teamCount: 1, tour });\n      showToast(t('rally.quick.lobby.switched', lang));\n    } catch (e) { showToast(rallyPlayErrText(e, lang)); }\n    setBusy(false);\n  };\n\n  return (\n    <React.Fragment>\n      <RallyCard accent padding={18} style={{ textAlign: 'center' }}>\n        <RallyKicker>{t('rally.quick.lobby.kicker', lang)}</RallyKicker>\n        <div style={{ marginTop: 14, display: 'flex', justifyContent: 'center' }}>\n          <RallyQr code={event.code} size={190} lang={lang} />\n        </div>\n        <div style={{ marginTop: 14, fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 13, color: 'var(--ink-2)' }}>{t('rally.quick.lobby.codeLabel', lang)}</div>\n        <button type=\"button\" className=\"rally-tap\" onClick={copyCode}\n          aria-label={rallyQuickT('rally.quick.lobby.codeAria', lang, { code: event.code })}\n          style={{\n            marginTop: 2, border: 'none', background: 'transparent', cursor: 'pointer', color: 'var(--ink)',\n            fontFamily: RAL_FONT_M, fontWeight: 700, fontSize: 44, letterSpacing: '0.18em', lineHeight: 1.1, paddingLeft: '0.18em',\n          }}>{event.code}</button>\n        <RallyPlayBody style={{ marginTop: 8, fontSize: 14 }}>{t('rally.quick.lobby.scan', lang)}</RallyPlayBody>\n        <div style={{ display: 'flex', gap: 10, marginTop: 14 }}>\n          <RallyButton variant=\"secondary\" full icon=\"📤\" onClick={share} style={{ flex: 1 }}>{t('rally.quick.lobby.share', lang)}</RallyButton>\n          <RallyButton variant=\"ghost\" full icon=\"📋\" onClick={copyCode} style={{ flex: 1 }}>{t('rally.quick.lobby.copy', lang)}</RallyButton>\n        </div>\n      </RallyCard>\n\n      {whoIn}\n      {modeLine}\n      {unfair && (\n        <RallyPlayNotice icon=\"⚖️\" tone=\"warn\">\n          <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900 }}>{t('rally.quick.lobby.unfair', lang)}</div>\n          <div style={{ marginTop: 2 }}>{t('rally.quick.lobby.unfairBody', lang)}</div>\n          <RallyButton variant=\"secondary\" full icon=\"🤝\" disabled={busy} onClick={makeOneTeam} style={{ marginTop: 10 }}>\n            {t('rally.quick.together', lang)}\n          </RallyButton>\n        </RallyPlayNotice>\n      )}\n      {shifted}\n\n      <div>\n        <RallyButton size=\"lg\" full icon=\"🚀\" disabled={!ready.ok || busy} onClick={startNow}>\n          {busy ? t('rally.quick.lobby.starting', lang) : t('rally.quick.lobby.start', lang)}\n        </RallyButton>\n        <div role={ready.ok ? undefined : 'status'} style={{\n          marginTop: 8, textAlign: 'center', fontFamily: RAL_FONT_B, fontSize: 14, lineHeight: 1.45,\n          color: ready.ok ? 'var(--ink-3)' : 'var(--stamp)',\n        }}>{reason}</div>\n      </div>\n\n      {meetMap}\n      <RallyPlayGermanOnly event={event} lang={lang} />\n      <RallyPlayNotice icon=\"📍\">{t('rally.quick.lobby.tip', lang)}</RallyPlayNotice>\n      {geo.error && <RallyGeoNotice geo={geo} lang={lang} />}\n    </React.Fragment>\n  );\n}\n\n// ══════════════════════════════════════════════════════════════════════════════\n// Ein Team: Zwischenstand und Ergebnis\n// ══════════════════════════════════════════════════════════════════════════════\nfunction rallyQuickQuizCount(event) {\n  return ((event.tour && event.tour.stations) || []).filter(s => s.puzzle && s.puzzle.type !== 'estimate').length;\n}\n\nfunction RallyQuickScore({ event, answers, teamNo, lang }) {\n  const rows = window.RallyEngine.standings(event, answers, [], { revealEstimates: false });\n  const mine = rows.find(r => +r.team === +(teamNo || 1)) || rows[0] || { base: 0, correct: 0 };\n  return (\n    <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n      <div style={{ textAlign: 'center', padding: '18px 12px', borderRadius: 18, background: 'var(--surface-2)' }}>\n        <div style={{ fontFamily: RAL_FONT_M, fontWeight: 700, fontSize: 40, lineHeight: 1.05, color: 'var(--ink)' }}>\n          {ralPlural(mine.base, 'rally.quick.score.points', lang)}\n        </div>\n        <div style={{ marginTop: 2, fontFamily: RAL_FONT_B, fontWeight: 500, fontSize: 14, color: 'var(--ink-3)' }}>\n          {rallyQuickT('rally.quick.score.max', lang, { n: rallyPlayMaxPoints(event, false) })}\n        </div>\n        <div style={{ marginTop: 6, fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 15, color: 'var(--ink-2)' }}>\n          {rallyQuickT('rally.quick.score.correct', lang, { n: mine.correct, total: rallyQuickQuizCount(event) })}\n        </div>\n      </div>\n      {((event.tour && event.tour.stations) || []).some(s => s.puzzle && s.puzzle.type === 'estimate') && (\n        <RallyPlayNotice icon=\"🔒\">{t('rally.quick.score.hidden', lang)}</RallyPlayNotice>\n      )}\n    </div>\n  );\n}\n\nfunction RallyQuickSolo({ event, answers = [], finishes = [], players = [], lang, theme, isHost, onEnd }) {\n  const [busy, setBusy] = React.useState(false);\n  const E = window.RallyEngine;\n  const row = E.standings(event, answers, finishes, { revealEstimates: true })[0] || { total: 0, correct: 0, answered: 0 };\n  const stations = (event.tour && event.tour.stations) || [];\n  const est = stations.filter(s => s.puzzle && s.puzzle.type === 'estimate');\n  const team = (event.teams || [])[0];\n  const ended = event.status === 'ended';\n  const first = {};\n  stations.forEach(s => {\n    const a = rallyPlayTeamAnswer(answers, team ? team.no : 1, s.id);\n    if (a) first[s.id] = a;\n  });\n  const fmt = (v, unit) => rallyFmtNum(v, lang, Number.isInteger(v) ? 0 : 1, unit) + (unit ? ' ' + unit : '');\n  const end = async () => {\n    if (busy || !onEnd) return;\n    setBusy(true);\n    try { await onEnd(); } catch (e) { console.warn('[RallyQuickSolo]', e); }\n    setBusy(false);\n  };\n\n  return (\n    <React.Fragment>\n      <div style={{\n        borderRadius: 22, padding: '22px 18px', textAlign: 'center', color: '#FFFFFF',\n        background: 'linear-gradient(135deg, var(--stamp), var(--primary-lt))', boxShadow: '0 4px 0 var(--stamp-deep)',\n      }}>\n        <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 11, letterSpacing: 1.5, textTransform: 'uppercase', opacity: 0.92 }}>\n          {t('rally.quick.solo.kicker', lang)}\n        </div>\n        <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 32, lineHeight: 1.1, marginTop: 10 }}>🎉 {t('rally.quick.solo.title', lang)}</div>\n        <div style={{ fontFamily: RAL_FONT_M, fontWeight: 700, fontSize: 30, marginTop: 10 }}>\n          {ralPlural(row.total, 'rally.quick.solo.points', lang)}\n        </div>\n        <div style={{ fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 15, marginTop: 2, opacity: 0.92 }}>\n          {rallyQuickT('rally.quick.score.max', lang, { n: rallyPlayMaxPoints(event, true) })}\n        </div>\n      </div>\n\n      <div style={{ display: 'flex', gap: 8 }}>\n        <RallyPlayStat value={row.correct + '/' + rallyQuickQuizCount(event)} label={t('rally.quick.solo.correct', lang)} />\n        <RallyPlayStat value={row.answered + '/' + stations.filter(s => s.puzzle).length} label={t('rally.quick.solo.answered', lang)} />\n      </div>\n\n      {est.length > 0 && (\n        <RallyCard padding={16}>\n          <RallyKicker color=\"var(--ink-2)\">{t('rally.quick.solo.estimates', lang)}</RallyKicker>\n          <div style={{ display: 'flex', flexDirection: 'column', gap: 14, marginTop: 10 }}>\n            {est.map(s => {\n              const p = s.puzzle;\n              const truth = E.parseNumber(p.answer);\n              const a = first[s.id];\n              const v = a ? E.parseNumber(a.value, lang) : NaN;\n              const off = isFinite(v) && isFinite(truth) ? Math.abs(v - truth) : null;\n              return (\n                <div key={s.id}>\n                  <div style={{ fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 15, lineHeight: 1.3, overflowWrap: 'anywhere' }}>{p.question}</div>\n                  <div style={{ display: 'flex', gap: 8, marginTop: 8 }}>\n                    <div style={{ flex: 1, minWidth: 0, padding: '8px 10px', borderRadius: 12, background: 'var(--surface-2)' }}>\n                      <div style={{ fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 11, letterSpacing: 1, textTransform: 'uppercase', color: 'var(--ink-2)' }}>{t('rally.quick.solo.yourGuess', lang)}</div>\n                      <div style={{ fontFamily: RAL_FONT_M, fontWeight: 700, fontSize: 18, marginTop: 2 }}>{isFinite(v) ? fmt(v, p.unit) : '?'}</div>\n                    </div>\n                    <div style={{ flex: 1, minWidth: 0, padding: '8px 10px', borderRadius: 12, background: 'var(--coin-soft)' }}>\n                      <div style={{ fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 11, letterSpacing: 1, textTransform: 'uppercase', color: 'var(--ink-2)' }}>{t('rally.quick.solo.truth', lang)}</div>\n                      <div style={{ fontFamily: RAL_FONT_M, fontWeight: 700, fontSize: 18, marginTop: 2 }}>{isFinite(truth) ? fmt(truth, p.unit) : '?'}</div>\n                    </div>\n                  </div>\n                  <div style={{ marginTop: 6, fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 14, color: off === 0 ? 'var(--cat-nat, #22C55E)' : 'var(--ink-2)' }}>\n                    {off == null ? t('rally.quick.solo.noGuess', lang)\n                      : off === 0 ? '🎯 ' + t('rally.quick.solo.exact', lang)\n                      : rallyQuickT('rally.quick.solo.off', lang, { n: fmt(off, p.unit) })}\n                  </div>\n                </div>\n              );\n            })}\n          </div>\n        </RallyCard>\n      )}\n\n      {!ended && (isHost ? (\n        <RallyButton size=\"lg\" full icon=\"🏁\" disabled={busy} onClick={end}>{t('rally.quick.solo.finish', lang)}</RallyButton>\n      ) : (\n        <div style={{ textAlign: 'center', fontFamily: RAL_FONT_B, fontSize: 14, color: 'var(--ink-3)' }}>\n          {rallyQuickT('rally.quick.solo.waitHost', lang, { name: rallyQuickHostName(event, players, lang) })}\n        </div>\n      ))}\n    </React.Fragment>\n  );\n}\n\n// ══════════════════════════════════════════════════════════════════════════════\n// Gastgeber: Tour speichern\n// ══════════════════════════════════════════════════════════════════════════════\nfunction RallyQuickSaveTour({ event, lang }) {\n  const [state, setState] = React.useState(() => (rallyQuickSavedMap()[event.id] ? 'done' : 'idle')); // idle | saving | done | failed\n  const save = async () => {\n    if (state === 'saving' || state === 'done') return;\n    setState('saving');\n    try {\n      const S = window.RallyStore;\n      // Ohne Titel: die Engine baut „Rallye ab <Ort>, <Datum>“\n      const tour = window.RallyEngine.tourForSave(event.tour, { ownerId: S.me().deviceId, lang });\n      const saved = await S.saveTour(tour);\n      rallyQuickMarkSaved(event.id, saved && saved.id);\n      setState('done');\n    } catch (e) {\n      console.warn('[RallyQuickSaveTour]', e);\n      setState('failed');\n    }\n  };\n  return (\n    <RallyCard padding={18} accent=\"var(--teal, #00C2A8)\">\n      <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 19, lineHeight: 1.25 }}>\n        {state === 'done' ? '✓ ' + t('rally.quick.save.done', lang) : t('rally.quick.save.title', lang)}\n      </div>\n      <RallyPlayBody style={{ marginTop: 6, fontSize: 15 }}>\n        {t(state === 'done' ? 'rally.quick.save.hint' : 'rally.quick.save.body', lang)}\n      </RallyPlayBody>\n      {state === 'failed' && <RallyPlayNotice icon=\"⚠️\" tone=\"warn\" style={{ marginTop: 10 }}>{t('rally.quick.save.failed', lang)}</RallyPlayNotice>}\n      {state !== 'done' && (\n        <RallyButton variant=\"secondary\" size=\"lg\" full icon=\"💾\" disabled={state === 'saving'} onClick={save} style={{ marginTop: 14 }}>\n          {t(state === 'saving' ? 'rally.quick.save.saving' : 'rally.quick.save.cta', lang)}\n        </RallyButton>\n      )}\n    </RallyCard>\n  );\n}\n\nObject.assign(window, { RallyQuickStart, RallyQuickLobby, RallyQuickScore, RallyQuickSolo, RallyQuickSaveTour, rallyQuickIsSingle, rallyQuickHostName });\n"],
  "mappings": "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",
  "names": ["key", "lang", "vars", "s", "k", "event", "players", "n", "text", "fallback", "ta", "ok", "eventId", "tourId", "m", "S", "sb", "r", "me", "hostName", "single", "p", "i", "team", "tm", "on", "icon", "title", "desc", "onClick", "theme", "userId", "user", "userPosition", "currentCity", "initialCode", "onExit", "onSignup", "onStarted", "duration", "setDuration", "teams", "setTeams", "name", "setName", "suggestName", "nameRef", "phase", "setPhase", "err", "setErr", "nameErr", "setNameErr", "geo", "mountedAt", "now", "appPos", "pos", "posRef", "geoFailed", "offline", "waitForPos", "left", "until", "go", "nm", "start", "E", "facts", "base", "tour", "sess", "ev", "e", "busy", "durOpts", "startLine", "startTone", "startIcon", "v", "isHost", "showToast", "setBusy", "ready", "url", "share", "copyCode", "startNow", "modeLine", "whoIn", "generic", "meetLine", "shiftedM", "walkMin", "walkLine", "shifted", "meetMap", "lateOk", "reason", "unfair", "makeOneTeam", "answers", "teamNo", "rows", "mine", "finishes", "onEnd", "row", "stations", "est", "ended", "first", "a", "fmt", "unit", "end", "truth", "off", "state", "setState", "save", "saved"]
}
