{
  "version": 3,
  "sources": ["rally-ui.jsx"],
  "sourcesContent": ["/* FACT Rallye: gemeinsame UI-Bausteine (Spec 06_Planung/specs/2026-10-17-rallye-organizer-design.md, Abschnitt 6.3)\n *\n * Wird von rally-organizer.jsx und rally-play.jsx benutzt. Kein eigener Screen.\n *\n * Globaler Babel-Scope: ALLE Top-Level-Namen beginnen mit Rally / rally / RAL_ / useRally.\n * Alles wird zusaetzlich auf window gelegt (window.RallyButton usw.).\n *\n * Farben kommen aus den CSS-Variablen in styles.css. Die Variablen haengen an\n * .theme-light bzw. :root (dunkel). Alles muss also innerhalb eines Elements mit\n * className \"theme-light\" oder \"theme-dark\" gerendert werden (ScreenFrame macht das).\n *\n * Overlays (RallySheet, RallyConfirm, RallyToast) sind position:absolute.\n * Der Eltern-Container braucht position:relative und overflow:hidden.\n *\n * Abhaengigkeiten: React (global), window.t (translations.jsx), rally-strings.jsx,\n * optional window.maplibregl, window.QRCode, window.makeMapStyle, window.RallyStore.\n */\n\nconst RAL_FONT_D = \"'Nunito', system-ui, sans-serif\";\nconst RAL_FONT_B = \"'DM Sans', system-ui, sans-serif\";\nconst RAL_FONT_M = \"'JetBrains Mono', ui-monospace, monospace\";\nconst RAL_MUC = { lat: 48.1374, lng: 11.5755 };\n\n// ── Styles (Keyframes + Pseudo-Klassen, die Inline-Styles nicht koennen) ──────\nfunction rallyEnsureStyles() {\n  if (typeof document === 'undefined' || document.getElementById('rally-ui-styles')) return;\n  const s = document.createElement('style');\n  s.id = 'rally-ui-styles';\n  s.textContent = `\n@keyframes rallySheetIn  { from { transform: translateY(100%); } to { transform: translateY(0); } }\n@keyframes rallySheetOut { from { transform: translateY(0); } to { transform: translateY(100%); } }\n@keyframes rallyFadeIn   { from { opacity: 0; } to { opacity: 1; } }\n@keyframes rallyFadeOut  { from { opacity: 1; } to { opacity: 0; } }\n@keyframes rallyPopIn    { from { transform: scale(0.92); opacity: 0; } to { transform: scale(1); opacity: 1; } }\n@keyframes rallyToastIn  { from { transform: translate(-50%, 12px); opacity: 0; } to { transform: translate(-50%, 0); opacity: 1; } }\n@keyframes rallyPulse    { 0% { transform: scale(0.8); opacity: 0.6; } 100% { transform: scale(2.6); opacity: 0; } }\n.rally-btn { transition: transform 0.08s ease-out, box-shadow 0.08s ease-out, filter 0.15s; -webkit-user-select: none; user-select: none; touch-action: manipulation; }\n.rally-btn:not(:disabled):active { transform: translateY(3px); }\n.rally-btn-primary:not(:disabled):active,\n.rally-btn-danger:not(:disabled):active,\n.rally-btn-gold:not(:disabled):active { box-shadow: 0 0 0 transparent !important; }\n.rally-btn-ghost:not(:disabled):active,\n.rally-btn-secondary:not(:disabled):active { transform: scale(0.97); }\n@media (hover: hover) {\n  .rally-btn-primary:not(:disabled):hover { background: var(--red-lt, #FF6B3D) !important; }\n  .rally-btn-secondary:not(:disabled):hover,\n  .rally-btn-ghost:not(:disabled):hover { filter: brightness(1.04); }\n}\n.rally-btn:focus-visible, .rally-tap:focus-visible, .rally-marker:focus-visible { outline: 3px solid var(--stamp); outline-offset: 2px; }\n.rally-tap { -webkit-user-select: none; user-select: none; touch-action: manipulation; transition: transform 0.08s ease-out, background 0.15s, color 0.15s; }\n.rally-tap:not(:disabled):active { transform: scale(0.96); }\n.rally-input::placeholder { color: var(--ink-3); opacity: 1; }\n.rally-input:focus { outline: none; border-color: var(--stamp) !important; box-shadow: 0 0 0 3px var(--stamp-soft); }\n.rally-scroll { -webkit-overflow-scrolling: touch; overscroll-behavior: contain; }\n.rally-map .maplibregl-ctrl-attrib { font-family: ${RAL_FONT_B}; font-size: 10px; }\n.rally-marker { cursor: pointer; -webkit-tap-highlight-color: transparent; }\n@media (prefers-reduced-motion: reduce) {\n  .rally-anim { animation: none !important; }\n  .rally-btn, .rally-tap { transition: none; }\n}\n`;\n  document.head.appendChild(s);\n}\n\n// ── Kleine Helfer ─────────────────────────────────────────────────────────────\nfunction rallyLang(lang) {\n  return lang || window._lang || 'de';\n}\n\n// Text aus { de, en } oder String holen (Teamnamen, Datenfelder).\nfunction rallyPickText(v, lang) {\n  if (v == null) return '';\n  if (typeof v === 'string' || typeof v === 'number') return String(v);\n  const l = rallyLang(lang);\n  return v[l] != null ? String(v[l]) : (v.de != null ? String(v.de) : (v.en != null ? String(v.en) : ''));\n}\n\n// Lesbare Textfarbe auf einer Datenfarbe (Teamfarbe). Nur fuer Hex-Werte, sonst weiss.\nfunction rallyReadableOn(color) {\n  const m = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(String(color || '').trim());\n  if (!m) return '#FFFFFF';\n  let h = m[1];\n  if (h.length === 3) h = h.split('').map(c => c + c).join('');\n  const r = parseInt(h.slice(0, 2), 16) / 255, g = parseInt(h.slice(2, 4), 16) / 255, b = parseInt(h.slice(4, 6), 16) / 255;\n  const lin = c => (c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4));\n  const L = 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b);\n  return L > 0.45 ? '#1A1208' : '#FFFFFF';\n}\n\n// ── Formatierung ──────────────────────────────────────────────────────────────\n// Jahreszahlen ohne Tausenderpunkt („1860 Jahr“, nicht „1.860 (Jahr)“)\nfunction rallyIsYearUnit(unit) { return /jahr|year/i.test(String(unit || '')); }\nfunction rallyFmtNum(n, lang, digits, unit) {\n  if (n == null || !isFinite(n)) return '';\n  const loc = rallyLang(lang) === 'en' ? 'en-US' : 'de-DE';\n  return Number(n).toLocaleString(loc, { minimumFractionDigits: digits || 0, maximumFractionDigits: digits || 0, useGrouping: !rallyIsYearUnit(unit) });\n}\n\n// 45 m, 320 m, 1,2 km (DE) / 1.2 km (EN), 12 km\nfunction rallyFmtDist(m, lang) {\n  if (m == null || !isFinite(m)) return '';\n  const v = Math.max(0, Number(m));\n  if (v < 100) return Math.round(v) + ' m';\n  if (v < 1000) return Math.round(v / 10) * 10 + ' m';\n  if (v < 10000) return rallyFmtNum(v / 1000, lang, 1) + ' km';\n  return rallyFmtNum(Math.round(v / 1000), lang) + ' km';\n}\n\n// 45 min, 1 h, 1 h 35 min\nfunction rallyFmtMin(min, lang) {\n  if (min == null || !isFinite(min)) return '';\n  const total = Math.max(0, Math.round(Number(min)));\n  if (total < 60) return total + ' min';\n  const h = Math.floor(total / 60), r = total % 60;\n  return r ? `${h} h ${r} min` : `${h} h`;\n}\n\n// Countdown: 04:09 oder 1:04:09\nfunction rallyFmtClock(ms) {\n  if (ms == null || !isFinite(ms)) return '';\n  const s = Math.max(0, Math.ceil(Number(ms) / 1000));\n  const h = Math.floor(s / 3600), m = Math.floor((s % 3600) / 60), sec = s % 60;\n  const p = n => String(n).padStart(2, '0');\n  return h > 0 ? `${h}:${p(m)}:${p(sec)}` : `${p(m)}:${p(sec)}`;\n}\n\n// Join-Link fuer QR und Teilen-Button\nfunction rallyJoinUrl(code) {\n  const loc = window.location;\n  return `${loc.origin}${loc.pathname}?rally=${encodeURIComponent(String(code || '').toUpperCase())}`;\n}\n\n// ── Tokens ────────────────────────────────────────────────────────────────────\nfunction rallyTokens(theme) {\n  const L = theme !== 'dark';\n  return {\n    L,\n    theme: L ? 'light' : 'dark',\n    themeClass: L ? 'theme-light' : 'theme-dark',\n    bg: 'var(--bg)',\n    surface: 'var(--surface)',\n    surf2: 'var(--surface-2)',\n    surf3: 'var(--surface-3)',\n    ink: 'var(--ink)',\n    ink2: 'var(--ink-2)',\n    ink3: 'var(--ink-3)',\n    bdr: 'var(--border)',\n    bdr2: 'var(--border-2)',\n    stamp: 'var(--stamp)',\n    stampDeep: 'var(--stamp-deep)',\n    stampSoft: 'var(--stamp-soft)',\n    stampLt: 'var(--primary-lt)',\n    stampGlow: 'var(--stamp-glow)',\n    coin: 'var(--coin)',\n    coinDk: 'var(--coin-dk)',\n    coinSoft: 'var(--coin-soft)',\n    teal: 'var(--teal, #00C2A8)',\n    ok: 'var(--cat-nat, #22C55E)',\n    okSoft: 'rgba(34,197,94,0.14)',\n    info: 'var(--cat-arch, #3B82F6)',\n    fontD: RAL_FONT_D,\n    fontB: RAL_FONT_B,\n    fontM: RAL_FONT_M,\n    radius: 18,\n    radiusSm: 12,\n    cardShadow: L ? '0 2px 6px rgba(0,0,0,0.04)' : 'none',\n    shadowMd: 'var(--shadow-md)',\n    backdrop: 'rgba(10,8,6,0.52)',\n  };\n}\n\n// ── Button ────────────────────────────────────────────────────────────────────\nconst RAL_BTN_SIZES = {\n  sm: { minHeight: 44, padding: '8px 16px', fontSize: 14, radius: 12, gap: 6 },\n  md: { minHeight: 50, padding: '12px 20px', fontSize: 16, radius: 14, gap: 8 },\n  lg: { minHeight: 56, padding: '14px 24px', fontSize: 17, radius: 16, gap: 10 },\n};\n\nfunction RallyButton({ variant = 'primary', size = 'md', disabled, onClick, children, icon, full, type = 'button', style, ariaLabel, title }) {\n  rallyEnsureStyles();\n  const sz = RAL_BTN_SIZES[size] || RAL_BTN_SIZES.md;\n  const v = {\n    primary:   { background: 'var(--stamp)', color: '#FFFFFF', border: 'none', boxShadow: '0 3px 0 var(--stamp-deep)' },\n    secondary: { background: 'transparent', color: 'var(--stamp)', border: '1.5px solid var(--stamp)', boxShadow: 'none' },\n    ghost:     { background: 'var(--surface-2)', color: 'var(--ink)', border: '1px solid var(--border-2)', boxShadow: 'none' },\n    danger:    { background: 'var(--stamp-deep)', color: '#FFFFFF', border: 'none', boxShadow: '0 3px 0 rgba(60,10,0,0.55)' },\n    gold:      { background: 'var(--coin)', color: '#3D2F00', border: 'none', boxShadow: '0 3px 0 var(--coin-dk)' },\n  }[variant] || {};\n  return (\n    <button\n      type={type}\n      className={'rally-btn rally-btn-' + variant}\n      disabled={!!disabled}\n      onClick={disabled ? undefined : onClick}\n      aria-label={ariaLabel}\n      title={title}\n      style={{\n        display: full ? 'flex' : 'inline-flex', width: full ? '100%' : undefined,\n        alignItems: 'center', justifyContent: 'center', gap: sz.gap,\n        minHeight: sz.minHeight, padding: sz.padding, borderRadius: sz.radius,\n        fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: sz.fontSize, lineHeight: 1.15,\n        letterSpacing: '0.005em', textAlign: 'center',\n        cursor: disabled ? 'not-allowed' : 'pointer',\n        ...v,\n        ...(disabled ? { opacity: 0.5, boxShadow: 'none' } : null),\n        ...style,\n      }}\n    >\n      {icon != null && <span aria-hidden=\"true\" style={{ display: 'inline-flex', fontSize: sz.fontSize + 2, lineHeight: 1 }}>{icon}</span>}\n      {children != null && <span style={{ minWidth: 0 }}>{children}</span>}\n    </button>\n  );\n}\n\n// ── Kicker (Mini-Caps) ────────────────────────────────────────────────────────\nfunction RallyKicker({ children, color, style }) {\n  return (\n    <div style={{\n      fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 11, letterSpacing: 1.5,\n      textTransform: 'uppercase', color: color || 'var(--stamp)', lineHeight: 1.3, ...style,\n    }}>{children}</div>\n  );\n}\n\n// ── Karte ─────────────────────────────────────────────────────────────────────\nfunction RallyCard({ children, onClick, accent, padding = 16, theme, style, ariaLabel }) {\n  rallyEnsureStyles();\n  const L = theme !== 'dark';\n  const clickable = typeof onClick === 'function';\n  const base = {\n    position: 'relative', background: 'var(--surface)', border: '1px solid var(--border)',\n    borderRadius: 18, padding, boxShadow: L ? '0 2px 6px rgba(0,0,0,0.04)' : 'none',\n    borderLeft: accent ? `3px solid ${accent === true ? 'var(--stamp)' : accent}` : undefined,\n    color: 'var(--ink)', textAlign: 'left', minWidth: 0,\n  };\n  if (!clickable) return <div style={{ ...base, ...style }}>{children}</div>;\n  return (\n    <div\n      role=\"button\" tabIndex={0} aria-label={ariaLabel}\n      className=\"rally-tap\"\n      onClick={onClick}\n      onKeyDown={e => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onClick(e); } }}\n      style={{ ...base, cursor: 'pointer', ...style }}\n    >{children}</div>\n  );\n}\n\n// ── Chip ──────────────────────────────────────────────────────────────────────\n// Mit onClick: Auswahl-Chip (44 px hoch). Ohne onClick: kompakter Status-Chip.\n// keepFocus: Tippen nimmt dem Eingabefeld nicht den Fokus (keine Tastatur-Bewegung, die den\n// ersten Tipp verschluckt, z. B. bei Namensvorschlägen unter dem Namensfeld).\nfunction RallyChip({ active, onClick, children, icon, color, style, ariaLabel, keepFocus }) {\n  rallyEnsureStyles();\n  const accent = color || 'var(--stamp)';\n  if (typeof onClick !== 'function') {\n    return (\n      <span style={{\n        display: 'inline-flex', alignItems: 'center', gap: 5, padding: '3px 10px', borderRadius: 999,\n        background: active ? accent : 'var(--surface-2)', color: active ? '#FFFFFF' : 'var(--ink-2)',\n        border: active ? 'none' : '1px solid var(--border)',\n        fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 12, lineHeight: 1.5, whiteSpace: 'nowrap', ...style,\n      }}>\n        {icon != null && <span aria-hidden=\"true\">{icon}</span>}{children}\n      </span>\n    );\n  }\n  return (\n    <button\n      type=\"button\" className=\"rally-tap\" onClick={onClick} aria-pressed={!!active} aria-label={ariaLabel}\n      onMouseDown={keepFocus ? (e => e.preventDefault()) : undefined}\n      style={{\n        display: 'inline-flex', alignItems: 'center', justifyContent: 'center', gap: 6,\n        minHeight: 44, padding: '0 16px', borderRadius: 999, cursor: 'pointer',\n        background: active ? accent : 'var(--surface-2)',\n        color: active ? '#FFFFFF' : 'var(--ink-2)',\n        border: active ? '1.5px solid transparent' : '1.5px solid var(--border-2)',\n        boxShadow: active ? '0 2px 0 var(--stamp-deep)' : 'none',\n        fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 14, whiteSpace: 'nowrap', ...style,\n      }}\n    >\n      {icon != null && <span aria-hidden=\"true\" style={{ fontSize: 16, lineHeight: 1 }}>{icon}</span>}\n      {children}\n    </button>\n  );\n}\n\n// ── Segmented Control ─────────────────────────────────────────────────────────\nfunction RallySegmented({ options = [], value, onChange, ariaLabel, style }) {\n  rallyEnsureStyles();\n  return (\n    <div role=\"radiogroup\" aria-label={ariaLabel} style={{\n      display: 'flex', gap: 4, padding: 4, borderRadius: 14,\n      background: 'var(--surface-2)', border: '1px solid var(--border)', ...style,\n    }}>\n      {options.map(o => {\n        const on = o.value === value;\n        return (\n          <button\n            key={String(o.value)} type=\"button\" role=\"radio\" aria-checked={on}\n            className=\"rally-tap\"\n            onClick={() => onChange && onChange(o.value)}\n            style={{\n              flex: 1, minWidth: 0, minHeight: 44, padding: '6px 8px', borderRadius: 11, cursor: 'pointer',\n              border: 'none',\n              background: on ? 'var(--surface)' : 'transparent',\n              color: on ? 'var(--stamp)' : 'var(--ink-2)',\n              boxShadow: on ? '0 1px 3px rgba(0,0,0,0.12), 0 0 0 1px var(--border-2)' : 'none',\n              fontFamily: RAL_FONT_D, fontWeight: on ? 900 : 800, fontSize: 14, lineHeight: 1.15,\n              overflow: 'hidden', textOverflow: 'ellipsis',\n            }}\n          >{o.label}</button>\n        );\n      })}\n    </div>\n  );\n}\n\n// ── Formularfelder ────────────────────────────────────────────────────────────\nfunction RallyField({ label, hint, error, children, htmlFor, style }) {\n  return (\n    <div style={{ display: 'flex', flexDirection: 'column', gap: 6, minWidth: 0, ...style }}>\n      {label != null && (\n        <label htmlFor={htmlFor} style={{ fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 14, color: 'var(--ink)' }}>{label}</label>\n      )}\n      {children}\n      {error ? (\n        <div role=\"alert\" style={{ fontFamily: RAL_FONT_B, fontWeight: 500, fontSize: 13, lineHeight: 1.45, color: 'var(--stamp)' }}>{error}</div>\n      ) : hint != null ? (\n        <div style={{ fontFamily: RAL_FONT_B, fontWeight: 500, fontSize: 13, lineHeight: 1.45, color: 'var(--ink-3)' }}>{hint}</div>\n      ) : null}\n    </div>\n  );\n}\n\nfunction rallyInputStyle(mono, invalid) {\n  return {\n    width: '100%', minHeight: 48, padding: '11px 14px', borderRadius: 12,\n    background: 'var(--surface-2)', color: 'var(--ink)',\n    border: `1.5px solid ${invalid ? 'var(--stamp)' : 'var(--border-2)'}`,\n    fontFamily: mono ? RAL_FONT_M : RAL_FONT_B, fontWeight: 500,\n    fontSize: 16, // 16 px verhindert den iOS-Zoom beim Fokus\n    letterSpacing: mono ? '0.08em' : undefined,\n    lineHeight: 1.4, boxSizing: 'border-box',\n    WebkitUserSelect: 'text', userSelect: 'text',\n  };\n}\n\nconst RallyInput = React.forwardRef(function RallyInput({ mono, invalid, style, className, ...rest }, ref) {\n  rallyEnsureStyles();\n  return <input ref={ref} className={'rally-input ' + (className || '')} {...rest} style={{ ...rallyInputStyle(mono, invalid), ...style }} />;\n});\n\nconst RallyTextarea = React.forwardRef(function RallyTextarea({ mono, invalid, rows = 3, style, className, ...rest }, ref) {\n  rallyEnsureStyles();\n  return <textarea ref={ref} rows={rows} className={'rally-input ' + (className || '')} {...rest}\n    style={{ ...rallyInputStyle(mono, invalid), resize: 'vertical', lineHeight: 1.5, ...style }} />;\n});\n\n// ── Stepper ───────────────────────────────────────────────────────────────────\nfunction RallyStepper({ value, min = -Infinity, max = Infinity, step = 1, onChange, format, lang, style, ariaLabel }) {\n  rallyEnsureStyles();\n  const v = Number(value) || 0;\n  const canDec = v - step >= min, canInc = v + step <= max;\n  const btn = (enabled, onTap, label, glyph) => (\n    <button type=\"button\" className=\"rally-tap\" disabled={!enabled} aria-label={label}\n      onClick={enabled ? onTap : undefined}\n      style={{\n        width: 44, height: 44, borderRadius: 12, border: '1.5px solid var(--border-2)',\n        background: 'var(--surface)', color: enabled ? 'var(--stamp)' : 'var(--ink-3)',\n        fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 22, lineHeight: 1,\n        cursor: enabled ? 'pointer' : 'not-allowed', opacity: enabled ? 1 : 0.45,\n        display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 0,\n      }}>{glyph}</button>\n  );\n  return (\n    <div role=\"group\" aria-label={ariaLabel} style={{\n      display: 'inline-flex', alignItems: 'center', gap: 6, padding: 4, borderRadius: 14,\n      background: 'var(--surface-2)', border: '1px solid var(--border)', ...style,\n    }}>\n      {btn(canDec, () => onChange && onChange(Math.max(min, v - step)), t('rally.ui.stepper.dec', rallyLang(lang)), '−')}\n      <div aria-live=\"polite\" style={{\n        minWidth: 48, textAlign: 'center', fontFamily: RAL_FONT_M, fontWeight: 600, fontSize: 18, color: 'var(--ink)',\n      }}>{format ? format(v) : v}</div>\n      {btn(canInc, () => onChange && onChange(Math.min(max, v + step)), t('rally.ui.stepper.inc', rallyLang(lang)), '+')}\n    </div>\n  );\n}\n\n// ── Stats-Kopfleiste ──────────────────────────────────────────────────────────\n// items: [{ label, value, mono = true, tone?: 'warn'|'ok', title? }]\n// Spalten richten sich nach der eigenen Breite (nicht nach dem Viewport, weil die\n// App auf dem Desktop in einem 390-px-Rahmen laeuft): 6 nebeneinander, sonst 3x2.\nconst RAL_STAT_MIN_W = 86;\n\nfunction RallyStatsBar({ items = [], style }) {\n  const ref = React.useRef(null);\n  const n = items.length || 1;\n  const [cols, setCols] = React.useState(Math.min(n, 3));\n  React.useEffect(() => {\n    const el = ref.current;\n    if (!el) return;\n    const calc = () => {\n      const w = el.clientWidth || 0;\n      const fit = Math.max(1, Math.floor(w / RAL_STAT_MIN_W));\n      const rows = Math.ceil(n / Math.min(fit, n));\n      setCols(Math.ceil(n / rows));\n    };\n    calc();\n    if (typeof ResizeObserver === 'undefined') return;\n    const ro = new ResizeObserver(calc);\n    ro.observe(el);\n    return () => ro.disconnect();\n  }, [n]);\n  return (\n    <div ref={ref} style={{\n      display: 'grid', gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))`,\n      background: 'var(--surface)', border: '1px solid var(--border)', borderRadius: 16,\n      overflow: 'hidden', ...style,\n    }}>\n      {items.map((it, i) => {\n        const col = i % cols, row = Math.floor(i / cols);\n        const toneColor = it.tone === 'warn' ? 'var(--stamp)' : it.tone === 'ok' ? 'var(--cat-nat, #22C55E)' : 'var(--ink)';\n        return (\n          <div key={i} title={it.title} style={{\n            padding: '9px 4px 8px', textAlign: 'center', minWidth: 0,\n            borderLeft: col > 0 ? '1px solid var(--border)' : 'none',\n            borderTop: row > 0 ? '1px solid var(--border)' : 'none',\n          }}>\n            <div style={{\n              fontFamily: it.mono === false ? RAL_FONT_D : RAL_FONT_M,\n              fontWeight: it.mono === false ? 800 : 600,\n              fontSize: it.mono === false ? 14 : 15, lineHeight: 1.25, color: toneColor,\n              whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis',\n            }}>{it.value == null || it.value === '' ? '·' : it.value}</div>\n            <div style={{\n              marginTop: 2, fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 10, letterSpacing: 0.8,\n              textTransform: 'uppercase', color: 'var(--ink-3)',\n              whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis',\n            }}>{it.label}</div>\n          </div>\n        );\n      })}\n    </div>\n  );\n}\n\n// ── Karte (MapLibre) ──────────────────────────────────────────────────────────\n// Style: window.makeMapStyle (screen-map.jsx) wenn vorhanden, sonst derselbe OpenFreeMap-Stil\n// (Vektor, kein API-Key). CARTO-Raster liefert inzwischen \"API KEY REQUIRED\"-Kacheln.\nfunction rallyMapStyle(dark) {\n  if (typeof window.makeMapStyle === 'function') {\n    try { return window.makeMapStyle(!!dark); } catch (e) { /* Fallback unten */ }\n  }\n  return 'https://tiles.openfreemap.org/styles/' + (dark ? 'dark' : 'liberty');\n}\n\n// CSS-Variable aufloesen (MapLibre-Paint kann kein var()).\nfunction rallyCssVar(el, name, fallback) {\n  try {\n    const v = getComputedStyle(el || document.documentElement).getPropertyValue(name).trim();\n    return v || fallback;\n  } catch (e) { return fallback; }\n}\n\nconst RAL_LINE_SRC = 'rally-line';\n\nfunction rallyApplyLine(map, coords, color, dashed, casing) {\n  casing = casing || '#FFFFFF';\n  if (!map) return;\n  const ok = Array.isArray(coords) && coords.length >= 2;\n  const data = {\n    type: 'FeatureCollection',\n    features: ok ? [{ type: 'Feature', properties: {}, geometry: { type: 'LineString', coordinates: coords } }] : [],\n  };\n  try {\n    const src = map.getSource(RAL_LINE_SRC);\n    if (src) {\n      src.setData(data);\n      if (map.getLayer('rally-line-main')) {\n        map.setPaintProperty('rally-line-main', 'line-color', color);\n        map.setPaintProperty('rally-line-main', 'line-dasharray', dashed ? [1.4, 1.1] : [1, 0]);\n      }\n      if (map.getLayer('rally-line-casing')) map.setPaintProperty('rally-line-casing', 'line-color', casing);\n      return true;\n    }\n    map.addSource(RAL_LINE_SRC, { type: 'geojson', data });\n    map.addLayer({\n      id: 'rally-line-casing', type: 'line', source: RAL_LINE_SRC,\n      layout: { 'line-join': 'round', 'line-cap': 'round' },\n      paint: { 'line-color': casing, 'line-width': 8, 'line-opacity': 0.85 },\n    });\n    map.addLayer({\n      id: 'rally-line-main', type: 'line', source: RAL_LINE_SRC,\n      layout: { 'line-join': 'round', 'line-cap': 'round' },\n      paint: { 'line-color': color, 'line-width': 4.5, 'line-dasharray': dashed ? [1.4, 1.1] : [1, 0] },\n    });\n    return true;\n  } catch (e) {\n    return false; // Style noch nicht bereit; style.load holt es nach\n  }\n}\n\n// DOM-Element fuer einen Marker. Alle Texte per textContent (keine HTML-Injektion).\nfunction rallyMarkerEl(m, lang) {\n  const kind = m.kind || 'station';\n  const color = m.color || (kind === 'start' ? 'var(--teal, #00C2A8)' : kind === 'finish' ? 'var(--coin)' : 'var(--stamp)');\n  const wrap = document.createElement('div');\n  wrap.className = 'rally-marker rally-marker-' + kind;\n  // Kein position hier: .maplibregl-marker setzt position:absolute, ein relative wuerde die Marker stapeln.\n  wrap.style.cssText = 'width:44px;height:44px;display:flex;align-items:center;justify-content:center;';\n\n  const div = (css, text) => {\n    const d = document.createElement('div');\n    d.style.cssText = css;\n    if (text != null) d.textContent = text;\n    return d;\n  };\n  const pill = (text, bg, fg) => div(\n    `position:absolute;top:40px;left:50%;transform:translateX(-50%);white-space:nowrap;max-width:140px;overflow:hidden;text-overflow:ellipsis;` +\n    `padding:2px 8px;border-radius:999px;background:${bg};color:${fg};font:900 10px/1.5 ${RAL_FONT_D};letter-spacing:0.8px;` +\n    `text-transform:uppercase;box-shadow:0 2px 5px rgba(0,0,0,0.25);pointer-events:none;`, text);\n\n  let aria = m.title || m.label || '';\n\n  if (kind === 'user') {\n    const c = m.color || 'var(--cat-arch, #3B82F6)';\n    wrap.style.pointerEvents = 'none';\n    wrap.appendChild(div(`position:absolute;left:50%;top:50%;width:16px;height:16px;margin:-8px 0 0 -8px;border-radius:50%;background:${c};animation:rallyPulse 1.8s ease-out infinite;`));\n    wrap.lastChild.className = 'rally-anim';\n    wrap.appendChild(div(`position:relative;width:18px;height:18px;border-radius:50%;background:${c};border:3px solid #FFFFFF;box-shadow:0 1px 6px rgba(0,0,0,0.4);box-sizing:border-box;`));\n    aria = aria || t('rally.ui.map.you', lang);\n  } else if (kind === 'start' || kind === 'finish') {\n    const emoji = m.emoji || (kind === 'start' ? '🚩' : '🏁');\n    wrap.appendChild(div(\n      `width:36px;height:36px;border-radius:50%;background:var(--surface);border:3px solid ${color};box-shadow:0 3px 8px rgba(0,0,0,0.3);` +\n      `display:flex;align-items:center;justify-content:center;font-size:18px;line-height:1;box-sizing:border-box;`, emoji));\n    const text = m.label != null && m.label !== '' ? String(m.label) : t(kind === 'start' ? 'rally.ui.map.start' : 'rally.ui.map.finish', lang);\n    wrap.appendChild(pill(text, color, kind === 'finish' ? '#3D2F00' : '#FFFFFF'));\n    aria = m.title || text;\n  } else if (kind === 'team') {\n    const fg = rallyReadableOn(m.color);\n    wrap.appendChild(div(\n      `width:38px;height:38px;border-radius:50%;background:${color};border:3px solid #FFFFFF;box-shadow:0 3px 8px rgba(0,0,0,0.35);` +\n      `display:flex;align-items:center;justify-content:center;font-size:20px;line-height:1;box-sizing:border-box;`, m.emoji || '👥'));\n    if (m.label) wrap.appendChild(pill(String(m.label), color, fg));\n    aria = aria || m.emoji || '';\n  } else {\n    // station\n    const size = m.active ? 38 : 30;\n    const core = div(\n      `width:${size}px;height:${size}px;border-radius:50%;background:${color};color:${rallyReadableOn(m.color)};border:2.5px solid #FFFFFF;` +\n      `box-shadow:0 2px 7px rgba(0,0,0,0.35);display:flex;align-items:center;justify-content:center;box-sizing:border-box;` +\n      `font:900 ${m.active ? 16 : 14}px/1 ${RAL_FONT_D};position:relative;${m.done ? 'opacity:0.55;filter:saturate(0.6);' : ''}`,\n      m.label != null ? String(m.label) : '');\n    if (m.active) {\n      const ring = div(`position:absolute;left:50%;top:50%;width:${size}px;height:${size}px;margin:-${size / 2}px 0 0 -${size / 2}px;border-radius:50%;background:${color};animation:rallyPulse 1.8s ease-out infinite;opacity:0.5;`);\n      ring.className = 'rally-anim';\n      wrap.appendChild(ring);\n      wrap.style.zIndex = '3';\n    }\n    wrap.appendChild(core);\n    if (m.emoji) {\n      wrap.appendChild(div(\n        `position:absolute;top:0;right:-2px;width:20px;height:20px;border-radius:50%;background:var(--surface);border:1px solid var(--border-2);` +\n        `display:flex;align-items:center;justify-content:center;font-size:11px;line-height:1;box-shadow:0 1px 3px rgba(0,0,0,0.25);`, m.emoji));\n    }\n    if (m.done) {\n      wrap.appendChild(div(\n        `position:absolute;bottom:1px;right:0;width:18px;height:18px;border-radius:50%;background:var(--cat-nat, #22C55E);color:#FFFFFF;` +\n        `border:2px solid #FFFFFF;display:flex;align-items:center;justify-content:center;font:900 10px/1 ${RAL_FONT_D};box-sizing:border-box;`, '✓'));\n    }\n  }\n  if (kind !== 'user') {\n    wrap.setAttribute('role', 'button');\n    wrap.setAttribute('tabindex', '0');\n  }\n  if (aria) wrap.setAttribute('aria-label', String(aria));\n  wrap.dataset.rallyAria = aria ? String(aria) : '';\n  return wrap;\n}\n\nfunction rallyMarkerSig(m, lang) {\n  return JSON.stringify([m.kind || 'station', m.label, m.emoji, m.color, !!m.active, !!m.done, m.title, lang]);\n}\n\n/*\n * RallyMap\n *  center       { lat, lng }        Startmitte (Aenderungen fahren die Karte dorthin, ausser fitToMarkers)\n *  zoom         number              Standard 15\n *  markers      [{ id, lat, lng, kind:'start'|'finish'|'station'|'team'|'user', label, emoji, color, title, active, done }]\n *  line         [[lng, lat], ...]   Route als Linie (null = keine)\n *  lineColor    string              Standard: aufgeloestes var(--stamp)\n *  lineDashed   bool                Standard true\n *  onMapTap     ({lat,lng}) => void Tipp auf freie Kartenflaeche\n *  onMarkerTap  (id) => void\n *  userPos      { lat, lng }        eigener Standort als pulsierender Punkt\n *  height       number|string       Standard 240\n *  theme        'light'|'dark'\n *  fitToMarkers bool                Ausschnitt an Marker (+ Linie + userPos) anpassen, wenn sich Positionen aendern\n *  recenter     bool                runder Knopf oben rechts, zentriert neu\n *  interactive  bool                Standard true (nur beim Mount ausgewertet)\n *  radius       number              Eckenradius, Standard 18\n */\nfunction RallyMap({\n  center, zoom = 15, markers = [], line = null, lineColor, lineDashed = true,\n  onMapTap, onMarkerTap, userPos, height = 240, theme = 'light', fitToMarkers = false,\n  recenter = false, interactive = true, radius = 18, lang, style,\n}) {\n  rallyEnsureStyles();\n  const l = rallyLang(lang);\n  const hostRef = React.useRef(null);\n  const boxRef = React.useRef(null);\n  const mapRef = React.useRef(null);\n  const markerObjs = React.useRef(new Map()); // id -> { marker, sig }\n  const userMarkerRef = React.useRef(null);\n  const styleReady = React.useRef(false);\n  const [gen, setGen] = React.useState(0);\n  const [failed, setFailed] = React.useState(false);\n\n  const live = React.useRef({});\n  live.current = { onMapTap, onMarkerTap, line, lineColor, lineDashed, markers, userPos, fitToMarkers, center, zoom };\n\n  const ml = typeof window !== 'undefined' ? window.maplibregl : null;\n\n  const resolveLineColor = () => live.current.lineColor || rallyCssVar(boxRef.current, '--stamp', '#E8380D');\n  const pushLine = () => {\n    const map = mapRef.current;\n    if (!map || !styleReady.current) return;\n    rallyApplyLine(map, live.current.line, resolveLineColor(), live.current.lineDashed !== false,\n      rallyCssVar(boxRef.current, '--surface', '#FFFFFF'));\n  };\n\n  // Ausschnitt anpassen\n  const fitNow = (animate) => {\n    const map = mapRef.current;\n    if (!map) return;\n    const cur = live.current;\n    const pts = [];\n    (cur.markers || []).forEach(m => { if (isFinite(m.lat) && isFinite(m.lng)) pts.push([m.lng, m.lat]); });\n    if (Array.isArray(cur.line)) cur.line.forEach(p => { if (p && isFinite(p[0]) && isFinite(p[1])) pts.push([p[0], p[1]]); });\n    if (cur.userPos && isFinite(cur.userPos.lat)) pts.push([cur.userPos.lng, cur.userPos.lat]);\n    const box = boxRef.current;\n    if (!box || !box.clientWidth || !box.clientHeight) return;\n    if (!pts.length) {\n      const c = cur.center || RAL_MUC;\n      map.jumpTo({ center: [c.lng, c.lat], zoom: cur.zoom || 15 });\n      return;\n    }\n    if (pts.length === 1) {\n      map.easeTo({ center: pts[0], zoom: Math.max(map.getZoom(), cur.zoom || 15), duration: animate ? 500 : 0 });\n      return;\n    }\n    let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n    pts.forEach(([x, y]) => { minX = Math.min(minX, x); maxX = Math.max(maxX, x); minY = Math.min(minY, y); maxY = Math.max(maxY, y); });\n    const pad = Math.max(24, Math.min(56, Math.round(Math.min(box.clientWidth, box.clientHeight) * 0.16)));\n    try {\n      // unten etwas mehr Luft fuer die Label-Pillen unter Start/Ziel/Team\n      map.fitBounds([[minX, minY], [maxX, maxY]], { padding: { top: pad, left: pad, right: pad, bottom: pad + 14 }, maxZoom: 16.5, duration: animate ? 600 : 0 });\n    } catch (e) { /* Container zu klein */ }\n  };\n  const fitRef = React.useRef(fitNow);\n  fitRef.current = fitNow;\n\n  // Mount / Unmount\n  React.useEffect(() => {\n    if (!ml || !hostRef.current) return;\n    const c = center || (markers && markers[0]) || RAL_MUC;\n    let map;\n    try {\n      map = new ml.Map({\n        container: hostRef.current,\n        style: rallyMapStyle(theme === 'dark'),\n        center: [c.lng, c.lat],\n        zoom,\n        attributionControl: false,\n        interactive: !!interactive,\n        dragRotate: false,\n        pitchWithRotate: false,\n        touchPitch: false,\n        maxZoom: 19,\n      });\n    } catch (e) {\n      console.warn('[RallyMap] init failed', e);\n      setFailed(true);\n      return;\n    }\n    try { map.touchZoomRotate && map.touchZoomRotate.disableRotation(); } catch (e) {}\n    try { map.addControl(new ml.AttributionControl({ compact: true }), 'bottom-right'); } catch (e) {}\n\n    map.on('style.load', () => {\n      styleReady.current = true;\n      pushLine();\n    });\n    // Tile-Fehler nicht als console.error durchreichen (MapLibre loggt sonst selbst)\n    map.on('error', (e) => { console.debug('[RallyMap]', e && e.error ? e.error.message : e); });\n    map.on('click', (e) => {\n      const tgt = e.originalEvent && e.originalEvent.target;\n      if (tgt && tgt.closest && tgt.closest('.rally-marker')) return;\n      const fn = live.current.onMapTap;\n      if (fn) fn({ lat: e.lngLat.lat, lng: e.lngLat.lng });\n    });\n\n    mapRef.current = map;\n    let sized = false;\n    let ro = null;\n    const onResize = () => {\n      try { map.resize(); } catch (e) {}\n      const box = boxRef.current;\n      if (!sized && box && box.clientWidth > 0 && box.clientHeight > 0) {\n        sized = true;\n        if (live.current.fitToMarkers) fitRef.current(false);\n      }\n    };\n    if (typeof ResizeObserver !== 'undefined' && boxRef.current) {\n      ro = new ResizeObserver(onResize);\n      ro.observe(boxRef.current);\n    }\n    onResize();\n    setGen(g => g + 1);\n\n    const objs = markerObjs.current;\n    return () => {\n      if (ro) ro.disconnect();\n      objs.forEach(o => { try { o.marker.remove(); } catch (e) {} });\n      objs.clear();\n      if (userMarkerRef.current) { try { userMarkerRef.current.remove(); } catch (e) {} userMarkerRef.current = null; }\n      styleReady.current = false;\n      mapRef.current = null;\n      try { map.remove(); } catch (e) {}\n    };\n  }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // Theme-Wechsel ohne Remount\n  const firstTheme = React.useRef(true);\n  React.useEffect(() => {\n    if (firstTheme.current) { firstTheme.current = false; return; }\n    const map = mapRef.current;\n    if (!map) return;\n    styleReady.current = false;\n    try { map.setStyle(rallyMapStyle(theme === 'dark'), { diff: false }); } catch (e) {}\n  }, [theme]);\n\n  // Linie\n  const lineSig = JSON.stringify([line, lineColor, lineDashed]);\n  React.useEffect(() => { pushLine(); }, [lineSig, gen]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // Marker diffen\n  const markersSig = JSON.stringify((markers || []).map(m => [m.id, m.lat, m.lng, rallyMarkerSig(m, l)]));\n  React.useEffect(() => {\n    const map = mapRef.current;\n    if (!map || !ml) return;\n    const objs = markerObjs.current;\n    const seen = new Set();\n    (markers || []).forEach(m => {\n      if (m == null || m.id == null || !isFinite(m.lat) || !isFinite(m.lng)) return;\n      const id = String(m.id);\n      seen.add(id);\n      const sig = rallyMarkerSig(m, l);\n      const prev = objs.get(id);\n      if (prev && prev.sig === sig) {\n        prev.marker.setLngLat([m.lng, m.lat]);\n        return;\n      }\n      if (prev) { try { prev.marker.remove(); } catch (e) {} }\n      const el = rallyMarkerEl(m, l);\n      if ((m.kind || 'station') !== 'user') {\n        const fire = (ev) => {\n          ev.stopPropagation();\n          const fn = live.current.onMarkerTap;\n          if (fn) fn(m.id);\n        };\n        el.addEventListener('click', fire);\n        el.addEventListener('keydown', (ev) => { if (ev.key === 'Enter' || ev.key === ' ') { ev.preventDefault(); fire(ev); } });\n      }\n      const marker = new ml.Marker({ element: el, anchor: 'center' }).setLngLat([m.lng, m.lat]).addTo(map);\n      // MapLibre ueberschreibt aria-label mit 'Map marker'\n      if (el.dataset.rallyAria) el.setAttribute('aria-label', el.dataset.rallyAria);\n      objs.set(id, { marker, sig });\n    });\n    objs.forEach((o, id) => {\n      if (!seen.has(id)) { try { o.marker.remove(); } catch (e) {} objs.delete(id); }\n    });\n  }, [markersSig, gen]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // Eigener Standort\n  const userSig = userPos && isFinite(userPos.lat) ? `${userPos.lat.toFixed(6)},${userPos.lng.toFixed(6)}` : '';\n  React.useEffect(() => {\n    const map = mapRef.current;\n    if (!map || !ml) return;\n    if (!userSig) {\n      if (userMarkerRef.current) { userMarkerRef.current.remove(); userMarkerRef.current = null; }\n      return;\n    }\n    if (!userMarkerRef.current) {\n      const uel = rallyMarkerEl({ kind: 'user' }, l);\n      userMarkerRef.current = new ml.Marker({ element: uel, anchor: 'center' })\n        .setLngLat([userPos.lng, userPos.lat]).addTo(map);\n      uel.setAttribute('aria-label', uel.dataset.rallyAria || '');\n    } else {\n      userMarkerRef.current.setLngLat([userPos.lng, userPos.lat]);\n    }\n  }, [userSig, gen]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // Ausschnitt: bei fitToMarkers auf Positionsaenderungen reagieren, sonst auf center/zoom\n  const fitSig = fitToMarkers ? JSON.stringify([\n    (markers || []).map(m => [m.lat, m.lng]), Array.isArray(line) ? line.length : 0,\n  ]) : '';\n  const firstFit = React.useRef(true);\n  React.useEffect(() => {\n    if (!fitToMarkers || !mapRef.current) return;\n    fitNow(!firstFit.current);\n    firstFit.current = false;\n  }, [fitSig, gen]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const centerSig = center && isFinite(center.lat) ? `${center.lat},${center.lng},${zoom}` : '';\n  const firstCenter = React.useRef(true);\n  React.useEffect(() => {\n    if (firstCenter.current) { firstCenter.current = false; return; }\n    const map = mapRef.current;\n    if (!map || fitToMarkers || !centerSig) return;\n    map.easeTo({ center: [center.lng, center.lat], zoom, duration: 500 });\n  }, [centerSig]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // Cursor fuer Tipp-Modus\n  React.useEffect(() => {\n    const map = mapRef.current;\n    if (!map) return;\n    try { map.getCanvas().style.cursor = onMapTap ? 'crosshair' : ''; } catch (e) {}\n  }, [!!onMapTap, gen]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const boxStyle = {\n    position: 'relative', width: '100%', height, borderRadius: radius, overflow: 'hidden',\n    background: 'var(--surface-2)', border: '1px solid var(--border)',\n    isolation: 'isolate', // MapLibre-Controls bleiben unter Sheets\n    ...style,\n  };\n\n  if (!ml || failed) {\n    return (\n      <div ref={boxRef} style={{\n        ...boxStyle, display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', gap: 8,\n        backgroundImage: 'radial-gradient(var(--border-2) 1px, transparent 1px)', backgroundSize: '14px 14px',\n        color: 'var(--ink-3)', textAlign: 'center', padding: 16,\n      }}>\n        <div aria-hidden=\"true\" style={{ fontSize: 28 }}>🗺️</div>\n        <div style={{ fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 14 }}>{t('rally.ui.map.unavailable', l)}</div>\n        {markers && markers.length > 0 && (\n          <div style={{ fontFamily: RAL_FONT_M, fontSize: 11, letterSpacing: '0.06em' }}>\n            {markers.length} × 📍\n          </div>\n        )}\n      </div>\n    );\n  }\n\n  return (\n    <div ref={boxRef} className=\"rally-map\" style={boxStyle}>\n      <div ref={hostRef} style={{ position: 'absolute', inset: 0 }} />\n      {recenter && (\n        <button type=\"button\" className=\"rally-tap\" aria-label={t('rally.ui.map.recenter', l)} title={t('rally.ui.map.recenter', l)}\n          onClick={() => {\n            if (live.current.fitToMarkers || (markers && markers.length > 1)) { fitNow(true); return; }\n            const map = mapRef.current;\n            const c = userPos || center || (markers && markers[0]);\n            if (map && c) map.easeTo({ center: [c.lng, c.lat], zoom, duration: 500 });\n          }}\n          style={{\n            position: 'absolute', top: 10, right: 10, zIndex: 2, width: 44, height: 44, borderRadius: 999,\n            border: '1px solid var(--border-2)', background: 'var(--surface)', color: 'var(--stamp)',\n            boxShadow: '0 2px 8px rgba(0,0,0,0.18)', cursor: 'pointer', padding: 0,\n            display: 'flex', alignItems: 'center', justifyContent: 'center',\n          }}>\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" aria-hidden=\"true\">\n            <circle cx=\"12\" cy=\"12\" r=\"6.5\" /><circle cx=\"12\" cy=\"12\" r=\"1.8\" fill=\"currentColor\" stroke=\"none\" />\n            <path d=\"M12 2v3M12 19v3M2 12h3M19 12h3\" />\n          </svg>\n        </button>\n      )}\n    </div>\n  );\n}\n\n// ── Bottom Sheet ──────────────────────────────────────────────────────────────\n// position:absolute innerhalb des naechsten positionierten Elternteils (ScreenFrame).\nfunction RallySheet({ open, onClose, title, kicker, children, footer, maxHeight = '90%', lang, zIndex = 200, closeLabel }) {\n  rallyEnsureStyles();\n  const l = rallyLang(lang);\n  const [mounted, setMounted] = React.useState(!!open);\n  const [closing, setClosing] = React.useState(false);\n\n  React.useEffect(() => {\n    if (open) { setMounted(true); setClosing(false); return; }\n    if (!mounted) return;\n    setClosing(true);\n    const id = setTimeout(() => { setMounted(false); setClosing(false); }, 220);\n    return () => clearTimeout(id);\n  }, [open]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  React.useEffect(() => {\n    if (!open || !onClose) return;\n    const onKey = (e) => { if (e.key === 'Escape') onClose(); };\n    window.addEventListener('keydown', onKey);\n    return () => window.removeEventListener('keydown', onKey);\n  }, [open, onClose]);\n\n  if (!mounted) return null;\n  return (\n    <div style={{ position: 'absolute', inset: 0, zIndex, display: 'flex', flexDirection: 'column', justifyContent: 'flex-end' }}>\n      <div\n        className=\"rally-anim\"\n        onClick={onClose}\n        style={{\n          position: 'absolute', inset: 0, background: 'rgba(10,8,6,0.52)',\n          animation: `${closing ? 'rallyFadeOut' : 'rallyFadeIn'} 0.22s ease-out forwards`,\n        }}\n      />\n      <div\n        role=\"dialog\" aria-modal=\"true\" aria-label={typeof title === 'string' ? title : undefined}\n        className=\"rally-anim\"\n        style={{\n          position: 'relative', maxHeight, display: 'flex', flexDirection: 'column',\n          background: 'var(--surface)', color: 'var(--ink)',\n          borderRadius: '22px 22px 0 0', borderTop: '1px solid var(--border-2)',\n          boxShadow: '0 -10px 34px rgba(0,0,0,0.28)',\n          animation: `${closing ? 'rallySheetOut 0.2s ease-in' : 'rallySheetIn 0.28s cubic-bezier(0.2, 0.8, 0.2, 1)'} forwards`,\n        }}\n      >\n        <div aria-hidden=\"true\" style={{ display: 'flex', justifyContent: 'center', paddingTop: 8 }}>\n          <div style={{ width: 40, height: 5, borderRadius: 999, background: 'var(--border-2)' }} />\n        </div>\n        {(title != null || onClose) && (\n          <div style={{ display: 'flex', alignItems: 'flex-start', gap: 8, padding: '6px 8px 8px 18px' }}>\n            <div style={{ flex: 1, minWidth: 0, paddingTop: 6 }}>\n              {kicker != null && <RallyKicker style={{ marginBottom: 2 }}>{kicker}</RallyKicker>}\n              {title != null && (\n                <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 20, lineHeight: 1.2, color: 'var(--ink)', overflowWrap: 'anywhere' }}>{title}</div>\n              )}\n            </div>\n            {onClose && (\n              <button type=\"button\" className=\"rally-tap\" onClick={onClose} aria-label={closeLabel || t('rally.ui.close', l)}\n                style={{\n                  width: 44, height: 44, flexShrink: 0, borderRadius: 999, border: 'none', cursor: 'pointer',\n                  background: 'var(--surface-2)', color: 'var(--ink-2)', padding: 0,\n                  display: 'flex', alignItems: 'center', justifyContent: 'center',\n                }}>\n                <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n                  <path d=\"M3.5 3.5l9 9M12.5 3.5l-9 9\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" />\n                </svg>\n              </button>\n            )}\n          </div>\n        )}\n        <div className=\"rally-scroll\" style={{\n          flex: '1 1 auto', minHeight: 0, overflowY: 'auto', padding: '4px 18px',\n          paddingBottom: footer ? 16 : 'calc(20px + env(safe-area-inset-bottom, 0px))',\n        }}>\n          {children}\n        </div>\n        {footer && (\n          <div style={{\n            flexShrink: 0, padding: '12px 18px', paddingBottom: 'calc(12px + env(safe-area-inset-bottom, 0px))',\n            borderTop: '1px solid var(--border)', background: 'var(--surface)',\n          }}>{footer}</div>\n        )}\n      </div>\n    </div>\n  );\n}\n\n// ── Team-Badge ────────────────────────────────────────────────────────────────\n// team: { no, name (String oder {de,en}), emoji, color }\nfunction RallyTeamBadge({ team, size = 'md', showName = true, lang, style }) {\n  if (!team) return null;\n  const S = { sm: { h: 28, emoji: 15, font: 13, pad: '0 10px 0 3px', dot: 22 },\n              md: { h: 36, emoji: 18, font: 15, pad: '0 14px 0 4px', dot: 28 },\n              lg: { h: 48, emoji: 26, font: 19, pad: '0 18px 0 5px', dot: 38 } }[size] || null;\n  const s = S || { h: 36, emoji: 18, font: 15, pad: '0 14px 0 4px', dot: 28 };\n  const color = team.color || 'var(--stamp)';\n  const fg = rallyReadableOn(team.color);\n  const name = rallyPickText(team.name, lang);\n  return (\n    <span title={name} style={{\n      display: 'inline-flex', alignItems: 'center', gap: 7, height: s.h, maxWidth: '100%',\n      padding: showName ? s.pad : 3, borderRadius: 999, background: color, color: fg,\n      boxShadow: '0 2px 0 rgba(0,0,0,0.18)', verticalAlign: 'middle', ...style,\n    }}>\n      <span aria-hidden=\"true\" style={{\n        width: s.dot, height: s.dot, flexShrink: 0, borderRadius: '50%', background: 'rgba(255,255,255,0.92)',\n        display: 'flex', alignItems: 'center', justifyContent: 'center', fontSize: s.emoji, lineHeight: 1,\n      }}>{team.emoji || '👥'}</span>\n      {showName && (\n        <span style={{\n          fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: s.font, lineHeight: 1,\n          whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', minWidth: 0,\n        }}>{name}</span>\n      )}\n    </span>\n  );\n}\n\n// ── QR-Code ───────────────────────────────────────────────────────────────────\n// index.html laedt qrcode@1.5.3/build/qrcode.min.js, das liefert 404 (Paket hat ab 1.5.2\n// keinen build-Ordner mehr). Deshalb laedt RallyQr die Lib bei Bedarf selbst nach.\nconst RAL_QR_SRC = 'https://cdn.jsdelivr.net/npm/qrcode@1.5.1/build/qrcode.min.js';\nlet RAL_QR_PROMISE = null;\n\nfunction rallyLoadQrLib() {\n  if (window.QRCode && window.QRCode.toDataURL) return Promise.resolve(window.QRCode);\n  if (RAL_QR_PROMISE) return RAL_QR_PROMISE;\n  RAL_QR_PROMISE = new Promise((resolve, reject) => {\n    const el = document.createElement('script');\n    el.src = RAL_QR_SRC;\n    el.async = true;\n    el.onload = () => (window.QRCode && window.QRCode.toDataURL ? resolve(window.QRCode) : reject(new Error('qrcode lib missing')));\n    el.onerror = () => { RAL_QR_PROMISE = null; reject(new Error('qrcode lib load failed')); };\n    document.head.appendChild(el);\n  });\n  return RAL_QR_PROMISE;\n}\n\n// Kodiert rallyJoinUrl(code). Immer dunkel auf weiss, damit jeder Scanner es liest.\nfunction RallyQr({ code, size = 180, lang, style }) {\n  const l = rallyLang(lang);\n  const [dataUrl, setDataUrl] = React.useState(null);\n  const [err, setErr] = React.useState(false);\n  React.useEffect(() => {\n    setDataUrl(null); setErr(false);\n    if (!code) return;\n    let alive = true;\n    rallyLoadQrLib()\n      .then(Q => Q.toDataURL(rallyJoinUrl(code), {\n        errorCorrectionLevel: 'M', margin: 1, width: size * 2,\n        color: { dark: '#1A1208', light: '#FFFFFF' },\n      }))\n      .then(u => { if (alive) setDataUrl(u); })\n      .catch(e => { console.warn('[RallyQr]', e); if (alive) setErr(true); });\n    return () => { alive = false; };\n  }, [code, size]);\n\n  return (\n    <div style={{\n      display: 'inline-block', padding: 10, background: '#FFFFFF', borderRadius: 16,\n      border: '1px solid var(--border)', boxShadow: '0 6px 14px rgba(0,0,0,0.08)', lineHeight: 0, ...style,\n    }}>\n      {dataUrl ? (\n        <img src={dataUrl} alt={t('rally.ui.qr.alt', l)} width={size} height={size}\n          style={{ display: 'block', width: size, height: size, imageRendering: 'pixelated' }} />\n      ) : (\n        <div style={{\n          width: size, height: size, display: 'flex', alignItems: 'center', justifyContent: 'center',\n          textAlign: 'center', padding: 12, boxSizing: 'border-box', lineHeight: 1.4,\n          fontFamily: RAL_FONT_M, fontSize: 11, letterSpacing: '0.06em', color: '#706860',\n        }}>{t(err ? 'rally.ui.qr.unavailable' : 'rally.ui.qr.loading', l)}</div>\n      )}\n    </div>\n  );\n}\n\n// ── Toast ─────────────────────────────────────────────────────────────────────\n// Rendert nur, wenn message gesetzt ist. Fuer Auto-Ausblenden useRallyToast().\nfunction RallyToast({ message, tone, bottom = 96, zIndex = 300 }) {\n  rallyEnsureStyles();\n  if (!message) return null;\n  const bg = tone === 'error' ? 'var(--stamp-deep)' : tone === 'ok' ? 'var(--cat-nat, #22C55E)' : 'rgba(26,18,8,0.92)';\n  return (\n    <div role=\"status\" aria-live=\"polite\" key={String(message)} className=\"rally-anim\" style={{\n      position: 'absolute', left: '50%', bottom: `calc(${bottom}px + env(safe-area-inset-bottom, 0px))`, zIndex,\n      transform: 'translate(-50%, 0)', maxWidth: 'calc(100% - 32px)', width: 'max-content',\n      padding: '11px 18px', borderRadius: 14, background: bg, color: '#FFFFFF',\n      fontFamily: RAL_FONT_D, fontWeight: 800, fontSize: 14, lineHeight: 1.35, textAlign: 'center',\n      boxShadow: '0 8px 24px rgba(0,0,0,0.3)', pointerEvents: 'none',\n      animation: 'rallyToastIn 0.22s ease-out',\n    }}>{message}</div>\n  );\n}\n\n// const [toast, showToast] = useRallyToast();  showToast('Text', 2500);  <RallyToast message={toast} />\nfunction useRallyToast(defaultMs = 2400) {\n  const [msg, setMsg] = React.useState(null);\n  const timer = React.useRef(null);\n  const show = React.useCallback((text, ms) => {\n    clearTimeout(timer.current);\n    setMsg(text);\n    timer.current = setTimeout(() => setMsg(null), ms || defaultMs);\n  }, [defaultMs]);\n  React.useEffect(() => () => clearTimeout(timer.current), []);\n  return [msg, show];\n}\n\n// ── Leerer Zustand ────────────────────────────────────────────────────────────\nfunction RallyEmpty({ icon, title, body, action, style }) {\n  return (\n    <div style={{\n      display: 'flex', flexDirection: 'column', alignItems: 'center', textAlign: 'center',\n      gap: 8, padding: '28px 20px', ...style,\n    }}>\n      {icon != null && (\n        <div aria-hidden=\"true\" style={{\n          width: 64, height: 64, borderRadius: 20, background: 'var(--stamp-soft)',\n          display: 'flex', alignItems: 'center', justifyContent: 'center', fontSize: 30, marginBottom: 4,\n        }}>{icon}</div>\n      )}\n      {title != null && <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 19, lineHeight: 1.25, color: 'var(--ink)' }}>{title}</div>}\n      {body != null && <div style={{ fontFamily: RAL_FONT_B, fontWeight: 500, fontSize: 15, lineHeight: 1.55, color: 'var(--ink-2)', maxWidth: 320 }}>{body}</div>}\n      {action != null && <div style={{ marginTop: 10 }}>{action}</div>}\n    </div>\n  );\n}\n\n// ── Ladezustand mit Ausweg ───────────────────────────────────────────────────\n// Hängt eine Supabase-Abfrage (Handy aus dem Standby, Funkloch), soll niemand vor\n// einem ewigen „Lädt …“ sitzen: nach slowMs kommen Erklärung, Nochmal und Zurück.\n// Einmal pro Ansicht geht eine Warnung an Sentry, damit wir die Hänger sehen.\nfunction RallyLoading({ lang, onBack, onRetry, where = 'rally', slowMs = 8000, style }) {\n  const [slow, setSlow] = React.useState(false);\n  const [attempt, setAttempt] = React.useState(0);\n  React.useEffect(() => {\n    setSlow(false);\n    const tm = setTimeout(() => {\n      setSlow(true);\n      try {\n        const S = window.RallyStore;\n        if (window.Sentry) window.Sentry.captureMessage('Rally loading slow: ' + where, {\n          level: 'warning',\n          extra: { where, attempt, storeMode: S && S.mode, degraded: S && S.degraded, online: navigator.onLine },\n        });\n      } catch (e) {}\n    }, slowMs);\n    return () => clearTimeout(tm);\n  }, [attempt, where, slowMs]);\n  if (!slow) return <RallyEmpty icon=\"⏳\" title={t('rally.ui.loading', lang)} style={style} />;\n  return (\n    <RallyEmpty icon=\"📶\" title={t('rally.ui.slow.title', lang)} body={t('rally.ui.slow.body', lang)} style={style}\n      action={<div style={{ display: 'flex', flexDirection: 'column', gap: 10, alignItems: 'center' }}>\n        {onRetry && <RallyButton onClick={() => { setAttempt(a => a + 1); onRetry(); }}>{t('rally.ui.retry', lang)}</RallyButton>}\n        {onBack && <RallyButton variant={onRetry ? 'secondary' : 'primary'} onClick={onBack}>{t('rally.ui.slow.back', lang)}</RallyButton>}\n      </div>} />\n  );\n}\n\n// ── Bestaetigungsdialog ───────────────────────────────────────────────────────\nfunction RallyConfirm({ open, title, body, confirmLabel, cancelLabel, onConfirm, onCancel, danger, lang, zIndex = 260 }) {\n  rallyEnsureStyles();\n  const l = rallyLang(lang);\n  React.useEffect(() => {\n    if (!open || !onCancel) return;\n    const onKey = (e) => { if (e.key === 'Escape') onCancel(); };\n    window.addEventListener('keydown', onKey);\n    return () => window.removeEventListener('keydown', onKey);\n  }, [open, onCancel]);\n  if (!open) return null;\n  return (\n    <div style={{ position: 'absolute', inset: 0, zIndex, display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 20 }}>\n      <div className=\"rally-anim\" onClick={onCancel} style={{\n        position: 'absolute', inset: 0, background: 'rgba(10,8,6,0.52)', animation: 'rallyFadeIn 0.18s ease-out',\n      }} />\n      <div role=\"alertdialog\" aria-modal=\"true\" aria-label={typeof title === 'string' ? title : undefined}\n        className=\"rally-anim\" style={{\n          position: 'relative', width: '100%', maxWidth: 340, padding: 20, borderRadius: 20,\n          background: 'var(--surface)', border: '1px solid var(--border-2)', color: 'var(--ink)',\n          boxShadow: '0 18px 48px rgba(0,0,0,0.35)', animation: 'rallyPopIn 0.2s ease-out',\n        }}>\n        {title != null && <div style={{ fontFamily: RAL_FONT_D, fontWeight: 900, fontSize: 19, lineHeight: 1.25 }}>{title}</div>}\n        {body != null && <div style={{ marginTop: 8, fontFamily: RAL_FONT_B, fontWeight: 500, fontSize: 15, lineHeight: 1.55, color: 'var(--ink-2)' }}>{body}</div>}\n        <div style={{ display: 'flex', gap: 10, marginTop: 18 }}>\n          <RallyButton variant=\"ghost\" full onClick={onCancel} style={{ flex: 1 }}>{cancelLabel || t('rally.ui.cancel', l)}</RallyButton>\n          <RallyButton variant={danger ? 'danger' : 'primary'} full onClick={onConfirm} style={{ flex: 1 }}>{confirmLabel || t('rally.ui.confirm', l)}</RallyButton>\n        </div>\n      </div>\n    </div>\n  );\n}\n\n// ── Hooks ─────────────────────────────────────────────────────────────────────\n\n// Uhr, die alle intervalMs neu rendert (Countdown, Restzeit).\nfunction useRallyNow(intervalMs = 1000) {\n  const [now, setNow] = React.useState(() => Date.now());\n  React.useEffect(() => {\n    const id = setInterval(() => setNow(Date.now()), Math.max(100, intervalMs));\n    const onVis = () => { if (!document.hidden) setNow(Date.now()); };\n    document.addEventListener('visibilitychange', onVis);\n    return () => { clearInterval(id); document.removeEventListener('visibilitychange', onVis); };\n  }, [intervalMs]);\n  return now;\n}\n\n// Debug-Position (?rallydebug=1): window.__rallySetPos(lat, lng), window.__rallyClearPos()\nconst RAL_GEO = { fake: null, listeners: new Set() };\n\nfunction rallyIsDebug() {\n  try { return new URLSearchParams(window.location.search).get('rallydebug') === '1'; } catch (e) { return false; }\n}\n\nfunction rallySetFakePos(lat, lng) {\n  if (lat == null || lng == null) {\n    RAL_GEO.fake = null;\n    try { sessionStorage.removeItem('fact_rally_fakepos'); } catch (e) {}\n  } else {\n    RAL_GEO.fake = { lat: Number(lat), lng: Number(lng), acc: 5, fake: true };\n    try { sessionStorage.setItem('fact_rally_fakepos', JSON.stringify(RAL_GEO.fake)); } catch (e) {}\n  }\n  RAL_GEO.listeners.forEach(fn => { try { fn(RAL_GEO.fake); } catch (e) {} });\n  return RAL_GEO.fake;\n}\n\nif (rallyIsDebug()) {\n  try {\n    const saved = JSON.parse(sessionStorage.getItem('fact_rally_fakepos') || 'null');\n    if (saved && isFinite(saved.lat)) RAL_GEO.fake = saved;\n  } catch (e) {}\n  window.__rallySetPos = (lat, lng) => rallySetFakePos(lat, lng);\n  window.__rallyClearPos = () => rallySetFakePos(null, null);\n}\n\n/*\n * useRallyGeo({ enabled = true }) -> { pos: {lat,lng,acc}|null, error, debug, setFakePos }\n * error: null | 'unsupported' | 'denied' | 'unavailable' | 'timeout'  (Text: rallyGeoErrorText)\n * Im Debug-Modus gewinnt eine gesetzte Fake-Position gegen GPS.\n */\nfunction useRallyGeo(opts) {\n  const enabled = !(opts && opts.enabled === false);\n  const debug = React.useMemo(() => rallyIsDebug(), []);\n  const [real, setReal] = React.useState(null);\n  const [fake, setFake] = React.useState(() => (debug ? RAL_GEO.fake : null));\n  const [error, setError] = React.useState(null);\n\n  React.useEffect(() => {\n    if (!debug) return;\n    const fn = (p) => setFake(p);\n    RAL_GEO.listeners.add(fn);\n    return () => { RAL_GEO.listeners.delete(fn); };\n  }, [debug]);\n\n  React.useEffect(() => {\n    if (!enabled) return;\n    if (!navigator.geolocation) { setError('unsupported'); return; }\n    let id = null;\n    try {\n      id = navigator.geolocation.watchPosition(\n        (p) => {\n          setReal({ lat: p.coords.latitude, lng: p.coords.longitude, acc: p.coords.accuracy, at: p.timestamp });\n          setError(null);\n        },\n        (e) => {\n          setError(e && e.code === 1 ? 'denied' : e && e.code === 3 ? 'timeout' : 'unavailable');\n        },\n        { enableHighAccuracy: true, maximumAge: 5000, timeout: 20000 },\n      );\n    } catch (e) { setError('unavailable'); }\n    return () => { if (id != null) { try { navigator.geolocation.clearWatch(id); } catch (e) {} } };\n  }, [enabled]);\n\n  const pos = debug && fake ? fake : real;\n  return { pos, error: pos && pos.fake ? null : error, debug, setFakePos: debug ? rallySetFakePos : null };\n}\n\nfunction rallyGeoErrorText(code, lang) {\n  if (!code) return '';\n  const k = { denied: 'rally.ui.geo.denied', timeout: 'rally.ui.geo.timeout', unsupported: 'rally.ui.geo.unsupported' }[code] || 'rally.ui.geo.unavailable';\n  return t(k, rallyLang(lang));\n}\n\n// Statuszeile fuer GPS (Fehler, Warten, Testmodus). Rendert nichts, wenn alles gut ist.\nfunction RallyGeoNotice({ geo, lang, style }) {\n  if (!geo) return null;\n  const l = rallyLang(lang);\n  let text = null, tone = 'info';\n  if (geo.debug && geo.pos && geo.pos.fake) { text = t('rally.ui.geo.debug', l); tone = 'debug'; }\n  else if (geo.error) { text = rallyGeoErrorText(geo.error, l); tone = 'error'; }\n  else if (!geo.pos) { text = t('rally.ui.geo.waiting', l); }\n  if (!text) return null;\n  const c = tone === 'error' ? 'var(--stamp)' : tone === 'debug' ? 'var(--cat-myth, #A855F7)' : 'var(--ink-2)';\n  return (\n    <div role=\"status\" style={{\n      display: 'flex', alignItems: 'center', gap: 8, padding: '9px 12px', borderRadius: 12,\n      background: tone === 'error' ? 'var(--stamp-soft)' : 'var(--surface-2)', border: '1px solid var(--border)',\n      fontFamily: RAL_FONT_B, fontWeight: 500, fontSize: 13, lineHeight: 1.45, color: c, ...style,\n    }}>\n      <span aria-hidden=\"true\">{tone === 'error' ? '⚠️' : tone === 'debug' ? '🧪' : '📡'}</span>\n      <span style={{ minWidth: 0 }}>{text}</span>\n    </div>\n  );\n}\n\n/*\n * useRallyEvent(eventId) -> { event, players, answers, finishes, positions, loading, error, reload }\n * Laedt alles ueber window.RallyStore und abonniert Aenderungen. Pro Aenderungstyp\n * wird nur die passende Scheibe nachgeladen. Unbekannter Typ -> alles.\n */\nconst RAL_EVENT_SLICES = ['event', 'players', 'answers', 'finishes', 'positions'];\n\nfunction useRallyEvent(eventId) {\n  const empty = { event: null, players: [], answers: [], finishes: [], positions: [] };\n  const [state, setState] = React.useState(() => ({ ...empty, loading: !!eventId, error: null }));\n  const reloadRef = React.useRef(() => {});\n\n  React.useEffect(() => {\n    if (!eventId) { setState({ ...empty, loading: false, error: null }); reloadRef.current = () => {}; return; }\n    const S = window.RallyStore;\n    if (!S) {\n      const e = new Error('RallyStore missing'); e.code = 'no_store';\n      setState({ ...empty, loading: false, error: e });\n      return;\n    }\n    let alive = true;\n    const seq = {};\n    const loaders = {\n      event: () => S.getEvent(eventId),\n      players: () => S.listPlayers(eventId),\n      answers: () => S.listAnswers(eventId),\n      finishes: () => S.listFinishes(eventId),\n      positions: () => (S.listPositions ? S.listPositions(eventId) : Promise.resolve([])),\n    };\n    const ready = (!S.mode && typeof S.init === 'function') ? Promise.resolve(S.init()).catch(() => {}) : Promise.resolve();\n\n    const load = (keys) => {\n      keys.forEach(k => { seq[k] = (seq[k] || 0) + 1; });\n      const mine = keys.map(k => seq[k]);\n      return ready.then(() => Promise.all(keys.map(k => Promise.resolve(loaders[k]()))))\n        .then(vals => {\n          if (!alive) return;\n          setState(s => {\n            const n = { ...s, loading: false, error: null };\n            keys.forEach((k, i) => {\n              if (seq[k] !== mine[i]) return; // neuere Anfrage unterwegs\n              n[k] = vals[i] == null ? (k === 'event' ? null : []) : vals[i];\n            });\n            return n;\n          });\n        })\n        .catch(err => { if (alive) setState(s => ({ ...s, loading: false, error: err })); });\n    };\n\n    setState({ ...empty, loading: true, error: null });\n    load(RAL_EVENT_SLICES);\n    reloadRef.current = () => load(RAL_EVENT_SLICES);\n\n    let unsub = null;\n    try {\n      unsub = S.subscribe ? S.subscribe(eventId, (msg) => {\n        const tp = msg && msg.type;\n        load(RAL_EVENT_SLICES.indexOf(tp) >= 0 ? [tp] : RAL_EVENT_SLICES);\n      }) : null;\n    } catch (e) { console.warn('[useRallyEvent] subscribe failed', e); }\n\n    // Nachholen, was Realtime verpasst haben kann: einmal kurz nach dem Abo\n    // (Änderungen zwischen erstem Laden und aktivem Kanal) und immer, wenn die\n    // Seite wieder sichtbar wird (Gerät war im Standby, Tab im Hintergrund).\n    const resyncTimer = setTimeout(() => load(RAL_EVENT_SLICES), 1200);\n    const onVis = () => { if (document.visibilityState === 'visible') load(RAL_EVENT_SLICES); };\n    document.addEventListener('visibilitychange', onVis);\n    window.addEventListener('online', onVis);\n\n    return () => {\n      alive = false;\n      reloadRef.current = () => {};\n      clearTimeout(resyncTimer);\n      document.removeEventListener('visibilitychange', onVis);\n      window.removeEventListener('online', onVis);\n      if (typeof unsub === 'function') { try { unsub(); } catch (e) {} }\n    };\n  }, [eventId]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const reload = React.useCallback(() => reloadRef.current(), []);\n  return { ...state, reload };\n}\n\n// ── Einzahl/Mehrzahl ──────────────────────────────────────────────────────────\n// ralPlural(n, 'rally.play.join.teams', lang) liest 'rally.play.join.teams.one' (n === 1)\n// bzw. '.other' und ersetzt {n}. Weitere Platzhalter über vars.\nfunction ralPlural(n, keyBase, lang, vars) {\n  const num = Number(n);\n  let s = t(keyBase + (num === 1 ? '.one' : '.other'), lang);\n  const all = Object.assign({ n: rallyFmtNum(isFinite(num) ? num : 0, lang, 0) }, vars || {});\n  Object.keys(all).forEach(k => { s = s.split('{' + k + '}').join(String(all[k])); });\n  return s;\n}\n\n// ── Export auf window ─────────────────────────────────────────────────────────\nObject.assign(window, {\n  rallyTokens, rallyEnsureStyles, rallyLoadQrLib, rallyPickText, rallyReadableOn, rallyJoinUrl,\n  rallyFmtNum, rallyFmtDist, rallyFmtMin, rallyFmtClock, rallyGeoErrorText, rallyMapStyle,\n  rallyIsDebug, rallySetFakePos, ralPlural,\n  RallyButton, RallyKicker, RallyCard, RallyChip, RallySegmented, RallyField, RallyInput, RallyTextarea,\n  RallyStepper, RallyStatsBar, RallyMap, RallySheet, RallyTeamBadge, RallyQr, RallyToast, RallyEmpty, RallyLoading,\n  RallyConfirm, RallyGeoNotice,\n  useRallyGeo, useRallyEvent, useRallyNow, useRallyToast,\n});\n"],
  "mappings": "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",
  "names": ["s", "lang", "v", "l", "color", "m", "h", "c", "r", "g", "b", "lin", "unit", "n", "digits", "loc", "min", "total", "ms", "sec", "p", "code", "theme", "L", "variant", "size", "disabled", "onClick", "children", "icon", "full", "type", "style", "ariaLabel", "title", "sz", "accent", "padding", "clickable", "base", "e", "active", "keepFocus", "options", "value", "onChange", "o", "on", "label", "hint", "error", "htmlFor", "mono", "invalid", "className", "rest", "ref", "rows", "max", "step", "format", "canDec", "canInc", "btn", "enabled", "onTap", "glyph", "items", "cols", "setCols", "el", "calc", "w", "fit", "ro", "it", "i", "col", "row", "toneColor", "dark", "name", "fallback", "map", "coords", "dashed", "casing", "data", "src", "kind", "wrap", "div", "css", "text", "pill", "bg", "fg", "aria", "emoji", "core", "ring", "center", "zoom", "markers", "line", "lineColor", "lineDashed", "onMapTap", "onMarkerTap", "userPos", "height", "fitToMarkers", "recenter", "interactive", "radius", "hostRef", "boxRef", "mapRef", "markerObjs", "userMarkerRef", "styleReady", "gen", "setGen", "failed", "setFailed", "live", "ml", "resolveLineColor", "pushLine", "fitNow", "animate", "cur", "pts", "box", "minX", "minY", "maxX", "maxY", "x", "y", "pad", "fitRef", "tgt", "fn", "sized", "onResize", "objs", "firstTheme", "lineSig", "markersSig", "seen", "id", "sig", "prev", "fire", "ev", "marker", "userSig", "uel", "fitSig", "firstFit", "centerSig", "firstCenter", "boxStyle", "open", "onClose", "kicker", "footer", "maxHeight", "zIndex", "closeLabel", "mounted", "setMounted", "closing", "setClosing", "onKey", "team", "showName", "resolve", "reject", "dataUrl", "setDataUrl", "err", "setErr", "alive", "Q", "u", "message", "tone", "bottom", "defaultMs", "msg", "setMsg", "timer", "show", "body", "action", "onBack", "onRetry", "where", "slowMs", "slow", "setSlow", "attempt", "setAttempt", "tm", "S", "a", "confirmLabel", "cancelLabel", "onConfirm", "onCancel", "danger", "intervalMs", "now", "setNow", "onVis", "lat", "lng", "saved", "opts", "debug", "real", "setReal", "fake", "setFake", "setError", "pos", "k", "geo", "eventId", "empty", "state", "setState", "reloadRef", "seq", "loaders", "ready", "load", "keys", "mine", "vals", "unsub", "tp", "resyncTimer", "reload", "keyBase", "vars", "num", "all"]
}
